MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  ソースとレプリカで異なるテーブル定義を使用したレプリケーション

17.5.1.9 ソースとレプリカで異なるテーブル定義を使用したレプリケーション

レプリケーションのソースおよびターゲットテーブルは同じである必要はありません。 ソース上のテーブルには、テーブルのレプリカコピーより多いカラムまたは少ないカラムを含めることができます。 また、ソースおよびレプリカ上の対応するテーブルのカラムでは、特定の条件に応じて異なるデータ型を使用できます。

注記

パーティション化が異なるテーブル間のレプリケーションはサポートされていません。 セクション17.5.1.24「レプリケーションおよびパーティション化」を参照してください。

ソーステーブルとターゲットテーブルの定義が同じではない場合、データベースとテーブルの名前はソースとレプリカの両方で同じである必要があります。 次の 2 つのセクションで、追加条件について例を示して説明します。

17.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 はレプリカで許可されています。これは、両方のバージョンのテーブル t に共通のカラム c1c2 および c3 が、異なるカラムの前に両方のバージョンのテーブルでグループ化されたままであるためです。

    ただし、レプリケーションを中断させないかぎり、次の ALTER TABLE ステートメントはレプリカで実行できません:

    ALTER TABLE t ADD COLUMN cnew2 INT AFTER c2;

    新しいカラム cnew2 は両方のバージョンの t に共通のカラムの間にあるため、示されている ALTER TABLE ステートメントのレプリカでの実行後にレプリケーションが失敗します。

  • カラム数の多いバージョンのテーブルの追加カラムごとに、デフォルト値が必要です。

    カラムのデフォルト値は、その型、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);

次のテーブル定義は、レプリカバージョンのテーブルにソースバージョンと比較して追加のカラムがあり、2 つのバージョンのテーブルで共通カラム c2 に異なるデータ型が使用されているため、失敗します:

source> CREATE TABLE t1 (c1 INT, c2 BIGINT);
replica>  CREATE TABLE t1 (c1 INT, c2 INT, c3 INT);
17.5.1.9.2 データ型が異なるカラムのレプリケーション

ソース上の対応するカラムと同じテーブルのレプリカコピーは、同じデータ型であることが理想的です。 ただし、特定の条件が満たされているかぎり、これは必ずしも厳密には強制されません。

通常、特定のデータ型のカラムから、同じサイズまたは幅 (該当する場合) またはそれ以上の同じ型の別のカラムにレプリケートできます。 たとえば、CHAR(10) カラムから別の CHAR(10) に、または CHAR(10) カラムから CHAR(25) カラムに、問題なく複製できます。 場合によっては、あるデータ型 (ソース上) を持つカラムから (レプリカ上の) 異なるデータ型を持つカラムにレプリケートすることもできます。ソースバージョンのカラムのデータ型がレプリカ上で同じサイズ以上の型に昇格される場合、これは属性プロモーションと呼ばれます。

属性昇格は、ステートメントベースと行ベースの両方のレプリケーションで使用でき、ソースまたはレプリカで使用されるストレージエンジンには依存しません。 ただし、ロギング形式の選択は許可される型変換に影響します。詳細は、このセクションで後述します。

重要

ステートメントベースまたは行ベースのレプリケーションのどちらを使用する場合でも、属性昇格を採用する場合は、テーブルのレプリカコピーにソースコピーより多くのカラムを含めることはできません。

ステートメントベースのレプリケーション.  ステートメントベースレプリケーションを使用する場合、従うべき簡単な経験則は「ソースで実行されたステートメントもレプリカで正常に実行される場合は、正常にレプリケートする必要もあります」です。 つまり、レプリカ上の特定のカラムの型と互換性のある値がステートメントで使用されている場合は、そのステートメントをレプリケートできます。 たとえば、TINYINT カラムに収まる任意の値を BIGINT カラムに挿入することもできます。テーブルのレプリカコピーの TINYINT カラムのタイプを BIGINT に変更した場合でも、成功したソースのそのカラムへの挿入もレプリカで成功する必要があります。これは、BIGINT カラムを超える有効な TINYINT 値を持つことができないためです。

行ベースレプリケーション: 属性の昇格と降格.  行ベースのレプリケーションでは、小さいデータ型と大きいデータ型の間の属性昇格および降格がサポートされています。 このセクションで後述するように、降格されるカラム値の不可逆 (切り捨て) または非不可逆変換を許可するかどうかを指定することもできます。

不可逆および非不可逆変換.  ターゲット型が挿入される値を表現できない場合、変換をどのように扱うかについての決定が必要になります。 変換を許可するけれども、ターゲットカラムで適合を実現するためにソース値を切り捨てる (または変更する) 場合、不可逆変換と呼ばれることを行います。 ソースカラム値をターゲットカラムに適合させるために切り捨てまたは同様の変更を必要としない変換は、非不可逆変換です。

型変換モード.  slave_type_conversions グローバルサーバー変数の設定によって、レプリカで使用される型変換モードが制御されます。 この変数は、レプリカタイプ変換動作に対する各モードの影響を説明する次のリストから一連の値を取得します:

ALL_LOSSY

このモードでは、情報の損失を意味する型変換が許可されます。

これは非不可逆変換が許可されることを暗示せず、不可逆変換を必要とするまたは変換をまったく必要としないケースのみが許可されることだけを暗示します。たとえば、このモードのみを有効にした場合、INT カラムが TINYINT に変換されること (不可逆変換) は許可されますが、TINYINT カラムが INT カラムに変換されること (非不可逆) は許可されません。 この場合、後者の変換を試みると、レプリカでエラーが発生してレプリケーションが停止します。

