ฉันหละหลวมเกินไปกับการสำรองข้อมูลฐานข้อมูลบนเซิร์ฟเวอร์ภายในของเรา
มีโปรแกรมบรรทัดคำสั่งง่ายๆที่ฉันสามารถใช้ในการสำรองฐานข้อมูลบางฐานข้อมูลใน SQL Server 2005 ได้หรือไม่ หรือมี VBScript แบบธรรมดา?
ฉันหละหลวมเกินไปกับการสำรองข้อมูลฐานข้อมูลบนเซิร์ฟเวอร์ภายในของเรา
มีโปรแกรมบรรทัดคำสั่งง่ายๆที่ฉันสามารถใช้ในการสำรองฐานข้อมูลบางฐานข้อมูลใน SQL Server 2005 ได้หรือไม่ หรือมี VBScript แบบธรรมดา?
คำตอบ:
ในการสำรองฐานข้อมูลเดียวจากบรรทัดคำสั่งใช้osqlหรือ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"
นอกจากนี้คุณยังจะต้องการที่จะอ่านเอกสารในการสำรองข้อมูลและเรียกคืนและขั้นตอนทั่วไป
WITH FORMAT
จัดรูปแบบสื่อบันทึกข้อมูล: " ตัวเลือก FORMAT ทำให้เนื้อหาสื่อทั้งหมดเป็นโมฆะโดยไม่สนใจเนื้อหาที่มีอยู่ " ตรวจสอบให้แน่ใจว่านี่คือสิ่งที่คุณต้องการ
osql.exe
คือในC:\Program Files\Microsoft SQL Server\140\Tools\Binn\OSQL.EXE
กำหนดเวลาต่อไปนี้เพื่อสำรองฐานข้อมูลทั้งหมด:
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)
นอกจากนี้ยังมีรายละเอียดเพิ่มเติมในบล็อกของฉัน: วิธีการอัตโนมัติ SQL เอ็กซ์เพรสเซิร์ฟเวอร์สำรองข้อมูล
ฉันพบนี้ในหน้าสนับสนุนของ Microsoft http://support.microsoft.com/kb/2019698
ใช้งานได้ดีมาก! และเนื่องจากมันมาจาก Microsoft ฉันรู้สึกว่ามันค่อนข้างถูกต้อง
โดยทั่วไปมีสองขั้นตอน
กำหนดการสำรองข้อมูลจากตัวกำหนดตารางเวลางานของคุณ คุณอาจต้องการใส่ลงในไฟล์. bat หรือ. cmd ก่อนแล้วจึงกำหนดเวลาไฟล์นั้น
sqlcmd -S YOUR_SERVER_NAME\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='C:\SQL_Backup\', @backupType='F'" 1>c:\SQL_Backup\backup.log
เห็นได้ชัดว่าแทนที่ YOUR_SERVER_NAME ด้วยชื่อคอมพิวเตอร์ของคุณหรือเลือกลองใช้ \ SQLEXPRESS และตรวจสอบว่ามีโฟลเดอร์สำรองอยู่ ในกรณีนี้จะพยายามใส่ลงใน c: \ SQL_Backup
คุณสามารถใช้แอปพลิเคชันสำรองโดย ApexSQL แม้ว่าจะเป็นแอปพลิเคชัน GUI แต่ก็มีคุณสมบัติทั้งหมดที่รองรับใน CLI เป็นไปได้ที่จะทำการสำรองข้อมูลเพียงครั้งเดียวหรือสร้างงานที่จะสำรองฐานข้อมูลที่ระบุไว้เป็นประจำ คุณสามารถตรวจสอบกฎสวิตช์และตัวอย่างได้ในบทความ:
ฉันใช้ tsql บนโครงสร้างพื้นฐาน Linux / UNIX เพื่อเข้าถึงฐานข้อมูล MSSQL นี่คือเชลล์สคริปต์อย่างง่ายสำหรับการถ่ายโอนข้อมูลตารางไปยังไฟล์:
#!/usr/bin/ksh
#
#.....
(
tsql -S {database} -U {user} -P {password} <<EOF
select * from {table}
go
quit
EOF
) >{output_file.dump}
ในที่สุดถ้าคุณไม่มีการเชื่อมต่อที่เชื่อถือได้ตามที่สวิตช์ –E ประกาศ
ใช้บรรทัดคำสั่งต่อไปนี้
"[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]
ที่ไหน
[program dir] คือไดเร็กทอรีที่มี osql.exe อยู่
บนระบบปฏิบัติการ 32 บิต c: \ Program Files \ Microsoft SQL Server \
บน 64 บิต OS c: \ Program Files (x86) \ Microsoft SQL Server \
[เวอร์ชันเซิร์ฟเวอร์ sql] เซิร์ฟเวอร์ sql เวอร์ชัน 110 หรือ 100 หรือ 90 หรือ 80 ขึ้นต้นด้วยจำนวนที่มากที่สุด
[เซิร์ฟเวอร์] ชื่อเซิร์ฟเวอร์หรือ ip เซิร์ฟเวอร์ของคุณ
[รหัสเข้าสู่ระบบ] ชื่อล็อกอินผู้ใช้เซิร์ฟเวอร์ ms-sql ของคุณ
[รหัสผ่าน] รหัสผ่านเข้าสู่ระบบที่จำเป็น
C:\tmp
เป็นเส้นทางในเซิร์ฟเวอร์หรือภายในเครื่อง ?
คำตอบของ Microsoft ในการสำรองฐานข้อมูลผู้ใช้ทั้งหมดบน SQL Express อยู่ที่นี่ :
กระบวนการนี้คือ: คัดลอกวางและรันโค้ดของพวกเขา (ดูด้านล่างฉันได้แสดงความคิดเห็นแปลก ๆ ที่ไม่แสดงความคิดเห็นที่ด้านบน) เป็นข้อความค้นหาบนเซิร์ฟเวอร์ฐานข้อมูลของคุณ นั่นหมายความว่าก่อนอื่นคุณควรติดตั้ง SQL Server Management Studio (หรือเชื่อมต่อกับเซิร์ฟเวอร์ฐานข้อมูลของคุณด้วย SSMS) การเรียกใช้โค้ดนี้จะสร้างโพรซีเดอร์ที่เก็บไว้บนเซิร์ฟเวอร์ฐานข้อมูลของคุณ
สร้างไฟล์แบตช์เพื่อดำเนินการตามขั้นตอนที่จัดเก็บจากนั้นใช้ Task Scheduler เพื่อกำหนดเวลาการรันไฟล์แบตช์นี้เป็นระยะ รหัสของฉัน (ที่ใช้งานได้) เป็นเวอร์ชันที่ปรับเปลี่ยนเล็กน้อยของตัวอย่างแรก:
sqlcmd -S .\SQLEXPRESS -E -Q "EXEC sp_BackupDatabases @backupLocation='E:\SQLBackups\', @backupType='F'"
สิ่งนี้ได้ผลสำหรับฉันและฉันชอบมัน ทุกครั้งที่คุณเรียกใช้ไฟล์สำรองข้อมูลใหม่จะถูกสร้างขึ้น คุณจะต้องคิดค้นวิธีการลบไฟล์สำรองข้อมูลเก่าเป็นประจำ ฉันมีกิจวัตรที่ทำสิ่งนั้นอยู่แล้วดังนั้นฉันจะเก็บข้อมูลสำรองไว้ในดิสก์สองสามวัน (นานพอที่พวกเขาจะได้รับการสำรองข้อมูลตามขั้นตอนการสำรองข้อมูลตามปกติของฉัน) จากนั้นฉันจะลบออก กล่าวอีกนัยหนึ่งฉันมักจะมีการสำรองข้อมูลสองสามวันในมือโดยไม่ต้องกู้คืนจากระบบสำรองข้อมูล
ฉันจะวางสคริปต์การสร้างขั้นตอนที่เก็บไว้ของ Microsoft ด้านล่าง:
--// 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
คุณสามารถใช้สคริปต์ VB ที่ฉันเขียนเพื่อจุดประสงค์นี้: https://github.com/ezrarieben/mssql-backup-vbs/
กำหนดเวลางานใน "Task Scheduler" เพื่อเรียกใช้สคริปต์ตามที่คุณต้องการและจะสำรองฐานข้อมูลทั้งหมดไปยังไฟล์ BAK และบันทึกไว้ทุกที่ที่คุณระบุ
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 ... "cp DBFiles backup /"
เกือบจะไม่แนะนำอย่างแน่นอนในกรณีส่วนใหญ่แต่ก็ง่ายเหมือนการรับทั้งหมด