19.5.1.9 Репликация с различающимися определениями таблиц на источнике и реплике
Источник и целевая таблицы для репликации не должны быть идентичными. Таблица на источнике может иметь больше или меньше столбцов, чем её копия на реплике. Кроме того, соответствующие столбцы таблиц на источнике и реплике могут использовать разные типы данных, при соблюдении определенных условий.
Репликация между таблицами, которые различаются по разбиению, не поддерживается. См. Раздел 19.5.1.24, «Репликация и разбиение».
Во всех случаях, когда источник и целевая таблицы не имеют идентичных определений, имена базы данных и таблицы должны быть одинаковыми как на источнике, так и на реплике. Дополнительные условия и примеры обсуждаются в следующих двух разделах.
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.24.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любых 2 размеров.При вставке значения из столбца
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.