¿Qué es un programa de línea de comandos simple o un script para hacer una copia de seguridad de las bases de datos del servidor SQL?

94

He sido demasiado laxo al realizar copias de seguridad de bases de datos en nuestros servidores internos.

¿Existe un programa de línea de comandos simple que pueda usar para hacer una copia de seguridad de ciertas bases de datos en SQL Server 2005? ¿O hay un VBScript simple?

Frank Krueger
fuente
6
Personalmente, tengo mucha mejor suerte con las aplicaciones de pedidos de limón y las utilidades de instrucción de color naranja. Los programas Command Lime son mucho más problemáticos de lo que valen.
Jim

Respuestas:

108

Hacer copias de seguridad de una base de datos única de la línea de comandos, el uso osql o sqlcmd .

"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe" 
    -E -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak' WITH FORMAT"

Usted también querrá leer la documentación sobre BACKUP y RESTORE y procedimientos generales .

Craig comerciante
fuente
3
Hay un buen script para hacer una copia de seguridad de todas las bases de datos de los usuarios de una sola vez aquí: mssqltips.com/tip.asp?tip=1070
Marnix van Valen
7
La documentación dice que WITH FORMATformatea el medio de almacenamiento: " La opción FORMAT invalida todo el contenido del medio, ignorando cualquier contenido existente " . Asegúrate de que esto es lo que quieres.
Alexg
4
@Tjaart, por eso dije que primero leyera la documentación. Si no usa WITH FORMAT y elige un archivo de copia de seguridad existente, la nueva copia de seguridad se agregará a las copias de seguridad existentes en el archivo, que puede que no sea lo que desea.
Craig Trader
@Kiquenet Bzzzzzt: ese sería un producto GUI y, por lo tanto, no un simple programa de línea de comandos o script, según la pregunta original.
Craig Trader
en mi instalación osql.exeestaba enC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Matthew Lock
9

Yo uso ExpressMaint .

Para hacer una copia de seguridad de todas las bases de datos de usuarios, hago, por ejemplo:

C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Martin Meixger
fuente
1
Meixger, no puedo encontrar una sola razón para usar ExpressMaint, cuando SQLBackupAndFTP lo supera en todos los escenarios imaginables
8

Programe lo siguiente para respaldar todas las bases de datos:

Use Master

Declare @ToExecute VarChar(8000)

Select @ToExecute = Coalesce(@ToExecute + 'Backup Database ' + [Name] + ' To Disk =     ''D:\Backups\Databases\' + [Name]   + '.bak'' With Format;' + char(13),'')
From
Master..Sysdatabases
Where
[Name] Not In ('tempdb')
and databasepropertyex ([Name],'Status') = 'online'

Execute(@ToExecute)

También hay más detalles en mi blog: cómo automatizar las copias de seguridad de SQL Server Express .

GateKiller
fuente
¿Puede explicar cómo programar?
Frank Krueger
Por favor, lea mi publicación de blog. Detalla todo lo que necesita saber.
GateKiller
Creo que la pregunta pide algo que se ejecute fuera de SQL Server.
bzlm
@bzlm, como dije. Mi blog tiene detalles sobre cómo hacer esto fuera de SQL Server :)
GateKiller
1
@GateKiller ¿El enlace de tu blog sigue siendo válido? No puedo abrirlo
Yash Saraiya
5

Encontré esto en una página de soporte de Microsoft http://support.microsoft.com/kb/2019698 .

¡Funciona genial! Y dado que vino de Microsoft, siento que es bastante legítimo.

Básicamente hay dos pasos.

  1. Cree un procedimiento almacenado en su base de datos maestra. Vea el enlace de msft o si está roto, intente aquí: http://pastebin.com/svRLkqnq
  2. Programe la copia de seguridad desde su programador de tareas. Es posible que desee colocar primero en un archivo .bat o .cmd y luego programar ese archivo.

    sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'"  1>c:\SQL_Backup\backup.log            

Obviamente, reemplace YOUR_SERVER_NAME con el nombre de su computadora u opcionalmente intente. \ SQLEXPRESS y asegúrese de que la carpeta de respaldo exista. En este caso, está intentando ponerlo en c: \ SQL_Backup

John W.
fuente
1
Por si sirve de algo , terminé usando el método anterior junto con el material de ola.hallengren.com, que creo que es muy respetado entre la comunidad de dba. Está funcionando a las mil maravillas.
John W.
4

Estoy usando tsql en una infraestructura Linux / UNIX para acceder a las bases de datos MSSQL. Aquí hay un script de shell simple para volcar una tabla en un archivo:

#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}
Ira C
fuente
3

Eventual si no tiene una conexión confiable como declara el conmutador –E

Utilice la siguiente línea de comando

"[program dir]\[sql server version]\Tools\Binn\osql.exe" -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak'" -S [server] –U [login id] -P [password]

Dónde

[dir de programa] es el directorio donde existe osql.exe

En un sistema operativo de 32 bits c: \ Archivos de programa \ Microsoft SQL Server \
En sistemas operativos de 64 bits c: \ Archivos de programa (x86) \ Microsoft SQL Server \

[versión del servidor sql] la versión 110 o 100 o 90 u 80 de su servidor SQL comienza con el número más grande

[servidor] su nombre de servidor o ip del servidor

[id de inicio de sesión] su nombre de inicio de sesión de usuario del servidor ms-sql

[contraseña] la contraseña de inicio de sesión requerida

