AWS Aurora只读副本设read_only=0仍报只读错误咨询
Aurora MySQL 5.7只读副本放开写入限制排查方案
场景与问题说明
- 运行环境:Aurora MySQL 引擎版本
5.7.mysql_aurora.2.07.2 - 业务需求:在集群内新增只读副本,用于运行夜间计算脚本、存储KPI与报表指标结果,对接前端仪表盘展示
- 已执行操作:
- 控制台通过「Add reader」创建只读实例
- 创建自定义实例参数组,将
read_only参数修改为0,重启实例同步配置 - 尝试创建
read_only=0的自定义集群参数组绑定集群,问题无改善 - 可通过只读副本实例端点、集群
.ro后缀只读端点正常建立数据库连接
- 故障现象:执行建表、写入数据等写操作时,返回报错
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement,无法完成写入
核心排查解决步骤
1. 补全修改引擎层只读参数(最常见漏项)
Aurora只读副本默认同时开启两层只读控制,仅修改read_only参数无法放开写入权限:
read_only:仅控制普通非SUPER权限用户的写入行为,对持有SUPER权限的账号无约束innodb_read_only:InnoDB引擎层只读开关,默认在只读副本上强制开启,开启后无论账号权限高低,都无法执行建表、增删改数据等涉及InnoDB表空间变更的操作,是触发当前报错的核心原因
操作流程:
- 进入RDS参数组控制台,找到绑定到该目标只读副本的自定义实例参数组(注意不要修改集群参数组,集群参数组的该配置对只读副本不生效)
- 搜索
innodb_read_only参数,将参数值调整为0,同时确认同参数组内super_read_only参数值也为0 - 保存参数修改后,手动重启该只读副本,等待实例状态恢复为「可用」
- 连接实例执行参数校验命令,确认所有只读开关均为关闭状态:
SHOW VARIABLES LIKE '%read_only%';
正常返回结果参考:
+-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_read_only | OFF | | read_only | OFF | | super_read_only | OFF | | transaction_read_only | OFF | +-----------------------+-------+
2. 更换连接端点
禁止使用集群.ro后缀的公共只读端点连接该实例:该端点是Aurora提供的只读流量负载均衡端点,路由层会默认拦截所有发往该端点的写入请求,哪怕单实例已经放开写入限制也无法执行写操作。
连接时仅使用该只读副本在「连接性与状态」模块展示的实例专属端点即可。
3. 校验账号权限
完成上述两步配置后如果仍报错,检查连接使用的业务账号是否持有目标库的写入权限,执行授权语句(按需替换占位符内容):
-- 授予对应库表的建表、读写权限 GRANT CREATE, INSERT, UPDATE, DELETE ON 指标存储库名.* TO '脚本使用账号'@'访问IP段'; FLUSH PRIVILEGES;
注意事项
- 该实例上写入的本地自建表不会同步回主集群,也不会同步到其他只读副本,数据仅存储在当前实例,完全符合本地报表计算存储的场景需求
- 不要修改主库同步过来的业务表数据/结构,否则会导致主从复制链路中断,影响副本上的业务数据同步
- 建议单独创建专属的指标存储库,和主库同步的业务库做物理隔离,避免误操作
- 所有参数修改必须在实例绑定的自定义实例参数组上操作,默认参数组不支持参数修改,集群参数组的只读相关配置不会覆盖只读副本的默认引擎限制
内容的提问来源于stack exchange,提问作者oncooldown
相关产品推荐
相关产品推荐

