Prise de sauvegarde de toutes les bases de données dans SQL Server

13

J'ai un serveur de base de données Microsoft SQL Server 2005. Sur le serveur DB, j'ai environ 250 bases de données utilisateur. Je dois sauvegarder toutes ces bases de données. Étant donné que la prise de sauvegarde manuelle prend beaucoup de temps, je recherche un script Batch ou un script DB qui prendra automatiquement la sauvegarde de toutes les 250 bases de données. Quelqu'un peut-il m'aider à ce sujet?

Taryn
la source

Réponses:

14

Remarque: Créez d'abord un dossier sur le D:lecteur. (par exemple D:\User_DataBackup\)

Étape 1: Créez une procédure indiquée ci-dessous.

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

Étape 2: Exécutez la procédure ci-dessus.

 EXEC [UserDataBaseBackUp]

Vous pouvez également planifier cette procédure. J'espère que cette procédure sera testée.

JP Chauhan
la source
Fonctionne un régal, pourrait être amélioré peut-être en passant dans le chemin?
Robin Salih
11

Élaborer un plan de maintenance

SQL Server a cette fonctionnalité étonnante où il créera le script et le travail pour vous

  • Étape 1:
    Faites un clic droit sur Maintenance PlansousManagement

    Clic droit sur la gestion

  • Étape 2:
    nommez votre plan

    Nommez le plan

  • Étape 3:
    Sélectionnez la tâche de sauvegarde de la base de données

    Tâche de sauvegarde de la base de données

  • Étape 4:
    configurer la tâche, sélectionner les bases de données, l'emplacement du dossier, le type de connexion (complète, différentielle, journal des transactions), etc.

    Configurer la tâche de sauvegarde

  • Étape 5:
    configurer le calendrier des travaux

    Configurer le calendrier des travaux


Je recommande d'avoir un plan distinct pour les bases de données système et vos bases de données utilisateur de pour éviter tout type de problème

Liens utiles:

AmmarR
la source
Remarque: les éditions Express de SQL Server n'offrent pas de fonctionnalité de plan de maintenance.
Alan B
8

Je sais pertinemment que la maintenance de nombreuses bases de données avec SSMS peut être un peu déroutante, mais c'est simple.

Je peux recommander un moyen plus efficace, qui utilise le script de maintenance d'Ola Hallengren . C'est très cool et très efficace. Et vous pouvez faire bien plus que simplement sauvegarder toutes les bases de données, vous pouvez effectuer tous les types de procédures de maintenance.

Par exemple, vous pouvez sauvegarder toutes les bases de données, les compresser et les chiffrer avec un certificat de votre choix, en utilisant une commande comme celle-ci (et elles sont toutes facultatives, et le chiffrement et la compression ne fonctionneront pas sur SQL Server 2005 mais je pense que ce sera le cas montrer la flexibilité et la force du script d'Ola):

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

En travaillant sur la réponse de JP, j'ai ajouté un paramètre pour passer le répertoire de destination (et très probablement ajouter plus d'options):

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

Donc alors:

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

Vous pouvez utiliser SELECT Statement ou CURSOR comme ceci:

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

OU

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
la source
-2

Vous pouvez également utiliser PowerShell comme indiqué dans Utiliser PowerShell pour sauvegarder toutes les bases de données utilisateur de 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
la source