
# 数据库代理约束与限制
#### 支持的区域
支持购买多个数据库代理实例的区域有：华北-北京四、华东-上海一、华南-广州、西南-贵阳一，其他区域需要有相应的操作权限，您可以[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)申请。
#### 版本约束
- 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实例支持数据库代理。
- 8.4：8.4版本开启数据库代理，需要保证数据库代理版本大于2.26.06.000，同时需要保证数据库参数authentication_policy的值为\*:mysql_native_password。
实例版本的查询方法请参见[如何查看云数据库RDS实例的版本号](https://support.huaweicloud.com/rds-mysql_faq/rds_faq_0211.html)。
如果内核版本低，可以[升级内核小版本](https://support.huaweicloud.com/usermanual-rds-mysql/rds_05_0003.html)。
#### 功能限制
表1功能限制 
| 分类     | 限制说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|
| 不支持的功能 | - 数据库代理不支持压缩协议。  - 数据库代理仅支持库级权限校验，不支持校验单表的权限。  - 数据库代理不支持使用中文数据库和中文用户名。  - 数据库代理不支持使用**show errors** 和**show warnings**命令。  - 数据库代理不支持RDS for MySQL8.0的caching_sha2_password身份认证插件。  - 开启数据库代理后，主实例和只读实例均不允许修改数据库端口和内网地址。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| 使用约束   | - 专属计算集群开通读写分离，需要有相应的操作权限，您可[提交工单](https://console.huaweicloud.com/ticket/?locale=zh-cn#/ticketindex/createIndex)申请。  - 一个MySQL只读实例可以被不同代理连接，但通常建议只有一个代理分配流量到该只读实例上。  - rdsProxy是数据库代理账户，属于RDS数据库内置账号，建议您不要创建同名账户，避免影响读写分离功能正常运行。  - 开启读写分离功能后，删除RDS for MySQL主实例，会同步删除只读实例，并关闭读写分离功能。  - 如果执行了Multi-Statements，默认当前连接的后续请求会全部路由到主节点，需断开当前连接并重新连接才能恢复读写分离，目前支持多种Multi-Statements处理模式，详情参考[设置Multi-Statements处理模式](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0052.html)。  - 如果执行了显式创建临时表的相关操作，默认当前连接的后续请求会全部路由到主节点，需断开当前连接并重新连接才能恢复读写分离。  - 使用读写分离的连接地址时，事务请求都会路由到主实例（可以使用事务拆分功能对事务中写之前的读请求进行拆分），不保证非事务读的一致性，业务上有读一致性需求可以封装到事务中。  - 使用读写分离的连接地址时，LAST_INSERT_ID()函数仅支持在事务中使用。  - 使用用户自定义变量时，包含用户自定义变量的语句会路由到主节点。  - 使用数据库代理时，批量提交的SQL执行条数不超过100条，多语句拼接的SQL大小不超过100MB，避免数据库代理解析SQL消耗过多的资源。  - 使用.net客户端连接数据库代理时，需要客户端的MySQL.Data驱动版本不低于8.0.19，低版本MySQL.Data与数据库代理存在兼容性风险。  - 使用事务拆分功能时，需要将代理升级至最新版。  - 更多限制，详见[发往主节点的读请求](https://support.huaweicloud.com/usermanual-rds-mysql/rds_11_0016.html#rds_11_0016__section1970963318543)。   |
   
#### 语法限制
读写分离请求路由原理：客户的前端请求会根据当前数据库节点权重的配置，随机路由到后端任一数据库节点。
因此，一些SQL语句多次执行的结果可能存在差异，部分语句列举如下：
- 使用读写分离地址连接proxy和直连后端数据库执行**show processlist** 结果返回有差异，因为proxy的**show processlist**是逻辑的，仅仅将通过proxy节点下发的业务展示出来，所以和直连后端数据库有差异。
- 当某一个代理节点处于异常状态时，通过读写分离地址连接proxy执行**show processlist** 或者**kill**时，有可能会出现命令执行时间稍微变长或卡顿的情况，此时无需关注，业务不会受到影响。
- 当数据库代理节点缩容后，通过代理执行**show processlist**命令时，可能会将被缩容的节点上的业务展示出来。
- 通过数据库代理进行**kill** 时，可能会出现超时等报错信息，此时可以通过再次执行**show processlist**查看业务是否真正被kill成功。
- 当数据库代理的某个节点处于异常状态时，执行**show processlist**命令时，可能会出现2秒卡顿，此时无需关注，结果会正常返回。
- 通过数据库代理的请求只能通过代理进行**kill**操作。
- 使用读写分离的连接地址时，如果存储过程(procedure)和函数(function)中依赖了用户变量，即@variable，则运行结果可能不正确。
- 如果开启了会话连接池功能，会导致SELECT LAST_INSERT_ID()值结果恒为0。
 
