Репликация секционированных таблиц и индексов
Область применения: SQL Server Управляемый экземпляр SQL Azure
Секционирование делает большие таблицы и индексы более управляемыми, так как позволяет быстро и эффективно получать доступ к подмножествам данных и управлять ими, при этом сохраняя целостность всей коллекции данных. Дополнительные сведения см. в разделе Partitioned Tables and Indexes. Репликация поддерживает секционирование, предоставляя набор свойств, которые указывают, как работать с секционированными таблицами и индексами.
Свойства статьи для репликации слиянием и репликации транзакций
В таблице перечислены объекты, применяемые для секционирования данных.
Object | Создан с помощью |
---|---|
Секционированная таблица или индекс | CREATE TABLE или CREATE INDEX |
Функция секционирования | CREATE PARTITION FUNCTION |
Схема секционирования | CREATE PARTITION SCHEME |
Свойства секционирования — это параметры схемы статьи, определяющие, следует ли копировать объекты секционирования в экземпляр подписчика. Эти параметры схемы могут быть установлены следующими способами.
На странице Свойства статьи мастера создания публикаций или в диалоговом окне «Свойства публикации». Чтобы копировать объекты, перечисленные в предыдущей таблице, задайте значение true для свойств Копировать схемы секционирования таблиц и Копировать схемы секционирования индекса. Сведения о доступе к странице Свойства статьи см. в статье Просмотр и изменение свойств публикации.
С помощью параметра schema_option одной из следующих хранимых процедур:
sp_addarticle или sp_changearticle для репликации транзакций;
sp_addmergearticle или sp_changemergearticle для репликации слиянием.
Чтобы копировать объекты, перечисленные в предыдущей таблице, выберите соответствующие значения параметров схемы. Дополнительные сведения об указании параметров схемы см. в разделе Specify Schema Options.
Репликация копирует объекты на подписчик во время начальной синхронизации. Если схема секционирования использует файловые группы, отличные от PRIMARY, эти файловые группы должны существовать на подписчике до начальной синхронизации.
После инициализации подписчика изменения данных распространяются на подписчик и применяются к соответствующим секциям. Однако изменения схемы секционирования не поддерживаются. Репликация транзакций и репликация слиянием не поддерживают репликацию следующих команд: ALTER PARTITION FUNCTION, ALTER PARTITION SCHEME, а также инструкции REBUILD WITH PARTITION команды ALTER INDEX. Изменения, связанные с ними, не будут автоматически реплицироваться на подписчика. Пользователь должен вручную внести соответствующие изменения.
Поддержка переключения секций при репликации
Одно из главных преимуществ секционирования — способность быстро и эффективно перемещать подмножества данных между секциями. Данные перемещаются командой SWITCH PARTITION. По умолчанию, если таблица включена для репликации, операции SWITCH PARTITION блокированы по следующим причинам.
Если данные перемещаются в таблицу или из таблицы, которая существует на издателе, но не на подписчике, издатель и подписчик могут оказаться несогласованными друг с другом. Эта проблема обычно возникает при перемещении данных в промежуточную таблицу или из нее.
Если определение секционированной таблицы отличается на подписчике и издателе, агент распространителя завершит свою работу ошибкой при попытке применить изменения на подписчике.
Несмотря на эти возможные проблемы, переключение секций можно включить при репликации транзакций. Прежде чем включить переключение секций, убедитесь, что все таблицы, участвующие в переключении секций, существуют на издателе и на подписчике и что определения таблиц и разделов совпадают.
Если все секции имеют одинаковую схему на издателях и подписчиках, можно включить параметр allow_partition_switch вместе с replication_partition_switch, что позволит выполнить репликацию только инструкции о переключении секции для подписчика. Можно также включить параметр allow_partition_switch без репликации DDL. Это полезно, когда из раздела требуется убрать сведения за прошлые месяцы, однако сохранить реплицированную секцию в течение следующего года в целях резервного копирования на подписчике.
При включении переключения секций в SQL Server 2008 R2 через текущую версию вам могут также потребоваться операции разбиения и слияния в ближайшем будущем. Перед выполнением операций разделения или слияния секций в реплицированной таблице или таблице с поддержкой CDC убедитесь, что нужная секция не содержит реплицированные команды в режиме ожидания. Также следует учитывать, что при разбиении или слиянии в секции не должны выполняться операции DML. Наличие транзакций, необработанных агентом чтения журнала или заданием отслеживания CDC, или выполнение операций DML в секции реплицируемой таблицы с поддержкой CDC во время выполнения операции разделения или слияния (с использованием одной и той же секции) может привести к ошибке обработки (Ошибка 608. No catalog entry found for partition ID (Запись каталога не обнаружена для идентификатора секции)) агентом чтения журнала или заданием отслеживания CDC. Чтобы исправить эту ошибку, может потребоваться повторная инициализация подписки или отключение отслеживания изменения данных для таблицы или базы данных.
Неподдерживаемые сценарии
При использовании репликации с переключением секций не будут поддерживаться следующие сценарии:
Одноранговая репликация
Одноранговая репликация не поддерживается при переключении секций.
Использование переменных с переключением секций
Использование переменных с переключением секций в таблицах, опубликованных с помощью репликации транзакций или отслеживания измененных данных (CDC), не поддерживается для инструкции ALTER TABLE ... SWITCH TO ... PARTITION ...
.
Например, следующий код переключения секций не будет работать с базой данных, для которой включена функция CDC, или с таблицей А, используемой при публикации транзакций:
DECLARE @SomeVariable INT = $PARTITION.pf_test(10);
ALTER TABLE dbo.TableA
SWITCH TO dbo.TableB
PARTITION @SomeVariable;
Вместо этого переключите секцию напрямую с помощью функции секционирования, как показано в следующем примере:
ALTER TABLE NonPartitionedTable
SWITCH TO PartitionedTable PARTITION $PARTITION.pf_test(10);
Включение переключения секций
Следующие свойства публикации транзакций позволяют пользователям управлять переключением секций в реплицируемой среде.
@allow_partition_switch
. Если его значение равноtrue
, команду SWITCH PARTITION можно выполнять в базе данных публикации.@replicate_partition_switch
определяет, реплицировать ли инструкцию DDL SWITCH PARTITION на подписчик. Этот параметр доступен, если свойство@allow_partition_switch
имеет значениеtrue
.
Эти свойства можно задать с помощью хранимой процедуры sp_addpublication при создании публикации или с помощью процедуры sp_changepublication после создания публикации. Как уже отмечалось, репликация слиянием не поддерживает переключение секций. Чтобы выполнить команду SWITCH PARTITION для таблицы, для которой включена репликация слиянием, удалите эту таблицу из публикации.