RDS无法查看新插入数据
问题描述
新插入的数据查询不到
问题原因
-
只读实例存在延迟
-
事务没有提交
-
RR隔离级别在已开启的事务中进行的查询
解决方案
一、只读实例存在延迟
1)只读实例规格过小
-
建议您升级只读实例规格,使只读实例的配置大于或者等于主实例的配置,避免由于只读实例规格较小导致延迟。
2)主实例的TPS(Transaction Per Second)过高
-
确认主实例的TPS是否正常,如果TPS过高,则需要对业务进行优化或者拆分,保证主实例的TPS不会导致只读实例出现延迟。TPS相关数据可以通过自治服务的性能趋势页面查看。
3)主实例的大事务
-
在只读实例出现大事务导致延迟时,登录数据库,执行以下SQL语句,确认Seconds_Behind_Master不断变化,而Exec_Master_Log_Pos却保持不变,说明只读实例的SQL线程在执行一个大事务或者DDL操作。然后通过
show processlist
语句定位具体的线程。show slave status \G
系统显示类似如下。
-
建议您将大事务拆分为小事务分别执行。例如在delete语句中增加where条件子句,限制每次删除的数据量,将一次删除操作拆分为多次数据量较小的删除操作进行。这样只读实例可以迅速的完成事务的执行,不会造成数据的延迟。
4)主实例的DDL语句执行时间长
-
对于DDL直接引起的只读实例延迟,建议在业务低峰期执行这些DDL。
-
对于来自主实例的DDL语句在只读实例上被阻塞的情况:
-
需要在只读实例上执行
show processlist
语句,确认SQL线程的状态为“waiting for table metadata lock”。 -
然后使用
kill
命令终止只读实例上引起阻塞的会话,恢复只读实例和主实例的数据同步,引起阻塞的会话请参考该文档最下方的链接。
-
二、事务没有提交
在RR以及RC隔离级别下,当事务没有提交时,在该事务外是查询不到的,修改完后需要及时提交。
事务隔离级别可以执行如下命令查看:
show variables like '%transaction_isolation%';
三、RR隔离级别在已开启的事务中进行的查询
在RR隔离级别下,如是在已开启的事务中进行的查询操作,那么开启该事务期间该事务外插入的数据是查询不到的,需要提交或者回滚当前事务或另开一个窗口进行查询操作,从而查到最新数据。
适用范围
- RDS For MySQL
相关文档: