Sono stato troppo negligente nell'eseguire i backup del DB sui nostri server interni.
Esiste un semplice programma a riga di comando che posso utilizzare per eseguire il backup di determinati database in SQL Server 2005? O c'è un semplice VBScript?
Sono stato troppo negligente nell'eseguire i backup del DB sui nostri server interni.
Esiste un semplice programma a riga di comando che posso utilizzare per eseguire il backup di determinati database in SQL Server 2005? O c'è un semplice VBScript?
Risposte:
Per eseguire il backup di un singolo database dalla riga di comando, utilizzare 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"
Ti consigliamo inoltre di leggere la documentazione su BACKUP e RESTORE e le procedure generali .
WITH FORMAT
formatta il supporto di memorizzazione: " L'opzione FORMAT invalida l'intero contenuto del supporto, ignorando qualsiasi contenuto esistente. " Assicurati che questo sia ciò che desideri.
osql.exe
era inC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Uso ExpressMaint .
Per eseguire il backup di tutti i database degli utenti, ad esempio:
C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Pianificare quanto segue per eseguire il backup di tutti i database:
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)
Ci sono anche ulteriori dettagli sul mio blog: come automatizzare i backup di SQL Server Express .
Ho trovato questo in una pagina del supporto Microsoft http://support.microsoft.com/kb/2019698 .
Funziona benissimo! E poiché proviene da Microsoft, mi sento come se fosse abbastanza legittimo.
Fondamentalmente ci sono due passaggi.
Pianifica il backup dal tuo pianificatore di attività. Potresti voler prima inserire un file .bat o .cmd e quindi pianificare quel file.
sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'" 1>c:\SQL_Backup\backup.log
Ovviamente sostituisci YOUR_SERVER_NAME con il nome del tuo computer o opzionalmente prova. \ SQLEXPRESS e assicurati che la cartella di backup esista. In questo caso sta cercando di metterlo in c: \ SQL_Backup
È possibile utilizzare l'applicazione di backup di ApexSQL. Sebbene sia un'applicazione GUI, ha tutte le sue funzionalità supportate nella CLI. È possibile eseguire operazioni di backup una tantum o creare un lavoro che esegua regolarmente il backup dei database specificati. Puoi controllare le regole di cambio ed esempio negli articoli:
Sto usando tsql su un'infrastruttura Linux / UNIX per accedere ai database MSSQL. Ecco un semplice script di shell per eseguire il dump di una tabella in un file:
#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}
Eventuale se non si dispone di una connessione attendibile come dichiara lo switch –E
Usa la seguente riga di 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]
Dove
[program dir] è la directory in cui esiste osql.exe
Su sistema operativo a 32 bit c: \ Programmi \ Microsoft SQL Server \
Su sistema operativo a 64 bit c: \ Programmi (x86) \ Microsoft SQL Server \
[versione server sql] la versione 110 o 100 o 90 o 80 del server sql inizia con il numero più grande
[server] il tuo nome server o IP del server
[ID di accesso] il nome di accesso dell'utente del server ms-sql
[password] la password di accesso richiesta
C:\tmp
è il percorso nel server o locale ?
La risposta di Microsoft al backup di tutti i database utente su SQL Express è qui :
Il processo è: copia, incolla ed esegui il loro codice (vedi sotto. Ho commentato alcune righe stranamente non commentate in alto) come una query sul tuo server database. Ciò significa che devi prima installare SQL Server Management Studio (o altrimenti connetterti al tuo server di database con SSMS). Questa esecuzione di codice creerà una procedura memorizzata sul server del database.
Creare un file batch per eseguire la procedura memorizzata, quindi utilizzare l'Utilità di pianificazione per pianificare un'esecuzione periodica (ad es. Notturna) di questo file batch. Il mio codice (che funziona) è una versione leggermente modificata del loro primo esempio:
sqlcmd -S SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'"
Questo ha funzionato per me e mi piace. Ogni volta che lo esegui, vengono creati nuovi file di backup. Avrai bisogno di escogitare un metodo per eliminare i vecchi file di backup su base regolare. Ho già una routine che fa questo genere di cose, quindi terrò un paio di giorni di backup su disco (abbastanza a lungo da consentirne il backup con la mia normale routine di backup), quindi li cancellerò. In altre parole, avrò sempre a disposizione alcuni giorni di backup senza dover eseguire il ripristino dal mio sistema di backup.
Incollare lo script di creazione della stored procedure di Microsoft di seguito:
--// 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
Potresti usare uno script VB che ho scritto esattamente per questo scopo: https://github.com/ezrarieben/mssql-backup-vbs/
Pianifica un'attività in "Utilità di pianificazione" per eseguire lo script come preferisci e farà il backup dell'intero DB in un file BAK e lo salverà dove specifichi.
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
Se riesci a trovare i file DB ... "cp DBFiles backup /"
Quasi sicuramente non è consigliabile nella maggior parte dei casi , ma è semplice come tutti i getup.