`

mysql 备份大表问题-mysqldump缺失-q参数导致MySQL被oom干掉

 
阅读更多

 

某日凌晨收到db故障告警,上机器检查,mysql已经被myqld守护进程重新启动。检查/var/log/messages和最近的dmesg发现mysql进程是被oom干掉了。

信息大概摘录如下:
 [13045702.638964] kthread invoked oom-killer: gfp_mask=0xd0, order=1, oomkilladj=0
[13045702.638969] 
[13045702.638969] Call Trace: <ffffffff8014a331>{oom_kill_process+87}
[13045702.638977]        <ffffffff8014a722>{out_of_memory+271} <ffffffff8013ce59>{autoremove_wake_function+0}
ERROR: Fatal error found, match ERROR-KEYWORD 'out_of_memory' 
...

 [13045702.716335] Out of Memory: Kill process 25795 (mysqld) score 1591671 and children.
ERROR: Fatal error found, match ERROR-KEYWORD 'Out of Memory'

[13045702.716359] Out of memory: Killed process 25795 (mysqld).
.....
 [13045702.802080] Out of Memory: Kill process 1907 (mysqld) score 955002 and children.
ERROR: Fatal error found, match ERROR-KEYWORD 'Out of Memory'

[13045702.802102] Out of memory: Killed process 1907 (mysqld).
....
 [13045762.203463] Out of Memory: Kill process 24544 (mysqld) score 341071 and children.
ERROR: Fatal error found, match ERROR-KEYWORD 'Out of Memory' 
[13045762.203485] Out of memory: Killed process 24544 (mysqld).

[13045762.322333] sap1002 invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0
.....
 [13045762.479886] Out of Memory: Kill process 19530 (mysqldump) score 93607 and children.
ERROR: Fatal error found, match ERROR-KEYWORD 'Out of Memory'

[13045762.479907] Out of memory: Killed process 19530 (mysqldump).

由于内存不足,系统选择性的选择了耗用内存大的几个进程kill掉了。先kill了mysqld,最后才把mysqldump kill掉,这样有理由怀疑可能是因为mysqldump耗用了大量的内存导致的。

在这个db上,每天凌晨会使用mysqldump做单表备份并通过管道进行压缩。这个备份任务已经部署了超过1年多了。
查看了后台采集的OS性能数据,也可以发现在mysqldump启动直到备份结束,内存耗用会上升比较多,这样可以肯定是因为mysqldump耗用大量内存导致此次故障发生。

check备份使用的脚本,备份的逻辑大概如下:
1:show tables like 'xxx%' 获取需要备份的表名
2:mysqldump --uxx -pyy  --skip-opt <dbname> <tablename> >> <bakfilename>

至此问题就比较清晰了,mysqldump由于未使用-q参数导致耗用内存过大而导致OOM现象发生。

对mysqldump -q参数的解释(取自man mysqldump)
  ? --quick, -q

This option is useful for dumping large tables. It forces mysqldump to retrieve rows for a table from the server a row at a time rather than retrieving the entire row set and buffering it in memory before writing it out.

这个选项被用来dump比较大的表。它强制mysqldump从服务器一行一行的获取数据而不是把获取所有行的数据在输出之前把它缓存到内存中。

以下是一个测试,可以看到-q 参数对内存耗用的影响:
1:不带-q参数
top输出如下:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20010 mysql    15  0 18.0g  17g 4496 S  10 56.6  2765:51 mysqld
27518 mysql    25  0 4227m 4.1g 1048 R  100 13.1  0:33.05 mysqldump
内存耗用超过4G
2:带-q参数
top输出如下:
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20010 mysql    16  0 18.0g  17g 4496 S  84 56.6  2766:12 mysqld
27686 mysql    25  0 11628 1380 1052 R  98  0.0  0:23.20 mysqldump 
内存耗用很小,只有几K

应对方案:
修改备份脚本,加上-q参数。

到此还没完,这个备份任务已经部署了超过1年了,为啥到最近才出现此故障呢?
对DB内的数据做了个统计,需要备份表从之前100M/day的数据量突然爆增到4G/day。知会研发跟进问题,最后发现是前端配置更改导致前端不断重试导致。

体会:
在很多时候,故障的发生是很多因素交织在一起才发生的。碰到问题需要更深一层考虑去探寻问题发生的根本原因。

相关阅读:

Linux下通过mysqldump备份MySQL数据库成sql文件 http://www.linuxidc.com/Linux/2013-02/79793.htm

Linux中使用mysqldump对MySQL数据库进行定时备份 http://www.linuxidc.com/Linux/2012-03/56063.htm

 

 

分享到:
评论

相关推荐

    LNH_MySQL 12-mysqldump-master-data参数答疑详解.mp4

    LNH_MySQL 12-mysqldump-master-data参数答疑详解.mp4

    mysql数据库备份还原实战操作步骤-mysqldump备份还原

    MySQL 数据库备份还原实战操作步骤 - mysqldump 备份还原 在本文中,我们将介绍 MySQL 数据库备份还原实战操作步骤,包括使用 mysqldump 工具进行备份和恢复数据库的详细指令。 一、备份数据库 mysqldump 是 ...

    LNH_MySQL 02-mysqldump-master-data参数答疑详解.mp4

    LNH_MySQL 02-mysqldump-master-data参数答疑详解.mp4

    Mysql数据库备份恢复测试报告-mysqldump.docx

    MySQL数据库的备份与恢复是确保数据安全性的重要环节。在本次测试中,主要验证了全量备份和增量备份的恢复功能,以及数据恢复后的时间一致性。以下是详细的测试过程和相关知识点: 1. **全量备份与增量备份**: ...

    Linux运维-运维课程d4-MySQL备份与恢复(重点)-19-mysqldump全库级备份.mp4

    Linux运维-运维课程d4-MySQL备份与恢复(重点)-19-mysqldump全库级备份.mp4

    mysql批处理 备份数据库-压缩文件

    总之,MySQL批处理备份结合了`mysqldump`的数据库导出功能和压缩工具的文件压缩能力,实现了数据库备份的自动化和高效化。通过编写和配置批处理脚本,我们可以确保在出现故障时迅速恢复数据,保障业务的正常运行。

    mysql命令,mysql -h主机地址 -u用户名 -p密码

    ### MySQL 命令行工具详解 MySQL 是一个广泛使用的开源关系型数据库管理系统,提供了丰富的命令行工具,用于管理数据库、执行SQL语句以及备份恢复数据等操作。本文将基于给定的文件信息,深入解析MySQL命令行工具的...

    mysql for Linux (mysql-standard-4.1.22-pc-linux-gnu-i686.tar.gz )

    MySQL提供了mysqldump工具,用于数据库的备份和恢复。通过定时备份,可以在数据丢失或系统故障时快速恢复。 七、性能优化 MySQL有许多性能优化策略,包括创建索引、调整查询语句、使用分区表、启用缓存等。MySQL还...

    mysql-8.0.21-el7-x86-64.tar.gz

    对于生产环境,还应考虑使用如`mysqldump`进行备份,`pt-online-schema-change`进行在线表结构变更,以及`percona-toolkit`等性能优化工具。同时,理解并正确配置MySQL的系统变量和配置文件`my.cnf`对于优化性能至关...

    Mysql数据库备份(一)-数据库备份和表备份.docx

    本篇文章将详细介绍 Mysql 数据库备份的方法和步骤,从基础的 mysqldump 命令到备份多个数据库和所有数据库的操作,还有直接复制整个数据库项目和使用 mysqlhotcopy 工具快速备份的方法。 一、Mysql 中的数据备份 ...

    MySQL-client-5.6.29-1.linux_glibc2.5.x86_64,MySQL-server-5.6.29-1.linux_glibc

    MySQL-client是用于与MySQL服务器进行交互的工具集,包括mysql命令行客户端、mysqladmin、mysqldump等。这些工具使得用户能够连接到MySQL服务器,执行SQL查询,管理数据库,备份和恢复数据。5.6.29版本的客户端支持...

    MySQL-概述-安装配置 mysql-8.0.31-winx64

    4. **备份与恢复**:MySQL支持多种备份策略,如mysqldump用于逻辑备份,xtrabackup用于物理备份。恢复则反之进行。 5. **性能优化**:通过调整SQL语句、索引优化、配置参数调整等方式,可以提高MySQL的性能。 总的...

    mysql数据备份和还原的常用命令

    MySQL 数据备份和还原的常用命令 MySQL 数据备份和还原是数据库管理中非常重要的一步,能够防止数据丢失和恢复数据库。下面将介绍 MySQL 数据备份和还原的常用命令。 MySQL 数据备份命令 1. 备份 MySQL 数据库的...

    mysql-installer-community-5.7.36.1

    MySQL是世界上最受欢迎的开源数据库管理系统之一,而`mysql-installer-community-5.7.36.1`则是MySQL Community Server的安装程序包,版本号为5.7.36。这个版本代表了MySQL 5.7系列的一个稳定版本,包含了众多的改进...

    LNH_MySQL 03-mysqldump逻辑备份的工作原理.mp4

    LNH_MySQL 03-mysqldump逻辑备份的工作原理.mp4

    mysql-essential-5.0.22-win32.msi

    5. **分区表**:MySQL 5.0引入了分区表功能,可以将大型表分成多个逻辑部分,从而改善查询性能和管理大表的便利性。 6. **视图**:视图提供了一种抽象数据的方式,允许用户通过预定义的查询结果来查看和操作数据,...

    mysql-5.7.35-winx64.rar

    - **备份和恢复**:定期备份数据库以防止数据丢失,学习如何使用`mysqldump`进行全量或增量备份,并了解如何恢复备份文件。 - **性能监控**:利用`SHOW STATUS;`和`SHOW VARIABLES;`命令监控MySQL的运行状态,调整...

    windows_下_自动备份mysql数据库--按时间命名备份文件.doc

    ### Windows 下自动备份 MySQL 数据库 -- 按时间命名备份文件 #### 一、概述 在 Windows 系统中,为了确保数据的安全性和完整性,定期对 MySQL 数据库进行备份是非常必要的。本文档介绍了几种在 Windows 环境下...

    mysql备份脚本-按日期进行备份,并进行压缩

    ### MySQL备份脚本知识点解析 #### 一、脚本概述 该脚本主要实现了MySQL数据库的备份功能,并根据当前日期创建对应的备份文件夹与备份文件,同时对备份文件进行了压缩处理。此脚本适用于Windows环境。 #### 二、...

    mysql-5.7.33-linux-glibc2.12-x86_64.rar ,linux 64位mysql 5.7安装包

    可以使用`mysqldump`命令来导出数据库,使用`mysql`命令导入。 MySQL 5.7.33带来了许多性能改进和新特性,如增强的InnoDB存储引擎、JSON支持、查询优化器改进等。对于开发者来说,理解这些新特性并合理应用,能提升...

Global site tag (gtag.js) - Google Analytics