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>…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
