首批通过分布式安全可靠测评,为关键业务系统打造
更改复制表属性
更新时间:2026-06-04 13:20:44
OceanBase 数据库中通过 DUPLICATE_SCOPE 参数来指定复制表的属性。表创建成功后,可以通过修改 DUPLICATE_SCOPE 参数的值来实现复制表与普通表之间的相互转换。
使用限制及注意事项
在进行复制表的转换时,如果当前租户有扩缩容、Primary Zone 变更以及 Locality 变更等行为触发了负载均衡任务,则复制表属性的转换任务需要等待当前均衡任务完成。
注意
复制表转换过程是异步的,在手动修改
DUPLICATE_SCOPE后,需要等待后台分区均衡任务完成才可以实际当做目标属性的表使用。更多有关分区均衡的信息,请参见 租户内均衡。由于复制表与表组互斥,在将普通表转换为复制表时,如果待转换的普通表属于某个表组,则该普通表无法转换为复制表。
复制表的转换依赖租户的负载均衡及 Transfer 功能,当租户级配置项
enable_rebalance、enable_transfer以及enable_rereplication中任意一个配置项的值为false即关闭状态时,均无法进行复制表的转换操作。如果修改配置项enable_rebalance、enable_transfer的值为false时,有正在执行的复制表转换任务,则对应的复制表转换任务会被取消。
前提条件
在进行复制表的转换操作前,请确认以下配置项的值已设置为 True:
enable_rebalance租户级配置项
enable_rebalance在系统租户下用于控制是否进行租户间的负载均衡;在用户租户下用于控制是否进行租户内均衡。默认值为True。有关配置项enable_rebalance的详细说明及设置,请参见 enable_rebalance。enable_transfer租户级配置项
enable_transfer用于控制是否在租户下进行 Transfer,默认值为True。有关配置项enable_transfer的详细说明及设置,请参见 enable_transfer。enable_rereplication集群级配置项
enable_rereplication是日志流副本自动迁移复制的总开关。默认值为True。有关配置项enable_rereplication的详细说明及设置,请参见 enable_rereplication。
更改复制表属性语法
更改复制表属性的 SQL 语句如下:
ALTER TABLE table_name DUPLICATE_SCOPE= 'none | cluster';
语句中:
none:表示将当前表转换为普通表。cluster:表示将当前表转换为复制表。
示例
下面的命令展示了如何将一个复制表转换为普通表。
创建复制表
tbl1。obclient [test]> CREATE TABLE tbl1 (c1 int,c2 int) DUPLICATE_SCOPE= 'cluster';将该复制表转换为普通表。
ALTER TABLE tbl1 DUPLICATE_SCOPE= 'none';注意
上面 SQL 语句在修改表属性后会立即返回成功,实际复制表转换动作由后台线程异步执行。
查看表的复制表属性。
通过视图
sys.DBA_OB_TABLE_LOCATIONS可以查看表当前的复制表属性及所在的日志流 ID。其中DUPLICATE_SCOPE列为CLUSTER则表示是复制表,为NONE则表示是普通表。SELECT database_name, table_name, table_id, tablet_id, ls_id, role, duplicate_scope FROM sys.DBA_OB_TABLE_LOCATIONS WHERE table_name = 'TBL1';返回结果如下:
+---------------+------------+----------+-----------+-------+--------+-----------------+ | DATABASE_NAME | TABLE_NAME | TABLE_ID | TABLET_ID | LS_ID | ROLE | DUPLICATE_SCOPE | +---------------+------------+----------+-----------+-------+--------+-----------------+ | SYS | TBL1 | 500011 | 200002 | 1002 | LEADER | NONE | +---------------+------------+----------+-----------+-------+--------+-----------------+ 1 row in set说明
可以根据以下步骤查看复制表转换后分区副本的分布是否符合目标属性。
查看复制表转换进度。
查看日志流的属性。
租户下所有复制表都要放到专门承载复制表的特殊日志流(广播日志流)上。过视图
sys.DBA_OB_LS可以查看日志流的属性。其中FLAG列包含DUPLICATE表示为广播日志流。FLAG为空或者不包含DUPLICATE则表示为普通日志流。SELECT * FROM sys.DBA_OB_LS WHERE LS_ID = 1002;返回结果如下:
+-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+-----------+ | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN | DROP_SCN | SYNC_SCN | READABLE_SCN | FLAG | UNIT_LIST | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+-----------+ | 1002 | NORMAL | zone1 | 0 | 0 | 1713164474213079001 | NULL | 1713173927933707000 | 1713173927933707000 | DUPLICATE | | +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+-----------+ 1 row in set判断是否需要生成复制表转换任务。
复制表转换任务通过后台负载均衡及 Transfer 模块生成。可以通过以下语句,快速判断是否需要生成复制表转换任务。其中
DUPLICATE_SCOPE是表的属性,FLAG是当前表的tablet所属 LS 的属性。FLAG中包含DUPLICATE则代表广播日志流。SELECT A.duplicate_scope, B.flag FROM sys.DBA_OB_TABLE_LOCATIONS A, sys.DBA_OB_LS B WHERE A.ls_id = B.ls_id AND A.table_name = 'TBL1' AND A.role = 'LEADER';返回结果如下:
+-----------------+-----------+ | DUPLICATE_SCOPE | FLAG | +-----------------+-----------+ | NONE | DUPLICATE | +-----------------+-----------+ 1 row in set返回信息解释如下:
DUPLICATE_SCOPE为NONE,FLAG包含DUPLICATE:非复制表在广播日志流上,需要生成复制表转普通表的任务,将非复制表从广播日志流 Transfer 到普通日志流。DUPLICATE_SCOPE为NONE,FLAG不包含DUPLICATE:复制表在普通日志流上,需要生成普通表转复制表任务,将复制表从普通日志流 Transfer 到广播日志流上。
立即生成转换任务。
可以通过临时调小配置项
partition_balance_schedule_interval,立即生成转换任务。ALTER SYSTEM SET partition_balance_schedule_interval = '30s';查看复制表转换任务。
复制表转换生成的任务可以通过相关视图
DBA/CDB_OB_BALANCE_JOB_HISTORY和DBA/CDB_OB_BALANCE_JOBS进行查看。查看历史转换任务执行情况。
如果没有历史记录,则可能正在执行或还未生成任务。
SELECT * FROM sys.DBA_OB_BALANCE_JOB_HISTORY;返回结果如下:
+--------+------------------------------+------------------------------+-------------------+-------------------+-----------------+-------------------------+-----------+---------+ | JOB_ID | CREATE_TIME | FINISH_TIME | BALANCE_STRATEGY | JOB_TYPE | TARGET_UNIT_NUM | TARGET_PRIMARY_ZONE_NUM | STATUS | COMMENT | +--------+------------------------------+------------------------------+-------------------+-------------------+-----------------+-------------------------+-----------+---------+ | 787926 | 15-APR-24 05.41.42.226172 PM | 15-APR-24 05.41.52.235808 PM | partition balance | PARTITION_BALANCE | 1 | 1 | COMPLETED | NULL | +--------+------------------------------+------------------------------+-------------------+-------------------+-----------------+-------------------------+-----------+---------+ 1 row in set查看当前均衡任务执行情况。
SELECT * FROM sys.DBA_OB_BALANCE_JOBS;查看转换任务对应的子任务(包含分区列表)
将上述任务对应
job_id填入下面 SQL 语句中:SELECT * FROM sys.DBA_OB_BALANCE_TASKS WHERE JOB_ID = xxxx;SELECT * FROM sys.DBA_OB_BALANCE_TASK_HISTORY WHERE JOB_ID = xxxx;
说明
- 若
DBA_OB_BALANCE_JOBS视图中有其他BALANCE_JOB在运行,需等待当前任务完成,才会调度分区均衡任务。 - 若上述
BALANCE相关视图中没有对应复制表转换任务,可能还未生成对应BALANCE_JOB,需等待或临时调小配置项partition_balance_schedule_interval。 - 如果长时间未生成转换任务,需要检查
enable_rebalance、enable_transfer、balancer_idle_time、enable_rereplication等负载均衡相关配置项,检查是否关闭了 Transfer。