Создание резервной копии всех баз данных в SQL Server

13

У меня есть сервер БД Microsoft SQL Server 2005. На сервере БД у меня около 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]

Вы также можете запланировать эту процедуру. Эта процедура проверена, надеюсь, это поможет.

JP Chauhan
источник
Работает удовольствие, может быть, может быть улучшено, пройдя по пути?
Робин Салих,
11

Разработать план обслуживания

SQL Server имеет эту удивительную особенность, где он будет создавать сценарий и работу для вас

  • Шаг 1:
    Щелкните правой кнопкой мыши Maintenance PlanподManagement

    Щелкните правой кнопкой мыши на Управление

  • Шаг 2:
    Назовите свой план

    Назовите план

  • Шаг 3:
    Выберите задачу резервного копирования базы данных

    Задача резервного копирования базы данных

  • Шаг 4.
    Настройте задачу, выберите «Базы данных», «Расположение папки», «Тип резервного подключения (полное, разностное, журнал транзакций)» и т. Д.

    Настройте задачу резервного копирования

  • Шаг 5:
    Настройте график работы

    Настройте график работы


Я рекомендую иметь отдельный план для системных баз данных и ваших пользовательских баз данных. чтобы избежать каких-либо проблем

Справочные ссылки:

AmmarR
источник
Примечание. Экспресс-выпуски SQL Server не предлагают функциональность плана обслуживания.
Алан Б
8

Я точно знаю, что поддержка большого количества баз данных с помощью SSMS может немного сбить с толку, но это просто.

Я могу порекомендовать более эффективный способ, который использует сценарий обслуживания Олы Хелленгрен . Это очень круто и очень эффективно. И вы можете сделать гораздо больше, чем просто резервное копирование всех баз данных, вы можете выполнять все виды процедур обслуживания.

Например, вы можете сделать резервную копию всех баз данных, сжать их и зашифровать их с помощью сертификата по вашему выбору, используя такую ​​команду (и все они являются необязательными, а шифрование и сжатие не будут работать на SQL Server 2005, но я думаю, что это будет показать гибкость и силу сценария Олы):

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 Statement или 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 для резервного копирования всех пользовательских баз данных » Бака Вуди:

# 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
источник