レプリケーションのソースおよびターゲットテーブルは同じである必要はありません。 ソース上のテーブルには、テーブルのレプリカコピーより多いカラムまたは少ないカラムを含めることができます。 また、ソースおよびレプリカ上の対応するテーブルのカラムでは、特定の条件に応じて異なるデータ型を使用できます。
パーティション化が異なるテーブル間のレプリケーションはサポートされていません。 セクション17.5.1.24「レプリケーションおよびパーティション化」を参照してください。
ソーステーブルとターゲットテーブルの定義が同じではない場合、データベースとテーブルの名前はソースとレプリカの両方で同じである必要があります。 次の 2 つのセクションで、追加条件について例を示して説明します。
テーブルのソースコピーとレプリカコピーのカラム数が異なるように、次の条件に従ってソースからレプリカにテーブルをレプリケートできます:
両方のバージョンのテーブルに共通するカラムは、ソースとレプリカで同じ順序で定義する必要があります。 (これは、両方のテーブルのカラム数が同じ場合でも当てはまります。)
-
両方のバージョンのテーブルに共通するカラムは、追加カラムの前に定義する必要があります。
これは、次の例に示すように、両方のテーブルに共通するカラムの範囲内のテーブルに新しいカラムが挿入されるレプリカで
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
に共通のカラムc1
、c2
および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);
ソース上の対応するカラムと同じテーブルのレプリカコピーは、同じデータ型であることが理想的です。 ただし、特定の条件が満たされているかぎり、これは必ずしも厳密には強制されません。
通常、特定のデータ型のカラムから、同じサイズまたは幅 (該当する場合) またはそれ以上の同じ型の別のカラムにレプリケートできます。 たとえば、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
からTINYINT
、CHAR(25)
からVARCHAR(20)
など) が失われる原因となる変換を試みると、レプリカはエラーで停止します。 - ALL_LOSSY,ALL_NON_LOSSY
このモードが設定されると、サポートされるすべての型変換が、不可逆変換かどうかにかかわらず、許可されます。
- ALL_SIGNED
昇格される整数型を符号付き値として扱います (デフォルト動作)。
- ALL_UNSIGNED
昇格される整数型を符号なし値として扱います。
- ALL_SIGNED,ALL_UNSIGNED
昇格される整数型を、可能な場合符号付きとして、そうでない場合は符号なしとして扱います。
- [empty]
-
slave_type_conversions
が設定されていなときは、属性の昇格または降格は許可されません。これは、ソースおよびターゲットテーブル内のすべてのカラムが同じ型である必要があることを意味します。このモードがデフォルトです。
整数型が昇格されるときに、符号ありか符号なしかは保持されません。 デフォルトでは、レプリカはこのような値をすべて符号付きとして扱います。 この動作は、ALL_SIGNED
、ALL_UNSIGNED
、またはその両方を使用して制御できます。 ALL_SIGNED
は、昇格されたすべての整数型を符号付きとして処理するようレプリカに指示します。ALL_UNSIGNED
は、これらを符号なしとして処理するように指示します。 両方を指定すると、レプリカは可能であれば値を符号付きとして処理し、それ以外の場合は符号なしとして処理します。リストされる順序は重要ではありません。 少なくとも ALL_LOSSY
または ALL_NONLOSSY
のいずれかが使用されていない場合は、ALL_SIGNED
も ALL_UNSIGNED
も効果を持ちません。
タイプ変換モードを変更するには、新しい slave_type_conversions
設定でレプリカを再起動する必要があります。
サポートされる変換. 違うけれども似ているデータ型の間でサポートされる変換を次のリストに示します。
-
整数型
TINYINT
、SMALLINT
、MEDIUMINT
、INT
、およびBIGINT
のいずれかの間。これには、これらの型の符号付きおよび符号なしバージョンの間の変換が含まれます。
不可逆変換は、ソース値をターゲットカラムで許可される最大値 (または最小値) に切り捨てることで行われます。 符号なし型から符号付き型への変換時に非可逆変換を保証するには、ターゲットカラムがソースカラムの値の範囲を収容できる十分な大きさである必要があります。 たとえば、
TINYINT UNSIGNED
は、非不可逆にSMALLINT
に降格できますが、TINYINT
にはできません。 -
小数点型
DECIMAL
、FLOAT
、DOUBLE
、およびNUMERIC
のいずれかの間。FLOAT
からDOUBLE
へは非不可逆変換です。DOUBLE
からFLOAT
へは不可逆にしか扱えません。
およびD'
>=D
(
) が非可逆的であるM'
-D'
) >= (M
-D
DECIMAL(
からM
,D
)DECIMAL(
への変換。M'
,D'
)
、M'
<M
、またはその両方の場合、不可逆変換のみ実行できます。D'
<D
いずれかの小数点型の場合、格納される値をターゲット型に適合させることができない場合は、このマニュアルのほかの場所でサーバーに定義される丸めルールに従って値が切り捨てられます。 小数点型でこれがどのように実行されるかについては、セクション12.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 つのサイズの任意の 2 つの
BIT
カラムの間。BIT(
カラムからの値をM
)BIT(
カラムに挿入するときは (M'
)
)、M'
>M
BIT(
カラムの最上位ビットがクリアされ (ゼロに設定され)、M'
)BIT(
値のM
)M
ビットがBIT(
カラムの最下位ビットとして設定されます。M'
)ソース
BIT(
カラムからの値をターゲットM
)BIT(
カラムに挿入するときは (M'
)
)、M'
<M
BIT(
カラムの可能な最大値が割り当てられます。つまり、「すべてが設定された」値がターゲットカラムに割り当てられます。M'
)
前のリストにない型の間の変換は許可されません。