การสำรองฐานข้อมูลทั้งหมดใน SQL Server


13

ฉันมีเซิร์ฟเวอร์ฐานข้อมูล Microsoft SQL Server 2005 ในเซิร์ฟเวอร์ DB ฉันมีฐานข้อมูลผู้ใช้ประมาณ 250 คน ฉันต้องสำรองฐานข้อมูลเหล่านี้ทั้งหมด เนื่องจากการสำรองข้อมูลด้วยตนเองใช้เวลานานฉันกำลังมองหาสคริปต์ชุดงานหรือสคริปต์ฐานข้อมูลซึ่งจะสำรองข้อมูลของฐานข้อมูล 250 ทั้งหมดโดยอัตโนมัติ มีใครช่วยได้บ้างไหม?

คำตอบ:


14

หมายเหตุ: ขั้นแรกให้สร้างโฟลเดอร์ในD:ไดรฟ์ (เช่นD:\User_DataBackup\)

ขั้นตอนที่ 1:สร้างขั้นตอนที่ได้รับด้านล่าง

Create PROCEDURE [dbo].[UserDataBaseBackUp]
AS

BEGIN
SET NOCOUNT ON;

DECLARE @name VARCHAR(50) -- database name
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
SET @path = 'D:\User_DataBackup\' -- as same as your created folder' 
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),104)
DECLARE db_cursor CURSOR FOR
  SELECT name
  FROM MASTER.dbo.sysdatabases
  WHERE name NOT IN ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB')
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
  SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
  BACKUP DATABASE @name TO DISK = @fileName
  FETCH NEXT FROM db_cursor INTO @name
END
CLOSE db_cursor
DEALLOCATE db_cursor
END

ขั้นตอนที่ 2:ดำเนินการขั้นตอนข้างต้น

 EXEC [UserDataBaseBackUp]

คุณยังสามารถกำหนดเวลาขั้นตอนนี้ หวังว่าขั้นตอนนี้จะได้รับการทดสอบ


ทำงานได้ดีขึ้นอาจจะดีขึ้นโดยการผ่านเข้าไปในเส้นทาง?
Robin Salih

11

พัฒนาแผนการบำรุงรักษา

SQL Server มีคุณสมบัติที่น่าทึ่งซึ่งจะสร้างสคริปต์และงานให้คุณ

  • ขั้นตอนที่ 1:
    คลิกขวาที่Maintenance Planใต้Management

    คลิกขวาที่การจัดการ

  • ขั้นตอนที่ 2: ตั้ง
    ชื่อแผนของคุณ

    ตั้งชื่อแผน

  • ขั้นตอนที่ 3:
    เลือกภารกิจการสำรองฐานข้อมูล

    งานสำรองฐานข้อมูล

  • ขั้นตอนที่ 4:
    กำหนดค่างานเลือกฐานข้อมูลที่ตั้งโฟลเดอร์ประเภทของการสำรองข้อมูล (การเชื่อมต่อเต็มรูปแบบการบันทึกธุรกรรม)

    กำหนดค่างานสำรองข้อมูล

  • ขั้นตอนที่ 5:
    กำหนดค่าตารางงาน

    กำหนดค่าตารางงาน


ฉันขอแนะนำให้วางแผนแยกต่างหากสำหรับระบบฐานข้อมูลและฐานข้อมูลผู้ใช้ของคุณเพื่อหลีกเลี่ยงปัญหาใด ๆ

ลิงค์ช่วยเหลือ:


หมายเหตุ: SQL Server รุ่นด่วนไม่ได้มีฟังก์ชันแผนการบำรุงรักษา
Alan B

8

ฉันรู้ว่าการรักษาฐานข้อมูลจำนวนมากด้วย SSMS อาจทำให้เกิดความสับสนเล็กน้อย

ฉันสามารถขอแนะนำวิธีที่มีประสิทธิภาพมากขึ้นที่ใช้สคริปต์การบำรุงรักษา Ola Hallengren ของ มันยอดเยี่ยมและมีประสิทธิภาพมาก และคุณสามารถทำมากกว่าสำรองฐานข้อมูลทั้งหมดคุณสามารถทำขั้นตอนการบำรุงรักษาได้ทุกประเภท

ตัวอย่างเช่นคุณสามารถสำรองฐานข้อมูลทั้งหมดบีบอัดและเข้ารหัสด้วยใบรับรองที่คุณเลือกโดยใช้คำสั่งเช่นนี้ (และเป็นทางเลือกทั้งหมดและการเข้ารหัสและการบีบอัดจะไม่ทำงานบน SQL Server 2005 แต่ฉันคิดว่ามันจะ แสดงความยืดหยุ่นและความแข็งแกร่งของสคริปต์ของ Ola):

EXECUTE dbo.DatabaseBackup @Databases = 'USER_DATABASES',
@Directory = 'C:\Backup',
@BackupType = 'FULL',
@Compress = 'Y',
@Encrypt = 'Y',
@EncryptionAlgorithm = 'AES_256',
@ServerCertificate = 'MyCertificate'

2

