相关文章推荐
时尚的企鹅  ·  c++ openssl https ...·  1 年前    · 
跑龙套的手链  ·  less-loader ...·  1 年前    · 

数据传输进行结构迁移或同步增量 CREATE TABLE DDL 时,会根据数据迁移项目的实际情况,提供相应的机制。

背景信息

如果您在运行数据迁移项目时,进入了正向切换步骤,数据传输会根据数据迁移项目的类型,自动删除隐藏列和唯一索引:

  • 迁移 Oracle 数据库的数据至 OceanBase 数据库 Oracle 租户时,数据传输将在目标端为全部表对象增加隐藏列,并基于隐藏列创建唯一索引,对应的列和索引将在正向切换步骤被自动移除。新建数据迁移项目的详情请参见 迁移 Oracle 数据库的数据至 OceanBase 数据库

  • 迁移 OceanBase 数据库的数据至 OceanBase 数据库时,为了支持无唯一键表迁移,数据传输将在目标端为对应表增加隐藏列,并基于隐藏列创建唯一索引,对应的列和索引将在正向切换步骤被自动移除。新建数据迁移项目的详情请参见 OceanBase 数据库之间的数据迁移

如果您在运行数据迁移项目时,没有进入正向切换步骤,请根据本文不同数据迁移项目的操作,自行删除隐藏列和唯一索引。

前置说明

  • "{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 数据库 Oracle 租户的数据迁移

迁移 Oracle 数据库的数据至 OceanBase 数据库 Oracle 租户时,数据传输不区分是否为无主键表,会统一添加隐藏列和唯一索引。

  • 添加隐藏列

    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 数据库 MySQL 租户之间的数据迁移

迁移 OceanBase 数据库 MySQL 租户的数据至 OceanBase 数据库 MySQL 租户时,数据传输会对无唯一键表添加列和唯一索引。

您可以执行下述命令(其中 {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 INDEX `UK_{table}_OBPK_INCRMT` ON `{schema}`.`{table}` (`{partition_col_0}`, `{partition_col_1}`, `OMS_PK_INCRMT`) LOCAL;
    // 没有分区字段
    CREATE UNIQUE INDEX `UK_{table}_OBPK_INCRMT` ON `{schema}`.`{table}` (`OMS_PK_INCRMT`);
  • 删除唯一索引

    DROP INDEX `UK_{table}_OBPK_INCRMT` ON `{schema}`.`{table}`;
  • 删除列

    ALTER TABLE `{schema}`.`{table}` DROP COLUMN `OMS_PK_INCRMT`;

OceanBase 数据库 Oracle 租户之间的数据迁移

迁移 OceanBase 数据库 Oracle 租户的数据至 OceanBase 数据库 Oracle 租户时,数据传输会对无主键表添加隐藏列和唯一索引。

您可以执行下述命令(其中 {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";