Posso ridurre il file di registro delle transazioni su un database mirror?


9

Questa è una domanda successiva a una domanda precedente sul perché non sono riuscito a ridurre il file di registro nel database principale.

Per farla breve, ho impostato il mirroring del database ma ho dimenticato di assicurarmi che il processo di backup del registro delle transazioni fosse di nuovo in esecuzione e che il registro delle transazioni sia cresciuto fino a quasi 60 GB.

Da quando è stato impostato il mirroring, questo aumento delle dimensioni è stato duplicato sul server con mirroring e alla fine ha occupato tutto lo spazio su disco e ha reso inutilizzabile il database mirror.

Per questa domanda sulla manutenzione del registro delle transazioni su un database mirror, non è possibile eseguire il backup del registro sul mirror, ma quando viene chiesto specificamente nei commenti su come ridurre un file di registro invaso su un database mirror, è stato lasciato un commento che

Un modo per eseguire questa operazione sarebbe eseguire il failover sul database con mirroring e ridurlo lì. Provalo a fondo in un ambiente non di produzione per assicurarti che abbia il comportamento che desideri / ti aspetti.

Questo sembra suggerire che potrebbero esserci altri modi per ridurre il file di registro su un mirror e questo metodo potrebbe non essere necessariamente sicuro su un server di produzione.

Esiste un modo per ridurre in modo sicuro il file di registro delle transazioni su un mirror del database?


2
L'unico modo supportato è ridurre il file sull'entità che ridurrà anche il file sul mirror. Se il tuo mirror non è più uguale al principale, non vuoi davvero tentare di eseguire il failover sul mirror. Rompi il mirroring e ricrealo, come hai detto nella domanda precedente.
Max Vernon,

Risposte:


6

Il DBCC SHRINKFILEcomando verrà eseguito il mirroring dall'entità al database con mirroring. Ecco alcune prove.

Creare un database di esempio sull'entità:

create database MirroredDb;
go

Crea lo stesso database da un backup con NORECOVERY:

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

Configura la tua sessione di mirroring comunque nel modo che preferisci.

Sul database principale guarda le dimensioni del file del database:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Il mio set di risultati è simile al seguente:

name            size
MirroredDb      392
MirroredDb_log  104

Sul database mirror , creare un'istantanea e guardare le stesse informazioni:

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;

Il mio set di risultati è simile al seguente:

name            size
MirroredDb      392
MirroredDb_log  104

Ora crescere il file di registro delle transazioni sul database principale (l'ho portato a 1 GB):

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

Osservando la dimensione del registro delle transazioni del database principale , ora vediamo la dimensione corretta:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Il mio set di risultati è simile al seguente:

name            size
MirroredDb      392
MirroredDb_log  131072

Crea un'altra istantanea sul database con mirroring e osserva qui le dimensioni del file di registro delle transazioni:

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;

Il mio set di risultati è simile al seguente:

name            size
MirroredDb      392
MirroredDb_log  131072

Ora fai DBCC SHRINKFILEil principale :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Il mio set di risultati è il seguente:

name            size
MirroredDb      392
MirroredDb_log  104

Crea una terza e ultima istantanea sul database con mirroring e osserva le dimensioni:

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;

E ottengo il seguente set di risultati:

name            size
MirroredDb      392
MirroredDb_log  104

Quindi, come puoi vedere qui, il DBCC SHRINKFILEcomando è infatti rispecchiato nel database mirror.


Grazie, non mi ero reso conto che la dimensione del file di registro fosse stata copiata anche dal server principale. Ma nel caso in cui il mirror non funzioni a causa delle dimensioni del registro delle transazioni, è l'unica soluzione per eliminare e ricreare il mirror? Non è possibile ridurre in modo sicuro il registro mirror quando il processo di mirroring non funziona?
Rachel,

Non è possibile connettersi al database con mirroring, quindi non è possibile eseguirlo DBCC SHRINKFILE. Per quanto riguarda se è possibile correggere la sessione di mirroring senza rimuovere il mirroring su quel database, c'è un po 'più di indagine che dovrebbe aver luogo lì. Sembra che sia stato sospeso a causa delle dimensioni del file. Hai provato a riprendere il partner?
Thomas Stringer,

Sì, ma è tornato immediatamente alla sospensione. Presumo sia perché è trascorso troppo tempo dall'interruzione del mirroring, quindi molti dati devono ancora essere trasferiti prima di arrivare alla parte del "file di registro ridotto". Speravo che ci fosse un altro modo di cui non ero a conoscenza, come qualcosa che avrei potuto eseguire dal database mirror per ridurre il file o una manipolazione del file system, ma questo non sembra essere il caso. La tua risposta è comunque molto utile, quindi grazie :)
Rachel

Spero non più. Una volta che il database viene sospeso / disconnesso e viene eseguito un backup del registro sul primario, si è praticamente esaltati nel riportare il mirror in sincronia senza un riavvio.
Jason Cumberland il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.