Dahili sunucularımızda DB yedeklemeleri yapmak konusunda çok gevşek davrandım.
SQL Server 2005'te belirli veritabanlarını yedeklemek için kullanabileceğim basit bir komut satırı programı var mı? Veya basit bir VBScript var mı?
Dahili sunucularımızda DB yedeklemeleri yapmak konusunda çok gevşek davrandım.
SQL Server 2005'te belirli veritabanlarını yedeklemek için kullanabileceğim basit bir komut satırı programı var mı? Veya basit bir VBScript var mı?
Yanıtlar:
Komut satırından tek bir veritabanını yedeklemek için osql veya sqlcmd kullanın .
"C:\Program Files\Microsoft SQL Server\90\Tools\Binn\osql.exe"
-E -Q "BACKUP DATABASE mydatabase TO DISK='C:\tmp\db.bak' WITH FORMAT"
YEDEKLEME ve GERİ YÜKLEME ile ilgili belgeleri ve genel prosedürleri de okumak isteyeceksiniz .
WITH FORMAT
, depolama ortamını biçimlendirdiğini söylüyor : " BİÇİMLENDİR seçeneği, mevcut içeriği yok sayarak tüm ortam içeriğini geçersiz kılar. " İstediğinizin bu olduğundan emin olun.
osql.exe
olduC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
Kullandığım ExpressMaint .
Örneğin tüm kullanıcı veritabanlarını yedeklemek için:
C:\>ExpressMaint.exe -S (local)\sqlexpress -D ALL_USER -T DB -BU HOURS -BV 1 -B c:\backupdir\ -DS
Tüm Veritabanlarını yedeklemek için aşağıdakileri planlayın:
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)
Blogumda daha fazla ayrıntı var: SQL Server Express Yedeklemelerini Otomatikleştirme .
Bunu bir Microsoft Destek sayfasında http://support.microsoft.com/kb/2019698 buldum .
Harika çalışıyor! Ve Microsoft'tan geldiğinden beri, oldukça yasal olduğunu hissediyorum.
Temelde iki adım var.
Yedeklemeyi görev zamanlayıcınızdan planlayın. Önce bir .bat veya .cmd dosyasına koyup ardından bu dosyayı planlamak isteyebilirsiniz.
sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'" 1>c:\SQL_Backup\backup.log
Açıkça YOUR_SERVER_NAME yerine bilgisayar adınızı yazın veya isteğe bağlı olarak. \ SQLEXPRESS'i deneyin ve yedekleme klasörünün var olduğundan emin olun. Bu durumda onu c: \ SQL_Backup içine koymaya çalışıyor
Yedekleme uygulamasını ApexSQL ile kullanabilirsiniz. Bir GUI uygulaması olmasına rağmen, CLI'de desteklenen tüm özelliklerine sahiptir. Tek seferlik yedekleme işlemleri gerçekleştirmek veya belirli veritabanlarını düzenli olarak yedekleyecek bir iş oluşturmak mümkündür. Anahtar kurallarını kontrol edebilir ve makalelerde örneklendirebilirsiniz:
–E anahtarının belirttiği gibi güvenilir bir bağlantınız yoksa
Aşağıdaki komut satırını kullanın
"[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]
Nerede
[program dizini] osql.exe dosyasının bulunduğu dizindir
32bit OS'de c: \ Program Files \ Microsoft SQL Server \
64bit OS üzerinde c: \ Program Files (x86) \ Microsoft SQL Server \
[sql server version] sql server version 110 veya 100 veya 90 veya 80 en büyük sayıyla başlar
[sunucu] sunucu adınız veya sunucu ipiniz
[oturum açma kimliği] ms-sql sunucusu kullanıcı oturum açma adınız
[parola] gerekli oturum açma parolası
C:\tmp
yol sunucuda mı yoksa yerel mi?
Microsoft'un SQL Express'teki tüm kullanıcı veritabanlarını yedeklemeye cevabı burada :
Süreç şudur: kodlarını kopyalayın, yapıştırın ve çalıştırın (aşağıya bakın. En üstte garip bir şekilde yorumlanmamış bazı satırları yorumladım) veritabanı sunucunuzda bir sorgu olarak. Bu, önce SQL Server Management Studio'yu kurmanız (veya başka bir şekilde veritabanı sunucunuza SSMS ile bağlanmanız) gerektiği anlamına gelir. Bu kod yürütme, veritabanı sunucunuzda bir saklı yordam oluşturacaktır.
Depolanan yordamı yürütmek için bir toplu iş dosyası oluşturun, ardından bu toplu iş dosyasının periyodik (örneğin her gece) çalışmasını planlamak için Görev Zamanlayıcı'yı kullanın. Kodum (işe yarayan), ilk örneklerinin biraz değiştirilmiş bir sürümü:
sqlcmd -S .\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'"
Bu benim için çalıştı ve hoşuma gitti. Her çalıştırdığınızda, yeni yedekleme dosyaları oluşturulur. Eski yedekleme dosyalarını rutin olarak silmek için bir yöntem geliştirmeniz gerekecektir. Zaten bu tür şeyleri yapan bir rutinim var, bu yüzden diskte birkaç günlük yedek tutacağım (normal yedekleme rutinim tarafından yedeklenmeleri için yeterince uzun), sonra onları sileceğim. Diğer bir deyişle, yedekleme sistemimden geri yükleme yapmak zorunda kalmadan her zaman elimde birkaç günlük yedeklemeye sahip olacağım.
Microsoft'un saklı yordam oluşturma komut dosyasını aşağıya yapıştıracağım:
--// 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
Tam olarak bu amaç için yazdığım bir VB Script'i kullanabilirsiniz: https://github.com/ezrarieben/mssql-backup-vbs/
Komut dosyasını istediğiniz gibi çalıştırmak için "Görev Zamanlayıcı" da bir görev planlayın ve tüm DB'yi bir BAK dosyasına yedekleyecek ve belirttiğiniz yere kaydedecektir.
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
DB dosyalarını bulabilirseniz ... "cp DBFiles backup /"
Neredeyse kesin olarak çoğu durumda tavsiye edilmez , ancak her şey kadar basit.