更新时间:2024-10-24 GMT+08:00

数据库代理约束与限制

支持的区域

支持开通数据库代理的区域有:中国-香港、亚太-曼谷、亚太-新加坡,其他区域需要有相应的操作权限,您可以提交工单申请。

购买多个数据库代理实例需要有相应的操作权限,您可以提交工单申请。

版本约束

  • 5.6:大于等于5.6.51.7版本的RDS for MySQL实例支持数据库代理。
  • 5.7:大于等于5.7.37.2版本的RDS for MySQL实例支持数据库代理。
  • 8.0:8.0全部内核小版本的RDS for MySQL实例支持数据库代理。

如果内核版本低,可以升级内核小版本

功能限制

  • 一个MySQL只读实例可以被不同代理连接,但通常建议只有一个代理分配流量到该只读实例上。
  • rdsProxy是数据库代理账户,属于RDS数据库内置账号,建议您不要创建同名账户,避免影响读写分离功能正常运行。
  • 开启读写分离功能后,删除RDS for MySQL主实例,会同步删除只读实例,并关闭读写分离功能。
  • 读写分离不支持RDS for MySQL8.0的caching_sha2_password身份认证插件。
  • 开启读写分离功能后,主实例和只读实例均不允许修改数据库端口和内网地址。
  • 读写分离功能不支持压缩协议。
  • 读写分离不支持事务隔离级别READ-UNCOMMITTED。
  • 如果执行了Multi-Statements,默认当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离,目前支持多种Multi-Statements处理模式,详情参考设置Multi-Statements处理模式
  • 如果执行了临时表的相关操作,默认当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能复读写分离。
  • 如果执行了Handler语句,默认后续请求全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。
  • 使用读写分离的连接地址时,事务请求都会路由到主实例(可以使用事务拆分功能对事务中写之前的读请求进行拆分),不保证非事务读的一致性,业务上有读一致性需求可以封装到事务中。
  • 使用读写分离的连接地址时,LAST_INSERT_ID()函数仅支持在事务中使用。
  • 使用用户自定义变量时,包含用户自定义变量的语句会路由到主节点。
  • 当使用数据库代理时,多语句拼接的SQL大小不超过100MB,避免数据库代理解析SQL消耗过多的资源。
  • 当使用.net客户端连接数据库代理时,需要客户端的MySQL.Data驱动版本不低于8.0.19,低版本MySQL.Data与数据库代理存在兼容性风险。
  • 当使用事务拆分功能时,需要将代理升级至最新版。
  • 数据库代理不支持SQL_MODE参数PAD_CHAR_TO_FULL_LENGTH

语法限制

读写分离请求路由原理:客户的前端请求会根据当前数据库节点权重的配置,随机路由到后端任一数据库节点。

因此,一些SQL语句多次执行的结果可能存在差异,部分语句列举如下:

  • 使用读写分离地址连接proxy和直连后端数据库执行show processlist结果返回有差异,因为proxy的show processlist是逻辑的,仅仅将通过proxy节点下发的业务展示出来,所以和直连后端数据库有差异。
  • 当某一个代理节点处于异常状态时,通过读写分离地址连接proxy执行show processlist或者kill时,有可能会出现命令执行时间稍微变长或卡顿的情况,此时无需关注,业务不会受到影响。
  • 当数据库代理节点缩容后,通过代理执行show processlist命令时,可能会将被缩容的节点上的业务展示出来。
  • 通过数据库代理进行kill时,可能会出现超时等报错信息,此时可以通过再次执行show processlist查看业务是否真正被kill成功。
  • 通过数据库代理的请求只能通过代理进行kill操作。
  • 使用读写分离的连接地址时,不支持使用show errorsshow warnings命令。
  • 使用读写分离的连接地址时,如果存储过程(procedure)和函数(function)中依赖了用户变量,即@variable,则运行结果可能不正确。