19.5.1.9 Репликация с отличающимися определениями таблиц на источнике и реплике
Источник и целевая таблицы для репликации не обязательно должны быть идентичны. Таблица на источнике может содержать больше или меньше столбцов, чем копия таблицы на реплике. Кроме того, соответствующие столбцы таблиц на источнике и реплике могут использовать разные типы данных, при соблюдении определенных условий.
Репликация между таблицами, которые разделены по-разному, не поддерживается. См. Раздел 19.5.1.25, «Репликация и разбиение».
Во всех случаях, когда источник и целевые таблицы не имеют идентичных определений, имена базы данных и таблицы должны быть одинаковыми как на источнике, так и на реплике. Дополнительные условия с примерами обсуждаются в следующих двух разделах.
19.5.1.9.1 Репликация с дополнительными столбцами на источнике или реплике
Вы можете выполнить репликацию таблицы с источника на реплику таким образом, что источник и реплика имеют различное количество столбцов, при соблюдении следующих условий:
Столбцы, общие для обеих версий таблицы, должны быть определены в том же порядке на источнике и на реплике. (Это верно, даже если обе таблицы имеют одинаковое количество столбцов.)
-
Столбцы, общие для обеих версий таблицы, должны быть определены до любых дополнительных столбцов.
Это означает, что выполнение оператора
ALTER TABLEна реплике, где новый столбец вставляется в таблицу в диапазоне столбцов, общих для обеих таблиц, приводит к сбою репликации, как показано в следующем примере:Предположим, что таблица
t, существующая на источнике и реплике, определена следующим операторомCREATE TABLE:CREATE TABLE t ( c1 INT, c2 INT, c3 INT );Предположим, что оператор
ALTER TABLE, показанный здесь, выполняется на реплике:ALTER TABLE t ADD COLUMN cnew1 INT AFTER c3;
Предыдущий оператор
ALTER TABLEразрешен на реплике, потому что столбцыc1,c2иc3, которые являются общими для обеих версий таблицыt, остаются сгруппированными в обеих версиях таблицы, до любых отличающихся столбцов.Однако, следующий оператор
ALTER TABLEне может быть выполнен на реплике без нарушения репликации:ALTER TABLE t ADD COLUMN cnew2 INT AFTER c2;
Репликация завершается сбоем после выполнения на реплике оператора
ALTER TABLE, так как новый столбецcnew2находится между столбцами, общими для обеих версийt. -
Каждый “дополнительный” столбец в версии таблицы, имеющей больше столбцов, должен иметь значение по умолчанию.
Значение по умолчанию столбца определяется несколькими факторами, включая его тип, определен ли он с помощью
DEFAULTопции, объявлен ли он какNULL, и режим SQL сервера, действующий в момент его создания; для получения дополнительной информации см. Раздел 13.6, «Значения по умолчанию типов данных»).
Кроме того, когда копия таблицы на реплике содержит больше столбцов, чем на источнике, каждый общий столбец должен иметь тот же тип данных в обеих таблицах.
Примеры. Следующие примеры иллюстрируют некоторые корректные и некорректные определения таблиц:
Дополнительные столбцы на источнике. Следующие определения таблиц являются корректными и реплицируются без ошибок:
source> CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
replica> CREATE TABLE t1 (c1 INT, c2 INT);
Следующие определения таблиц вызовут ошибку, так как определения общих столбцов в обеих версиях таблицы на реплике имеют другой порядок, чем на источнике:
source> CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
replica> CREATE TABLE t1 (c2 INT, c1 INT);
Следующие определения таблиц также вызовут ошибку, так как определение дополнительного столбца на источнике расположено перед определениями общих столбцов:
source> CREATE TABLE t1 (c3 INT, c1 INT, c2 INT);
replica> CREATE TABLE t1 (c1 INT, c2 INT);
Дополнительные столбцы на реплике. Следующие определения таблиц являются корректными и реплицируются без ошибок:
source> CREATE TABLE t1 (c1 INT, c2 INT);
replica> CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
Следующие определения вызовут ошибку, так как общие столбцы не определены в одинаковом порядке на источнике и реплике:
source> CREATE TABLE t1 (c1 INT, c2 INT);
replica> CREATE TABLE t1 (c2 INT, c1 INT, c3 INT);
Следующие определения таблиц также вызовут ошибку, так как определение дополнительного столбца на реплике расположено перед определениями общих столбцов:
source> CREATE TABLE t1 (c1 INT, c2 INT);
replica> CREATE TABLE t1 (c3 INT, c1 INT, c2 INT);
Следующие определения таблиц некорректны, так как версия таблицы на реплике имеет дополнительные столбцы по сравнению с версией на источнике, и две версии таблицы используют разные типы данных для общего столбца c2:
source> CREATE TABLE t1 (c1 INT, c2 BIGINT);
replica> CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
19.5.1.9.2 Репликация столбцов с разными типами данных
Столбцы в исходной и реплицированной копиях одной таблицы в идеале должны иметь одинаковый тип данных. Однако это требование не всегда строго соблюдается, если выполняются определенные условия.
Обычно можно реплицировать данные из столбца заданного типа данных в другой столбец того же типа и размера или ширины (если применимо) или большего размера. Например, можно реплицировать данные из столбца типа CHAR(10) в другой столбец типа CHAR(10) или из столбца типа CHAR(10) в столбец типа CHAR(25) без проблем. В некоторых случаях также можно реплицировать данные из столбца одного типа данных (в источнике) в столбец другого типа данных (в реплике). Если тип данных столбца в источнике повышен до типа, который имеет тот же или больший размер в реплике, это называется повышением атрибута.
Повышение атрибута можно использовать как при репликации на основе инструкций, так и при репликации на основе строк и не зависит от используемого в источнике или реплике движка хранения. Однако выбор формата логов влияет на разрешенные преобразования типов; подробности обсуждаются позже в этом разделе.
Независимо от того, используете ли вы репликацию на основе инструкций или на основе строк, реплицированная копия таблицы в реплике не может содержать больше столбцов, чем исходная копия, если вы хотите использовать повышение атрибута.
Репликация на основе инструкций. При использовании репликации на основе инструкций простым правилом является: “Если инструкция, выполненная в источнике, также успешно выполнится в реплике, она также должна быть успешно реплицирована”. Другими словами, если инструкция использует значение, совместимое с типом данного столбца в реплике, инструкция может быть реплицирована. Например, вы можете вставить любое значение, которое подходит в столбец типа TINYINT, в столбец типа BIGINT; следует, что даже если вы измените тип столбца типа TINYINT в реплицированной копии таблицы на BIGINT, любая вставка в этот столбец в источнике, которая выполняется успешно, должна выполняться успешно и в реплике, поскольку невозможно иметь законное значение TINYINT, достаточно большое, чтобы превысить размер столбца типа BIGINT.
Репликация на основе строк: повышение и понижение атрибутов. Репликация на основе строк поддерживает повышение и понижение атрибутов между меньшими типами данных и большими типами данных. Также можно указать, разрешить ли потери (обрезание) или безнакладные преобразования значений пониженного столбца, как объясняется позже в этом разделе.
Потери и безнакладные преобразования. В случае, если целевой тип не может представить вставляемое значение, необходимо принять решение о том, как обработать преобразование. Если мы разрешаем преобразование, но обрезаем (или иначе изменяем) исходное значение, чтобы оно соответствовало целевому столбцу, мы выполняем потеренное преобразование. Преобразование, которое не требует обрезки или подобных модификаций для соответствия значения исходного столбца в целевом столбце, является безнакладным преобразованием.
Режимы преобразования типов. Глобальное значение системной переменной replica_type_conversions управляет режимом преобразования типов, используемым в реплике. Эта переменная принимает набор значений из следующего списка, который описывает влияние каждого режима на поведение преобразования типов в реплике:
- ALL_LOSSY
-
В этом режиме разрешены преобразования типов, которые могут привести к потере информации.
Это не означает, что разрешены безнакладные преобразования, а лишь то, что разрешены только случаи, требующие либо потеренных преобразований, либо вообще никакого преобразования; например, включение только этого режима позволяет преобразовать столбец типа
INTвTINYINT(потеренное преобразование), но не столбец типаTINYINTвINT(безнакладное). Попытка последнего преобразования в этом случае приведет к остановке репликации с ошибкой в реплике. - ALL_NON_LOSSY
-
Этот режим разрешает преобразования, которые не требуют обрезки или другой специальной обработки исходного значения; то есть, он разрешает преобразования, где целевой тип имеет более широкий диапазон, чем исходный тип.
Установка этого режима не влияет на то, разрешены ли потеренные преобразования; это контролируется режимом
ALL_LOSSY. Если установлен только режимALL_NON_LOSSY, но неALL_LOSSY, то попытка преобразования, которая приведет к потере данных (например,INTвTINYINTилиCHAR(25)вVARCHAR(20)), приведет к остановке реплики с ошибкой. - ALL_LOSSY,ALL_NON_LOSSY
При установке этого режима разрешены все поддерживаемые преобразования типов, независимо от того, являются ли они потеренными преобразованиями.
- ALL_SIGNED
Обрабатывать повышенные целочисленные типы как знакомые значения (по умолчанию).
- ALL_UNSIGNED
Обрабатывать повышенные целочисленные типы как беззнаковые значения.
- ALL_SIGNED,ALL_UNSIGNED
Обрабатывать повышенные целочисленные типы как знакомые, если это возможно, в противном случае как беззнаковые.
- [пусто]
-
Когда
replica_type_conversionsне установлен, повышение или понижение атрибутов не разрешено; это означает, что все столбцы в исходной и целевых таблицах должны быть одного типа.Этот режим является по умолчанию.
При повышении целочисленного типа его знаковый бит не сохраняется. По умолчанию реплика обрабатывает все такие значения как знакомые. Вы можете управлять этим поведением, используя ALL_SIGNED, ALL_UNSIGNED или оба.
ALL_SIGNED сообщает реплике обрабатывать все повышенные целочисленные типы как знакомые; ALL_UNSIGNED инструктирует обрабатывать их как беззнаковые. Указание обоих заставляет реплику обрабатывать значение как знаковое, если это возможно, в противном случае как беззнаковое; порядок их перечисления не имеет значения.
Ни ALL_SIGNED, ни ALL_UNSIGNED не имеют никакого эффекта, если по крайней мере один из ALL_LOSSY или ALL_NONLOSSY также не используется.
Изменение режима преобразования типов требует перезапуска реплики с новым значением replica_type_conversions.
Поддерживаемые преобразования. Поддерживаемые преобразования между различными, но похожими типами данных показаны в следующем списке:
-
Между любыми целочисленными типами
TINYINT,SMALLINT,MEDIUMINT,INTиBIGINT.Это включает преобразования между знаковыми и беззнаковыми версиями этих типов.
Потери при преобразовании происходят путем усечения исходного значения до максимального (или минимального) значения, разрешенного целевым столбцом. Для обеспечения безпотерь при преобразовании из беззнакового в знаковый тип, целевой столбец должен быть достаточно большим, чтобы вместить диапазон значений в исходном столбце. Например, вы можете без потерь преобразовать
TINYINT UNSIGNEDвSMALLINT, но не вTINYINT. -
Между любыми десятичными типами
DECIMAL,FLOAT,DOUBLEиNUMERIC.Преобразование
FLOATвDOUBLEявляется безпотерьным; преобразованиеDOUBLEвFLOATможет быть выполнено только с потерями. Преобразование изDECIMAL(вM,D)DECIMAL(, гдеM',D')иD'>=D() является безпотерьным; во всех случаях, где присутствуетM'-D') >= (M-D,M'<Mили оба, возможно только преобразование с потерями.D'<DДля любых десятичных типов, если значение, подлежащее хранению, не может быть помещено в целевой тип, значение округляется вниз в соответствии с правилами округления, определенными для сервера в другом месте документации. См. Раздел 14.25.4 «Поведение округления» для получения информации о том, как это выполняется для десятичных типов.
-
Между любыми строковыми типами
CHAR,VARCHARиTEXT, включая преобразования между различными ширинами.Преобразование
CHAR,VARCHARилиTEXTв столбецCHAR,VARCHARилиTEXTтой же или большей длины никогда не происходит с потерями. Преобразование с потерями обрабатывается путем вставки только первыхNсимволов строки на реплике, гдеN- ширина целевого столбца.ВажноРепликация между столбцами, использующими разные наборы символов, не поддерживается.
-
Между любыми типами двоичных данных
BINARY,VARBINARYиBLOB, включая преобразования между различными ширинами.Преобразование
BINARY,VARBINARYилиBLOBв столбецBINARY,VARBINARYилиBLOBтой же или большей длины никогда не происходит с потерями. Преобразование с потерями обрабатывается путем вставки только первыхNбайтов строки на реплике, гдеN- ширина целевого столбца. -
Между любыми 2 столбцами типа
BITлюбой длины.При вставке значения из столбца типа
BIT(в столбец типаM)BIT(, гдеM'), старшие биты столбцаM'>MBIT(обнуляются (устанавливаются в ноль), аM')Mбитов значенияBIT(устанавливаются как младшие биты столбцаM)BIT(.M')При вставке значения из исходного столбца
BIT(в целевой столбецM)BIT(, гдеM'), устанавливается максимально возможное значение для столбцаM'<MBIT(; другими словами, в целевой столбец присваивается значение “все установленные биты”.M')
Преобразования между типами, не указанными в предыдущем списке, запрещены.
© 2025 Oracle
Licensed under the GPLv2 License.