Bonjour,
J'aimerais automatiser un restore sur une BD test à partir de mon dernier backup de ma BD prod. Une partie de mon problème est que le nom du fichier du backup change à tous les nuits à cause de la date.
Merci
Version imprimable
Bonjour,
J'aimerais automatiser un restore sur une BD test à partir de mon dernier backup de ma BD prod. Une partie de mon problème est que le nom du fichier du backup change à tous les nuits à cause de la date.
Merci
Si c'est sur le même serveur (même instance) alors il suffit de lire les tables de msdb pour savoir quelle est cette dernière sauvegarde et quel est son fichier.
A +
Oui c'est sur la même instance et serveur. Est-ce que tu as plus d'informations? :)
Tu trouveras la liste des sauvegardes avec cette requête :
A +Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 SELECT @@SERVERNAME AS SERVER_NAME, BS.database_name, BS.backup_start_date, BS.backup_finish_date, BS.expiration_date, CASE BS.type WHEN 'D' THEN 'Database' WHEN 'L' THEN 'Log' END AS backup_type, BS.backup_size, MF.logical_device_name, MF.physical_device_name, BS.name AS backupset_name, BS.description FROM msdb.dbo.backupmediafamily AS MF INNER JOIN msdb.dbo.backupset AS BS ON MF.media_set_id = BS.media_set_id
Hello,
Tu as les dbatools qui permet de simplifier le travail et notamment la commande Restore-DbaDatabase.
La commande va soit chercher é reconstituer la chaîne des backups en fonction des fichiers scannés sur le chemin spécifié, soit il fait confiance à l'historique dans msdb via l'option -TrustDbBackupHistory
++
La commande ressemblerait à quoi si je veux prendre le dernier backup dans un dossier local x et l'importer sur une BD qui n'est pas celle du backup? C'est sûr le serveur de production donc je ne veux vraiment pas me tromper! :) Notre serveur de dev n'est pas dans la même version pour l'instant donc je ne peux pas tester.
Pour connaître les éléments nécessaire et prendre la dernière sauvegarde FULL d'une base de nom "Ma_base", voici la requête à faire :Code:
1
2
3
4
5 RESTORE nom_de_la_nouvelle_base FROM DISK = 'Répertoire\Fichier_de_sauvegarde' WITH MOVE 'nom_fichier_logique1' TO 'Emplacement_disque_fichier_physique\nom_Fichier_physique1', MOVE 'nom_fichier_logique2' TO 'Emplacement_disque_fichier_physique\nom_Fichier_physique2', MOVE ...
A +Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 SELECT TOP 1 BS.database_name, MF.physical_device_name AS emplacement_fichier_sauvegarde, BF.logical_name, BF.logical_name + '.' + PARSENAME(physical_name, 1) AS physical_name FROM msdb.dbo.backupmediafamily AS MF INNER JOIN msdb.dbo.backupset AS BS ON MF.media_set_id = BS.media_set_id INNER JOIN msdb.dbo.backupfile AS BF ON BS.backup_set_id = BF.backup_set_id WHERE BS.type = 'D' AND BS.database_name = 'master' ORDER BY BS.backup_start_date DESC
et avec dbatools:
Comme ca tu as les choix de l'outil :DCode:Restore-DbaDatabase -SqlInstance 'nom_instance' -Path 'Répertoire\Fichier_de_sauvegarde' -DestinationFilePrefix 'nom_de_la_nouvelle_base_' -DatabaseName 'nom_de_la_nouvelle_base' `
++
Est-ce que ça fonctionne si la DB existe déjà? Ce que je dois faire, c'est mettre à jour une DB test à partir des backups de la prod.
Oui l'idées des 2 commandes proposés est de créer une nouvelle base de données à partir d'un backup d'une base de données existante sur ton serveur.
++
Je ne veux pas créer une nouvelle BD mais écraser une existante. De plus, je ne peux pas un nom de fichier car le nom du fichier change à chaque nuit.
Ok clarifions un peu le scénario. De ce que je comprends:
1) DB_PROD -> Backup -> Restore DB_TEST
2) DB_TEST existe déjà et tu veux remplacer DB_TEST
Si nous sommes alignés sur le besoin alors les commandes précédentes fonctionnent:
Dans cette commande PowerShell / dbatools, tu n'as pas besoin de connaitre le nom de ton backup (qui change tout le temps). Par défaut, cette commande te restaure les derniers backupsCode:Restore-DbaDatabase -SqlInstance 'nom_instance' -Path 'Répertoire_des_sauvegardes_DB_PROD' -DestinationFilePrefix 'DB_TEST_' -DatabaseName 'DB_TEST' -WithReplace
Avec les scripts fournis par SQLPro, il te faut d'abord utiliser celui-ci pour chercher le dernier backup (que tu peux mettre dans une table temporaire / variable de table)
... Et ensuite utiliser le script SQLCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 SELECT TOP 1 BS.database_name, MF.physical_device_name AS emplacement_fichier_sauvegarde, BF.logical_name, BF.logical_name + '.' + PARSENAME(physical_name, 1) AS physical_name FROM msdb.dbo.backupmediafamily AS MF INNER JOIN msdb.dbo.backupset AS BS ON MF.media_set_id = BS.media_set_id INNER JOIN msdb.dbo.backupfile AS BF ON BS.backup_set_id = BF.backup_set_id WHERE BS.type = 'D' AND BS.database_name = 'master' ORDER BY BS.backup_start_date DESC
Ca demande un peu plus de travail de codage mais ca fonctionne aussiCode:
1
2
3
4
5 RESTORE DB_TEST FROM DISK = 'Répertoire_des_sauvegardes_DB_PROD\Fichier_de_sauvegarde' WITH REPLACE, MOVE 'nom_fichier_logique1' TO 'Emplacement_disque_fichier_physique\nom_Fichier_physique1', MOVE 'nom_fichier_logique2' TO 'Emplacement_disque_fichier_physique\nom_Fichier_physique2', MOVE ...
++
Je m'y approche!! Il me manque seulement comment installer le DBAtools sur un Windows 2008 R2, mais j'ai réussi sur mon Windows 2019!