OceanBase中没有像ORACLE或MySQL那样独立的参数文件,因此在进行数据库迁移的这种场景下,如何保持新老数据库的参数的一致成了OceanBase中的一个问题。这个问题其实也可以转化为如何查询OceanBase数据库中修改过的参数,我们需要找到那些和默认值不一致的参数,并以此在新数据库环境中同步修改。
一. OCP查询
在OCP集群和租户界面的参数管理功能下,可以查看“参数列表”和“修改历史”。但是这里“修改历史”只能查询通过OCP平台修改过的参数,如果是通过命令行修改的则无法查询,并且如果OCP重装后这里的“修改历史”也会被清空。因此,通过OCP查询参数的修改历史不能保证获取全部修改过的参数。
二. obdiag工具
2.1 obdiag集群参数分析
obdiag是OB官方推出的黑屏诊断工具,obdiag有个参数分析功能,可以一键分析OceanBase集群参数和默认值的差异。分析集群参数时,首先需要使用集群参数收集功能一键收集集群参数信息,然后用生成的csv文件进行参数比对。
#集群参数收集 obdiag gather parameter #集群参数比对 obdiag analyze parameter default --file
在OceanBase3.2.3版本使用参数分析功能时,报了以下错误。这是因为323版本不存在oceanbase.GV$OB_PARAMETERS试图,所以这个功能至少得4版本以后的OB才可以用。
在OceanBase4.2.1进行参数比对时,发现所有参数都和默认值相同,这明显是不符合实际的。因为这里是用采集生成的csv文件作为默认值文件,所以自然不能找到非默认值参数。对于OB 4.2.2之后的版本,则无需添加--file选项,直接使用obdiag analyze parameter default功能即可找出非默认值参数。因此,obdiag的这个功能其实要在4.2.2版本后才能真正达到和默认值对比的效果。此外,我们也可以在集群迁移的时候,在新集群收集一份参数的存档文件,通过对比新老集群的参数找出不一致的参数。
2.2 obdiag租户变量分析
obdiag analyze variable diff 可以一键分析 OceanBase 在线集群变量和之前相比是否变更了,有助于排查变量变更带来的问题。同样,分析变量时,首先也需要一键收集变量信息,然后使用收集变量信息生产的csv文件进行变量比对。
#变量收集 obdiag gather variable #变量比对 obdiag analyze variable diff --file=/tmp/gather_variables/ob_test2_stb_variables_20241015110704.csv
同样obdiag变量分析功能其实也是和使用obdiag收集的变量存档文件进行比对,而不能直接找出非默认值参数。这样的话,就需要在集群搭建好的时候使用obdiag收集一份变量的存档文件进行变量比对。或者,在租户迁移的时候,在新环境收集一份变量存档文件,然后用这份存档文件和老环境的变量进行比对,这样也能找出两边不一致的变量。
三、系统视图查询
oceanbase中提供了参数相关的数据字典视图,我们可以从这些视图中发现一些端倪。在3版本和4版本的OB中,描述租户变量的视图分别是__all_virtual_sys_variable和cdb_ob_sys_variables,在这两个视图中有两列gmt_create和gmt_modified,代表着变量的创建和修改时间,通过比对这个时间,可以找到修改过的租户变量。
MySQL [oceanbase]> desc __all_virtual_sys_variable; +--------------+----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------------+------+-----+---------+-------+ | tenant_id | bigint(20) | NO | PRI | NULL | | | zone | varchar(128) | NO | PRI | NULL | | | name | varchar(128) | NO | PRI | | | | gmt_create | timestamp(6) | NO | | NULL | | | gmt_modified | timestamp(6) | NO | | NULL | | | data_type | bigint(20) | NO | | NULL | | | value | varchar(65536) | YES | | NULL | | | info | varchar(4096) | NO | | NULL | | | flags | bigint(20) | NO | | NULL | | | min_val | varchar(65536) | NO | | | | | max_val | varchar(65536) | NO | | | | +--------------+----------------+------+-----+---------+-------+ 11 rows in set (0.00 sec)MySQL [oceanbase]> select min(gmt_create) from __all_virtual_sys_variable where tenant_id=1028; +----------------------------+ | min(gmt_create) | +----------------------------+ | 2024-08-30 14:48:19.243321 | +----------------------------+ MySQL [oceanbase]> select * from __all_virtual_sys_variable where tenant_id=1028 and gmt_modified>'2024-08-30 14:48:19.243321'; +-----------+------+------------------+----------------------------+----------------------------+-----------+------------+----------------------------------+-------+---------+---------+ | tenant_id | zone | name | gmt_create | gmt_modified | data_type | value | info | flags | min_val | max_val | +-----------+------+------------------+----------------------------+----------------------------+-----------+------------+----------------------------------+-------+---------+---------+ | 1028 | | ob_query_timeout | 2024-10-15 15:12:40.329644 | 2024-10-15 15:12:40.329644 | 5 | 1000000000 | Query timeout in microsecond(us) | 131 | | | +-----------+------+------------------+----------------------------+----------------------------+-----------+------------+----------------------------------+-------+---------+---------+ 1 row in set (0.00 sec)
对于集群参数,相关的数据字典视图分别是3版本的__all_virtual_tenant_parameter_stat和__all_virtual_sys_parameter_stat,以及4版本的gv$ob_parameters。在这几个数据字典视图中没有相关的信息可以找到曾经修改过的集群参数。
MySQL [oceanbase]> desc __all_virtual_sys_parameter_stat; +---------------+----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+----------------+------+-----+---------+-------+ | zone | varchar(128) | NO | | NULL | | | svr_type | varchar(16) | NO | | NULL | | | svr_ip | varchar(46) | NO | | NULL | | | svr_port | bigint(20) | NO | | NULL | | | name | varchar(128) | NO | | NULL | | | data_type | varchar(128) | YES | | NULL | | | value | varchar(65536) | NO | | NULL | | | value_strict | varchar(4096) | YES | | NULL | | | info | varchar(4096) | NO | | NULL | | | need_reboot | bigint(20) | NO | | NULL | | | section | varchar(128) | NO | | NULL | | | visible_level | varchar(64) | NO | | NULL | | | scope | varchar(64) | NO | | NULL | | | source | varchar(64) | NO | | NULL | | | edit_level | varchar(128) | NO | | NULL | | +---------------+----------------+------+-----+---------+-------+ MySQL [oceanbase]> desc gv$ob_parameters; +------------+----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+----------------+------+-----+---------+-------+ | SVR_IP | varchar(46) | NO | | NULL | | | SVR_PORT | bigint(20) | NO | | NULL | | | ZONE | varchar(128) | NO | | NULL | | | SCOPE | varchar(64) | NO | | NULL | | | TENANT_ID | bigint(20) | YES | | NULL | | | NAME | varchar(128) | NO | | NULL | | | DATA_TYPE | varchar(128) | YES | | NULL | | | VALUE | varchar(65536) | NO | | NULL | | | INFO | varchar(4096) | NO | | NULL | | | SECTION | varchar(128) | NO | | NULL | | | EDIT_LEVEL | varchar(128) | NO | | NULL | | +------------+----------------+------+-----+---------+-------+
四、总结
本文总结了在OceanBase数据库中找出和默认值不一样的参数的三种方法。目前看来,通过obdiag工具在新部署的数据库环境收集参数信息生成存档文件,然后再通过obdiag工具比对参数存档文件和老数据库的参数,这种方法是最靠谱有效的。此外通过变量数据字典视图也可以帮助我们找到那些曾经修改过的参数。