[MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数

转载 2015年11月03日 14:59:17

[MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数

mysqldump

写在前面:我们在使用mysqldump备份数据时,请一定记住要加上 -q 参数,后果可能是很严重的,不要给自己挖坑哦。到底为什么呢,且听我慢慢道来!

先来看看 mysqldump –help 中,关于 -q 参数的解释:

-q, --quick         Don't buffer query, dump directly to stdout.

简言之,就是说加上 -q 后,不会把SELECT出来的结果放在buffer中,而是直接dump到标准输出中,顶多只是buffer当前行结果,正常情况下是不会超过 max_allowed_packet 限制的,它默认情况下是开启的。

如果关闭该参数,则会把SELECT出来的结果放在本地buffer中,然后再输出给客户端,会消耗更多内存。

在mysqldump.c中也能看到二者的对比(现在流行深入源码,虽然我不是专注开发的,找几行源码能力还尚存,用来装B的,大家知道就好,哈哈):

if (quick)
  res=mysql_use_result(sock);
else
  res=mysql_store_result(sock);

有理论,也要有实践不是,我们来看看在实际场景中,加不加 -q 的区别有多大。

  部分备份(启用-q) 部分备份(禁用-q) 完整备份(启用-q) 完整备份(禁用-q)
备份总耗时 27.882秒 22.665秒 277.387秒 217.074秒
占用内存(含swap) 3056KB 2.5GB 3048KB 内存:12GBswap:305MB

可以看到,如果只是备份小量数据,足以放在空闲内存buffer中的话,禁用 -q 会快一些,但如果是大数据集,没办法完全hold在内存buffer中时,就会产生swap,效率反而更差,真是赔了夫人又折兵。

因此,如果使用mysqldump来备份数据时,建议总是加上 -q 参数,避免发生swap反而影响备份效率。

详细过程(有耐心的可以继续往下看)

1、全量备份:备份时不使用 -q 参数

mysqldump --quick=false -Smysql.sock -B yejr --tables t_yejr

#先看下一开始时的状态:
Mem:  32863040k total, 29338704k used,  3524336k free,   227632k buffers
Swap: 16777208k total,    23548k used, 16753660k free,  8200416k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
21986 root      20   0 6119m 5.9g 2192 S 20.6 18.9   0:21.69 mysqldump

#再看下备份结束后的状态,内存不够用,产生了swap
Mem:  32863040k total, 32521328k used,   341712k free,      440k buffers
Swap: 16777208k total,   336876k used, 16440332k free,   315192k cached
PID   USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+   COMMAND
21986 root      20   0 12.3g  12g  656 R 100.0 39.1   2:23.93 mysqldump

#最后看下备份总耗时
real    4m37.387s
user    2m2.731s
sys     0m24.608s

2、全量备份:备份时启用 -q 参数

mysqldump -Smysql.sock -B yejr --tables t_yejr

#先看下一开始时的状态:
Mem:  32863040k total, 20157476k used, 12705564k free,     4608k buffers
Swap: 16777208k total,        0k used, 16777208k free,   488296k cached

#再看下备份结束后,可以看到,没有使用到swap
Mem:  32863040k total, 32644496k used,   218544k free,      920k buffers
Swap: 16777208k total,        0k used, 16777208k free, 12618740k cached
PID   USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
25234 root      20   0 50880 3048 2192 S 57.6  0.0   2:22.79 mysqldump

#最后看下总耗时统计:
real    3m37.074s
user    2m6.018s
sys     0m17.315s

3、部分备份:备份时不使用 -q 参数

mysqldump -w " id<100000 " -Smysql.sock --quick=false -Smysql.sock -B yejr --tables t_yejr

#看下总耗时
real 0m22.665s
user 0m20.458s
sys 0m2.156s

#再看下mysqldump进程消耗的内存,最高时大概使用了2.5G内存
20619 root      20   0 2571m 2.5g 2208 R 99.9  7.8   0:11.63 mysqldump

4、部分备份:备份时启用 -q 参数

mysqldump -w " id<100000 " -Smysql.sock -Smysql.sock -B yejr --tables t_yejr

#看下总耗时,并没有慢多少
real 0m27.882s
user 0m22.610s
sys 0m0.670s

#再看下mysqldump进程消耗的内存,只占用了极少量内存
19690 root      20   0 50880 3056 2200 S 73.4  0.0   0:06.01 mysqldump

mysqldump备份数据库时文件为空的问题

本人在自学mysql遇到的一些问题,整理下知识怕以后用到的时候忘记。首先备份数据库C:\Users\popo>mysqldump -uroot -p123 mydb1 > d:1.sql在d盘打开文件...
  • bestkilly
  • bestkilly
  • 2017年06月03日 10:53
  • 1006

mysqldump备份不输入密码直接备份

1、在你的用户根目录下面创建一个.my.cnf 文件添加以下内容[mysqldump]user=username---- 我的是rootpassword=password----我的是1qazxsw2...
  • aiqixiao1015
  • aiqixiao1015
  • 2016年01月21日 10:23
  • 1160

mysqldump备份报错(1064),版本问题引起。

mysql备份错误1064
  • hufeng719
  • hufeng719
  • 2016年12月29日 15:08
  • 904

MySQL5.6 备份之mysqldump(一)

MySQL5.6 备份之mysqldump(一)Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] –databa...
  • wjhhjl
  • wjhhjl
  • 2016年12月16日 23:44
  • 292

Mysql使用mysqldump按时间导出时,结果数据与预期不同

在使用Mysql的mysqldump命令按时间进行数据导出时,我们可能会遇到导出数据与原库中不符或者导出数据和我们期望的数据不同的情况。原因就是在导出时,如果没有加其他选项,在我们的导出文件中发现有这...
  • wbb_1216
  • wbb_1216
  • 2017年02月20日 10:44
  • 1534

Linux下使用mysqldump命令备份数据库实例

基本命令格([xxx]中的内容根据实际情况改动) mysqldump -u [username] -p -d [databaseName] [tableName] > [路径及导出的sql文件名]...
  • u013754060
  • u013754060
  • 2016年04月12日 11:21
  • 511

mysqldump备份数据库或数据表为空解决办法。

今天在shell中利用mysqldump备份数据库或数据表时,发现结果文件为空,定位很久得出结论:未找到mysqldump对应的路径,现给出解决办法: 1.找到mysqldump所在的路径,linu...
  • u012006909
  • u012006909
  • 2015年06月01日 19:16
  • 1622

mysqldump 备份需要锁表

show engine innodb status\G ------------ TRANSACTIONS ------------ Trx id counter 117509 Purge done...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2015年04月26日 20:58
  • 1347

mysqldump如何保证数据一致性

作为DBA的小K,搭建备机应该是家常便饭了,这时候用到的方法无非有如下三种: 1、停掉一台备机(这里叫备机1),直接拷贝整个数据目录下的所有文件到新的备机(这里叫备机2)。优点是简单、快速,只需要拷...
  • kianliu_007
  • kianliu_007
  • 2014年08月06日 23:13
  • 1640

mysqldump备份(全量+增量)方案操作记录

在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据。 线上数据库备份场景: 每周日执行一次全量备份,然后每天下午1点执行MySQLdum...
  • wade5200
  • wade5200
  • 2017年08月02日 14:06
  • 664
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数
举报原因:
原因补充:

(最多只允许输入30个字)