スキーマ移行を実行するか、増分 DDL 文 CREATE TABLE を同期する場合、データ転送サービスはデータ移行タスクの実際の状況に基づいて対応するメカニズムを提供します。
背景
データ移行タスクのフォワード スイッチオーバー フェーズに進む前に、このトピックのガイダンスに従って、データ移行タスクのタイプに基づいて非表示カラムと一意なインデックスを手動で削除できます。
非表示カラムと一意なインデックスを手動で削除していない場合、データ転送サービスはフォワード スイッチオーバー フェーズでデータ移行タスクのタイプに基づいて非表示カラムと一意なインデックスを自動的に削除します。
Oracle データベースから OceanBase Database の Oracle テナントにデータを移行する場合、[移行オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスはターゲット データベースのすべてのテーブルに非表示カラムを追加し、非表示カラムに基づいて一意なインデックスを作成します。これらのカラムとインデックスは、フォワード スイッチオーバー フェーズで自動的に削除されます。タスクの作成方法の詳細については、「Oracle データベースから OceanBase Database の Oracle テナントにデータを移行する」をご参照ください。
データ転送サービスは、
CREATE TABLE文に非表示カラムを自動的に追加します。次に例を示します。CREATE TABLE "table1" ( "S1" NVARCHAR2(2) NOT NULL, "S2" NVARCHAR2(20) DEFAULT 'Default value field', "OMS_OBJECT_NUMBER" NUMBER INVISIBLE, "OMS_RELATIVE_FNO" NUMBER INVISIBLE, "OMS_BLOCK_NUMBER" NUMBER INVISIBLE, "OMS_ROW_NUMBER" NUMBER INVISIBLE );次の表に示すデータ移行タスクの場合、一意なキーのないテーブルの移行を確実にするために、データ転送サービスはターゲットの対応するテーブルに非表示カラムを追加し、非表示カラムに基づいて一意なインデックスを作成します。これらの非表示カラムとインデックスは、フォワード スイッチオーバー フェーズで自動的に削除されます。
ソース
ターゲット
参照
OceanBase Database の MySQL テナント
OceanBase Database の MySQL テナント
OceanBase Database の Oracle テナント
OceanBase Database の Oracle テナント
OceanBase Database の Oracle テナント
Oracle データベース
OceanBase Database の MySQL テナント
OceanBase Database の Oracle テナント
OceanBase Database の Oracle テナント
OceanBase Database の MySQL テナント
OceanBase Database の MySQL テナント間でデータを移行または同期する場合、[移行オプション] または [同期オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスは
CREATE TABLE文に非表示カラム、非表示カラムのコメント、および一意なインデックスを自動的に追加します。// パーティショニングキーカラムのないテーブルに非表示カラムと一意なインデックスを作成します。 create table `table2` ( `c1` binary(1), `OMS_PK_INCRMT` bigint COMMENT 'OMS のデータ移行タスク用に予約されています', UNIQUE KEY `UK_table2_OBPK_INCRMT` (`OMS_PK_INCRMT`) ); // パーティショニングキーカラムのあるテーブルに非表示カラムと一意なインデックスを作成します。 create table `partlistcolumns_key_nopri` ( `col1` int(11), `col2` decimal(10,2), `col3` decimal(10,2), `col4` bit(1), `col5` tinyint(4), `col6` smallint(6), `OMS_PK_INCRMT` bigint COMMENT 'OMS のデータ移行タスク用に予約されています', UNIQUE KEY `UK_partlistcolumns_key_nopri_OBPK_INCRMT` (`col1`,`col6`, `OMS_PK_INCRMT`) LOCAL ) default charset=utf8mb4 default collate=utf8mb4_general_ci PARTITION BY LIST COLUMNS (col1) SUBPARTITION BY KEY (col6) subpartition template ( SUBPARTITION `p0`, SUBPARTITION `p1`, SUBPARTITION `p2`, SUBPARTITION `p3` ) ( PARTITION `p1` VALUES IN (1), PARTITION `p2` VALUES IN (2), PARTITION `p3` VALUES IN (3), PARTITION `p4` VALUES IN (4) );OceanBase Database の Oracle テナント間でデータを移行または同期する場合、[移行オプション] または [同期オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスは
CREATE TABLE文に非表示カラムを自動的に追加します。CREATE TABLE "table4" ( "V1" CHAR(20 BYTE) DEFAULT 'test', "OMS_PK_INCRMT" NUMBER INVISIBLE );OceanBase Database の Oracle テナントから Oracle データベースにデータを移行する場合、[移行オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスは
CREATE TABLE文に非表示カラムを自動的に追加します。// Oracle Database 12c より前のバージョン CREATE TABLE "table3" ( "id" NUMBER, "status" VARCHAR2(1 BYTE), "OMS_PK_INCRMT" NUMBER ); // Oracle Database 12c 以降 CREATE TABLE "table3" ( "id" NUMBER, "status" VARCHAR2(1 BYTE), "OMS_PK_INCRMT" NUMBER INVISIBLE );
使用上の注意
"{partition_col_0}"または`{partition_col_0}`は、テーブルパーティショニングキーカラムを示します。このようなフィールドは複数存在する可能性があります。"{partition_col_0}", "{partition_col_1}", "{partition_col_2}"または`{partition_col_0}`, `{partition_col_1}`, `{partition_col_2}`など、フィールドをカンマ (,) で区切ります。{schema}、{table}、{partition_col_0}、および {partition_col_1} は、それぞれデータベース名、テーブル名、およびパーティショニングキーカラム名のプレースホルダーです。
Oracle データベースから OceanBase Database の Oracle テナントへのデータ移行
Oracle データベースから OceanBase Database の Oracle テナントにデータを移行する場合、データ転送サービスはプライマリキーを持つテーブルに非表示カラムを追加し、一意なインデックスを作成します。
プライマリキーまたは NULL 以外のユニークキーがないテーブルの場合、移行タスクの構成中に [はい]null以外のユニークキーがないテーブルに非表示の列を追加する 内の [詳細オプション] セクション で[移行オプション] ページの 移行タスクの構成中。 に を選択した場合は、データ転送サービスによってテーブルに非表示カラムと一意なインデックスが自動的に追加されます。

非表示カラムを追加する
ALTER TABLE "{schema}"."{table}" ADD "OMS_OBJECT_NUMBER" NUMBER INVISIBLE; ALTER TABLE "{schema}"."{table}" ADD "OMS_RELATIVE_FNO" NUMBER INVISIBLE; ALTER TABLE "{schema}"."{table}" ADD "OMS_BLOCK_NUMBER" NUMBER INVISIBLE; ALTER TABLE "{schema}"."{table}" ADD "OMS_ROW_NUMBER" NUMBER INVISIBLE;一意なインデックスを追加する
// パーティショニングキーカラムが使用可能です。 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OMS_ROWID" ON "{schema}"."{table}" ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER", "{partition_col_0}", "{partition_col_1}") LOCAL; // パーティショニングキーカラムは使用できません。 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OMS_ROWID" ON "{schema}"."{table}" ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER");一意なインデックスを削除する
DROP INDEX "{schema}"."UK_{table}_OMS_ROWID";非表示カラムを削除する
ALTER TABLE "{schema}"."{table}" DROP ("OMS_OBJECT_NUMBER", "OMS_RELATIVE_FNO", "OMS_BLOCK_NUMBER", "OMS_ROW_NUMBER");
OceanBase Database の MySQL テナント間でのデータ移行または同期
OceanBase Database の MySQL テナント間でデータを移行または同期する場合、[移行オプション] または [同期オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスはプライマリキーまたは NULL 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

次のコマンドを実行して、テーブルにユニークキーがあるかどうかを確認できます。{schema} と {table} を実際のデータベース名とテーブル名にそれぞれ置き換えます。結果が返されない場合、テーブルにはユニークキーがありません。
SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA = {schema} AND TABLE_NAME = {table} GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME HAVING count(1) = count(IF(upper(nullable) != 'YES' and NON_UNIQUE = 0, 1, NULL));カラムを追加する
ALTER TABLE `{schema}`.`{table}` ADD COLUMN `OMS_PK_INCRMT` BIGINT;一意なインデックスを追加する
// パーティショニングキーカラムが使用可能です。 CREATE UNIQUE KEY `UK_{table}_OBPK_INCRMT` (`{partition_col_0}`, `{partition_col_1}`, `OMS_PK_INCRMT`) LOCAL; // パーティショニングキーカラムは使用できません。 CREATE UNIQUE KEY `UK_{table}_OBPK_INCRMT` (`OMS_PK_INCRMT`);一意なインデックスを削除する
DROP INDEX `UK_{table}_OBPK_INCRMT` ON `{schema}`.`{table}`;カラムを削除する
ALTER TABLE `{schema}`.`{table}` DROP COLUMN `OMS_PK_INCRMT`;
OceanBase Database の Oracle テナント間でのデータ移行または同期
OceanBase Database の Oracle テナント間でデータを移行または同期する場合、[移行オプション] または [同期オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスはプライマリキーまたは NULL 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

次の文を実行して、テーブルにプライマリキーがあるかどうかを確認できます。文中の {schema} と {table} を実際のデータベース名とテーブル名に置き換える必要があります。結果が返されない場合、テーブルにはプライマリキーがありません。
SELECT 1 FROM ( SELECT DC.OWNER, DC.TABLE_NAME, DC.CONSTRAINT_NAME FROM ALL_CONS_COLUMNS DCC JOIN ALL_CONSTRAINTS DC ON DCC.CONSTRAINT_NAME = DC.CONSTRAINT_NAME AND DCC.OWNER = DC.OWNER JOIN ALL_TAB_COLUMNS DTC ON DCC.COLUMN_NAME = DTC.COLUMN_NAME AND DCC.OWNER = DTC.OWNER AND DCC.TABLE_NAME = DTC.TABLE_NAME WHERE DCC.OWNER = {schema} AND DCC.TABLE_NAME = {table} AND DC.CONSTRAINT_TYPE IN ('U', 'P') GROUP BY DC.OWNER, DC.TABLE_NAME, DC.CONSTRAINT_NAME HAVING COUNT(*) = COUNT( CASE DTC.NULLABLE WHEN 'Y' THEN NULL ELSE 1 END ) MINUS SELECT TABLE_OWNER, TABLE_NAME, INDEX_NAME FROM ALL_IND_EXPRESSIONS WHERE TABLE_OWNER = {schema} AND TABLE_NAME = {table} );非表示カラムを追加する
ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER INVISIBLE;一意なインデックスを追加する
// パーティショニングキーカラムが使用可能です。 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OBPK_INCRMT" ON "{schema}"."{table}"("{partition_col_0}", "{partition_col_1}", "OMS_PK_INCRMT") LOCAL; // パーティショニングキーカラムは使用できません。 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OBPK_INCRMT" ON "{schema}"."{table}"("OMS_PK_INCRMT");一意なインデックスを削除する
DROP INDEX "{schema}"."UK_{table}_OBPK_INCRMT";非表示カラムを削除する
ALTER TABLE "{schema}"."{table}" DROP COLUMN "OMS_PK_INCRMT";
OceanBase Database の Oracle テナントから Oracle データベースへのデータ移行
OceanBase Database の Oracle テナントから Oracle データベースにデータを移行する場合、[移行オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスはプライマリキーまたは NULL 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

次の文を実行して、テーブルにプライマリキーがあるかどうかを確認できます。文中の {schema} と {table} を実際のデータベース名とテーブル名に置き換える必要があります。結果が返されない場合、テーブルにはプライマリキーがありません。
SELECT 1 FROM ( SELECT DC.OWNER, DC.TABLE_NAME, DC.CONSTRAINT_NAME FROM ALL_CONS_COLUMNS DCC JOIN ALL_CONSTRAINTS DC ON DCC.CONSTRAINT_NAME = DC.CONSTRAINT_NAME AND DCC.OWNER = DC.OWNER JOIN ALL_TAB_COLUMNS DTC ON DCC.COLUMN_NAME = DTC.COLUMN_NAME AND DCC.OWNER = DTC.OWNER AND DCC.TABLE_NAME = DTC.TABLE_NAME WHERE DCC.OWNER = {schema} AND DCC.TABLE_NAME = {table} AND DC.CONSTRAINT_TYPE IN ('U', 'P') GROUP BY DC.OWNER, DC.TABLE_NAME, DC.CONSTRAINT_NAME HAVING COUNT(*) = COUNT( CASE DTC.NULLABLE WHEN 'Y' THEN NULL ELSE 1 END ) MINUS SELECT TABLE_OWNER, TABLE_NAME, INDEX_NAME FROM ALL_IND_EXPRESSIONS WHERE TABLE_OWNER = {schema} AND TABLE_NAME = {table} );非表示カラムを追加する
// Oracle Database 12c より前のバージョン ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER; // Oracle Database 12c 以降 ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER INVISIBLE;一意なインデックスを追加する
// パーティショニングキーカラムが使用可能です。 CREATE UNIQUE INDEX "{schema}"."{table}" ON "{schema}"."{table}"("{partition_col_0}", "{partition_col_1}", "OMS_PK_INCRMT") LOCAL; // パーティショニングキーカラムは使用できません。 CREATE UNIQUE INDEX "{schema}"."{table}" ON "{schema}"."{table}"("OMS_PK_INCRMT");一意なインデックスを削除する
DROP INDEX "{schema}"."{table}";非表示カラムを削除する
ALTER TABLE "{schema}"."{table}" DROP COLUMN "OMS_PK_INCRMT";
OceanBase Database で MySQL テナントから Oracle テナントにデータを同期する
OceanBase Database で MySQL テナントから Oracle テナントにデータを同期する場合、[同期オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスはプライマリキーまたは NULL 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

次の文を実行して、テーブルにプライマリキーがあるかどうかを確認できます。文中の {schema} と {table} を実際のデータベース名とテーブル名に置き換える必要があります。結果が返されない場合、テーブルにはプライマリキーがありません。
SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA = {schema} AND TABLE_NAME = {table} GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME HAVING count(1) = count(IF(upper(nullable) != 'YES' and NON_UNIQUE = 0, 1, NULL));非表示カラムを追加する
ALTER TABLE "{schema}"."{table}" ADD "OMS_PK_INCRMT" NUMBER INVISIBLE;一意なインデックスを追加する
// パーティショニングキーカラムが使用可能です。 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OBPK_INCRMT" ON "{schema}"."{table}"("{partition_col_0}", "{partition_col_1}", "OMS_PK_INCRMT") LOCAL; // パーティショニングキーカラムは使用できません。 CREATE UNIQUE INDEX "{schema}"."UK_{table}_OBPK_INCRMT" ON "{schema}"."{table}"("OMS_PK_INCRMT");一意なインデックスを削除する
DROP INDEX "{schema}"."UK_{table}_OBPK_INCRMT";非表示カラムを削除する
ALTER TABLE "{schema}"."{table}" DROP COLUMN "OMS_PK_INCRMT";
OceanBase Database で Oracle テナントから MySQL テナントにデータを同期する
OceanBase Database で Oracle テナントから MySQL テナントにデータを同期する場合、[同期オプション] ページの [詳細オプション] セクションで [NULL 以外のユニークキーがないテーブルに非表示カラムを追加する] に [はい] を選択した場合、データ転送サービスはプライマリキーまたは NULL 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

次の文を実行して、テーブルにプライマリキーがあるかどうかを確認できます。文中の {schema} と {table} を実際のデータベース名とテーブル名に置き換える必要があります。結果が返されない場合、テーブルにはプライマリキーがありません。
SELECT 1 FROM ( SELECT DC.OWNER, DC.TABLE_NAME, DC.CONSTRAINT_NAME FROM ALL_CONS_COLUMNS DCC JOIN ALL_CONSTRAINTS DC ON DCC.CONSTRAINT_NAME = DC.CONSTRAINT_NAME AND DCC.OWNER = DC.OWNER JOIN ALL_TAB_COLUMNS DTC ON DCC.COLUMN_NAME = DTC.COLUMN_NAME AND DCC.OWNER = DTC.OWNER AND DCC.TABLE_NAME = DTC.TABLE_NAME WHERE DCC.OWNER = {schema} AND DCC.TABLE_NAME = {table} AND DC.CONSTRAINT_TYPE IN ('U', 'P') GROUP BY DC.OWNER, DC.TABLE_NAME, DC.CONSTRAINT_NAME HAVING COUNT(*) = COUNT( CASE DTC.NULLABLE WHEN 'Y' THEN NULL ELSE 1 END ) MINUS SELECT TABLE_OWNER, TABLE_NAME, INDEX_NAME FROM ALL_IND_EXPRESSIONS WHERE TABLE_OWNER = {schema} AND TABLE_NAME = {table} );非表示カラムを追加する
ALTER TABLE `{schema}`.`{table}` ADD COLUMN `oms_pk_incrmt` BIGINT;一意なインデックスを追加する
// パーティショニングキーカラムが使用可能です。 CREATE UNIQUE KEY `uk_{table}_obpk_incrmt` (`{partition_col_0}`, `{partition_col_1}`, `oms_pk_incrmt`) LOCAL; // パーティショニングキーカラムは使用できません。 CREATE UNIQUE KEY `uk_{table}_obpk_incrmt` (`oms_pk_incrmt`);一意なインデックスを削除する
DROP INDEX `uk_{table}_obpk_incrmt` ON `{schema}`.`{table}`;非表示カラムを削除する
ALTER TABLE `{schema}`.`{table}` DROP COLUMN `oms_pk_incrmt`;