Можно ли сжать файл журнала транзакций в зеркальной базе данных?

9

Это дополнительный вопрос к предыдущему вопросу о том, почему я не смог сжать файл журнала в основной базе данных.

Короче говоря, я настроил зеркальное отображение базы данных, но забыл убедиться, что задание, выполняющее резервное копирование журнала транзакций, снова запускается, и журнал транзакций вырос до почти 60 ГБ.

Поскольку зеркалирование было настроено, это увеличение размера дублировалось на зеркальном сервере, и в итоге заняло все дисковое пространство и сделало базу данных зеркала непригодной для использования.

В связи с этим вопросом об обслуживании журнала транзакций в зеркальной базе данных вы не можете создать резервную копию журнала в зеркале, но когда вас спросили конкретно в комментариях о том, как сжать заросший файл журнала в зеркальной базе данных, был оставлен комментарий, что

Один из способов сделать это - переключиться на зеркальную базу данных и выполнить сжатие там. Тщательно проверьте это в непроизводственной среде, чтобы убедиться, что она работает так, как вы хотите / ожидаете.

Похоже, это говорит о том, что могут быть другие способы сжатия файла журнала на зеркале, и этот метод не обязательно безопасен для использования на рабочем сервере.

Есть ли способ безопасно сжать файл журнала транзакций на зеркале базы данных?

Рейчел
источник
2
Единственный поддерживаемый способ - уменьшить файл на основном сервере, что также уменьшит файл на зеркале. Если ваше зеркало больше не совпадает с основным, вы действительно не хотите пытаться переключаться на зеркало. Разбейте зеркалирование и воссоздайте его, как вы сказали в предыдущем вопросе.
Макс Вернон,

Ответы:

6

Команда DBCC SHRINKFILEбудет отражена от принципала в зеркальную базу данных. Вот некоторые доказательства.

Создайте пример базы данных на основном сервере:

create database MirroredDb;
go

Создайте ту же базу данных из резервной копии с помощью NORECOVERY:

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

Настройте сеанс зеркалирования, какой бы вы ни выбрали.

В основной базе данных посмотрите размеры файлов базы данных:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Мой набор результатов выглядит следующим образом:

name            size
MirroredDb      392
MirroredDb_log  104

В зеркальной базе данных создайте снимок и посмотрите на ту же информацию:

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;

Мой набор результатов выглядит следующим образом:

name            size
MirroredDb      392
MirroredDb_log  104

Теперь увеличьте файл журнала транзакций в основной базе данных (я довел его до 1 ГБ):

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

Глядя на размер журнала транзакций основной базы данных , мы теперь видим скорректированный размер:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

Мой набор результатов выглядит следующим образом:

name            size
MirroredDb      392
MirroredDb_log  131072

Создайте еще один снимок в зеркальной базе данных и посмотрите на размер файла журнала транзакций:

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;

Мой набор результатов выглядит следующим образом:

name            size
MirroredDb      392
MirroredDb_log  131072

Теперь сделайте DBCC SHRINKFILEна основном :

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

Мой набор результатов следующий:

name            size
MirroredDb      392
MirroredDb_log  104

Создайте третий и последний снимок в зеркальной базе данных и посмотрите на размер:

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;

И я получаю следующий набор результатов:

name            size
MirroredDb      392
MirroredDb_log  104

Итак, как вы можете видеть здесь, DBCC SHRINKFILEкоманда фактически отражена в зеркальной базе данных.

Томас Стрингер
источник
Спасибо, я не осознавал, что размер файла журнала также был скопирован с основного сервера. Но если зеркало не работает из-за размера журнала транзакций, является ли единственным решением удалить и воссоздать зеркало? Нет способа безопасно сжать зеркальный журнал, когда процесс зеркалирования не работает?
Рейчел
Вы не можете подключиться к зеркальной базе данных, поэтому вы не можете запустить DBCC SHRINKFILEее. Что касается того, что вы можете исправить свой зеркальный сеанс, не удаляя зеркальное отображение в этой базе данных, там нужно провести еще немного расследования. Кажется, что это было приостановлено из-за размера файла. Вы пытались возобновить партнер?
Томас Стрингер
Да, но это немедленно вернулось к приостановке. Я предполагаю, что это потому, что прошло слишком много времени с того момента, как зеркальное отображение прекратилось, поэтому необходимо перенести много данных, прежде чем они попадут в часть «сжать файл журнала». Я надеялся, что есть какой-то другой способ, о котором я просто не знал, например, что-то, что я мог запустить из зеркальной базы данных, чтобы уменьшить файл, или некоторые манипуляции с файловой системой, но это не так. Ваш ответ все еще очень полезен, так что спасибо :)
Рэйчел
Надеюсь больше нет. Когда база данных приостановлена ​​/ отключена, а резервная копия журнала запущена на первичном сервере, вы в значительной степени надеетесь на синхронизацию зеркала без повторной инициализации.
Джейсон Камберленд