-
-
Notifications
You must be signed in to change notification settings - Fork 20
昆仑分布式数据库独特的变量读写功能介绍
本篇文章阐述说明下昆仑分布式数据库计算节点如何支持读写存储节点中的变量。
- 使set [shard] global/session/local/PERSIST/PERSIST_only VARNAME=VALUE 的语法生效;总是假设VARNAME是MySQL的;计算节点会发送SET语句给所有的存储节点去执行,且在一个session的生命期当中,所有设置过的session 变量的值会在计算节点的session里面缓存。
在切换存储集群主节点后,新的主节点会使用缓存的session变量值设置给新的存储集群主节点,确保一致的会话(连接)状态。
set session innodb_lock_wait_timeout = 3;
设置全局变量:
set global innodb_lock_wait_timeout = 4;
set persist_only innodb_lock_wait_timeout = 11;
- set VARNAME=VALUE 语句,在PostgreSQL客户端连接的时候会默认以PostgreSQL的变量名来看待他们,如果变量名不存在,则会把他们看成是MySQL的session变量。在客户端MySQL连接时,会默认把他们视为MySQL的session变量,如果变量名不存在则把他们视为PostgreSQL变量。
set innodb_lock_wait_timeout = 2;
-
计算节点会缓存MySQL配对的session var-value,且如果shard连接被重新设置或者重新连接,计算节点会把缓存的变量发送给MySQL节点。
-
也支持set @@global/session/local/persist/persist_only.varname=value 语句,且总是假定为MySQL变量,因为只有MySQL有这样的SET语法。但因shift/reduce冲突而不支持set @@VARNAME=VALUE。
set @@global.innodb_lock_wait_timeout = 4;
set @@innodb_lock_wait_timeout = 2;
(不支持该语法)
- 支持show [session/local/global] variables like 'wildcard-filter语法且总是假定是MySQL变量,因为MySQL才有这样的语法,PostgreSQL没有。对于show varname语法总是先假定是PostgreSQL变量。如果变量名不是PostgreSQL变量,则被假定是MySQL变量。
show global variables like 'innodb_lock_wait_timeout';
show session variables like 'innodb_lock_wait_timeout';
show local variables like 'innodb_lock_wait_timeout';
- 支持在Kunlun计算节点里面的选项show [session/global/local] variables like里选择 STRICT来展示只有计算节点允许访问的MySQL变量。
show local variables like 'innodb_lock_wait_timeout' strict;
show session variables like 'innodb_lock_wait_timeout' strict;
show global variables like 'innodb_lock_wait_timeout' strict;
- 当执行show语句时会取得一个变量的值,直接发送给任意存储shard来获取他的值。
昆仑分布式数据库的计算节点支持读写存储节点的系统变量,可以给用户带来很大的便利。
例如,用户可以在计算节点的连接中执行一个set global var=value;语句,来设置所有后端集群的var变量的值为value。也可以通过在计算节点执行一个set session var=value;就把当前会话(连接)中的var变量的值设置为value。
这部分功能的对应测试脚本从https://gitee.com/zettadb/kunlun.git 上面拉下来,在src/test/regression/sql/vars.sql 中,这些测例也展示了MyQL变量访问的功能。