hhdb数据库介绍(9-21)
计算节点参数说明
checkClusterBeforeDnSwitch
参数说明:
Property | Value |
---|---|
参数值 | checkClusterBeforeDnSwitch |
是否可见 | 否 |
参数说明 | 集群模式下触发数据节点高可用切换时,是否先判断集群所有成员正常再进行数据节点切换 |
默认值 | false |
Reload是否生效 | 是 |
参数设置:
<property name="checkClusterBeforeDnSwitch">false</property><!--集群模式下触发数据节点高可用切换时,是否先判断集群所有成员正常再进行数据节点切换-->
参数作用:
控制节点切换前是否先判断集群所有成员都能ping通,true开启false关闭。 例:A机房和B机房构成双活集群,A机房3个计算节点,B机房2个计算节点,primary节点在B机房。AB机房网络隔离后,A机房做为多数派会选出主,B机房无法形成多数派而cluster shutdown,但是在B机房primary未下线时,收到A机房主存储节点的心跳超时导致存储节点发生切换(开启此参数可避免此类情况)。
checkConnLastUsedTime
参数说明:
Property | Value |
---|---|
参数值 | checkConnLastUsedTime |
是否可见 | 否 |
参数说明 | 后端连接最后一次使用最大允许间隔时间,超过将校验该连接是否有效 单位:毫秒 |
默认值 | 3000 |
最小值 | 0 |
最大值 | 600000 |
Reload是否生效 | 是 |
参数设置:
<property name="checkConnLastUsedTime">false</property><!-- 后端连接最后一次使用最大允许间隔时间,超过将校验该连接是否有效 单位:毫秒 -->
参数作用:
后端连接超过此参数配置的时长没有被使用过,计算节点从连接池获取连接时会先校验该连接的连通性,保证获取到的连接可用。
mysql> show @@session;+-------+---------+-------------+----------+-----------+----------+---------+---------+-------+------------+----------+-----------+---------------+---------+---------+-------+----------+-------------------+--------------------+
| id | running | trx_started | trx_time | trx_query | bk_count | bk_dnid | bk_dsid | bk_id | bk_mysqlid | bk_state | bk_closed | bk_autocommit | bk_host | bk_port | bk_db | bk_query | bk_last_read_time | bk_last_write_time |
+-------+---------+-------------+----------+-----------+----------+---------+---------+-------+------------+----------+-----------+---------------+---------+---------+-------+----------+-------------------+--------------------+
| 60615 | FALSE | NULL | NULL | NULL | 0 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+-------+---------+-------------+----------+-----------+----------+---------+---------+-------+------------+----------+-----------+---------------+---------+---------+-------+----------+-------------------+--------------------+
1 row in set (0.00 sec)
checkConnValid
参数说明:
Property | Value |
---|---|
参数值 | checkConnValid |
是否可见 | 否 |
参数说明 | 是否检查后端连接有效 |
默认值 | true |
Reload是否生效 | 是 |
参数设置:
server.xml中手动添加一条checkConnValid的配置
<property name="CheckConnValid">true</property>
参数作用:
从连接池获取连接的时候检查连接的可用性,如有不可用的连接会关闭连接,从连接池清除。
checkConnValidTimeout
参数说明:
Property | Value |
---|---|
参数值 | checkConnValidTimeout |
是否可见 | 否 |
参数说明 | 后端连接有效校验时,最大超时时间 单位:毫秒 |
默认值 | 500 |
Reload是否生效 | 是 |
参数设置:
<property name="checkConnValidTimeout">500</property><!-- 后端连接有效校验时,最大超时时间 单位:毫秒 -->
参数作用:
后端连接有效校验时,当检测时间超过"后端连接超时时间",则判断为无效的连接,当检测后端连接属于超时连接时,会把该连接从连接池中清除。
checkMySQLParamInterval
参数说明:
Property | Value |
---|---|
参数值 | checkMySQLParamInterval |
是否可见 | 否 |
参数说明 | 检查存储节点参数设置 间隔时间(单位:毫秒) |
默认值 | 600000 |
最小值 | 1000 |
最大值 | 86400000 |
Reload是否生效 | Y |
参数设置:
<property name="checkMySQLParamInterval">60000</property><!-- 检查存储节点参数设置是否合理的间隔时间(单位:毫秒) -->
参数作用:
检查存储节点参数设置是否合理的间隔时间。其中,检查参数包括:completion_type、innodb_rollback_on_timeout、div_precision_increment、autocommit、read_only、tx_isolation、max_allowed_packet。
checkQueryIndexTimeMs
参数说明:
Property | Value |
---|---|
参数值 | checkQueryIndexTimeMs |
是否可见 | 否 |
参数说明 | 检测SQL查询是否走上索引等待时间,单位毫秒 |
默认值 | 0 |
最小值 | 0或200(ms) |
最大值 | 3600000(ms) |
Reload是否生效 | 是 |
参数设置:
<property name="checkMySQLParamInterval">0</property><!-- 检测SQL查询是否走上索引等待时间,单位毫秒 -->
参数作用:
检测SQL查询是否走上索引等待时间。若SQL在存储节点执行时间超过该值,则检查该SQL是否走上了索引,若未走上索引,则客户端发起的查询进入流控规则,若走上索引,则不处理。默认为0表示不检查,非0时最小值为200(ms)。
示例如下:
在server.xml设置highCostSqlConcurrency=10,checkQueryIndexTimeMs=200并执行如下步骤。
- 创建表
create table setl_d (emp_no varchar(50), emp_name varchar(50), emp_type varchar(50), psn_no varchar(50), psn_name varchar(50), certno varchar(50), GEND varchar(50), brdy varchar(50), MEDFEE_SUMAMT decimal(10,2), hifp_pay decimal(10,2), OTHFUND_PAY decimal(10,2), MDTRT_ID varchar(50), VALI_FLAG varchar(50), MED_TYPE varchar(50), REFD_SETL_FLAG varchar(50), pay_loc varchar(50));
- 使用sysbench插入1000万行数据
rs = db_query("insert into setl_d values ('SW"..math.random(1,9999999999).."','省委"..math.random(1,9999999999).."','A1','SF"..math.random(10000000,99999999).."','张三"..math.random(1,9999999999).."','"..math.random(100000,999999)..math.random(1949,2013)..math.random(1001,1231)..math.random(1000,9999).."','"..math.random(1,9).."','"..math.random(1949,2013).."-0"..math.random(1,9).."-0"..math.random(1,9).."','"..math.random(1000,9999)..".11','"..math.random(1000,9999)..".55','"..math.random(1000,9999)..".11','fix-ak"..math.random(1000,9999).."-"..math.random(1000,9999).."','"..math.random(1,9).."','"..math.random(1,100).."','"..math.random(1,9).."','"..math.random(1,9).."')")
- 使用sysbench压测15并发的select * from setl_d where psn_no like ‘%1~9999随机值%’;
- 由于上述select语句未使用索引且执行时间超过了200ms,故该查询会匹配流控规则,在3325端口执行show @@flowcontrol_connection命令可见流控信息如下所示:
root@127.0.0.1:(none) 8.0.32 11:10:09> show @@flowcontrol_connection;
+------+------+-----------------+-------+------+------------------+---------------+------------+--------------------------------------------------+
| id | user | host | db | time | state | type | crc32 | info |
+------+------+-----------------+-------+------+------------------+---------------+------------+--------------------------------------------------+
| 432 | root | 127.0.0.1:47318 | SBDEV | 1 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%3814%' |
| 419 | root | 127.0.0.1:47292 | SBDEV | 5 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%4957%' |
| 421 | root | 127.0.0.1:47295 | SBDEV | 2 | Sending data | executing | 3685623056 | select * from setl_d where psn_no like '%9851%' |
| 422 | root | 127.0.0.1:47298 | SBDEV | 1 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%9919%' |
| 423 | root | 127.0.0.1:47300 | SBDEV | 1 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%4442%' |
| 424 | root | 127.0.0.1:47302 | SBDEV | 1 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%4857%' |
| 427 | root | 127.0.0.1:47308 | SBDEV | 2 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%5554%' |
| 428 | root | 127.0.0.1:47310 | SBDEV | 2 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%5166%' |
| 430 | root | 127.0.0.1:47314 | SBDEV | 4 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%5718%' |
| 431 | root | 127.0.0.1:47316 | SBDEV | 3 | Writing to net | executing | 3685623056 | select * from setl_d where psn_no like '%8693%' |
| 429 | root | 127.0.0.1:47312 | SBDEV | 2 | Flow control sql | flowcontroled | 3685623056 | select * from setl_d where psn_no like '%6729%' |
| 425 | root | 127.0.0.1:47304 | SBDEV | 1 | Flow control sql | flowcontroled | 3685623056 | select * from setl_d where psn_no like '%1238%' |
| 420 | root | 127.0.0.1:47294 | SBDEV | 0 | Flow control sql | flowcontroled | 3685623056 | select * from setl_d where psn_no like '%4698%' |
| 418 | root | 127.0.0.1:47290 | SBDEV | 1 | Flow control sql | flowcontroled | 3685623056 | select * from setl_d where psn_no like '%8259%' |
| 426 | root | 127.0.0.1:47306 | SBDEV | 0 | Flow control sql | flowcontroled | 3685623056 | select * from setl_d where psn_no like '%8793%' |
+------+------+-----------------+-------+------+------------------+---------------+------------+--------------------------------------------------+
15 rows in set (0.00 sec)
5、同时在3325端口执行show @@debug可见highCostSqlConcurrency已被占满,即join_limit列10-10
root@127.0.0.1:(none) 8.0.32 11:11:53> show @@debug;
+------------+------------+------------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+
| join_limit | committing | processconcounter | dbunavailablecount | clusterstatus |
+------------+------------+------------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+
| 10-10 | 0 | ,0:1,1:1,2:1,3:1,4:1,5:0,6:0,7:1,8:1,9:0,10:0,11:0,12:0,13:1,14:0,15:0,16:1,17:0,18:0,19:0,20:1,21:0,22:0,23:0,24:0,25:0,26:0,27:0 | | NULL |
+------------+------------+------------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+
1 row in set (0.00 sec)
checkUpdate
参数说明:
Property | Value |
---|---|
参数值 | checkUpdate |
是否可见 | 否 |
参数说明 | 是否拦截对分片字段的更新操作 |
默认值 | true |
Reload是否生效 | 是 |
参数设置:
<property name="checkUpdate">true</property><!-- 是否拦截对分片字段的更新操作(The update operation of Sharding Key intercepted or not) -->
参数作用:
控制是否允许修改分片字段。设置为true的情况,同节点内可以更新,不能更新分片字段路由到不同节点的 ,如跨节点分片字段更新会有如下提示:
mysql> update ss set id=13 where a='aa';
ERROR 10217 (HY000): update sharding column's value can't change dn.
设置为false的情况,更新分片字段可以随意更新,且更新后的数据会自动根据分片规则进行重分配。
mysql> update ss set id=13 where a='aa';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from ss where a='aa';
+----+----+
| id | a |
+----+----+
| 13 | aa |
+----+----+
1 row in set (0.00 sec)
clusterElectionTimeoutMs
参数说明:
Property | Value |
---|---|
参数值 | clusterElectionTimeoutMs |
是否可见 | 否 |
参数说明 | 集群选举超时时间(ms) |
默认值 | 2000 |
Reload是否生效 | 是 |
参数设置:
<property name="clusterElectionTimeoutMs">2000</property><!-- 集群选举超时时间(ms) -->
参数作用:
该参数用于设置计算节点集群选举超时时间,一般不建议修改,可根据实际网络质量情况进行适度调整。例如将参数clusterElectionTimeoutMs设置为2000ms,则集群中的主计算节点发生故障后,新的候选节点会在超时时间内一直等待选举,直至选举成功或超过2000ms选举失败。
clusterHeartbeatTimeoutMs
参数说明:
Property | Value |
---|---|
参数值 | clusterHeartbeatTimeoutMs |
是否可见 | 否 |
参数说明 | 集群心跳超时时间(ms) |
默认值 | 5000 |
Reload是否生效 | 是 |
参数设置:
server.xml中clusterHeartbeatTimeoutMs参数配置 如下配置:
<property name="clusterHeartbeatTimeoutMs">5000</property><!-- 集群心跳超时时间(ms) -->
参数作用:
该参数用于设置计算节点集群心跳超时时间,一般不建议修改,可根据实际网络质量情况进行适度调整。当正在执行DDL时,跳过不执行心跳逻辑。
clusterHost
参数说明:
Property | Value |
---|---|
参数值 | clusterHost |
是否可见 | 是 |
参数说明 | 本节点所在IP |
默认值 | 192.168.200.1 |
Reload是否生效 | 否 |
参数设置:
server.xml中clusterHost参数配置 如下配置:
<property name="clusterHost">192.168.200.1</property><!-- 本节点所在IP -->
参数作用:
该参数需设置和实际计算节点所在的IP一致(不能用127.0.0.1代替),集群选举时该计算节点用于与其他计算节点通信的地址。
clusterName
参数说明:
Property | Value |
---|---|
参数值 | clusterName |
是否可见 | 是 |
参数说明 | 集群组名称 |
默认值 | HotDB-Cluster |
Reload是否生效 | 否 |
参数设置:
server.xml中clusterName参数配置 如下配置:
<property name="clusterName">HotDB-Cluster</property><!-- 集群组名称 -->
参数作用:
指定集群启动后加入的组名称,同一个集群内的计算节点的该参数必须相同,不同集群的计算节点的该参数必须设置不同。
clusterNetwork
参数说明:
Property | Value |
---|---|
参数值 | clusterNetwork |
是否可见 | 是 |
参数说明 | 集群所在网段 |
默认值 | 192.168.200.0/24 |
Reload是否生效 | 否 |
参数设置:
server.xml中clusterNetwork参数配置 如下配置:
<property name="clusterNetwork">192.168.200.0/24</property><!-- 集群所在网段 -->
参数作用:
该参数为整个集群所在的网段,限定集群内的所有计算节点IP必须在该网段内。否则即使集群组相同启动后也不会加入集群。
clusterPacketTimeoutMs
参数说明:
Property | Value |
---|---|
参数值 | clusterPacketTimeoutMs |
是否可见 | 否 |
参数说明 | 集群间通讯包失效时间(ms) |
默认值 | 5000 |
Reload是否生效 | 是 |
参数设置:
server.xml中clusterPacketTimeoutMs参数配置 如下配置:
<property name="clusterPacketTimeoutMs">5000</property><!-- 集群间通讯包失效时间(ms) -->
参数作用:
该参数用于设置集群间通讯包失效时间,一般不建议修改,可根据实际网络质量情况进行适度调整。集群间通讯包指在集群正常运行时需要发送的所有点对点的通讯包,包括且不限于心跳、选举、成员变更等数据包。
clusterPort
参数说明:
Property | Value |
---|---|
参数值 | clusterPort |
是否可见 | 是 |
参数说明 | 集群通信端口 |
默认值 | 3326 |
Reload是否生效 | 否 |
参数设置:
server.xml中clusterPort参数配置 如下配置:
<property name="clusterPort">3326</property><!-- 集群通信端口 -->
参数作用:
默认值3326,指定监听集群信息的端口。该参数用于集群内通讯,同一集群通信的端口必须相同。
clusterRole
参数说明:
Property | Value |
---|---|
参数值 | clusterRole |
是否可见 | 是 |
参数说明 | 计算节点集群当前角色 |
默认值 | 0 |
Reload是否生效 | 否 |
参数设置:
server.xml中clusterRole参数配置 如下配置:
<property name="clusterRole">0</property><!-- 计算节点集群当前角色 -->
参数作用:
目前集群模式下的计算节点,如果宕机到最后一个计算节点故障之前, 其他计算节点若均是一起故障(不是先后故障),则整个集群可能都是故障状态。为了减少发生这类问题的概率,新增了clusterRole参数,该参数为计算节点在集群内的角色配置参数,配置为0代表普通角色、配置为1代表仅参与选举投票的角色。仅参与选举投票的角色在成为集群内最后一个节点前不提供服务,可将其单独与实际集群计算节点配置在同一集群内,可保证集群内只要计算节点多数存活即可提供服务。
clusterSize
参数说明:
Property | Value |
---|---|
参数值 | clusterSize |
是否可见 | 是 |
参数说明 | 集群中节点总数 |
默认值 | 3 |
Reload是否生效 | 否 |
参数设置:
server.xml中clusterSize参数配置 如下配置:
<property name="clusterSize">3</property><!-- 集群中节点总数 -->
参数作用:
该参数为集群内计算节点的总个数,若haMode设置为1(即集群模式),需配置成该集群的实际计算节点数。
clusterStartedPacketTimeoutMs
参数说明:
Property | Value |
---|---|
参数值 | clusterStartedPacketTimeoutMs |
是否可见 | 否 |
参数说明 | 集群Started广播包失效时间(ms) |
默认值 | 5000 |
Reload是否生效 | 是 |
参数设置:
server.xml中clusterStartedPacketTimeoutMs参数配置 如下配置:
<property name="clusterStartedPacketTimeoutMs">5000</property><!-- 集群Started广播包失效时间(ms) -->
参数作用:
该参数用于设置集群Started广播包失效时间,一般不建议修改,可根据实际网络质量情况进行适度调整。集群Started广播包是指在集群启动时的一个针对网段广播的包。
columnPrivilegeDenied
参数说明:
Property | Value |
---|---|
参数值 | columnPrivilegeDenied |
是否可见 | 否 |
参数说明 | 控制表中的列拒绝权限,优先级高于其他权限 |
默认值 | (空) |
Reload是否生效 | 是 |
参数设置:
<property name="columnPrivilegeDenied">列拒绝权限内容</property><!--控制表中的列拒绝权限,优先级高于其他权限,默认为空-->
内容格式:
‘user_name’@‘host_name’.logicDB.tableName[privilegeType(columnName,columnName)];‘user_name’@‘host_name’.logicDB.tableName[privilegeType(columnName,columnName),privilegeType(columnName,columnName)];....
详细说明:
- ‘user_name’@‘host_name’:由用户名+主机名组成,可以填写具体用户(例如‘zhangsan’@‘127.0.0.1’或‘lisi’@‘%‘或‘wangwu’@‘192.168.210.129’),也可以填写*(代表所有用户);
- logicDB:逻辑库名,可以填写具体逻辑库(例如hotdb),也可以填写*(代表所有逻辑库);
- tableName:表名,可以具体表(例如sbtest1),也可以填写*(代表所有表);
- privilegeType:权限类型,列权限目前可控制类型包括:INSERT,SELECT,UPDATE(不区分大小写),可以只填写一种权限类型,也可以填写多种权限类型,两种权限类型之间用,隔开;
- columnName:列名 ,若是主键字段可以使用“PRIMARY”代替,若是唯一键字段可以使用“UNIQUE”代替。同一个权限类型下可以只填写一个列名,也可以填写多个列名,两个列名之间用,隔开;
- 为了保证能够被识别和分类,采用.,;符号间隔;
- 当配置的列拒绝权限生效后,执行SQL涉及被控制的列时,不符合权限要求的有错误提示,同时hotdb.log会输出相应日志信息;
- 用户可通过服务端口执行show hotdb grants查看被拒绝的列权限类型;
示例1: 不允许用户‘ztm’@‘192.168.210.129’对逻辑库d1中sbtest1表的c列有select权限
以OLTP场景标准表sbtest1为例,则可配置:
<property name="columnPrivilegeDenied">'ztm'@'192.168.210.129'.d1.sbtest1[select(c)]</property><!--控制表中的列拒绝权限,优先级高于其他权限-->
动态加载成功后,立即生效,在服务端口执行sql验证:
ztm@192.168.210.130:(none) 5.7.25 01:37:23> use d1
Database changed
ztm@192.168.210.130:d1 5.7.25 02:20:37> select c from sbtest1;
ERROR 1143 (HY000): SELECT command denied to user 'ztm'@'192.168.210.129' for column 'c' in table 'sbtest1'
ztm@192.168.210.130:d1 5.7.25 02:22:33> show grants for 'ztm'@'192.168.210.129';
+-----------------------------------------------------------+
| Grants for ztm |
+-----------------------------------------------------------+
| 'ztm'@'192.168.210.129'.d1.sbtest1[select(c)] |
+-----------------------------------------------------------+
此时hotdb.log会输出相应内容:
2021-06-25 14:22:33.465 [INFO] [SQL] [$NIOExecutor-1-2] cn.hotpu.hotdb.server.b(1140) - Error in SQL:[select c from sbtest1] from connection:[[thread=$NIOExecutor-1-2,id=702,user=ztm,host=192.168.210.129,port=3323,localport=47832,schema=D1,[{_os:linux-glibc2.12}, {_client_name:libmysql}, {_pid:32094}, {_client_version:5.7.25}, {_platform:x86_64}, {program_name:mysql}]]] cn.hotpu.hotdb.b.c: 1143: SELECT command denied to user 'ztm'@'192.168.210.129' for column 'c' in table 'sbtest1'
2021-06-25 14:22:33.466 [INFO] [HOTDBERROR] [Unusual-Logger-1] cn.hotpu.hotdb.server.b(286) - sql: select c from sbtest1, err: SELECT command denied to user 'ztm'@'192.168.210.129' for column 'c' in table 'sbtest1' from connection [thread=Unusual-Logger-1,id=702,user=ztm,host=192.168.210.129,port=3323,localport=47832,schema=D1,[{_os:linux-glibc2.12}, {_client_name:libmysql}, {_pid:32094}, {_client_version:5.7.25}, {_platform:x86_64}, {program_name:mysql}]]
示例2: 不允许用户‘ztm’@‘%'对逻辑库d1中sbtest1表主键所在列有select、insert、update权限
以OLTP场景标准表sbtest1为例,则可配置:
<property name="columnPrivilegeDenied">'ztm'@'%'.d1.sbtest1[select(id),insert(_primary_),update(_unique_)]</property><!--控制表中的列拒绝权限,优先级高于其他权限-->
由于sbtest1表中id既是主键,也是唯一键,故可以使用_primary_或者_unique_来表示。动态加载成功后,立即生效,在服务端口执行sql验证:
ztm@192.168.210.130:(none) 5.7.25 01:47:10> use d1
Database changed
ztm@192.168.210.130:d1 5.7.25 01:47:17> select id from sbtest1;
ERROR 1143 (HY000): SELECT command denied to user 'ztm'@'%' for column 'id' in table 'sbtest1'
ztm@192.168.210.130:d1 5.7.25 01:47:49> insert into sbtest1(id) values(1000);
ERROR 1143 (HY000): INSERT command denied to user 'ztm'@'%' for column 'id' in table 'sbtest1'
ztm@192.168.210.130:d1 5.7.25 01:48:16> update sbtest1 set id=id+1 where k=1;
ERROR 1143 (HY000): UPDATE command denied to user 'ztm'@'%' for column 'id' in table 'sbtest1'
示例3: 不允许用户‘ztm’@‘127.0.0.1’对逻辑库d1中sbtest1表所有列有select、insert、update权限,不允许用户‘root’@‘%‘对逻辑库d2中sbtest4表所有列有select、insert、update权限,不允许用户‘ztm’@‘192.168.210.129’对逻辑库d3中sbtest8表所有列有select、insert、update权限
以OLTP场景标准表sbtest1~sbtest10为例,则可配置:
<property name="columnPrivilegeDenied">'ztm'@'127.0.0.1'.d1.sbtest1[select(id,k,c,pad),insert(_primary_,k,c,pad),update(_unique_,k,c,pad)];'root'@'%'.d2.sbtest4[select(id,k,c,pad),insert(_primary_,k,c,pad),update(_unique_,k,c,pad)];'ztm'@'192.168.210.129'.d3.sbtest8[select(id,k,c,pad),insert(_primary_,k,c,pad),update(_unique_,k,c,pad)]</property><!--控制表中的列拒绝权限,优先级高于其他权限-->
由于sbtest1表中id既是主键,也是唯一键,故可以使用_primary_或者_unique_来表示。动态加载成功后,立即生效,在服务端口执行sql验证:
root@127.0.0.1:(none) 5.7.25 02:01:10> use d2
Database changed
root@127.0.0.1:d2 5.7.25 02:01:20> select id from sbtest4;
ERROR 1143 (HY000): SELECT command denied to user 'root'@'%' for column 'id' in table 'sbtest4'
root@127.0.0.1:d2 5.7.25 02:01:25> select k from sbtest4;
ERROR 1143 (HY000): SELECT command denied to user 'root'@'%' for column 'k' in table 'sbtest4'
root@127.0.0.1:d2 5.7.25 02:01:43> select c from sbtest4;
ERROR 1143 (HY000): SELECT command denied to user 'root'@'%' for column 'c' in table 'sbtest4'
root@127.0.0.1:d2 5.7.25 02:01:47> select pad from sbtest4;
ERROR 1143 (HY000): SELECT command denied to user 'root'@'%' for column 'pad' in table 'sbtest4'
root@127.0.0.1:d2 5.7.25 02:01:52> insert into sbtest4 values(10000,88,uuid(),uuid());
ERROR 1143 (HY000): INSERT command denied to user 'root'@'%' for column 'id' in table 'sbtest4'
root@127.0.0.1:d2 5.7.25 02:02:16> insert into sbtest4(id) values(10000);
ERROR 1143 (HY000): INSERT command denied to user 'root'@'%' for column 'id' in table 'sbtest4'
root@127.0.0.1:d2 5.7.25 02:02:44> insert into sbtest4(k) values(88);
ERROR 1143 (HY000): INSERT command denied to user 'root'@'%' for column 'k' in table 'sbtest4'
root@127.0.0.1:d2 5.7.25 02:02:53> insert into sbtest4(c) values(uuid());
ERROR 1143 (HY000): INSERT command denied to user 'root'@'%' for column 'c' in table 'sbtest4'
root@127.0.0.1:d2 5.7.25 02:03:02> insert into sbtest4(pad) values(uuid());
ERROR 1143 (HY000): INSERT command denied to user 'root'@'%' for column 'pad' in table 'sbtest4'
示例4: 不允许所有用户对所有逻辑库中所有表pad列有select、insert、update权限
以OLTP场景标准表sbtest1~sbtest10为例,则可配置:
<property name="columnPrivilegeDenied">*.*.*[select(pad),insert(pad),update(pad)]</property><!--控制表中的列拒绝权限,优先级高于其他权限-->
动态加载成功后,立即生效,在服务端口执行sql验证:
ztm@192.168.210.130:(none) 5.7.25 02:09:01> use d1;
Database changed
ztm@192.168.210.130:d1 5.7.25 02:09:11> select pad from sbtest1;
ERROR 1143 (HY000): SELECT command denied to user 'ztm'@'192.168.210.129' for column 'pad' in table 'sbtest1'
ztm@192.168.210.130:d1 5.7.25 02:09:21> select pad from sbtest2;
ERROR 1143 (HY000): SELECT command denied to user 'ztm'@'192.168.210.129' for column 'pad' in table 'sbtest2'
ztm@192.168.210.130:d1 5.7.25 02:09:25> select pad from sbtest3;
ERROR 1143 (HY000): SELECT command denied to user 'ztm'@'192.168.210.129' for column 'pad' in table 'sbtest3'
ztm@192.168.210.130:d1 5.7.25 02:09:28> select pad from d2.sbtest4;
ERROR 1143 (HY000): SELECT command denied to user 'ztm'@'192.168.210.129' for column 'pad' in table 'sbtest4'
ztm@192.168.210.130:d1 5.7.25 02:09:40> insert into sbtest3(pad) values(uuid());
ERROR 1143 (HY000): INSERT command denied to user 'ztm'@'192.168.210.129' for column 'pad' in table 'sbtest3'
ztm@192.168.210.130:d1 5.7.25 02:10:07> update sbtest2 set pad=uuid() where id=1;
ERROR 1143 (HY000): UPDATE command denied to user 'ztm'@'192.168.210.129' for column 'pad' in table 'sbtest2'
compatibleWithChinesePunctuation
参数说明:
Property | Value |
---|---|
参数值 | compatibleWithChinesePunctuation |
是否可见 | 否 |
参数说明 | 是否兼容语句中使用中文标点 |
默认值 | false |
Reload是否生效 | 是 |
参数设置:
<property name="compatibleWithChinesePunctuation">false</property><!-- 是否兼容语句中使用中文标点 -->
参数作用:
开启后,支持如下中文标点:左括号、右括号、逗号、冒号、分号、问号、感叹号,以上标点仅支持如下编码方式:Unicode、UTF8、GBK/18030、BIG5
特殊说明:
支持中文字符等价于英文字符:1. 左括号(2. 右括号)3. 逗号,4. 冒号:5. 分号;6. 问号?7. 感叹号!
/!hotdb:/暂不支持中文符号。
以下举例说明(左右中文括号查询):
root@127.0.0.1:(none) 01:01:01> SELECT hello('world');
+--------------------+
| hello('world') |
+--------------------+
| Hello,world! |
configMGR & bak1Url & bak1Username & bak1Password
参数说明:
Property | Value |
---|---|
参数值 | configMGR |
是否可见 | 是 |
参数说明 | 配置库是否使用MGR |
默认值 | false |
Reload是否生效 | 是 |
Property | Value |
---|---|
参数值 | bak1Url |
是否可见 | 是 |
参数说明 | MGR配置库地址 |
默认值 | 空 |
Reload是否生效 | 是 |
Property | Value |
---|---|
参数值 | bak1Username |
是否可见 | 是 |
参数说明 | MGR配置库用户名 |
默认值 | 空 |
Reload是否生效 | 是 |
Property | Value |
---|---|
参数值 | bak1Password |
是否可见 | 是 |
参数说明 | MGR配置库密码 |
默认值 | 空 |
Reload是否生效 | 是 |
参数作用:
configMGR和bak1Url和bak1Username以及bak1Password属于配套参数,用于MGR配置库功能。若使用MGR配置库,则需要设置为对应MGR配置库的信息且保证MGR配置库实例的复制关系正常,且互为MGR,当主配置库发生故障时会自动切换到新的主配置库。MGR配置库最多支持3个。
<property name="configMGR">true</property> <!-- 配置库是否使用MGR -->
<property name="bak1Url">jdbc:mysql://192.168.210.32:3306/hotdb_config</property> <!-- MGR配置库地址(如配置库使用MGR,必须配置此项),需指定配置库服务所在的真实IP地址 -->
<property name="bak1Username">hotdb_config</property> <!-- MGR配置库用户名(如配置库使用MGR,必须配置此项) -->
<property name="bak1Password">DRDS_config@2013</property> <!-- MGR配置库密码(如配置库使用MGR,必须配置此项) -->
crossDbXa
参数说明:
Property | Value |
---|---|
参数值 | crossDbXa |
是否可见 | 否 |
参数说明 | 跨逻辑库是否采用XA事务 |
默认值 | false |
Reload是否生效 | 否 |
参数设置:
server.xml中crossDbXa参数如下配置:
<property name="crossDbXa">false</property>
参数作用:
开启enableXA时,如果存在跨逻辑库查询的XA事务,需要开启crossDbXa才能保证强一致性。当crossDbXa未开启时也可以支持,但不保证数据的强一致,且事务内加入新节点,查询会报错。以下四个场景举例说明:
数据准备:
- 开启XA
- 逻辑库A,默认节点为1,2;逻辑库B,默认节点为2,3,4
- 逻辑库A创建表a;逻辑库B创建表b;两张表的表结构一致
- 表a中插入1000条数据;表b无数据
场景一、crossDbXa 关闭时,不保证数据强一致:
1.开启一个session,执行如下SQL:
use A;
begin;
insert into B.b select * from A.a;
commit;
use B;
begin;
delete from b;
commit;
两个事务反复交替执行,无间隔时间;
2.开启另外一个session,反复执行:
use A;
select count(*) from B.b;
结果:count (*)得出的结果不一定全为0或1000
场景二、crossDbXa 开启时,保证数据强一致:
1.开启一个session,执行如下SQL:
use A;
begin;
insert into B.b select * from A.a;
commit;
use B;
begin;
delete from b;
commit;
两个事务反复交替执行,无间隔时间;
2. 开启另外一个session,反复执行:
use A;
select count(*) from B.b;
结果:Count (*)得出的结果为0或1000
场景三、crossDbXa 关闭时,事务内加入节点会报错:
1.开启一个session,执行如下SQL:
use A;
begin;
select * from A.a;
select * from B.b;
结果:select * from B.b;执行会报错
场景四、crossDbXa 开启时,事务内加入节点正常执行:
1.开启一个session,执行如下SQL:
use A;
begin;
select * from A.a;
select * from B.b;
结果:select * from B.b;正常执行
cryptMandatory
参数说明:
Property | Value |
---|---|
参数值 | cryptMandatory |
是否可见 | 是 |
参数说明 | 是否强制加密密码 |
默认值 | False |
Reload是否生效 | 是 |
参数设置:
<property name="cryptMandatory">false</property><!-- 是否强制加密密码,是:true,否:false -->
参数作用:
于设置计算节点是否可以读取加密后的存储节点密码。
- True状态:
- 存储节点密码为明文的时候,计算节点会无法连接该存储节点
- 存储节点密码为密文的时候,计算节点能够连接该存储节点
- False状态:
- 存储节点密码为明文的时候,计算节点能够连接该存储节点
- 存储节点密码为密文的时候,计算节点能够连接该存储节点
clientDeprecateEof
参数说明:
Property | Value |
---|---|
参数值 | clientDeprecateEof |
是否可见 | 否 |
参数说明 | 客户端激活CLIENT_DEPRECATE_EOF标志后,发送OK包 |
默认值 | 0 |
Reload是否生效 | 是 |
参数设置:
server.xml的clientDeprecateEof参数设置为0:
<property name="clientDeprecateEof">0</property><!-- 当客户端激活CLIENT_DEPRECATE_EOF标志后,在结果集包后发送OK包而非EOF包, 0:关闭, 1:开启-->
参数作用:
由于pyodbc无法智能处理CLIENT_DEPRECATE_EOF标志位,增加参数clientDeprecateEof,当客户端激活CLIENT_DEPRECATE_EOF标志后,在结果集包后发送OK包而非EOF包, 0:关闭, 1:开启
cteMaxRecursiveDepth
参数说明:
Property | Value |
---|---|
参数值 | cteMaxRecursiveDepth |
是否可见 | 否 |
参数说明 | 公共表达式(CTE)最大递归深度 |
默认值 | 1000 |
最小值 | 0 |
最大值 | 4294967295 |
Reload是否生效 | 是 |
参数设置:
<property name="cteMaxRecursiveDepth">1000</property><!-- 公共表达式(CTE)最大递归深度(The common table expression (CTE) maximum recursion depth) -->
参数作用:
用于设置计算节点公共表达式(CTE)最大递归深度。公共表达式语法同存储节点 8.0语法一致(仅支持SELECT),在计算节点做支持,故不限制存储节点版本。
例如: 设置cteMaxRecursiveDepth的值为5,未超出公共表达式最大递归深度场景:
root@127.0.0.1:cte1 5.7.25 11:37:38> WITH RECURSIVE cte (n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM cte LIMIT 3 ) SELECT * FROM cte;
+------+
| n |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (0.01 sec)
超出公共表达式最大递归深度场景:
root@127.0.0.1:cte1 5.7.25 11:40:15> WITH RECURSIVE cte (n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM cte LIMIT 7 ) SELECT * FROM cte;
ERROR 3636 (HY000): Recursive query aborted after 6 iterations. Try increasing cteMaxRecursiveDepth to a larger value in server.xml
相关文章:
hhdb数据库介绍(9-21)
计算节点参数说明 checkClusterBeforeDnSwitch 参数说明: PropertyValue参数值checkClusterBeforeDnSwitch是否可见否参数说明集群模式下触发数据节点高可用切换时,是否先判断集群所有成员正常再进行数据节点切换默认值falseReload是否生效是 参数设…...
React中组件通信的几种方式
在构建复杂的React应用时,组件之间的通信是至关重要的。从简单的父子组件通信到跨组件状态同步,不同组件之间的通信方式多种多样。 1. 父子组件通信 父子组件通信是 React 中最基本的通信方式之一。在这种模式下,数据是从父组件通过 props …...
python脚本实现csv中百度经纬度转84经纬度
数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84...
syslog udp配置笔记
要将 /var/log/ 目录下的日志信息通过 UDP 发送到远程服务器,可以使用 rsyslog 的配置来实现。以下是详细步骤: 步骤 1:确保 rsyslog 已安装 如果 rsyslog 没有安装,请使用以下命令进行安装: 在 CentOS/RHEL: sudo yum install rsyslog在 Ubuntu/Debian: sudo apt-get i…...
Linux环境开启MongoDB的安全认证
文章目录 1. MongoDB安全认证简介1.1 访问控制1.2 角色1.3 权限 2. MongoDB中的常见角色3. MongoDB Shell3.1 下载MongoDB Shell3.2 通过MongoDB Shell连接MongoDB 4. 创建管理员用户5. 为具体的数据库创建用户6. 开启权限认证7. 重启MongoDB服务8. 连接MongoDB9. MongoDB数据库…...
django基于Python的农产品销售系统的设计与实现
摘 要 随着现代人们的快速发展,农产品销售系统已成为农产品的需求。该平台采用Python技术和django搭建系统框架,后台使用MySQL数据库进行信息管理;通过个人中心、用户管理、商家管理、产品类型管理、农产品管理、系统管理、订单管理等功能&a…...
linux复习5:C prog
编辑 缩排 为了使C源代码更加整洁易读,可以使用一些工具来自动格式化代码,例如cb(C程序美化器)、bcpp(C美化器)和indent等。 编译 编译并链接C文件 gcc hello.c -o hello 将 hello.c 编译并链接成可执行文…...
Go语言24小时极速学习教程(三)常见标准库用法
常见标准库 常见标准库即Go语言自带的库,这里的所有包都可以通过import直接引入,如果你觉得实在是不好用,那么请先保证你学会了标准库的基础上,再学一下Gookit,特别是其中的GoUtil,千万不要轻易自己去造轮…...
大数据环境下的高效数据清洗策略
大数据环境下的高效数据清洗策略 在当今这个信息爆炸的时代,大数据已成为企业决策和科学研究不可或缺的重要资源。然而,数据的海量性、多样性和复杂性也给数据处理带来了前所未有的挑战,其中数据清洗是确保数据质量和后续分析准确性的关键步…...
基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段
一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时,为了实现通用的CURD,在定义实体类pojo时,会尽量将能用得上的数据库字段都定义到 pojo中,但是在查询的时候却有不一样的需求。mybatis的文档地址链接ÿ…...
Python 3 字符串
Python 3 字符串 字符串在Python中是一种基本的数据类型,用于存储文本数据。Python中的字符串是不可变的,这意味着一旦创建了一个字符串,就不能更改其内容。字符串可以用单引号()、双引号("ÿ…...
Android集成FCM(Firebace Cloud Messaging )
集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面,创建自己的项目 2、点击自己创建好的项目,在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…...
基于 RBF 神经网络辨识的单神经元 PID 模型参考自适应控制
这是一个基于 RBF 神经网络辨识 和 单神经元 PID 模型参考自适应控制 的系统框图,包含以下主要部分: RBF 神经网络模块:用于对系统进行辨识,输入误差 e(t)e(t)e(t) 和误差变化量 Δe(t)\Delta e(t)Δe(t),输出与系统特…...
2024年 Web3开发学习路线全指南
Web3是一个包含了很多领域的概念,不讨论币圈和链圈的划分,Web3包括有Defi、NFT、Game等基于区块链的Dapp应用的开发;也有VR、AR等追求视觉沉浸感的XR相关领域的开发;还有基于区块链底层架构或者协议的开发。 这篇文章给出的学习路…...
Ubuntu22.04LTS 部署前后端分离项目
一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库,过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 (停止mysql的命令为:sudo service mysql stop࿰…...
「Mac玩转仓颉内测版23」基础篇3 - 深入理解整数类型
本篇将详细讲解Cangjie中的整数类型,探讨整数的定义、操作、表示范围、进制表示、类型转换及应用场景,帮助开发者在Cangjie中灵活运用整数类型构建程序逻辑。 关键词 有符号整数与无符号整数表示范围与溢出进制表示类型转换字面量与操作 一、整数类型概…...
渗透测试导学
渗透测试导学 渗透测试概念 渗透测试是干什么? 渗透测试的定义和目的:渗透测试是一种通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全性能的评估方法。它的目的是通过识别安全问题,帮助了解当前的安全状况,从而…...
Django实现智能问答助手-基础配置
设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑,并设计用户界面。下面是一步一步的简要说明: 目录: QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…...
亚马逊商品详情API接口解析,Json数据示例返回
亚马逊的商品详情API接口(如Amazon Product Advertising API)允许开发者获取商品的详细信息,包括价格、描述、图片URL等。以下是一个示例的JSON数据返回结构,以及相应的解析说明。请注意,实际返回的数据结构可能会根据…...
git根据远程分支创建本地新分支
比如我当前本地仓库有4个 remote 仓库,我希望根据其中的一个 <remote>/<branch> 创建本地分支: 先使用 github fetch <remote> 拉取 <remote> 的分支信息,然后在 git checkout -b 创建新分支时使用 -t <remote>…...
Android U 多任务启动分屏——SystemUI流程(更新中)
前文 Android U 多任务启动分屏——Launcher流程(下分屏) 前文说到通过ISplitScreen接口跨进程调用到了SystemUI进程,我们继续分析分屏在systemui中的实现。 wmshell实现分屏 实现ISplitScreen接口 代码路径:frameworks/base/…...
使用SaaS化的Aurora应用快速搭建私人ChatGPT助手
使用SaaS化的Aurora应用快速搭建私人ChatGPT助手 简介: Aurora是一个带UI且免费的GPT私人聊天助手,可切换GPT-3.5,4,4o等常用版本。用户可通过部署Aurora,快速打造自己专属的AI助手。阿里云计算巢已将Aurora打包为SaaS…...
.NET 9与C# 13革新:新数据类型与语法糖深度解析
记录(Record)类型 使用方式: public record Person(string FirstName, string LastName); 适用场景:当需要创建不可变的数据结构,且希望自动生成 GetHashCode 和 Equals 方法时。不适用场景:当数据结构需…...
2.fs文件系统模块
文章目录 [TOC](文章目录)2.5.练习-成绩管理2.5.1在files文件夹下新建成绩.txt文件2.5.2.新建对应的js文件 2.6.fs模块-路径动态拼接的问题 3.path路径模块3.1什么是path路径模块3.2.路径拼接3.3.获取路径中的文件名3.4.获取路径中的文件扩展名3.5.案例3.5.1.步骤13.5.2.调用fs…...
Ubuntu24.04LTS设置root用户可远程登录
Ubuntu24.04LTS设置root用户可远程登录 文章目录 Ubuntu24.04LTS设置root用户可远程登录1. 设置root密码2. 设置root用户可远程登录1. 查看ssh服务是否安装2. 安装ssh服务3. 再次查看ssh服务是否安装4. 配置ssh文件5. 重启ssh服务6. root远程登录 1. 设置root密码 Ubuntu安装后…...
ROS2指令总结(跟随古月居教程学习)
博主跟随古月居博客进行ROS2学习,对ROS2相关指令进行了总结,方便学习和回顾。 古月居ROS2博文链接:https://book.guyuehome.com/ 本文会持续进行更新,觉得有帮助的朋友可以点赞收藏。 1. ROS2安装命令 $ sudo apt update &am…...
IPTV智慧云桌面,后台服务器搭建笔记
环境CentOs7.9 ,安装宝塔yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 访问宝塔,修改服务器端口安全组端口 26029 注意!!!!…...
徒手从零搭建一套ELK日志平台
徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…...
udp_socket
文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen UDP服务器封装 系统调用socket …...
肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)
大家好!我是凯哥,今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线,并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的,花费了不少精力哦,希望对…...
上海网上做鸭子的网站/百度一下你就知道了百度一下
题目来源:http://ac.jobdu.com/problem.php?pid1283 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:991 解决:568 题目描述:在一个字符串(1<字符串长度<10000,全部由大写字…...
湖州市吴兴区建设局网站/百度长尾关键词挖掘
判断 判断尽量都用equals 测试 接口写完都要写单元测试...
厦门定制型网站建设/万网域名注册官网阿里云
内联函数 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数压 栈的开销,内联函数提升程序运行的效率 #define Fun(x,y) x*y #define N 10 int Mul(int x, int y) {return x*y; } int main() {cout <<…...
wordpress 更换模板/推广普通话奋进新征程手抄报
首先证明欧几里德算法(即最大公约数算法) 设有a,b两个数; ak*br,ra%b; 假设d是a,b的一个公约数,a%d0,b%d0;ra-k*b,因此r%d0; 即所有a,b的公约数都是b,a%b的公约数,那么gcd(a,b)gcd(b,a%b); 所以当a%b0时,即…...
一个空间建多个网站的方法/百度图片搜索入口
开发工具(工欲善其事必先利其器) 为了让大家更快的融入到编程的世界中, 不被繁琐的英语单词所困扰, 不用每天编写很多没有意义的重复代码, 提升大家的开发效率今后的课程中我们统一采用最高级高发工具来编写网页常见的前端开发工具 记事本: 提示功能较差editplus/nodepad: 提示…...
B2B第三方网站建设的流程/百度搜索优化平台
DTOJ 2700:hello world 解题报告 2017.11.06 第一版 ——由翱翔的逗比w原创题目信息: 题目描述 输出hello world 输出 hello world 样例输出 hello world 思路: 利用标准输出字符串“hello world”。 注意: hello world单词需拼…...