SQL Server'daki tüm veritabanlarının yedeğini alma


13

Bir Microsoft SQL Server 2005 DB sunucum var. DB sunucusunda yaklaşık 250 kullanıcı veritabanım var. Tüm bu veritabanlarını yedeklemeliyim. Manuel olarak yedek almak çok zaman harcadığından, otomatik olarak tüm 250 veritabanlarının yedeğini alacak bir Batch komut dosyası veya DB komut dosyası arıyorum. Herkes bu konuda yardımcı olabilir mi?

Yanıtlar:


14

Not: Önce D:sürücüde bir klasör oluşturun . (ör. D:\User_DataBackup\)

Adım 1: Aşağıda verilen bir prosedürü oluşturun.

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

Adım 2: Yukarıdaki prosedürü uygulayın.

 EXEC [UserDataBaseBackUp]

Bu prosedürü de zamanlayabilirsiniz. Bu prosedür umarım yardımcı olacaktır test edilir.


Bir tedavi çalışır, belki yoldan geçerek geliştirilebilir mi?
Robin Salih

11

Bir Bakım Planı Geliştirin

SQL Server, sizin için komut dosyası ve iş oluşturacağı bu şaşırtıcı özelliğe sahiptir

  • Adım 1: altında
    sağ tıklayınMaintenance PlanManagement

    Yönetimi Sağ Tıklayın

  • 2. Adım:
    Planınıza ad verin

    Planı adlandırın

  • Adım 3:
    Veritabanı Yedekleme Görevini Seçin

    Veritabanı Yedekleme Görevi

  • Adım 4:
    Görevi yapılandırın, Veritabanları, Klasör konumu, Yedekleme Türü (Tam, diferansiyel, İşlem günlüğü) bağlantısı vb. Seçin.

    Yedekleme Görevini Yapılandırma

  • 5. Adım:
    İş Zamanlamasını Yapılandırma

    İş Zamanlamasını Yapılandırma


Her türlü sorunun oluşmasını önlemek için sistem veritabanları ve kullanıcı veritabanlarınız için ayrı bir plana sahip olmanızı öneririm

Yardım Bağlantıları:


Not: SQL Server'ın Express sürümleri Bakım Planı işlevi sunmaz.
Alan B

8

SSMS ile birçok veritabanını korumanın biraz kafa karıştırıcı olabileceğini biliyorum, ama bu oldukça basit.

Daha etkili bir yol önerebilirim, yani Ola Hallengren'in bakım senaryosunu kullanıyor . Çok havalı ve çok etkilidir. Ve tüm veritabanlarını yedeklemekten çok daha fazlasını yapabilir, her türlü bakım prosedürünü yapabilirsiniz.

Örneğin, tüm veritabanlarını yedekleyebilir, sıkıştırabilir ve istediğiniz bir sertifika ile şifreleyebilirsiniz, böyle bir komut kullanarak (ve hepsi isteğe bağlıdır ve şifreleme ve sıkıştırma SQL Server 2005'te çalışmaz, ancak bence Ola'nın senaryosunun esnekliğini ve gücünü göster):

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

2

JP'nin cevabı üzerinde çalışırken, hedef dizini geçmek için bir parametre ekledim (ve muhtemelen daha fazla seçenek ekledim):

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

E sonra:

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

1

SELECT Deyimi veya CURSOR'u şu şekilde kullanabilirsiniz:

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

VEYA

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

Tüm Kullanıcı Veritabanlarını Buck Woody ile Yedeklemek için PowerShell'i Kullanma bölümünde gösterildiği gibi PowerShell'i de kullanabilirsiniz :

# 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)
            }
        }     
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.