首批通过分布式安全可靠测评,为关键业务系统打造
启动 OceanBase 时 -o 内的参数是否会持久化
更新时间:2026-07-02 15:41
本文介绍启动 OceanBase 数据库时 -o 内的参数是否会持久化。
通常,除了 bootstrap 首次启动 OBServer 节点时需要通过 -o 来指定集群配置项外,日常的 OBServer 节点重启不需要指定配置项。使用 -o 选项既可以指定集群配置项,也可以采用 key@tenant_id=value 的形式指定租户配置项,如下所示。
./observer -o "freeze_trigger_percentage@1001=30,freeze_trigger_percentage@1003=30,enable_monotonic_weak_read=false"
其中,freeze_trigger_percentage 只对 tenant_id 为 1001 和 1003 的租户生效,enable_monotonic_weak_read 对所有租户生效。
注意
等号两侧不能有空格。
使用 -o 来指定集群或租户的配置项是一种临时性的行为,是解决已有问题的权宜之计,它不具有传递性和可继承性。按照目前的设计,-o 选项设置的配置项不会刷到内部表中,这可能导致重启后 -o 选项设置的值被覆盖,是否会被覆盖,取决于该配置项在使用 -o 参数设置前,有没有通过 alter system set 修改过。 举例:
以动态生效的集群级配置项 memory_limit_percentage 为例(默认值为 81),使用 deploy.py 部署。
reboot 集群,不在
-o中设置memory_limit_percentage。以 SYS 租户登录,
alter system set memory_limit_percentage=81;,使用select gmt_create, gmt_modified, name, value, config_version from __all_sys_parameter;查看内部表。obclient> select gmt_create, gmt_modified, name, value, config_version from __all_sys_parameter where name = 'memory_limit_percentage';返回结果如下:
+----------------------------+----------------------------+-------------------------+-------+------------------+ | gmt_create | gmt_modified | name | value | config_version | +----------------------------+----------------------------+-------------------------+-------+------------------+ | 2023-08-18 15:03:19.675398 | 2023-08-18 15:03:19.671442 | memory_limit_percentage | 81 | 1692342199671442 | +----------------------------+----------------------------+-------------------------+-------+------------------+stop 集群;在
config.py中增加ObCfg.init_config['memory_limit_percentage']=82;,然后再 start 集群。以 SYS 租户登录后进行以下操作,结果如下。查询内部表中
memory_limit_percentage值。obclient> select gmt_create, gmt_modified, name, value, config_version from __all_sys_parameter where name = 'memory_limit_percentage';返回结果如下:
+----------------------------+----------------------------+-------------------------+-------+------------------+ | gmt_create | gmt_modified | name | value | config_version | +----------------------------+----------------------------+-------------------------+-------+------------------+ | 2023-08-18 15:03:19.675398 | 2023-08-18 15:03:19.671442 | memory_limit_percentage | 81 | 1692342199671442 | +----------------------------+----------------------------+-------------------------+-------+------------------+查询
memory_limit_percentage值,确认-o设置的值已生效。obclient> select name, value, zone from __all_virtual_sys_parameter_stat where name = 'memory_limit_percentage';返回结果如下:
+-------------------------+-------+-------+ | name | value | zone | +-------------------------+-------+-------+ | memory_limit_percentage | 82 | zone1 | +-------------------------+-------+-------+修改一个其他配置项,触发刷内部表的动作。
obclient> alter system set auto_refresh_location_cache_rate_limit=1050;查询
-o设置的值未被覆盖。obclient> select name, value, zone from __all_virtual_sys_parameter_stat where name = 'memory_limit_percentage';返回结果如下:
+-------------------------+-------+-------+ | name | value | zone | +-------------------------+-------+-------+ | memory_limit_percentage | 82 | zone1 | +-------------------------+-------+-------+
根据上述示例可以得知,处理
-o参数时会将当前时间戳设为配置项的版本号,因此,alter system set触发的刷内部表行为不会把-o设的值覆盖掉。stop 集群;在
config.py中去掉对memory_limit_percentage的设置;然后再 start 集群。以 SYS 租户登录后进行以下操作,结果如下。查询内部表中
memory_limit_percentage值。obclient> select gmt_create, gmt_modified, name, value, config_version from __all_sys_parameter where name = 'memory_limit_percentage';返回结果如下:
+----------------------------+----------------------------+-------------------------+-------+------------------+ | gmt_create | gmt_modified | name | value | config_version | +----------------------------+----------------------------+-------------------------+-------+------------------+ | 2023-08-18 15:03:19.675398 | 2023-08-18 15:03:19.671442 | memory_limit_percentage | 81 | 1692342199671442 | +----------------------------+----------------------------+-------------------------+-------+------------------+查询
memory_limit_percentage值。obclient> select name, value, zone from __all_virtual_sys_parameter_stat where name = 'memory_limit_percentage';返回结果如下:
+-------------------------+-------+-------+ | name | value | zone | +-------------------------+-------+-------+ | memory_limit_percentage | 81 | zone1 | +-------------------------+-------+-------+
根据上述示例可以得知,
memory_limit_percentage的值变成了 81,和内部表中的值一样了。这是因为,observer 会从内部表中读取配置项的值,但同时会将该配置项对应的版本号强设为 0。而重启时,observer 会刷内部表,于是,memory_limit_percentage的值就被内部表中的值覆盖了。
注意
- 如果通过
-o设置某配置项之前,没有通过alter system set修改过该配置项(即没有上面的 step2),那么,无论之后再重启多少次,该配置项的值都是通过-o设置的值。这是因为,-o设置的值不会写入内部表,所以内部表中就不会有该配置项,也就不存在内部表中的值把-o的值覆盖的情况了。 - 对于重启生效的配置项,在 step4 中并不会看到截图所示情况,注意再次重启,才能看到。
- 以上结论对租户级配置项同样适用。
适用版本
OceanBase 数据库 V2.x、V3.x 版本。