Spec-Zone.ru › MySQL 9.2

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

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

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

Примечание

Репликация между таблицами, которые разделены по-разному, не поддерживается. См. Раздел 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' > 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-9.2-en/replication-features-differing-tables.html

Spec-Zone.ru

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