Данный материал является переводом оригинальной статьи "MSDN Blog SQLGardner : SQL 2012 AlwaysOn and Backups - Part 1 - Offloading the work to a replica".
Одним из величайших аспектов SQL Server AlwaysOn является возможность разгрузить работу резервного копирования и проверку целостности в реплику. Это действительно может помочь сохранить ресурсы на вашей основной рабочей нагрузке приложения. Я собираюсь сосредоточиться главным образом на резервных копиях журнала транзакций в этой статье, так как резервное копирование журнала лучше всего использовать для того, чтобы проиллюстрировать эту новую функцию. Одним из ключевых элементов включения этой резервной способности является цепочка одного журнала, которая поддерживается по всем репликам. Проиллюстрирую это, показывая log_reuse_wait_desc sys.databases и выходные данные инструкции DBCC SQLPERF('logspace').
Моя среда имеет 3 экземпляра, участвующих в группе доступности со старой доброй базой данных AdventureWorks. У меня есть основной экземпляр (SQL1), синхронная реплика, установленная в нечитаемый режим (SQL2) и асинхронная реплика, которая является читаемой (SQL3). Причиной, по которой я выбрал эту конкретную конфигурацию, является хорошее сочетание sync/async и читаемое/не читаемое для тестирования.
Обратите внимание на то, что я недавно выполнил полный бэкап из SQL1, но есть некоторые транзакции в журнале транзакций. Помните, что журнал транзакций не усекается при полном резервном копировании! Буду продолжать повторять следующую таблицу после каждой команды, чтобы показать вам, как журнал остается тем же самым среди реплик
Экземпляр |
log_reuse_wait_desc |
Размер журнала |
Журнал используется % |
SQL1 |
LOG_BACKUP |
249.99 |
66,7 |
SQL2 |
LOG_BACKUP |
NA |
NA |
SQL3 |
LOG_BACKUP |
249.99 |
66.1 |
Обратите внимание, что поскольку SQL2 не установлен для чтения, выходные данные для этой базы данных не будут отображаться в DBCC SQLPERF('logspace').
Теперь будем выполнять команды резервного копирования журнала транзакций на SQL2.
Несмотря на то, что эта реплика не для чтения, мы по-прежнему можем делать резервное копирование журнала транзакций отсюда.
Экземпляр |
log_reuse_wait_desc |
Размер журнала |
Журнал используется % |
SQL1 |
NOTHING |
249.99 |
6.3 |
SQL2 |
NOTHING |
NA |
NA |
SQL3 |
NOTHING |
249.99 |
5,75 |
Хотя в точности использованное место слегка отличается по ряду различных причин, вы можете увидеть, что выполнение резервного копирования журнала транзакций на одной из баз данных очистило журнал для них всех.
Теперь я сгенерировал немного больше активности в базе, чтобы в журналы транзакций попало больше данных. Я также устанавливаю реплику на SQL2 для чтения, чтобы мы могли получить некоторые выходные от DBCC SQLPERF('logspace'). Вы можете увидеть, что отражено в статистике ниже
Экземпляр |
log_reuse_wait_desc |
Размер журнала |
Журнал используется % |
SQL1 |
LOG_BACKUP |
249.99 |
13.19 |
SQL2 |
LOG_BACKUP |
249.99 |
12.56 |
SQL3 |
LOG_BACKUP |
249.99 |
12.56 |
Теперь давайте возьмем резервную копию журнала транзакций от SQL3 и посмотрим, как выглядит наш вывод
Экземпляр |
log_reuse_wait_desc |
Размер журнала |
Журнал используется % |
SQL1 |
NOTHING |
249.99 |
1.09 |
SQL2 |
NOTHING |
249.99 |
0.46 |
SQL3 |
NOTHING |
249.99 |
0.46 |
Так что теперь вы можете видеть, что вы можете взять резервные копии журналов транзакций из любой реплики и это все часть одной цепочки журнала транзакций. Когда журнал усекается на одной реплике, это отражается на других.
Важная вещь, которую следует иметь в виду, это то, что хотя есть одна цепочка журнала, существует не одна msdb по всем репликам. Вы заметите, что только резервные копии из данного экземпляра будут отображаться в таблицах резервного копирования базы данных msdb. Хотя это кажется довольно очевидным, важно отметить, что вы действительно должны быть осторожны в том, что вы знаете, где происходит резервное копирование. Если вам необходимо восстановиться, вам нужно будет собрать воедино необходимые файлы для завершения цепочки журналов. В моем примере, где я взял полный бэкап на SQL1, и первый бэкап журнала транзакций на SQL2, msdb на SQL2 ничего не знала о полной резервной копии, которая была сделана на SQL1. Для борьбы с этим, рекомендуется убедиться в том, что все резервные копии направляются в одно и то же местоположение файлов.
Я также хочу отметить, что существуют некоторые ограничения. Например, полные резервные копии реплик должны быть "copy_only" резервными копиями. Если вы просто выполняете полный бэкап и бэкап журнала транзакций, это будет влиять только на то, что надо убедиться, что вы добавили "copy_only" в команду бэкапа. Ключевым моментом к этому является, что "copy_only" полный бэкап не может служить разностной резервной копией базы. Кроме того, разностные резервные копии не могут быть выполнены с реплик. Это может быть разочарованием, если вы надеялись выполнять разностные бэкапы из реплики. Обычно полные и разностные резервные копии выполняются во время низких нагрузок приложений, в любом случае, поэтому это не должно быть слишком большой проблемой.
Обратная ссылка: SQL Server 2012 AlwaysOn и резервные копии. Часть 2 – Настройка резервного копирования и автоматизация резервного копирования. Перевод статьи – Блог IT-K /