ALL_NON_LOSSY

このモードは、ソース値の切り捨てまたは特別処理を必要とない変換を許可します。すなわち、ターゲット型の範囲がソース型より広い変換を許可します。

このモードを設定することは、不可逆変換が許可されるかどうかに関係ありません。これは ALL_LOSSY モードで制御されます。 ALL_NON_LOSSY のみが設定され、ALL_LOSSY は設定されていない場合、データ (INT から TINYINTCHAR(25) から VARCHAR(20) など) が失われる原因となる変換を試みると、レプリカはエラーで停止します。

ALL_LOSSY,ALL_NON_LOSSY

このモードが設定されると、サポートされるすべての型変換が、不可逆変換かどうかにかかわらず、許可されます。

ALL_SIGNED

昇格される整数型を符号付き値として扱います (デフォルト動作)。

ALL_UNSIGNED

昇格される整数型を符号なし値として扱います。

ALL_SIGNED,ALL_UNSIGNED

昇格される整数型を、可能な場合符号付きとして、そうでない場合は符号なしとして扱います。

[empty]

slave_type_conversions が設定されていなときは、属性の昇格または降格は許可されません。これは、ソースおよびターゲットテーブル内のすべてのカラムが同じ型である必要があることを意味します。

このモードがデフォルトです。

整数型が昇格されるときに、符号ありか符号なしかは保持されません。 デフォルトでは、レプリカはこのような値をすべて符号付きとして扱います。 この動作は、ALL_SIGNEDALL_UNSIGNED、またはその両方を使用して制御できます。 ALL_SIGNED は、昇格されたすべての整数型を符号付きとして処理するようレプリカに指示します。ALL_UNSIGNED は、これらを符号なしとして処理するように指示します。 両方を指定すると、レプリカは可能であれば値を符号付きとして処理し、それ以外の場合は符号なしとして処理します。リストされる順序は重要ではありません。 少なくとも ALL_LOSSY または ALL_NONLOSSY のいずれかが使用されていない場合は、ALL_SIGNEDALL_UNSIGNED も効果を持ちません。

タイプ変換モードを変更するには、新しい slave_type_conversions 設定でレプリカを再起動する必要があります。

サポートされる変換.  違うけれども似ているデータ型の間でサポートされる変換を次のリストに示します。

  • 整数型 TINYINTSMALLINTMEDIUMINTINT、および BIGINT のいずれかの間。

    これには、これらの型の符号付きおよび符号なしバージョンの間の変換が含まれます。

    不可逆変換は、ソース値をターゲットカラムで許可される最大値 (または最小値) に切り捨てることで行われます。 符号なし型から符号付き型への変換時に非可逆変換を保証するには、ターゲットカラムがソースカラムの値の範囲を収容できる十分な大きさである必要があります。 たとえば、TINYINT UNSIGNED は、非不可逆に SMALLINT に降格できますが、TINYINT にはできません。

  • 小数点型 DECIMALFLOATDOUBLE、および NUMERIC のいずれかの間。

    FLOAT から DOUBLE へは非不可逆変換です。DOUBLE から FLOAT へは不可逆にしか扱えません。 D' >= D および (M'-D') >= (M-D) が非可逆的である DECIMAL(M,D) から DECIMAL(M',D') への変換。M' < MD' < D、またはその両方の場合、不可逆変換のみ実行できます。

    いずれかの小数点型の場合、格納される値をターゲット型に適合させることができない場合は、このマニュアルのほかの場所でサーバーに定義される丸めルールに従って値が切り捨てられます。 小数点型でこれがどのように実行されるかについては、セクション12.25.4「丸め動作」を参照してください。

  • 文字列型 CHARVARCHAR、および TEXT のいずれかの間 (異なる幅の間での変換を含む)。

    CHARVARCHAR、または TEXT から、同じまたはそれより大きいサイズの CHARVARCHAR、または TEXT カラムへの変換は、決して不可逆ではありません。 不可逆変換は、レプリカに文字列の最初の N 文字のみを挿入することで処理されます。ここで、N はターゲットカラムの幅です。

    重要

    異なる文字セットを使用するカラム間のレプリケーションはサポートされません。

  • バイナリデータ型 BINARYVARBINARY、および BLOB のいずれかの間 (異なる幅の間での変換を含む)。

    BINARYVARBINARY、または BLOB から、同じまたはそれより大きいサイズの BINARYVARBINARY、または BLOB カラムへの変換は、決して不可逆ではありません。 不可逆変換は、レプリカに文字列の最初の N バイトのみを挿入することで処理されます。ここで、N はターゲットカラムの幅です。

  • 任意の 2 つのサイズの任意の 2 つの BIT カラムの間。

    BIT(M) カラムからの値を BIT(M') カラムに挿入するときは (M' > M)、BIT(M') カラムの最上位ビットがクリアされ (ゼロに設定され)、BIT(M) 値の M ビットが BIT(M') カラムの最下位ビットとして設定されます。

    ソース BIT(M) カラムからの値をターゲット BIT(M') カラムに挿入するときは (M' < M)、BIT(M') カラムの可能な最大値が割り当てられます。つまり、すべてが設定された値がターゲットカラムに割り当てられます。

前のリストにない型の間の変換は許可されません。


関連キーワード:  カラム, テーブル, ソース, INT, 変換, TABLE, 定義, 不可逆, CREATE, ALL