移动云云数据库大事务处理预防方案
背景信息
大事务即运行的时间比较长,操作数据比较多的事务。
风险:
- 出现内存溢出(OOM)的隐患;
- 锁定太多数据,造成大量的阻塞和锁超时;
- 执行时间长,容易造成主从延迟。
内存溢出(OOM)的预防解决方案
事务较多或者运行大事务SQL,加剧内存消耗量,当实例的内存使用率达到80%,此时实例的内存已达瓶颈,会导致系统响应慢,出现实例频繁重启现象,甚至经常出现内存溢出(OOM)隐患。
预防方案:
移动云云数据库mysql提供监控告警功能和数据库自治服务,可自定义监控内存使用量情况。具体操作参见“MySQL内存使用问题”章节。
解决方案:
1.建议您将大事务拆分为小事务分别执行。例如在delete语句中增加where条件子句,限制每次删除的数据量,将一次删除操作拆分为多次数据量较小的删除操作进行。
2.优化数据库参数,减少内存利用率,具体操作参见“内存利用率过高”章节。
3.如果经常出现内存溢出(OOM)现象,建议升级实例规格,具体操作参见“实例规格、存储/备份空间变更升级”章节。
锁定太多的数据排查方案
方案1:实例的存储空间不足
升级变更实例存储空间后即可解锁数据,具体操作参考“实例变更”章节。
方案2:日志文件占用量高
事务较多或者运行大事务导致事务日志增长过快。
- 数据文件占用量高的解决方法。如果数据库文件占用空间比较多,可以先检查数据文件的使用率。对于文件大但使用率低的数据库,可以进行相应处理。详细步骤如下。
1.查看数据库的空闲空间。
USE [$DB_Name];SELECT SUM(unallocated_extent_page_count) AS [free pages], (SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]FROM sys.dm_db_file_space_usage;
说明
[$DB_Name]指数据库名。
2.找到空间使用率较高的数据库,然后执行以下语句,收缩该数据库。
DBCC SHRINKDATABASE([$DB_Name]);
也可以执行以下命令来收缩单个文件。
DBCC SHRINKFILE(file_id,[$Size]);
说明
[$Size]指收缩以后的大小,而不是要收缩多少,单位MB。
临时文件用量高的解决方法。您可以从MySQL控制台>监控告警功能中初步判定临时文件是否占用太多空间。如果临时文件的空间不够,Error Log中也会有相应的记录。建议您执行以下操作:
执行时间长,造成主从延迟排查方案
方案1:主实例的TPS(Transaction Per Second)过高
确认主实例的TPS是否正常,如果TPS过高,则需要对业务进行优化或者拆分,保证主实例的TPS不会导致只读实例出现延迟。
方案2:主实例的大事务
1.主实例运行update、delete、insert…select、replace…select等涉及大事务操作时,会生成大量的Binlog日志文件数据并同步到只读实例。只读实例需花费与主实例相同的时间来完成该事务,因此会导致只读实例同步延迟。
在只读实例出现大事务导致延迟时,登录数据库,执行以下SQL语句,确认Seconds_Behind_Master不断变化,而Exec_Master_Log_Pos却保持不变,说明只读实例的SQL线程在执行一个大事务或者DDL操作。然后通过show processlist语句定位具体的线程。
show slave status \G
2.建议拆分大事务为小事务分别执行。例如,一个事务中操作了500万行数据,在有这种大事务的情况下,建议您将事务拆分,每个事务操作10万行数据,分50次执行。这样只读实例可以迅速的完成事务的执行,不会造成数据的延迟。
方案3:主实例的DDL语句执行时间长
- 对于DDL直接引起的只读实例延迟,建议在业务低峰期执行这些DDL。您可根据业务情况通过以下方法进行解决:
- 对于来自主实例的DDL语句在只读实例上被阻塞的情况:
本文由 vps主机对比评测网 刊发,转载请注明出处