すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB for OceanBase (Deprecated):データ転送サービスの非表示カラムメカニズム

最終更新日:Feb 27, 2025

スキーマ移行を実行するか、増分 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 データベース間でデータを移行する

    OceanBase Database 内の同じタイプのテナント間でデータを同期する

    OceanBase Database の Oracle テナント

    OceanBase Database の Oracle テナント

    OceanBase Database の Oracle テナント

    Oracle データベース

    OceanBase Database の Oracle テナントから Oracle データベースにデータを移行する

    OceanBase Database の MySQL テナント

    OceanBase Database の Oracle テナント

    OceanBase Database 内の異なるタイプのテナント間でデータを同期する

    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以外のユニークキーがないテーブルに非表示の列を追加する 内の [詳細オプション] セクション [移行オプション] ページの 移行タスクの構成中。 に を選択した場合は、データ転送サービスによってテーブルに非表示カラムと一意なインデックスが自動的に追加されます。

image

  • 非表示カラムを追加する

    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 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

image

次のコマンドを実行して、テーブルにユニークキーがあるかどうかを確認できます。{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 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

image

次の文を実行して、テーブルにプライマリキーがあるかどうかを確認できます。文中の {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 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

image

次の文を実行して、テーブルにプライマリキーがあるかどうかを確認できます。文中の {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 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

image

次の文を実行して、テーブルにプライマリキーがあるかどうかを確認できます。文中の {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 以外のユニークキーがないテーブルに非表示カラムと一意なインデックスを自動的に追加します。

image

次の文を実行して、テーブルにプライマリキーがあるかどうかを確認できます。文中の {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`;