Goldilocks的REBALANCE基本工作原理
设定需要做REBALANCE的表分别为T1, T2, T3,具体执行过程如下:
ALTER DATABASE REBALANCE 在内部会按照ALTER TABLE REBALANCE 执行
ALTER TABLE T1 REBALANCE是DDL语句,会在T1表加个IX-LOCK。
(此时如果有事务执行,DDL_TIMEOUT = 0时会出现错误)执行REBALANCE时,会标记T1表以便能执行日志。
标记后,新的事务记录在日志中,并且标记时刻active的事务执行完成后,REBALANCE BEGIN开始。
REBALANCE BEGIN开始后,T1表原来的数据会发生sync。此时会对记录进行IX-LOCK
数据SYNC完成后,将反映2~3步骤中发生的日记帐事务。
反映执行4期间产生的日记帐事务。
4~5步骤会根据MAXIMUM_JOURNAL_REPLAY_COUNT, ONLINE_JOURNAL_REPLAY_THRESHOLD等参数决定。后日记帐事务的反映会在所有节点加X-LOCK并执行,然后表会变为ON-LINE。
(此时其他事务会等待。所以需要设置参数以便能把时间压到小,也是为什么负载达到高值时很难执行的原因。)1~6按照表顺序执行。
需要使用20c正式版的理由是6号步骤。
6中RABALANCE语句可能会死锁。
(APP事务为IX,反映日志的事务也是IX,同级的LOCK可能会交叉。)
出现死锁REBALANCE会rollback,需要重复直到正常执行完成。
正式版中修正了这部分。(参数设置后执行)
=========================================
参考
ALTER TABLE … REBALANCE, ALTER DATABASE REBALANCE 为DDL语句。
GOLDILOCKS CLUSTER 环境中DDL语句在某个节点执行,会自动传到所有节点执行。
所以在某个单个节点执行是正确方式。通常DDL语句是error or success,而有些集群语句为success or success with info。
执行alter system join database时如果出现下面错误信息,需要rebalance。
(可以理解为已经join,但表需要rebalance。)
gSQL> alter system join database;
ERR-42000(16405): of the total ‘1’ tables in the database, ‘1’ tables need to be rebalanced
System altered.
- 需要rebalance的表,可以在表为offline时,通过dba_tab_place, all_tab_place, user_tab_place的MEMBER_OFFLINE is true确认。
大部分字典视图不会输出offline状态的信息。
所以需要在非join的,open状态的其他节点执行。
gSQL> select * from dba_tab_place where member_offline is true;
OWNER TABLE_SCHEMA TABLE_NAME GROUP_ID GROUP_NAME MEMBER_ID MEMBER_NAME MEMBER_OFFLINE DROPPED SCN NUM_ROWS BLOCKS LAST_ANALYZED
SYS PUBLIC T1 1 G1 2 G1N2 TRUE NO 7.0.1046 null 992 null
1 row selected.
- alter database rebalance如果执行结果如下,那就表示执行失败。
这里的例子中DDL_LOCKTIMEOUT = 0 ,所以执行后马上发生了错误。
( 可以理解为alter database rebalance语句虽然执行了,但是部分表执行失败。)
gSQL> alter database rebalance;
ERR-42000(16379): of the total ‘4’ tables, ‘1’ tables failed to rebalance
Database altered.
- 通过执行表语句可以看到发生错误
gSQL> alter table t1 rebalance;
ERR-HYT00(14026): resource busy or timeout expired
- 通常大小比较大或者事务较多时,可以使用上述表进行确认。
目标表的负载比较大或者记录较多,则先执行alter table ~ rebalance。
之后再执行alter database ~ rebalance。
相关文章