ทำงานกับคำตอบของ JP ฉันได้เพิ่มพารามิเตอร์เพื่อส่งต่อไดเรกทอรีปลายทาง (และอาจเพิ่มตัวเลือกเพิ่มเติม):

Create PROCEDURE [dbo].[UserDataBaseBackUp] (
  @OutputDir varchar(255)
) AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @name VARCHAR(50) -- database name
    DECLARE @path VARCHAR(256) -- path for backup files
    DECLARE @fileName VARCHAR(256) -- filename for backup
    DECLARE @fileDate VARCHAR(20) -- used for file name
    SET @path = @OutputDir
    SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),104)
    PRINT 'Starting Backups'
    DECLARE db_cursor CURSOR FOR
        SELECT name FROM MASTER.dbo.sysdatabases
            WHERE name NOT IN ('master','model','msdb','tempdb','ReportServer','ReportServerTempDB')
        OPEN db_cursor
            FETCH NEXT FROM db_cursor INTO @name
            WHILE @@FETCH_STATUS = 0 BEGIN
                SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
                    PRINT 'Starting Backup For ' + @name
                    BACKUP DATABASE @name TO DISK = @fileName WITH FORMAT
                FETCH NEXT FROM db_cursor INTO @name
            END
        CLOSE db_cursor
    DEALLOCATE db_cursor
    PRINT 'Backups Finished'
END
GO

ดังนั้น:

EXEC UserDataBaseBackUp @OutputDir = 'F:\Backups\SQL Databases\'

1

คุณสามารถใช้คำสั่ง SELECT หรือ CURSOR เช่นนี้:

DECLARE @PathForBackUp VARCHAR(255)
SET @PathForBackUp = 'F:\Backup\User DB\'

SELECT 'BACKUP DATABASE [' + name + '] TO  DISK = N''' + @PathForBackUp + '' + name + '.bak''
WITH NOFORMAT, NOINIT,  NAME = N''' + name + '_FullBackUp'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 5'
FROM sys.databases
WHERE database_id > 4

หรือ

DECLARE @DBName VARCHAR(255)  
DECLARE @PathForBackUp VARCHAR(255) 
DECLARE @FileName VARCHAR(255)  
DECLARE @DateFile VARCHAR(255)
DECLARE @SQL NVARCHAR(2048) 
SET @PathForBackUp = 'F:\Backup\User DB\'  
SET @DateFile = REPLACE(REPLACE(CONVERT(VARCHAR(20),GETDATE(),120) ,' ','T'), ':','') 

DECLARE BACKUPING CURSOR FOR   
SELECT name  
FROM master.dbo.sysdatabases WHERE dbid > 4 

OPEN BACKUPING    
FETCH NEXT FROM BACKUPING INTO @DBName    
WHILE @@FETCH_STATUS = 0    

BEGIN    
        SET @FileName = @PathForBackUp + @DBName + '_' + @DateFile + '.BAK'  
    SET @SQL = 'BACKUP DATABASE '+@DBName+ ' TO DISK = '''+@FileName+''' WITH COMPRESSION ' 
    PRINT @SQL 
    EXECUTE sp_executesql @sql   
    FETCH NEXT FROM BACKUPING INTO @DBName  

END    

CLOSE BACKUPING    
DEALLOCATE BACKUPING 

-2

คุณสามารถใช้ PowerShell ดังแสดงในใช้ PowerShell เพื่อสำรองฐานข้อมูลผู้ใช้ทั้งหมดโดย Buck Woody:

# Performs a Full backup followed by a transaction log backup on all user databases

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")  | out-null
$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') 'BWOODY1\SQL2K8'
$bkdir = $s.Settings.BackupDirectory
$dbs = $s.Databases
$dbs | foreach-object {
    $db = $_

    if ($db.IsSystemObject -eq $False -and $db.IsMirroringEnabled -eq $False) {
        $dbname = $db.Name
        $dt = get-date -format yyyyMMddHHmmss
        $dbbk = new-object ('Microsoft.SqlServer.Management.Smo.Backup')
        $dbbk.Action = 'Database'
        $dbbk.BackupSetDescription = "Full backup of " + $dbname
        $dbbk.BackupSetName = $dbname + " Backup"
        $dbbk.Database = $dbname
        $dbbk.MediaDescription = "Disk"
        $dbbk.Devices.AddDevice($bkdir + "\" + $dbname + "_db_" + $dt + ".bak", 'File')
        $dbbk.SqlBackup($s)
        if ($db.DatabaseOptions.RecoveryModel -ne 'Simple') {
            $dt = get-date -format yyyyMMddHHmmss
            $dbtrn = new-object ('Microsoft.SqlServer.Management.Smo.Backup')
            $dbtrn.Action = 'Log'
            $dbtrn.BackupSetDescription = "Trans Log backup of " + $dbname
            $dbtrn.BackupSetName = $dbname + " Backup"
            $dbtrn.Database = $dbname
            $dbtrn.MediaDescription = "Disk"
            $dbtrn.Devices.AddDevice($bkdir + "\" + $dbname + "_tlog_" + $dt + ".trn", 'File')
            $dbtrn.SqlBackup($s)
            }
        }     
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.