web-dev-qa-db-fra.com

Mode utilisateur unique lors de la restauration de la base de données

Est-il nécessaire de mettre la base de données en mode mono-utilisateur avant de restaurer une base de données? Si c'est le cas, lequel est plus préférable de mettre le serveur SQL en mode mono-utilisateur ou de mettre la base de données uniquement en mode mono-utilisateur avant de restaurer! Je vous remercie.

3
SqlNovice

Vous n'auriez besoin de mettre les instances SQL Server en mode mono-utilisateur que si vous restaurez la base de données master. Pour les bases de données user, vous devez vous assurer qu'il n'y a pas de connexion active à la base de données que vous restaurez. Vous devez soit déterminer et tuer tout SPID actif (qui ne nécessiterait pas que la base de données soit en mode mono-utilisateur), soit mettre la base de données en mode mono-utilisateur en utilisant l'un des éléments suivants (référençant une publication de Greg Robidoux Obtenir un accès exclusif pour restaurer les bases de données SQL Server :

ALTER DATABASE [Test4] SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
OR 
ALTER DATABASE [Test4] SET SINGLE_USER WITH ROLLBACK AFTER 30 
OR 
ALTER DATABASE [Test4] SET SINGLE_USER WITH NO_WAIT 
  • AVEC ROLLBACK IMMÉDIATE - cette option n'attend pas que les transactions soient terminées, elle commence simplement à annuler toutes les transactions ouvertes
  • AVEC ROLLBACK APRÈS nnn - cette option annulera toutes les transactions ouvertes après avoir attendu nnn secondes pour que les transactions ouvertes se terminent. Dans notre exemple, nous spécifions que le processus doit attendre 30 secondes avant d'annuler toutes les transactions ouvertes.
  • WITH NO_WAIT - cette option ne mettra la base de données en mode mono-utilisateur que si toutes les transactions ont été effectuées. Il attend une période spécifiée et si les transactions ne sont pas terminées, le processus échouera. C'est l'approche la plus propre, car elle n'annule aucune transaction, mais elle ne fonctionnera pas toujours s'il y a des transactions ouvertes.

Une fois que la base de données a été mise en mode mono-utilisateur, vous avez un accès exclusif à la base de données et pouvez ensuite effectuer la restauration sans problème.

Remarque: lorsque vous utilisez l'option ROLLBACK, vous annulez toutes les transactions ouvertes qui existent toujours pour la base de données. Le processus de restauration devrait fonctionner sans problème, mais si vous avez des transactions très longues, le processus de restauration pourrait prendre beaucoup de temps, alors soyez conscient de ce qui est en cours d'exécution sur vos systèmes. Pour les systèmes de test et de développement, car vous effectuez une restauration, vous ne vous souciez pas des transactions de toute façon, donc le retour en arrière ne devrait pas être un problème, mais vous devez toujours être conscient que les transactions à long terme peuvent prendre un certain temps à revenir en arrière.

7
Scott Hodgin

Vous ne pouvez pas restaurer la base de données si vous êtes connecté à cette base de données, vous obtiendrez l'erreur:

RESTORE ne peut pas traiter la base de données 'my_db_name' car elle est utilisée par cette session

Cela signifie que vous devez restaurer la base de données en cours de connexion à une autre base de données, (recommandé) master.

Mais si vous mettez la base de données dans single_user (avant la restauration) à partir de master, il est possible que quelqu'un se connecte à cette base de données entre votre mise à single_user et restauration.

Pour éviter cette situation, mettez simplement votre base de données offline et non dans single_user:

alter database ... set offline with rollback immediate;
restore database ...;
4
sepupic