Byłem zbyt niedbały w wykonywaniu kopii zapasowych bazy danych na naszych wewnętrznych serwerach.
Czy istnieje prosty program wiersza polecenia, którego mogę użyć do tworzenia kopii zapasowych niektórych baz danych w programie SQL Server 2005? A może istnieje prosty VBScript?
sql-server
command-line
scripting
backup
Frank Krueger
źródło
źródło
Odpowiedzi:
Aby wykonać kopię zapasową pojedynczej bazy danych z wiersza poleceń, użyj osql lub 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"
Będziesz także chciał przeczytać dokumentację dotyczącą tworzenia kopii zapasowych i przywracania oraz ogólnych procedur .
źródło
WITH FORMAT
formatuje nośnik danych: „ Opcja FORMAT unieważnia całą zawartość multimedialną, ignorując wszelkie istniejące treści. ” Upewnij się, że tego chcesz.osql.exe
byłaC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Używam ExpressMaint .
Aby wykonać kopię zapasową wszystkich baz danych użytkowników, na przykład:
źródło
Zaplanuj wykonanie kopii zapasowych wszystkich baz danych:
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)
Więcej szczegółów znajduje się na moim blogu: jak zautomatyzować kopie zapasowe SQL Server Express .
źródło
Znalazłem to na stronie pomocy technicznej firmy Microsoft http://support.microsoft.com/kb/2019698 .
Działa świetnie! A ponieważ pochodzi od Microsoftu, czuję, że jest całkiem legalny.
Zasadniczo są dwa kroki.
Zaplanuj kopię zapasową z harmonogramu zadań. Możesz najpierw umieścić w pliku .bat lub .cmd, a następnie zaplanować ten plik.
Oczywiście zamień YOUR_SERVER_NAME na nazwę swojego komputera lub opcjonalnie spróbuj. \ SQLEXPRESS i upewnij się, że folder kopii zapasowej istnieje. W tym przypadku próbuje umieścić go w c: \ SQL_Backup
źródło
Możesz skorzystać z aplikacji do tworzenia kopii zapasowych ApexSQL. Chociaż jest to aplikacja z interfejsem graficznym, ma wszystkie funkcje obsługiwane w interfejsie CLI. Możliwe jest wykonanie jednorazowych operacji tworzenia kopii zapasowych lub utworzenie zadania, które będzie regularnie tworzyć kopie zapasowe określonych baz danych. Możesz sprawdzić zasady przełączania i przykłady w artykułach:
źródło
Używam tsql w infrastrukturze Linux / UNIX, aby uzyskać dostęp do baz danych MSSQL. Oto prosty skrypt powłoki, który zrzuca tabelę do pliku:
#!/usr/bin/ksh # #..... ( tsql -S {database} -U {user} -P {password} <<EOF select * from {table} go quit EOF ) >{output_file.dump}
źródło
Ostatecznie, jeśli nie masz zaufanego połączenia, jak deklaruje przełącznik –E
Użyj następującego wiersza poleceń
"[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]
Gdzie
[katalog programu] to katalog, w którym istnieje plik osql.exe
[wersja serwera sql] wersja serwera sql 110 lub 100, 90 lub 80 zaczyna się od największej liczby
[serwer] nazwa serwera lub adres IP
[identyfikator logowania] nazwa logowania użytkownika serwera ms-sql
[hasło] wymagane hasło logowania
źródło
C:\tmp
to ścieżka na serwerze czy lokalna ?Odpowiedź firmy Microsoft na tworzenie kopii zapasowych wszystkich baz danych użytkowników w SQL Express jest tutaj :
Proces jest następujący: skopiuj, wklej i wykonaj ich kod (patrz poniżej. Skomentowałem kilka dziwnie niekomentowanych wierszy na górze) jako zapytanie na serwerze bazy danych. Oznacza to, że należy najpierw zainstalować SQL Server Management Studio (lub w inny sposób połączyć się z serwerem bazy danych za pomocą programu SSMS). To wykonanie kodu spowoduje utworzenie procedury składowanej na serwerze bazy danych.
Utwórz plik wsadowy, aby wykonać procedurę składowaną, a następnie użyj Harmonogramu zadań, aby zaplanować okresowe (np. Nocne) uruchamianie tego pliku wsadowego. Mój kod (który działa) to nieco zmodyfikowana wersja ich pierwszego przykładu:
To zadziałało dla mnie i podoba mi się. Za każdym razem, gdy go uruchamiasz, tworzone są nowe pliki kopii zapasowych. Musisz wymyślić metodę rutynowego usuwania starych plików kopii zapasowych. Mam już procedurę, która robi tego typu rzeczy, więc zachowam kopie zapasowe na kilka dni na dysku (wystarczająco długo, aby zostały one zarchiwizowane przez moją normalną procedurę tworzenia kopii zapasowych), a następnie je usunę. Innymi słowy, zawsze będę mieć pod ręką kopie zapasowe na kilka dni bez konieczności przywracania danych z systemu kopii zapasowych.
Wkleję poniżej skrypt tworzenia procedury składowanej Microsoftu:
--// 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
źródło
Możesz użyć skryptu VB, który napisałem dokładnie w tym celu: https://github.com/ezrarieben/mssql-backup-vbs/
Zaplanuj zadanie w „Harmonogramie zadań”, aby wykonać skrypt tak, jak chcesz, a utworzy on kopię zapasową całej bazy danych do pliku BAK i zapisze go w dowolnym miejscu.
źródło
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
źródło
Jeśli możesz znaleźć pliki DB ... "cp DBFiles backup /"
Prawie na pewno nie jest to wskazane w większości przypadków , ale jest to proste jak każdy strój.
źródło