web-dev-qa-db-fra.com

Est-il possible de mettre une base de données hors ligne lors d'une sauvegarde à l'aide d'un travail SQL?

J'ai le scénario où je dois générer une sauvegarde de la base de données (SQL Server 2008) et restaurer sur le nouveau serveur (SQL Server 2016). Tout en prenant des données de sauvegarde ne doit en aucun cas être modifié. J'ai donc deux options pour le faire, mais je ne sais pas comment cela fonctionnera. (Tout utilise uniquement le travail SQL.)

  1. Définissez une base de données en lecture seule et restaurez-la sur le nouveau serveur DB.

    → Est-il possible de restaurer une base de données en lecture seule sur le nouveau serveur? Le serveur de destination possède déjà une base de données en lecture-écriture (en ligne) du même nom.

  2. Définissez une base de données hors ligne et restaurez-la sur le nouveau serveur DB.

    → Est-il possible de restaurer une base de données hors ligne sur le nouveau serveur? Le serveur de destination possède déjà une base de données en ligne (lecture-écriture) du même nom.

6
Irfan

→ Est-il possible de restaurer une base de données en lecture seule sur le nouveau serveur?

Oui

Un exemple:

CREATE DATABASE ReadOnlyDB;
GO

ALTER DATABASE ReadOnlyDB SET READ_ONLY;

BACKUP DATABASE ReadOnlyDB TO  disk = '\\share\readonly.Bak';

le serveur de destination possède déjà une base de données en lecture-écriture (en ligne) du même nom.

Vous ne savez pas exactement ce que vous entendez par cela, mais vous pouvez restaurer la base de données avec un nom différent si vous le souhaitez, n'oubliez pas de supprimer la propriété en lecture seule par la suite.

RESTORE DATABASE ReadOnlyDB2
FROM DISK = '\\share\readonly.Bak'
WITH MOVE 'ReadOnlyDB' to '\Datalocation\ReadOnlyDB2.mdf',
 MOVE 'ReadOnlyDB_log' to '\Loglocation\ReadOnlyDB_log2.ldf',
STATS = 5;
GO
ALTER DATABASE ReadOnlyDB2 SET READ_WRITE;

Vous pouvez également remplacer la base de données existante par le mot clé REPLACE.

→ Est-il possible de restaurer une base de données hors ligne sur le nouveau serveur?

Non, cela n'est pas possible car le serveur SQL supprime tous les descripteurs des fichiers de la base de données et ne pourra pas y accéder pendant qu'il est hors ligne.

ALTER DATABASE ReadOnlyDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
GO
BACKUP DATABASE ReadOnlyDB TO  disk = 'C:\temp\readonlyOffline.Bak';

Msg 942, niveau 14, état 4, ligne 10 La base de données 'ReadOnlyDB' ne peut pas être ouverte car elle est hors ligne. Msg 3013, niveau 16, état 1, ligne 10 BASE DE DONNÉES DE SAUVEGARDE se termine anormalement.

Vous pouvez regarder dans détacher/attacher mais la restauration de sauvegarde est préférable.

11
Randi Vertongen

Vous avez quelques options dans votre situation:

  1. Désactiver les applications pouvant modifier les données de la base de données
  2. Définissez la base de données en mode mono-utilisateur et sauvegardez-la. Quelque chose comme ça:

ALTER DATABASE [<DBName>] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;

BACKUP DATABASE [<DBName>] TO DISK = N'<locationAndFilename>'

Ensuite, restaurez-la et redirigez l'application vers le nouveau serveur

5
George K

Je ne comprends pas bien votre situation. Il y a quelques éléments non mentionnés dans la question ou les réponses existantes.

Tout en prenant des données de sauvegarde ne doit en aucun cas être modifié.

Pourquoi? - Toutes les modifications apportées pendant la sauvegarde sont capturées et incluses dans la sauvegarde. Donc, si la sauvegarde prend 2 heures, toutes les modifications apportées au cours de ces 2 heures seront incluses dans la sauvegarde. Les deux correspondront à l'instant où la sauvegarde se termine.

En supposant (à l'opposé de ci-dessus) que vous souhaitez une sauvegarde qui soit effective à partir d'une heure de début plutôt que d'une heure de fin. Et comme vous l'avez mentionné, la mise hors ligne de la base de données, je suppose que vous êtes bien avec personne n'ayant accès pendant la sauvegarde.

S'il n'y a qu'une seule base de données sur le serveur, utilisez une étape de travail pour désactiver leurs connexions sur le serveur, une fois la sauvegarde terminée, réactivez-la.

 USE [master]
 EXEC asp_kill_user_connections [myDatabase] --This is sp that kills all user connects to a database, it is in house and I don't have the rights to share its code, but you can make your own. 

 USE master
 REVOKE CONNECT SQL TO [AD/SomeGroupAccount]
 ALTER LOGIN [SomeSQLAuthAccount] DISABLE
 GO

Faites votre sauvegarde, et quand c'est fait, donnez-leur à nouveau accès.

3
James Jenkins