Mengambil cadangan semua database di SQL Server

13

Saya memiliki server Microsoft SQL Server 2005 DB. Di server DB, saya memiliki sekitar 250 database pengguna. Saya harus mengambil cadangan dari semua database ini. Karena, mengambil cadangan secara manual menghabiskan banyak waktu, saya mencari skrip Batch atau skrip DB yang akan secara otomatis mengambil cadangan semua 250 basis data. Adakah yang bisa membantu dalam hal ini?

Taryn
sumber

Jawaban:

14

Catatan: Pertama-tama buat folder di D:drive. (misalnya D:\User_DataBackup\)

Langkah 1: Buat prosedur yang diberikan di bawah ini.

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

Langkah 2: Jalankan prosedur di atas.

 EXEC [UserDataBaseBackUp]

Anda juga dapat menjadwalkan prosedur ini. Prosedur ini diuji semoga akan membantu.

JP Chauhan
sumber
Pekerjaan yang menyenangkan, dapat ditingkatkan mungkin dengan melewati jalan?
Robin Salih
11

Kembangkan Rencana Pemeliharaan

SQL Server memiliki fitur luar biasa di mana ia akan membuat skrip dan pekerjaan untuk Anda

  • Langkah 1:
    Klik kanan di Maintenance PlanbawahManagement

    Klik kanan pada Manajemen

  • Langkah 2:
    Beri nama Paket Anda

    Beri nama Rencananya

  • Langkah 3:
    Pilih Tugas Pencadangan Database

    Tugas Pencadangan Database

  • Langkah 4:
    Konfigurasikan Tugas, pilih Pangkalan Data, Lokasi folder, Jenis Cadangan (Penuh, diferensial, Log transaksi) dll.

    Konfigurasikan Tugas Cadangan

  • Langkah 5:
    Konfigurasikan Jadwal Pekerjaan

    Konfigurasikan Jadwal Pekerjaan


Saya sarankan memiliki rencana terpisah untuk basis data sistem dan basis data pengguna Anda untuk menghindari masalah apa pun

Tautan Bantuan:

AmmarR
sumber
Catatan: Edisi Express SQL Server tidak menawarkan fungsionalitas Rencana Perawatan.
Alan B
8

Saya tahu pasti bahwa memelihara banyak basis data dengan SSMS bisa sedikit membingungkan, tapi ini lurus ke depan.

Saya dapat merekomendasikan cara yang lebih efektif, yaitu menggunakan skrip pemeliharaan Ola Hallengren . Ini sangat keren dan sangat efektif. Dan Anda dapat melakukan lebih dari sekadar mencadangkan semua basis data, Anda dapat melakukan semua jenis prosedur perawatan.

Sebagai contoh, Anda dapat membuat cadangan semua database, kompres mereka dan mengenkripsi mereka dengan sertifikat pilihan Anda, dengan menggunakan perintah seperti ini (dan mereka semua opsional, dan enkripsi dan kompresi tidak akan berfungsi pada SQL Server 2005 tapi saya pikir itu akan tunjukkan fleksibilitas dan kekuatan skrip Ola):

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

Bekerja pada jawaban oleh JP, saya telah menambahkan parameter untuk melewati direktori tujuan (dan sangat mungkin menambahkan lebih banyak opsi):

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

Sehingga kemudian:

EXEC UserDataBaseBackUp @OutputDir = 'F:\Backups\SQL Databases\'
Jerry Dodge
sumber
1

Anda dapat menggunakan Pernyataan SELECT atau CURSOR seperti ini:

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

ATAU

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 
Filip Holub
sumber
-2

Anda juga bisa menggunakan PowerShell seperti yang ditunjukkan di Gunakan PowerShell untuk Membuat Cadangan Semua Database Pengguna oleh 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)
            }
        }     
    }
Emito
sumber