暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

OceanBase设置变量

OceanBase 2022-12-31
1370

您可以通过系统变量的设置使 OceanBase 数据库的行为符合您业务的要求。

变量分类

OceanBase 数据库的系统变量分为全局变量和 Session 变量:

  • 全局变量:表示 Global 级别的修改,数据库同一租户内的不同用户共享全局变量。全局变量的修改不会随会话的退出而失效。此外,全局变量修改后,对当前已打开的 Session 不生效,需要重新建立 Session 才能生效。

  • Session 变量:表示 Session 级别的修改。当客户端连接到数据库后,数据库会复制全局变量来自动生成 Session 变量。Session 变量的修改仅对当前 Session 生效。

名称以 "_" 开头的变量称为隐藏变量,如:_primary_zone_entity_count。仅供开发人员在故障排查或紧急运维时使用。

系统变量相关视图

MySQL 租户下的系统变量相关视图如下:

  • INFORMATION_SCHEMA.GLOBAL_VARIABLES:记录当前租户下的全局变量信息。

  • INFORMATION_SCHEMA.SESSION_VARIABLES:记录当前租户下的 Session 变量信息。

Oracle 租户下的系统变量相关视图如下:

  • SYS.TENANT_VIRTUAL_GLOBAL_VARIABLE:记录当前租户下的全局变量信息。

  • SYS.TENANT_VIRTUAL_SESSION_VARIABLE:记录当前租户下的 Session 变量信息。

有关视图的详细介绍,请参见《系统参考》中的 系统视图

设置变量

说明

  • 设置 Session 级别的变量仅对当前 Session 有效,对其他 Session无效。设置 Global 级别的变量对当前 Session 无效,需要重新登录建立新的 Session 才会生效。
  • 设置 Global 级别变量要求当前用户拥有 SUPER 权限或 ALTER SYSTEM 权限。

设置 Session/Global 级别变量的 SQL 语法如下:

SET VARIABLE_NAME = 'VALUE'
SET GLOBAL VARIABLE_NAME = 'VALUE'

通过 SQL 语句设置 Session/Global 级别变量。示例如下:

obclient> SET ob_query_timeout = 20000000;
obclient> SET GLOBAL ob_query_timeout = 20000000;

对于变量值类型为 INT, 且在 SHOW VARIABLE 命令中显示 ON/OFF 或者 True/False 的变量,可以通过如下任意方式设置 Session/Global 级别变量。示例如下:

SET foreign_key_checks = ON;
SET foreign_key_checks = 1;
SET GLOBAL foreign_key_checks = ON;
SET GLOBAL foreign_key_checks = 1;

对于全局变量、只读变量,我们在创建租户时也能对其进行设置,语法如下:

CREATE TENANT [IF NOT EXISTS] tenant_name 
     [tenant_characteristic_list] [opt_set_sys_var];

tenant_characteristic_list: 
  tenant_characteristic [, tenant_characteristic...]

tenant_characteristic: 
      COMMENT 'string'  
    | {CHARACTER SET | CHARSET} [=] charsetname 
    | COLLATE [=]  collationname
    | REPLICA_NUM [=] num 
    | ZONE_LIST [=] (zone [, zone...]) 
    | PRIMARY_ZONE [=] zone  
    | DEFAULT TABLEGROUP [=] {NULL | tablegroup}
    | RESOURCE_POOL_LIST [=](poolname [, poolname...])
    | LOGONLY_REPLICA_NUM [=] num
    | LOCALITY [=] 'locality description'

opt_set_sys_var:
  {SET | SET VARIABLES | VARIABLES} system_var_name = expr [,system_var_name = expr] ...

在创建租户时,将只读变量 ob_compatibility_mode 初始化为 'oracle',将全局变量 ob_tcp_invited_nodes 初始化为 '%'。示例如下:

obclient> CREATE TENANT IF NOT EXISTS test_tenant
charset='utf8mb4', replica_num=3, zone_list=('zone1','zone2','zone3'), 
primary_zone='zone1;zone2,zone3', resource_pool_list=('pool1')
SET ob_compatibility_mode='oracle', ob_tcp_invited_nodes='%';

查看变量

  • 通过 SHOW VARIABLES 语句查看。

    查看 Session/Global 级别变量的 SQL 语法如下:

    SHOW VARIABLES [LIKE 'pattern' | WHERE expr]
    SHOW GLOBAL VARIABLES [LIKE 'pattern' | WHERE expr]
    

    通过 SQL 语句查询 Session/Global 级别变量。示例如下:

    obclient> SHOW VARIABLES LIKE 'ob_query_timeout';
    obclient> SHOW VARIABLES WHERE VARIABLE_NAME = 'ob_query_timeout';
    obclient> SHOW GLOBAL VARIABLES LIKE 'ob_query_timeout';
    obclient> SHOW GLOBAL VARIABLES WHERE VARIABLE_NAME = 'ob_query_timeout';
    obclient> SHOW GLOBAL VARIABLES WHERE VARIABLE_NAME LIKE 'ob_query_timeout';
    +------------------+----------+
    | Variable_name    | Value    |
    +------------------+----------+
    | ob_query_timeout | 10000000 |
    +------------------+----------+
    1 row in set (0.00 sec)
    

    返回结果中的列属性如下表所示:

    列名含义
    Variable_name变量名
    Value变量值

    说明

    如果连接 sys 租户后,再通过 ALTER SYSTEM CHANGE TENANT 语句切换到普通租户,此时查询的 Session 级别变量仍然是 sys 租户的 Session 级别的变量。查询的 Global 级别的变量是切换后普通租户的 Global 级别变量。有关 ALTER SYSTEM CHANGE TENANT 语句的详细介绍,请参见《 SQL 语法》。

  • 通过 SELECT 语句,在本租户相关视图中查看 Session/Global 级别变量信息。SQL 语法如下:

    SELECT * FROM view_name WHERE VARIABLE_NAME = '[var name]'
    

    在 Oracle 模式下,通过 SELECT 语句,在本租户相应视图中查看 Session/Global 级别变量信息。示例如下:

    obclient> SELECT * FROM SYS.TENANT_VIRTUAL_GLOBAL_VARIABLE WHERE VARIABLE_NAME = 'ob_query_timeout';
    obclient> SELECT * FROM SYS.TENANT_VIRTUAL_SESSION_VARIABLE WHERE VARIABLE_NAME = 'ob_query_timeout';
    

    MySQL 模式下,通过 SELECT 语句,在本租户视图中查看 Session/Global 级别变量信息。示例如下:

    obclient> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME = 'ob_query_timeout';
    obclient> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME = 'ob_query_timeout';
    


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论