Puis-je réduire le fichier journal des transactions sur une base de données miroir?

9

Il s'agit d'une question de suivi d' une question précédente sur la raison pour laquelle je n'ai pas pu réduire le fichier journal sur la base de données principale.

Pour faire court, j'ai configuré la mise en miroir de la base de données, mais j'ai oublié de m'assurer que le travail qui a sauvegardé le journal des transactions était à nouveau en cours d'exécution et que le journal des transactions était passé à près de 60 Go.

Depuis la mise en miroir, cette augmentation de taille a été dupliquée sur le serveur en miroir, et a finalement pris tout l'espace disque et rendu la base de données miroir inutilisable.

Par cette question sur la maintenance du journal des transactions sur une base de données miroir, vous ne pouvez pas sauvegarder le journal sur le miroir, mais lorsqu'on lui a demandé spécifiquement dans les commentaires sur la façon de réduire un fichier journal envahi par une base de données miroir, un commentaire a été laissé qui

Une façon de le faire serait de basculer vers la base de données en miroir et de procéder à la réduction. Testez-le soigneusement dans un environnement hors production pour vous assurer qu'il a le comportement que vous souhaitez / attendez.

Cela semble suggérer qu'il pourrait y avoir d'autres façons de réduire le fichier journal sur un miroir, et cette méthode n'est pas nécessairement sûre à faire sur un serveur de production.

Existe-t-il un moyen de réduire en toute sécurité le fichier journal des transactions sur un miroir de base de données?

Rachel
la source
2
La seule façon prise en charge est de réduire le fichier sur le principal, ce qui réduira également le fichier sur le miroir. Si votre miroir n'est plus le même que le principal, vous ne voulez vraiment pas essayer de basculer vers le miroir. Brisez la mise en miroir et recréez-la, comme vous l'avez dit dans votre question précédente.
Max Vernon

Réponses:

6

La DBCC SHRINKFILEcommande sera mise en miroir du principal vers la base de données en miroir. Voici une preuve.

Créez un exemple de base de données sur le principal:

create database MirroredDb;
go

Créez la même base de données à partir d'une sauvegarde avec NORECOVERY:

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

Configurez votre session de mise en miroir comme vous le souhaitez.

Sur la base de données principale, regardez les tailles de fichier de base de données:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Mon jeu de résultats ressemble à ceci:

name            size
MirroredDb      392
MirroredDb_log  104

Sur la base de données miroir , créez un instantané et regardez les mêmes informations:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

Mon jeu de résultats ressemble à ceci:

name            size
MirroredDb      392
MirroredDb_log  104

Développez maintenant le fichier journal des transactions sur la base de données principale (je l'ai porté à 1 Go):

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

En regardant la taille du journal des transactions de la base de données principale , nous voyons maintenant la taille ajustée:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Mon jeu de résultats ressemble à ceci:

name            size
MirroredDb      392
MirroredDb_log  131072

Créez un autre instantané sur la base de données en miroir et examinez la taille du fichier journal des transactions:

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

Mon jeu de résultats ressemble à ceci:

name            size
MirroredDb      392
MirroredDb_log  131072

Maintenant, faites le DBCC SHRINKFILEsur le principal :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Mon jeu de résultats est le suivant:

name            size
MirroredDb      392
MirroredDb_log  104

Créez un troisième et dernier instantané sur la base de données en miroir et regardez la taille:

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

Et j'obtiens l'ensemble de résultats suivant:

name            size
MirroredDb      392
MirroredDb_log  104

Donc, comme vous pouvez le voir ici, la DBCC SHRINKFILEcommande est en fait reflétée dans la base de données miroir.

Thomas Stringer
la source
Merci, je ne savais pas que la taille du fichier journal avait également été copiée à partir du serveur principal. Mais dans le cas où le miroir ne fonctionne pas en raison de la taille du journal des transactions, est-ce la seule solution pour supprimer et recréer le miroir? Il n'y a aucun moyen de réduire en toute sécurité le journal miroir lorsque le processus de mise en miroir n'est pas fonctionnel?
Rachel
Vous ne pouvez pas vous connecter à la base de données en miroir, vous ne pouvez donc pas l'exécuter DBCC SHRINKFILE. Quant à savoir si vous pouvez corriger votre session miroir sans supprimer la mise en miroir sur cette base de données, il y a un peu plus d'investigation qui devrait y avoir lieu. Il semble qu'il ait été suspendu en raison de la taille du fichier. Avez-vous essayé de reprendre le partenaire?
Thomas Stringer
Oui, mais il a immédiatement recommencé à être suspendu. Je présume que c'est parce que trop de temps s'est écoulé depuis l'arrêt de la mise en miroir, donc beaucoup de données doivent encore être transférées avant d'arriver à la partie "réduire le fichier journal". J'espérais qu'il y avait une autre façon dont je n'étais tout simplement pas au courant, comme quelque chose que je pouvais exécuter à partir de la base de données miroir pour réduire le fichier, ou une manipulation du système de fichiers, mais cela ne semble pas être le cas. Votre réponse est toujours très utile, alors merci :)
Rachel
J'espère plus. Une fois que la base de données est suspendue / déconnectée et qu'une sauvegarde de journal est exécutée sur le serveur principal, vous êtes à peu près empêché de remettre le miroir en synchronisation sans redémarrage.
Jason Cumberland