[MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数
来源:互联网 发布:jquery.form.js教程 编辑:程序博客网 时间:2024/04/29 23:03
[MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数
发表回复
写在前面:我们在使用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)3056KB2.5GB3048KB内存: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 buffersSwap: 16777208k total, 23548k used, 16753660k free, 8200416k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND21986 root 20 0 6119m 5.9g 2192 S 20.6 18.9 0:21.69 mysqldump#再看下备份结束后的状态,内存不够用,产生了swapMem: 32863040k total, 32521328k used, 341712k free, 440k buffersSwap: 16777208k total, 336876k used, 16440332k free, 315192k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND21986 root 20 0 12.3g 12g 656 R 100.0 39.1 2:23.93 mysqldump#最后看下备份总耗时real 4m37.387suser 2m2.731ssys 0m24.608s
2、全量备份:备份时启用 -q 参数
mysqldump -Smysql.sock -B yejr --tables t_yejr#先看下一开始时的状态:Mem: 32863040k total, 20157476k used, 12705564k free, 4608k buffersSwap: 16777208k total, 0k used, 16777208k free, 488296k cached#再看下备份结束后,可以看到,没有使用到swapMem: 32863040k total, 32644496k used, 218544k free, 920k buffersSwap: 16777208k total, 0k used, 16777208k free, 12618740k cachedPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND25234 root 20 0 50880 3048 2192 S 57.6 0.0 2:22.79 mysqldump#最后看下总耗时统计:real 3m37.074suser 2m6.018ssys 0m17.315s
3、部分备份:备份时不使用 -q 参数
mysqldump -w " id<100000 " -Smysql.sock --quick=false -Smysql.sock -B yejr --tables t_yejr#看下总耗时real 0m22.665suser 0m20.458ssys 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.882suser 0m22.610ssys 0m0.670s#再看下mysqldump进程消耗的内存,只占用了极少量内存19690 root 20 0 50880 3056 2200 S 73.4 0.0 0:06.01 mysqldump
0 0
- [MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数
- 使用mysqldump进行Mysql 备份
- 使用mysqldump进行Mysql 备份
- 使用mysqldump进行Mysql 备份
- 使用mysqldump进行Mysql备份
- 使用mysqldump进行Mysql 备份
- 使用mysqldump备份MySQL数据库
- MYSQL 使用mysqldump 备份数据库
- 使用 mysqldump 备份MySQL数据库
- 使用mysqldump备份MySQL数据库
- MySql数据库备份mysqldump参数选项
- MySql数据库备份mysqldump参数选项
- mysql备份还原-mysqldump参数介绍
- MySQL mysqldump 常见备份参数说明
- mysql系列2-mysqldump逻辑备份
- [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
- [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
- [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
- JAVA中执行顺序
- 51nod 1459 迷宫游戏 (最短路)
- Hibernate、批量操作数据
- android 下载进度条的实现
- java多线程中synchronized(同步块)和volatile的区别
- [MySQL FAQ]系列 — 使用mysqldump备份时为什么要加上 -q 参数
- leetcode:ZigZag Conversion
- 暂时刷完leetcode的一点小体会
- C++ 编译器生成默认构造函数的四种情况
- Xcode7无法安装iOS8.x模拟器解决办法(亲测好用)
- eclipse ctrl+左键失效
- Barny Boatman在2015 WSOPE赛事7夺冠
- java中class文件的结构的介绍
- CSDN博客插入图片