George Vrynios
fuente
1
C:\tmpes la ruta en el servidor o local ?
Kiquenet
las copias de seguridad siempre se almacenan en los discos del servidor, por lo que c: \ tmp está en el servidor
George Vrynios
1

La respuesta de Microsoft para realizar copias de seguridad de todas las bases de datos de usuarios en SQL Express está aquí :

El proceso es: copiar, pegar y ejecutar su código (ver más abajo. He comentado algunas líneas extrañamente no comentadas en la parte superior) como una consulta en su servidor de base de datos. Eso significa que primero debe instalar SQL Server Management Studio (o conectarse a su servidor de base de datos con SSMS). Esta ejecución de código creará un procedimiento almacenado en su servidor de base de datos.

Cree un archivo por lotes para ejecutar el procedimiento almacenado, luego use el Programador de tareas para programar una ejecución periódica (por ejemplo, nocturna) de este archivo por lotes. Mi código (que funciona) es una versión ligeramente modificada de su primer ejemplo:

sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'" 

Esto funcionó para mí y me gusta. Cada vez que lo ejecuta, se crean nuevos archivos de respaldo. Deberá idear un método para eliminar archivos de respaldo antiguos de forma rutinaria. Ya tengo una rutina que hace ese tipo de cosas, así que guardaré copias de seguridad de un par de días en el disco (el tiempo suficiente para que se realicen copias de seguridad con mi rutina normal de copias de seguridad), luego las eliminaré. En otras palabras, siempre tendré a mano copias de seguridad para algunos días sin tener que restaurar desde mi sistema de copias de seguridad.

Pegaré el script de creación de procedimientos almacenados de Microsoft a continuación:

--// 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
CraigD
fuente
0

Podría usar un script VB que escribí exactamente para este propósito: https://github.com/ezrarieben/mssql-backup-vbs/

Programe una tarea en el "Programador de tareas" para ejecutar el script como desee y hará una copia de seguridad de toda la base de datos en un archivo BAK y lo guardará donde usted especifique.

ezrarieben
fuente
0
SET NOCOUNT ON;
declare @PATH VARCHAR(200)='D:\MyBackupFolder\'
 -- path where you want to take backups
IF OBJECT_ID('TEMPDB..#back') IS NOT NULL

DROP TABLE #back

CREATE TABLE #back
(
RN INT IDENTITY (1,1),
DatabaseName NVARCHAR(200)

)

INSERT INTO #back 
SELECT       'MyDatabase1'
UNION SELECT 'MyDatabase2'
UNION SELECT 'MyDatabase3'
UNION SELECT 'MyDatabase4'

-- your databases List

DECLARE @COUNT INT =0 ,  @RN INT =1, @SCRIPT NVARCHAR(MAX)='',  @DBNAME VARCHAR(200)

PRINT '---------------------FULL BACKUP SCRIPT-------------------------'+CHAR(10)
SET @COUNT = (SELECT COUNT(*) FROM #back)
PRINT 'USE MASTER'+CHAR(10)
WHILE(@COUNT > = @RN)
BEGIN

SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
+ REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.bak'''+CHAR(10)+'WITH COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
PRINT @SCRIPT
SET @RN=@RN+1
END

 PRINT '---------------------DIFF BACKUP SCRIPT-------------------------'+CHAR(10)

  SET  @COUNT  =0 SET  @RN  =1 SET @SCRIPT ='' SET @DBNAME =''
 SET @COUNT = (SELECT COUNT(*) FROM #back)
PRINT 'USE MASTER'+CHAR(10)
WHILE(@COUNT > = @RN)
BEGIN
SET @DBNAME =(SELECT DatabaseName FROM #back WHERE RN=@RN)
SET @SCRIPT ='BACKUP DATABASE ' +'['+@DBNAME+']'+CHAR(10)+'TO DISK =N'''+@PATH+@DBNAME+ N'_Backup_'
+ REPLACE ( REPLACE ( REPLACE ( REPLACE ( CAST ( CAST ( GETDATE () AS DATETIME2 ) AS VARCHAR ( 100 )), '-' , '_' ), ' ' , '_' ), '.' , '_' ), ':' , '' )+'.diff'''+CHAR(10)+'WITH DIFFERENTIAL, COMPRESSION, STATS = 10'+CHAR(10)+'GO'+CHAR(10)
PRINT @SCRIPT
SET @RN=@RN+1
END
Sagar Mahajan
fuente
-10

Si puede encontrar los archivos DB ... "cp DBFiles backup /"

Casi seguro que no es aconsejable en la mayoría de los casos , pero es muy simple.

BCS
fuente
1
NO haga esto si SQL Server se está ejecutando, incluso si nada lo está usando.
Craig Trader
6
Las probabilidades de utilizar este método para realizar copias de seguridad y restaurar una base de datos con éxito son escasas. Solo funcionará SI, tanto durante la copia de seguridad como durante la restauración: no se están ejecutando procesos de SQL Server, usted identifica y copia TODOS los archivos binarios involucrados, está ejecutando EXACTAMENTE la misma versión y nivel de parche de SQL Server (y / o Windows). El formato del archivo de respaldo está diseñado para ser portátil entre versiones; los archivos de base de datos binarios NO lo son. Esto es cierto para TODAS las bases de datos, no solo para SQL Server. Simplemente no lo hagas. DE VERDAD. NO HAGAS ESTO.
Craig Trader
Esta respuesta es 98,7% una broma. OTOH si solo va a restaurar exactamente a la misma configuración (también conocida como restauración / reversión) y se puede cerrar (también conocido como un servidor de desarrollo local) y probablemente algunas otras cosas ...
BCS