Сжать журнал транзакций при использовании группы доступности AlwaysOn

17

Мы используем AlwaysOn Availability Groupфункцию SQL Server 2012. Регулярные полные резервные копии базы данных и резервные копии журнала транзакций выполняются каждый день на вторичной базе данных.

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

введите описание изображения здесь

Я восстановил базу данных локально и выполнил операцию сжатия. Размер файла журнала был уменьшен до 160 МБ.

У меня вопрос, на какой базе данных мне следует выполнить операцию сжатия файла журнала транзакций (первичную, вторичную или обе)?


Я предполагаю, что в течение последних нескольких лет никаких резервных копий файла журнала не создавалось, поэтому он стал таким огромным. Выполняя, DBCC SQLPERF (LOGSPACE)я вижу, что используются только 0.06%файлы - нет смысла сохранять такой огромный размер файла журнала. В [sys].[database_files]проверяю , что его max_sizeустановлен в -1с growthк , 65536так что я думаю , когда это нужно больше места , он получит. Во всяком случае, я могу уменьшить его до 5%, например, чтобы предотвратить будущий рост. Я пытаюсь найти какое-то подтверждение, что это неплохая идея.


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

gotqn
источник

Ответы:

21

В AGs запись может происходить только на основной. Сжатие операции записи. Поэтому вы должны сделать сокращение на первичном. Обратите внимание, что сжатие может не уменьшиться так сильно, как вы ожидаете, ваш тест на восстановленной БД, вероятно, использовал простую модель восстановления. Прочтите Как сжать журнал SQL Server для получения дополнительной информации.

Не сжиматься до 160 МБ. Определите, почему журнал вырос до 121 Гб, чтобы он не повторялся (у вас есть подозрения, было бы неплохо подтвердить, если это возможно). Размер журнала в соответствии с вашими потребностями. Увеличение журнала - серьезная проблема, он не может использовать мгновенную инициализацию файла, и все ваши действия с базой данных будут зависать, пока журнал увеличивается и инициализируется 0. Пользователи и приложения ненавидят это, когда это происходит. Если вы понимаете последствия и ваши пользователи ОК, вы можете сжать один раз в небольшом количестве (160MB, вероятно , слишком мал , хотя) , и пусть она расти , пока не стабилизируется.

Ремус Русану
источник
7

Можешь попробовать:

  1. База данных на всех серверах в группе доступности должна находиться в синхронизированном состоянии.
  2. Переместите использованные страницы в начало журнала транзакций, прежде чем уменьшать его.
  3. Иногда доступное свободное место в журнале составляет 99%, но SQL Server не может освободить неиспользуемое пространство. Попробуйте перезагрузить каждый сервер в группе доступности по очереди.
  4. Иногда вам нужно 2 раза сжать и сжать журнал транзакций, прежде чем MS SQL Server освободит свободное место (невозможно сжать файл журнала (DB_Log), поскольку файл логического журнала, расположенный в конце файла, используется.).

Попробуйте этот скрипт:

    - Установить текущую базу данных внутри шага задания или скрипта
    - Проверить выполнение только на первичном
    если (ВЫБЕРИТЕ роль
        ОТ sys.dm_hadr_availability_replica_states КАК
        ПРИСОЕДИНЯЙТЕСЬ к sys.availability_replicas AS b
            ON b.replica_id = a.replica_id
    ГДЕ b.replica_server_name = @@ SERVERNAME) = 1
    НАЧАТЬ
        - Использовать [test_db] - Не работает для MS SQL 2014, просто закомментируйте эту строку и установите текущую базу данных внутри шага задания или сценария
        - 1) Бакуп Трн
        РЕЗЕРВНОЕ КОПИРОВАНИЕ [test_db] НА ДИСК = N'D: \ MSSQL \ Backup \ test_db.trn 'С NOFORMAT, INIT, ИМЯ = N' Резервное копирование Trn ', Пропуск, NOREWIND, ЗАГРУЗКА, СЖАТИЕ, STATS = 10
        - 2) Переместить использованные страницы
        DBCC SHRINKFILE (N'test_db_log ', 3000, NOTRUNCATE)
        - 3) журнал SHRINKFILE
        DBCC SHRINKFILE (N'test_db_log ', 3000)
    КОНЕЦ
Денис П.
источник