Spec-Zone.ru › MySQL 8.4

19.5.1.9 Репликация с различающимися определениями таблиц на источнике и реплике

  • 19.5.1.9.1 Репликация со столбцами, которых больше на источнике или реплике
  • 19.5.1.9.2 Репликация столбцов с разными типами данных

Источник и целевая таблицы для репликации не должны быть идентичными. Таблица на источнике может иметь больше или меньше столбцов, чем её копия на реплике. Кроме того, соответствующие столбцы таблиц на источнике и реплике могут использовать разные типы данных, при соблюдении определенных условий.

Примечание

Репликация между таблицами, которые различаются по разбиению, не поддерживается. См. Раздел 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' > M, старшие биты столбца BIT(M') очищаются (устанавливаются в ноль), а M бит значения BIT(M) устанавливаются как младшие биты столбца BIT(M').

    При вставке значения из исходного столбца BIT(M) в целевой столбец BIT(M'), где M' < M, назначается максимальное возможное значение для столбца BIT(M'); другими словами, целевому столбцу назначавается значение “все установленные”.

Преобразования между типами, не указанными в предыдущем списке, запрещены.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/replication-features-differing-tables.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API