Amygoing
作者Amygoing联盟成员·2020-04-09 10:25
产品经理·数据库

分布式事务数据库HotDB的HINT特色语法

字数 3022阅读 1085评论 0赞 0

在计算节点使用HINT语法,可绕过HotDB Server解析器,直接在指定数据节点上执行MySQL的任意SQL语句。计算节点支持两种方式的HINT语法:

1.在HINT中使用DNID(数据节点ID):
语法:

/*!hotdb:dnid= dnid_value /

要执行的SQL

注:dnid_value的值为某个数据节点的ID号。用户可以替换dnid_value的值来指定具体的分片节点。

例如:

/*!hotdb:dnid= 1*/select * from customer where age > 20;

该语句将在数据库节点1上执行。用户可以通过分布式事务数据库管理平台中的”数据节点”页面,找到数据节点ID为1的存储节点名称,并在”存储节点”页面中搜索指定的存储节点名称,即可定位到实际的MySQL数据库。

2.在HINT中使用分片字段:
语法:

/*!hotdb:table= table_name:column_value*/ 

要执行的SQL

注:table_name即某个分片表的表名;column_value即该表上分片字段某个值。用户可以替换table_name的值指定相应的拆分规则,通过替换column_value的值来指定使用该分片字段的值对应的分片节点。

例如:

/*!hotdb:table = customer:10001*/select * from customer where age > 20;

使用方法:
连接计算节点(参考登录计算节点并开始使用),选择设置的逻辑库(这里使用“test”逻辑库),然后使用上述方式执行指定的语句(这里举例说明,使用时可以按需编写SQL)。
在dn_id=2的分片节点上查找cutomer表

mysql> /*!hotdb:dnid=2*/ select count(*) from customer;
+------------+
|  count(*) |
+-----------+
|      50     |
+-----------+
1 row inset (0.00 sec)

查找customer表上provinceid为1的分片节点的customer表

mysql> /*!hotdb:table=customer:1*/ select count(*) from customer;
+------------+
|  count(*) |
+------------+
|     11       |
+------------+
1 row inset (0.00 sec)

特殊说明:业务层面不建议HINT直接操作存储节点,因为使用HINT之后,数据、状态将不受计算节点控制。且为了防止连接池被污染,当使用HINT操作后,计算节点会绑定当前HINT查询使用的逻辑库关联的后端连接(即计算节点与存储节点的连接),所有涉及到后端的操作均在绑定的连接范围内被允许。故当HINT使用完毕后,建议重建新的前端连接以保证新的会话连接状态干净稳定。若不重建连接,当HINT使用后,有其他操作涉及到与原逻辑库绑定的后端连接之外的新的数据节点时,之前绑定的后端连接会失效,前端连接会被自动重建。
涉及到连接绑定的语句除了HINT,还包括如下语句:

set[session] foreign_key_checks=0;
STARTTRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
set[session] UNIQUE_CHECKS=0;

计算节点在这种连接被绑定的SQL执行后,会输出Warning及日志提醒:
如执行如下语句时会有warning提示:

mysql>use db_a
Databasechanged
mysql>/*!hotdb:dnid=all*/select * From tba;
+----+----+
|  id  |  a  |
+----+----+
|   1  |  1  |
|   2  |  2  |
|   3  |  3  |
|   4  |  4  |
|   5  |  5  |
+----+----+
5 rows inset, 1 warning (0.01 sec)
Warning(Code 10041): The current session has been bound to the backend connectionassociated with the current LogicDB. It is recommended to rebuild the sessionafter use.

同时日志会有info信息:
2019-04-0119:11:29.662 [INFO] [CONNECTION] [$NIOEecutor-3-1] ServerConnection(1565) – 31has been bound to the backend connection:[2,1]

当操作涉及到与原逻辑库绑定的后端连接之外的新的数据节点时,showwarnings会有如下提示且连接会断开:

mysql>use db_b
Databasechanged
mysql>show warnings;
+-------+-------+----------------------------------------------------------------------------------------------------------------+
| Level |Code  | Message
                                                       |
+-------+-------+----------------------------------------------------------------------------------------------------------------+
|Note  | 10042 | The connection in currentLogicDB was a binded connection, operations under current LogicDB may causeconnect abort. |
+-------+-------+----------------------------------------------------------------------------------------------------------------+
1 row inset (0.00 sec)
mysql>select * from tbb;
ERROR 2013(HY000): Lost connection to MySQL server during query
ERROR 2016(HY000): MySQL server has gone away
Noconnection. Trying to reconnect…
Connectionid:    63
Currentdatabase: db_b

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广