Spec-Zone.ru › MySQL 5.7

16.4.1.10 Репликация с различными определениями таблиц на источнике и реплике

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

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

Примечание

Репликация между таблицами, разделёнными по-разному, не поддерживается. См. Раздел 16.4.1.23, «Репликация и Разделение таблиц».

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

16.4.1.10.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 в момент его создания; для получения дополнительной информации см. Раздел 11.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);
16.4.1.10.2 Репликация столбцов с различными типами данных

В идеале, соответствующие столбцы на источнике и реплике одной и той же таблицы должны иметь один и тот же тип данных. Однако это не всегда строго соблюдается, если выполняются определенные условия.

Обычно возможно реплицировать данные из столбца заданного типа в другой столбец того же типа и того же размера или ширины (если применимо) или большего размера. Например, вы можете реплицировать данные из столбца типа CHAR(10) в столбец типа CHAR(10) или из столбца типа CHAR(10) в столбец типа CHAR(25) без проблем. В некоторых случаях также возможно реплицировать данные из столбца одного типа данных (на источнике) в столбец другого типа данных (на реплике); когда тип данных версии столбца на источнике повышается до типа того же размера или большего размера на реплике, это называется повышением атрибута.

Повышение атрибута может использоваться как при репликации на основе инструкций, так и при репликации на основе строк и не зависит от используемого хранилища данных на источнике или реплике. Однако выбор формата ведения журнала влияет на допустимые преобразования типов; подробности обсуждаются позже в этом разделе.

Важно

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

Репликация на основе инструкций. При использовании репликации на основе инструкций можно руководствоваться простым правилом: “Если инструкция, выполняемая на источнике, также успешно выполнится на реплике, то она также должна быть успешно реплицирована”. Другими словами, если инструкция использует значение, совместимое с типом заданного столбца на реплике, то инструкция может быть реплицирована. Например, вы можете вставить любое значение, которое подходит в столбец типа TINYINT, в столбец типа BIGINT; это означает, что даже если вы измените тип столбца типа TINYINT на реплике на BIGINT, любая вставка в этот столбец на источнике, которая проходит успешно, должна также пройти успешно на реплике, так как невозможно иметь законное значение TINYINT, достаточно большое, чтобы превысить размер столбца типа BIGINT.

До MySQL 5.7.1 при использовании репликации на основе инструкций столбцы типа AUTO_INCREMENT должны быть одинаковыми как на источнике, так и на реплике; в противном случае обновления могут быть применены к неправильной таблице на реплике. (Ошибка #12669186)

Репликация на основе строк: повышение и понижение атрибутов. Репликация на основе строк поддерживает повышение и понижение атрибутов между меньшими и большими типами данных. Также можно указать, разрешать ли потери (обрезание) или без потерь преобразования значений понижаемого столбца, как объяснено позже в этом разделе.

Преобразования с потерями и без потерь. В случае, если целевой тип не может представить вставляемое значение, необходимо принять решение о том, как обработать преобразование. Если мы разрешим преобразование, но обрезаем (или иным образом изменяем) исходное значение, чтобы оно «поместилось» в целевой столбец, мы выполним преобразование с потерями. Преобразование, которое не требует обрезки или аналогичных модификаций для помещения исходного значения столбца в целевой столбец, является преобразованием без потерь.

Режимы преобразования типов (переменная slave_type_conversions). Настройка глобальной переменной сервера slave_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

Обрабатывать повышенные целочисленные типы как знаковые, если это возможно, в противном случае как беззнаковые.

[пусто]

Когда slave_type_conversions не задано, повышение или понижение атрибутов не разрешается; это означает, что все столбцы в источнике и целевых таблицах должны иметь одинаковые типы.

Этот режим является по умолчанию.

Когда целочисленный тип повышается, его знаковость не сохраняется. По умолчанию реплика обрабатывает все такие значения как знаковые. Начиная с MySQL 5.7.2, вы можете контролировать это поведение, используя ALL_SIGNED, ALL_UNSIGNED или оба. (Ошибка #15831300) ALL_SIGNED сообщает реплике обрабатывать все повышенные целочисленные типы как знаковые; ALL_UNSIGNED инструктирует ее обрабатывать их как беззнаковые. Указание обоих заставляет реплику обрабатывать значение как знаковое, если это возможно, в противном случае обрабатывать его как беззнаковое; порядок их указания не существенен. Ни ALL_SIGNED, ни ALL_UNSIGNED не оказывают никакого влияния, если хотя бы один из ALL_LOSSY или ALL_NONLOSSY не используется.

Изменение режима преобразования типов требует перезапуска реплики с новым значением slave_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 или оба, возможно только преобразование с потерями.

    Для любого десятичного типа, если значение, которое должно быть сохранено, не может быть помещено в целевой тип, значение округляется вниз в соответствии с правилами округления, определенными для сервера в другом месте документации. Для получения информации о том, как это делается для десятичных типов, см. Раздел 12.21.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-5.7-en/replication-features-differing-tables.html

Spec-Zone.ru

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