写在前面:我们在使用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);
elseres=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

转载于:https://www.cnblogs.com/zengkefu/p/5646529.html

mysqldump备份原理6相关推荐

  1. mysqldump备份原理及注意事项

    mysqldump的备份原理是什么呢? 抛开源码不谈,其实我们可以通过打开general log,查看mysqldump全库备份时执行的命令来了解mysqldump背后的原理. 只考虑innodb表的 ...

  2. mysqldump 备份原理8

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; http://www.cnblogs.com/lyhabc/p/38 ...

  3. mysqldump和xtrabackup备份原理实现说明

    MySQL数据库备份分为逻辑备份和物理备份两大类,犹豫到底用那种备份方式的时候先了解下它们的差异: 逻辑备份的特点是:直接生成SQL语句,在恢复的时候执行备份的SQL语句实现数据库数据的重现.物理备份 ...

  4. mysql备份与还原-mysqldump备份、mysql与source还原

    以下都以在linux操作系统上的mysql为例 mysqldump备份 mysqldump实际就是将数据库中的数据转化为建库.建表和插入记录的sql语句 1.备份一个数据库 [或其中几个表],不指定表 ...

  5. MySQL备份原理详解

    备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(R ...

  6. java实现mysql增量备份_企业级MySQL备份原理

    企业级MYSQL备份恢复原理 1. 全量备份 全量数据就是数据库中所有的数据,全量备份就是把数据库中所有的数据进行备份. 例如: 备份所有库: # mysqldump -uroot -poldboy ...

  7. mysqldump 备份详解

    文章目录 前言 常用模版 1. 备份整个实例 2. 备份单个数据库 3. 导出单表结构与数据 4. 仅导出单表数据 5. 仅导出单表部分数据 6. 某库下表结构导出 备份上云 1. DEFINER 问 ...

  8. MySQL备份恢复之mysqldump备份_SQL语句模式

    mysqldump备份_SQL语句模式 mysql备份类型 1.分为冷备和热备 冷备就是在数据库shutdown以后进行备份 热备就是在数据库open进行备份 2.又可以分为物理备份和逻辑备份 (1 ...

  9. mysqldump备份数据库时出现when using LOCK TABLES

    用mysqldump备份数据库时,如果出现when using LOCK TABLES,解决办法是加上 --skip-lock-tables 例如: 用mysqldump备份数据库时出现 29: Fi ...

最新文章

  1. android 6.0 重启 丢失 壁纸,android6.0 壁纸设置流程讲解
  2. JStorm与Storm源码分析(八)--计时器工具-mk-timer
  3. [洛谷P5057][CQOI2006]简单题
  4. Caffe训练过程:test_iter test_interval等概念
  5. ajax请求 apend,jsp如何获取ajax append的数据?
  6. C语言 链表 3个结点,一个关于C语言链表头结点的问题
  7. 暴风电视TV 55X 3.0系统通过adb Root修改桌面,删除无用app
  8. 腾讯的天天快报凭什么想挑战今日头条?
  9. 常用视频接口线头介绍
  10. 像CFO一样思考(1)- 给私域运营算个帐
  11. 井字棋(棋子可消去(拿走))
  12. jawbone app for android,jawbone手环app
  13. ccf csp寻宝!大冒险!(C语言)
  14. MTK项目case解决方法(经验)
  15. 问题解决:shared_ptr Assertion px != 0 failed 及debug经验分享
  16. 【电信学】【2013】未知环境下移动机器人导航研究
  17. python中uuid用法详解
  18. 07 Python数据类型详解
  19. 马士兵JVM课程笔记
  20. 【discuz x3】home_follow.php(广播页面)中$alist = getfollowfeed($vuid, $view, true, $start, $perpage);结果

热门文章

  1. linux cp -w,对Linux的cp命令的思考
  2. linux 迁移mysql目录_linux默认mysql迁移目录
  3. python学生管理系统(函数方法)_(python函数)学生管理系统
  4. 白中英 计算机组成原理_白中英《计算机组成原理》(第5版)笔记和课后习题答案详解...
  5. python大学_大学为什么不先开python?
  6. c++ 箭头符号怎么打_C++随笔
  7. golang 包含 数组_在 Golang 中如何快速判断字符串是否在一个数组中
  8. mysql中最常用的存储引擎有_mysql常用的存储引擎有哪些
  9. html js url 跳转页面内容,js跳转页面方法总结
  10. flask 接口上传文件_Flask干货:Flask数据交换——上传文件