SQL Server - La FAQConsultez toutes les FAQ
Nombre d'auteurs : 13, nombre de questions : 119, dernière mise à jour : 31 mai 2011 Ajouter une question
Question / réponses à tout ce que vous avez toujours voulu savoir sur Microsoft SQL Server sans jamais oser le demander
- Comment sauvegarder une base de données
- Comment restaurer une base de données depuis un fichier .bak ?
- Comment faire une copie de ma base de données ?
- Comment savoir si je suis en mode recouvrement de type FULL ?
- Comment configurer une base de données en mode FULL RECOVERY ?
- Comment connaîte le jeu de caractère et le tri configuré sur son serveur ?
- Comment faire un export complet d'une base ( structure avec clés, procédures etc...) y.c. des données qui sont dans les tables.
- Comment retrouver la date de la dernière restauration d'une base ?
- Comment restaurer une base de données depuis des fichiers .mdb et .ldb ?
- Sauvegarder toutes les bases de données d'un serveur d'un seul coup
- Comment savoir si un plan de maintenance s'est correctement exécuté ?
Via la commande backup
Code tsql : | Sélectionner tout |
backup database MaBase to DISK=N'c:\temp\MonFichier.bak'
Via la commande restore, en ayant au préalable supprimé toutes les connexions existantes sur la base qui sera écrasée
Code tsql : | Sélectionner tout |
restore database MaBase from DISK=N'c:\temp\MonFichier.bak'
via commandes backup/restore
Code tsql : | Sélectionner tout |
1 2 | backup database MaBase to DISK=N'c:\temp\Mabase.bak' restore database MaCopie from DISK=N'c:\temp\Mabase.bak' |
Code tsql : | Sélectionner tout |
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Recovery')
Code tsql : | Sélectionner tout |
ALTER DATABASE MABASE SET RECOVERY FULL
Code tsql : | Sélectionner tout |
sp_helpsort
Il y a des outils qui génèrent le DDL des objets, et les inserts.
Il y a des outils de diff de base qui sont payants (Red Gate SQL Compare et Data Compare), http://www.sqldelta.com/, http://www.sqlscriptsafe.com/, ...
Il y a des outils gratuits :
- http://www.sqldbtools.com/
- http://www.codeproject.com/cs/database/DBScriptSafe.asp
- http://www.codeproject.com/database/...eratorPack.asp
dont des scripts en Perl, Python et Ruby faits par votre serviteur :
- http://www.babaluga.com/doku.php/sql_server/code/index
- http://www.babaluga.com/doku.php/pro...on_python-ruby
Et de Microsoft :
Si vous avez exécuté cette restauration via un job de Microsoft SQL Server, vous pouvez rechercher l'information via la base système msdb
Code tsql : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | USE VotreBase GO SELECT destination_database_name, restore_date, b.database_name, physical_name, backup_start_date FROM msdb.dbo.RestoreHistory h INNER JOIN msdb.dbo.BackupSet b ON h.backup_set_id = b.backup_set_id INNER JOIN msdb.dbo.BackupFile f ON f.backup_set_id = b.backup_set_id WHERE b.database_name = db_name() GO |
Ces fichiers sont cex d'une base de données qui a été détachée d'un serveur par l'ordre sp_detache_db.
Pour les rattacher à votre serveur SQL, utilisez la procédure stockée sp_attach_db
Code tsql : | Sélectionner tout |
1 2 3 | EXEC sp_attach_db @dbname ='AdventureWorks', @filename1 = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf', @filename2 = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Log.ldf' |
Voici une procédure destinée à opérer une sauvegarde globales de toutes les bases d'un serveur. Différentes options sont possible comme de sauvegarder aussi les bases systèmes ou utiliser une unité de sauvegarde (device).
Code sql : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | CREATE PROCEDURE dbo.P_SAVE @FILE_PATH NVARCHAR(256), -- chemin pour stockage des fichiers de sauvegarde @FILE_EXT NVARCHAR(3) = 'BAK', -- extension pour les fichiers de sauvegarde @FILE_NAME NVARCHAR(128) = 'DB_SAVE', -- nom générique des fichiers de sauvegarde @FILE_DATE BIT = 1, -- incorporer la date dans le nom des fichiers @FILE_HOUR BIT = 1, -- incorporer l'heure dans le nom des fichiers @ONLY_USER_DB BIT = 0, -- ne sauvegarder que les bases utilisateur (pas les bases systèmes) @TO_DEVICE BIT = 1, -- créer une unité de sauvegarde (device) pour y inclure toutes les sauvegardes @CLEAN_DEVICE BIT = 1 -- purger l'unité de sauvegarde (device) des sauvegrades qu'elle contient AS -- ATTENTION : les noms des bases de données doivent repecter la norme ISO (pas de caractères illicites) -- dans le cas contraire prévoir les crochet dans le SQL dynamique IF @FILE_PATH IS NULL OR @FILE_EXT IS NULL OR @FILE_NAME IS NULL BEGIN SET @FILE_PATH = COALESCE(@FILE_PATH, '?'); SET @FILE_EXT = COALESCE(@FILE_EXT, '?'); SET @FILE_NAME = COALESCE(@FILE_NAME, '?'); RAISERROR ('Un des paramètres de la procédure est manquant. Chemin : %s - Nom fichier : %s - Extension : %s', 16, 1) RETURN END; -- la variable @PATH se termine t-elle par un "\" ?, si non, l'ajouter IF SUBSTRING(REVERSE(@FILE_PATH), 1, 1) <> '\' SET @FILE_PATH = @FILE_PATH + '\'; -- l'extension ne doit pas avoir de point SET @FILE_EXT = REPLACE(@FILE_EXT, '.', ''); -- le répertoire doit exister. S'il n'existe pas on le créé. -- utilisation de xp_cmdshell DECLARE @SHOW_OPTIONS BIT, @CMDSHELL BIT; SELECT @SHOW_OPTIONS = CAST(value_in_use AS BIT) FROM sys.configurations WHERE name = 'show advanced options' SELECT @CMDSHELL = CAST(value_in_use AS BIT) FROM sys.configurations WHERE name = 'xp_cmdshell' IF @CMDSHELL = 0 BEGIN IF @SHOW_OPTIONS = 0 EXEC sp_configure 'show advanced options', 1; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; IF @SHOW_OPTIONS = 0 EXEC sp_configure 'show advanced options', 0; RECONFIGURE; END -- création du répertoire EXEC ('xp_cmdshell ''MKDIR "' + @FILE_PATH+'"'''); IF @CMDSHELL = 0 BEGIN EXEC sp_configure 'xp_cmdshell', 0; IF @SHOW_OPTIONS = 0 EXEC sp_configure 'show advanced options', 0; RECONFIGURE; END; -- variables de travail DECLARE @DATE NVARCHAR(9), @HOUR NVARCHAR(7), @DEVICE_NAME NVARCHAR(128), @DEVICE_FILE NVARCHAR(512), @FILE_SAVE NVARCHAR(512), @SQL VARCHAR(max); -- conversion en chaine date et heure au format ISO court IF @FILE_DATE = 1 SET @DATE = REPLACE(CONVERT(NCHAR(10), CURRENT_TIMESTAMP, 121), '-', ''); IF @FILE_HOUR = 1 SET @HOUR = SUBSTRING(REPLACE(CONVERT(NCHAR(25), CURRENT_TIMESTAMP, 121), ':', ''), 12, 6); -- la sauvegarde se fait sur un device. Il faut le créer. IF @TO_DEVICE = 1 BEGIN SET @DEVICE_NAME = @FILE_NAME + COALESCE('_' + @DATE,'') + COALESCE('_' + @HOUR, ''); SET @DEVICE_FILE = @FILE_PATH + @DEVICE_NAME + '.' +@FILE_EXT; END; IF @TO_DEVICE = 1 AND @CLEAN_DEVICE = 1 -- création d'un "device" (unité de sauvegarde) en fait un super fichier qui va contenir toutes les sauvegardes IF EXISTS (SELECT * FROM sys.backup_devices WHERE name = @DEVICE_NAME) EXEC sp_dropdevice @DEVICE_NAME; IF NOT EXISTS(SELECT * FROM sys.backup_devices WHERE name = @DEVICE_NAME) EXEC sp_addumpdevice 'DISK', @DEVICE_NAME, @DEVICE_FILE; -- génération de la commande SQL pour la liste des bases à sauvegarder SET @SQL = ''; SELECT @SQL = @SQL + 'BACKUP DATABASE ' + name +' TO ' + -- vers device ou fichiers CASE WHEN @TO_DEVICE = 1 THEN @DEVICE_NAME ELSE 'DISK = ''' + @FILE_PATH + @FILE_NAME + '_' + name + COALESCE('_' + @DATE,'') + COALESCE('_' + @HOUR, '') + COALESCE('.' + @FILE_EXT, '') + '''' END + -- si device alors purger ou non CASE WHEN @TO_DEVICE = 1 AND N = 1 AND @CLEAN_DEVICE = 1 THEN ' WITH FORMAT, INIT' ELSE '' END + ';' + CHAR(10) + CHAR(13) FROM (SELECT name, ROW_NUMBER() OVER(ORDER BY database_id) AS N FROM sys.databases WHERE state = 0 AND source_database_id IS NULL AND (owner_sid <> 0x01 OR @ONLY_USER_DB <> 1) AND name <> 'tempdb' ) AS T; EXEC (@SQL); GO |
Code sql : | Sélectionner tout |
1 2 | P_SAVE 'C:\! test sauve', 'bkp', 'SAUVEGARDE_SQL_SERVER', 1, 1, 0, 1, 0 -- @FILE_PATH @FILE_EXT @FILE_NAME @FILE_DATE @FILE_HOUR @ONLY_USER_DB @TO_DEVICE @CLEAN_DEVICE |
Une requête simple dans la base de données système MSDB nous donne la réponse ... Valable sous SQL Server 2000 et ultérieur
Code sql : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | SELECT plan_name, database_name, activity, start_time, end_time, CASE LEN(CAST(duration / 3600 AS VARCHAR(4))) WHEN 1 THEN '0' + CAST(duration / 3600 AS VARCHAR(4)) ELSE CAST(duration / 3600 AS VARCHAR(4)) END + ':' + CASE LEN(CAST(duration / 60 % 60 AS VARCHAR(2))) WHEN 1 THEN '0' + CAST(duration / 60 % 60 AS VARCHAR(2)) ELSE CAST(duration / 60 % 60 AS VARCHAR(2)) END + ':' + CASE LEN(CAST(duration % 60 AS VARCHAR(2))) WHEN 1 THEN '0' + CAST(duration % 60 AS VARCHAR(2)) ELSE CAST(duration % 60 AS VARCHAR(2)) END Durée FROM msdb.dbo.sysdbmaintplan_history WHERE succeeded = 0 -- 0 : échec | 1 : réussite -- AND start_time BETWEEN '20090907' AND '20090908' ORDER BY database_name, start_time |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.