全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
云数据库 RDS 版

通过内部SQL命令验证

更新时间:2017-06-07 13:26:11

您可以通过执行/*PROXY_INTERNAL*/show last route;命令来验证读写分离的效果。

注意:该SQL语句目前为内部测试功能,后期根据实际情况可能会做调整,请暂勿用于生产环境。

查看一条SQL命令被发送到哪个库执行

执行如下SQL命令,即可查看SQL命令执行到的实例ID。

  1. /*PROXY_INTERNAL*/show last route;

注意:RDS提供了内置的hint SQL(该SQL只能通过读写分离vip执行),如果您通过mysqlclient客户端访问,必须加-c选项,否则hit会被mysql client过滤掉,导致返回如下错误。

  1. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
  2. corresponds to your MySQL server version for the right syntax to use near 'last route' at
  3. line 1

返回结果:last_bkid,即上条SQL(hit的上一条)发到哪个库的ID,这个ID是RDS每个实例的唯一标识,每个实例的ID唯一。详情如下图所示。

返回结果

说明:由于RDS的SQL负载是按批负载,现在是以每100条为最小单位,所以您可能看到第一次select在一个实例ID上执行,第二次还是在这个ID上执行,要执行100次之后才会发现到另外一个ID上执行了。可以通过写个简单的SQL文件来验证,如下面的a.sql所示:

  1. select 1;
  2. /*PROXY_INTERNAL*/show last route;select 1;
  3. ***100条***;
  4. select 1;
  5. /*PROXY_INTERNAL*/show last route;

这时就可以看到第101条SQL被路由到另外一个ID(假设您有超过2个的只读实例ID可以负载)。

验证写请求都发送到主库(主实例)执行

RDS实例开通读写分离功能后,写请求只能发送到主库,因为所有的只读库都是read_only,即使我们系统或路由出错了(假设把某条写的SQL路由到只读库),我们会根据出错原因(read_only error)再次把该写请求发到主库上执行。

另外,您可以先执行一条insert语句,然后再执行如下hint SQL来确定写请求是否都发送到了主库。

  1. /*PROXY_INTERNAL*/show last route;

验证读请求都发送到备库(只读实例)执行

执行如下hint SQL命令,查询执行度请求的实例ID,来确定读请求是否发送到了备库。

  1. /*PROXY_INTERNAL*/show last route;

说明:由于RDS的SQL负载是按批负载,现在是以每100条为最小单位,所以您可能看到第一次select在一个实例ID上执行,第二次还是在这个ID上执行,要执行100次之后才会发现到另外一个ID上执行了。可以通过写个简单的SQL文件来验证,如下面的a.sql所示:

  1. select 1;
  2. /*PROXY_INTERNAL*/show last route;select 1;
  3. ***100条***;
  4. select 1;
  5. /*PROXY_INTERNAL*/show last route;

这时就可以看到第101条SQL被路由到另外一个ID(假设您有超过2个的只读实例ID可以负载)。

本文导读目录