因按需回放redo阶段执行部分DDL报错的问题
问题现象
按需回放redo阶段,执行部分DDL报错,报错信息如下:
1. openGauss=# create database tpcc1;
2. ERROR: only support INSERT/UPDATE/DELETE/SELECT/SET/SHOW/CALL, and ALTER/CREATE/DROP on Table/Index/View/Procedure/Schema, and ALTER on Database during SS on-demand recovery, command 752
定位方法
查询ondemand_recovery_status视图,确认当前节点处于按需回放状态,对应in_ondemand_recovery字段查询为true,ondemand_recovery_status字段状态为ONDEMAND_RECOVERY_REDO。
1. openGauss=# select * from ondemand_recovery_status();
2. -[ RECORD 1 ]---------------+-----------------------
3. primary_checkpoint_redo_lsn | 0/0
4. realtime_build_replayed_lsn | B/24C39FA0
5. hashmap_used_blocks | 9928223
6. hashmap_total_blocks | 70640909
7. trxn_queue_blocks | 0
8. seg_queue_blocks | 0
9. in_ondemand_recovery | t
10. ondemand_recovery_status | ONDEMAND_RECOVERY_REDO
11. realtime_build_status | DISABLED
12. recovery_pause_status | NOT PAUSE
13. record_item_num | 57001
14. record_item_mbytes | 648
问题根因
主节点当前处于按需回放状态,支持有限的DDL(详见特性增强),此现象符合预期。
解决方案
等待按需回放redo阶段结束,之后执行SQL无限制。按需回放redo阶段进度,可以通过查询ondemand_recovery_status视图中的hashmap_used_blocks字段判断。当hashmap_used_blocks的值为0时,会进行全量checkpoint,之后退出按需回放,in_ondemand_recovery字段为false,ondemand_recovery_status字段为normal。
