mysqldump备份原理6
写在前面:我们在使用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备份原理6的更多相关文章
- mysqldump备份原理
现网中数据库运维时,要经常对数据库做热备.为保证恢复时数据的完整性与一致性, 一种方法是在备份之前锁表,但锁表会影响正在运行的业务. mysqldump是当前MySQL中最常用的备份工具,通过mysq ...
- mysql 5.5 mysqldump备份原理
开启general_log日志,获取mysqldump执行语句 show VARIABLES like 'general_log%' set GLOBAL general_log=on 执行备份命令 ...
- mysqldump 备份原理8
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; http://www.cnblogs.com/lyhabc/p/38 ...
- mysqldump 备份原理9
前文的一个细节http://blog.itpub.net/29254281/viewspace-1392757/ 5.--master-data + --single-transaction 同时 ...
- mysqldump+mydumper+xtrabackup备份原理流程
mysqldump备份原理 备份的基本流程如下: 1.调用FTWRL(flush tables with read lock),全局禁止读写 2.开启快照读,获取此时的快照(仅对innodb表起作用) ...
- mysqldump和xtrabackup备份原理实现说明
背景: MySQL数据库备份分为逻辑备份和物理备份两大类,犹豫到底用那种备份方式的时候先了解下它们的差异: 逻辑备份的特点是:直接生成SQL语句,在恢复的时候执行备份的SQL语句实现数据库数据的重现. ...
- MySQL备份原理详解
备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(R ...
- mysqldump备份7
http://www.cnblogs.com/ivictor/p/5505307.html 对于MySQL的备份,可分为以下两种: 1. 冷备 2. 热备 其中,冷备,顾名思义,就是将数据库关掉, ...
- MySQL Backup mysqldump备份流程学习
我们都知道MySQL逻辑备份工具mysqldump可以保证备份数据的一致性,但是它是怎么保持一致性的? 本文不讨论mysqldump具体的选项和用法,一直对mysqldump的工作机制梳理的不太清楚, ...
随机推荐
- delphi中formatFloat代码初探(在qt下实现floatformat的函数)
由于项目需要,需要在qt下实现floatformat的函数.之前写过一个,但是写得不好.决定重新写一个,参考delphi xe2下的实现.把xe2下的相关代码都看了一遍,xe2的代码思路在这里贴出来. ...
- 坚持Delphi的厂商与产品
能记一个算一个吧... 招商银行的企业网银是用Delphi开发的,听说招商有不少软件都是用Delphi开发的. 广州酷狗音乐招Delphi开发 对程序员来说,Delphi写的比较有名的软件莫过于Dev ...
- OpenCV学习笔记:矩阵的掩码操作
矩阵的掩码操作很简单.其思想是:根据掩码矩阵(也称作核)重新计算图像中每个像素的值.掩码矩阵中的值表示近邻像素值(包括该像素自身的值)对新像素值有多大影响.从数学观点看,我们用自己设置的权值,对像素邻 ...
- (?m)
centos6.5:/root/sbin#cat -n vv 1 192.168.11.186,192.168.11.187 35199,3306 Dec 7, 2016 11:40:02.75052 ...
- URAL1635. Mnemonics and Palindromes(DP)
链接 先初始化一下所有的回文串 再O(n*n)DP 输出路径dfs 刚开始存所有回文 ME了 后来发现用不着 改了改了OK了 数据还挺强 #include <iostream> #incl ...
- hdu4293Groups
http://acm.hdu.edu.cn/showproblem.php?pid=4293 这题单拉出来写篇吧 确实不错的一题 将每个人说的话 转化一下 可以算出它处在哪个段中 题目就转换成了求不相 ...
- MVC——数据库增删改查(Razor)——Html语法
一.显示界面 .Models(模板) private MyDBDataContext _context = new MyDBDataContext(); public List<Info> ...
- 单元测试中Assert类
一.Assert类的使用 1.Assert类所在的命名空间为Microsoft.VisualStudio.TestTools.UnitTesting 在工程文件中只要引用Microsoft.Visua ...
- 一个TextView使用不同的颜色
一个TextView使用不同的颜色: textview中首先需要已经有内容了 public static void ColorFormatTextView(TextView tv,int color, ...
- Java问题汇集(2)
1.Error setting driver on UnpooledDataSource 具体:Exception in thread "main" org.apache.ibat ...