backup - script - ¿Cómo puedo programar una copia de seguridad diaria con SQL Server Express?
script backup sql server (6)
Hemos utilizado la combinación de:
Cobian Backup para la programación / mantenimiento
ExpressMaint para respaldo
Ambos son gratis. El proceso consiste en crear una secuencia de comandos de ExpressMaint para realizar una copia de seguridad como un evento de Cobian "antes de la copia de seguridad". Normalmente dejo que sobrescriba el archivo de copia de seguridad anterior. Cobian toma un zip / 7zip de esto y los archiva en la carpeta de respaldo. En Cobian puede especificar la cantidad de copias completas que debe conservar, hacer múltiples ciclos de respaldo, etc.
Ejemplo de sintaxis del comando ExpressMaint:
expressmaint -S HOST/SQLEXPRESS -D ALL_USER -T DB -R logpath -RU WEEKS -RV 1 -B backuppath -BU HOURS -BV 3
Esta pregunta ya tiene una respuesta aquí:
Estoy ejecutando una pequeña aplicación web con SQL Server Express (2005) como back-end. Puedo crear una copia de seguridad con una secuencia de comandos SQL, sin embargo, me gustaría programar esto diariamente. Como opción adicional (debería tener) me gustaría conservar solo las últimas copias de seguridad de X (obviamente por razones de ahorro de espacio) ¿Alguna sugerencia?
[edit] SQL Server Agent no está disponible en SQL Server Express ...
No puede usar el agente SQL Server en SQL Server Express. La forma en que lo he hecho antes es crear un script SQL, y luego ejecutarlo como una tarea programada todos los días; puede tener múltiples tareas programadas que se adapten a su agenda / retención de respaldo. El comando que uso en la tarea programada es:
"C: / Archivos de programa / Microsoft SQL Server / 90 / Tools / Binn / SQLCMD.EXE" -i "c: / path / to / sqlbackupScript.sql"
La gente de MSSQLTips tiene algunos artículos muy útiles, el más relevante para esto es " Automatizar copias de seguridad de SQL Server 2005 Express y eliminar archivos de copia de seguridad anteriores ".
El enfoque básico es configurar dos tareas utilizando el Programador de tareas de Windows. Una tarea ejecuta un script TSQL que genera archivos de respaldo separados para todas las bases de datos MSSQL (excepto TEMPDB) con el nombre de la base de datos y un sello de fecha / hora en el nombre del archivo en un directorio específico. La segunda tarea ejecuta un script de VBScript que pasa por ese directorio y elimina todos los archivos con una extensión .BAK que tienen más de 3 días de antigüedad.
Ambos scripts requieren una edición menor para su entorno (rutas, por cuánto tiempo mantener esos depósitos de bases de datos), pero están muy cerca de la función de inserción y ejecución.
Tenga en cuenta que existen posibles implicaciones de seguridad si está descuidado con estos o con permisos de directorio, ya que son archivos de texto sin formato que deberán ejecutarse con cierto nivel de privilegio. No seas descuidado.
Solo use esta secuencia de comandos para hacer una copia de seguridad dinámica de todas las bases de datos en el servidor. A continuación, cree un archivo por lotes según el artículo. Es útil crear dos archivos por lotes, uno para la copia de seguridad completa y otro para la copia de seguridad. A continuación, cree dos tareas en el Programador de tareas, una para completar y otra para la diferencia.
-- // Copyright © Microsoft Corporation. All Rights Reserved.
-- // This code released under the terms of the
-- // Microsoft Public License (MS-PL, http://opensource.org/licenses/ms-pl.html.)
USE [master]
GO
/****** Object: StoredProcedure [dbo].[sp_BackupDatabases] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Microsoft
-- Create date: 2010-02-06
-- Description: Backup Databases for SQLExpress
-- Parameter1: databaseName
-- Parameter2: backupType F=full, D=differential, L=log
-- Parameter3: backup file location
-- =============================================
CREATE PROCEDURE [dbo].[sp_BackupDatabases]
@databaseName sysname = null,
@backupType CHAR(1),
@backupLocation nvarchar(200)
AS
SET NOCOUNT ON;
DECLARE @DBs TABLE
(
ID int IDENTITY PRIMARY KEY,
DBNAME nvarchar(500)
)
-- Pick out only databases which are online in case ALL databases are chosen to be backed up
-- If specific database is chosen to be backed up only pick that out from @DBs
INSERT INTO @DBs (DBNAME)
SELECT Name FROM master.sys.databases
where state=0
AND name=@DatabaseName
OR @DatabaseName IS NULL
ORDER BY Name
-- Filter out databases which do not need to backed up
IF @backupType=''F''
BEGIN
DELETE @DBs where DBNAME IN (''tempdb'',''Northwind'',''pubs'',''AdventureWorks'')
END
ELSE IF @backupType=''D''
BEGIN
DELETE @DBs where DBNAME IN (''tempdb'',''Northwind'',''pubs'',''master'',''AdventureWorks'')
END
ELSE IF @backupType=''L''
BEGIN
DELETE @DBs where DBNAME IN (''tempdb'',''Northwind'',''pubs'',''master'',''AdventureWorks'')
END
ELSE
BEGIN
RETURN
END
-- Declare variables
DECLARE @BackupName varchar(100)
DECLARE @BackupFile varchar(100)
DECLARE @DBNAME varchar(300)
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @dateTime NVARCHAR(20)
DECLARE @Loop int
-- Loop through the databases one by one
SELECT @Loop = min(ID) FROM @DBs
WHILE @Loop IS NOT NULL
BEGIN
-- Database Names have to be in [dbname] format since some have - or _ in their name
SET @DBNAME = ''[''+(SELECT DBNAME FROM @DBs WHERE ID = @Loop)+'']''
-- Set the current date and time n yyyyhhmmss format
SET @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),101),''/'','''') + ''_'' + REPLACE(CONVERT(VARCHAR, GETDATE(),108),'':'','''')
-- Create backup filename in path/filename.extension format for full,diff and log backups
IF @backupType = ''F''
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, ''['',''''),'']'','''')+ ''_FULL_''+ @dateTime+ ''.BAK''
ELSE IF @backupType = ''D''
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, ''['',''''),'']'','''')+ ''_DIFF_''+ @dateTime+ ''.BAK''
ELSE IF @backupType = ''L''
SET @BackupFile = @backupLocation+REPLACE(REPLACE(@DBNAME, ''['',''''),'']'','''')+ ''_LOG_''+ @dateTime+ ''.TRN''
-- Provide the backup a name for storing in the media
IF @backupType = ''F''
SET @BackupName = REPLACE(REPLACE(@DBNAME,''['',''''),'']'','''') +'' full backup for ''+ @dateTime
IF @backupType = ''D''
SET @BackupName = REPLACE(REPLACE(@DBNAME,''['',''''),'']'','''') +'' differential backup for ''+ @dateTime
IF @backupType = ''L''
SET @BackupName = REPLACE(REPLACE(@DBNAME,''['',''''),'']'','''') +'' log backup for ''+ @dateTime
-- Generate the dynamic SQL command to be executed
IF @backupType = ''F''
BEGIN
SET @sqlCommand = ''BACKUP DATABASE '' +@DBNAME+ '' TO DISK = ''''''+@BackupFile+ '''''' WITH INIT, NAME= '''''' +@BackupName+'''''', NOSKIP, NOFORMAT''
END
IF @backupType = ''D''
BEGIN
SET @sqlCommand = ''BACKUP DATABASE '' +@DBNAME+ '' TO DISK = ''''''+@BackupFile+ '''''' WITH DIFFERENTIAL, INIT, NAME= '''''' +@BackupName+'''''', NOSKIP, NOFORMAT''
END
IF @backupType = ''L''
BEGIN
SET @sqlCommand = ''BACKUP LOG '' +@DBNAME+ '' TO DISK = ''''''+@BackupFile+ '''''' WITH INIT, NAME= '''''' +@BackupName+'''''', NOSKIP, NOFORMAT''
END
-- Execute the generated SQL command
EXEC(@sqlCommand)
-- Goto the next database
SELECT @Loop = min(ID) FROM @DBs where ID>@Loop
END
Y el archivo por lotes puede verse así:
sqlcmd -S localhost/myDB -Q "EXEC sp_BackupDatabases @backupLocation=''c:/Dropbox/backup/DB/', @backupType=''F''" >> c:/Dropbox/backup/DB/full.log 2>&1
y
sqlcmd -S localhost/myDB -Q "EXEC sp_BackupDatabases @backupLocation=''c:/Dropbox/backup/DB/', @backupType=''D''" >> c:/Dropbox/backup/DB/diff.log 2>&1
La ventaja de este método es que no necesita cambiar nada si agrega una nueva base de datos o elimina una base de datos, ni siquiera necesita listar las bases de datos en la secuencia de comandos. La respuesta de JohnB es mejor / más simple para el servidor con una base de datos, este enfoque es más adecuado para servidores de bases de datos múltiples.
Puede crear un dispositivo de copia de seguridad en el objeto del servidor, digamos
BDTEST
y luego crea un archivo por lotes que contiene el siguiente comando
sqlcmd -S 192.168.1.25 -E -Q "BACKUP DATABASE dbtest TO BDTEST"
digamos con nombre
backup.bat
entonces puedes llamar
backup.bat
en el programador de tareas según su conveniencia
Eduardo Molteni tuvo una gran respuesta:
Uso de tareas programadas de Windows:
En el archivo por lotes
"C:/Program Files/Microsoft SQL Server/100/Tools/Binn/SQLCMD.EXE" -S
(local)/SQLExpress -i D:/dbbackups/SQLExpressBackups.sql
En SQLExpressBackups.sql
BACKUP DATABASE MyDataBase1 TO DISK = N''D:/DBbackups/MyDataBase1.bak''
WITH NOFORMAT, INIT, NAME = N''MyDataBase1 Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10
BACKUP DATABASE MyDataBase2 TO DISK = N''D:/DBbackups/MyDataBase2.bak''
WITH NOFORMAT, INIT, NAME = N''MyDataBase2 Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO