这片博文主要用来介绍MySQL的备份与恢复:
MySQL的备份形式可以分为如下几种:
热备----即不停机备份
冷备----需要关闭MySQL,然后备份其数据文件。(停机备份一般是直接拷贝其datadir目录)
温备----在线备份,对应用影响大,通常加一个读锁【会阻塞写的应用】,意义不大,基本不用。
从导出的备份文件结构可分为如下几种:
逻辑备份---备份的数据是导出的SQL语句(如mysqldump, mysqlpump【MySQL5.7加入的】,mydumper)
物理备份--备份的是物理文件(如xtracebackup)
接下来会详细介绍这四种命令的通常用法(如果不特别说明,数据库存储引擎为INNODB):
mysqldump的用法如下:
备份单张表:

--single-transaction 参数说明
备份单个库和备份所有的库
恢复数据的时候直接使用mysql导入即可:
切记在备份INNODB数据库时一定要加上--single-transaction 参数,为了基于PIT恢复也要加上--master-data参数。
mysqldump的备份过程
上面我们已经看到了mysqldump备份出的数据文件时对应sql语句,我们查看一下在执行mysqldump时,MySQL数据库做了哪些操作!
首先开启general_log日志,如下:
然后再去使用mysqldump备份一次数据文件
最后查看general_log日志,如下:
mysqld的其余常见参数应用:
-d:只备份指定数据库表的结构(也就是建表语句)
-R, --routines :备份时导出存储过程和自定义函数!
-f, --force Continue even if we get an SQL error.。发生错误的时候也继续备份。
mysqldump还有很多参数,可以在用到的时候查看!
mysqldump是逻辑备份,单线程备份,单线程恢复,因此会比较慢。特别是恢复的时候,之前恢复过一个800多万行记录的数据,结果使用mysql逐条导入sql语句,搞库几个小时。
备份与恢复纠错
1:在使用mysql导入mysqldump的备份数据时,报了如下错误:
错误原因就是行太长了,但是线上环境修改字段属性有点不太合适,可以采用如下方法:
导入成功后,如果是线上环境,还需要把参数修改回去!
2:在使用mysqldump备份的时候出现如下问题
我查了一下,这个表大概有1500万行的记录,报错原因如下:
问题的解决方案:增加 net_write_timeout 可以解决上述的问题的。在实践中发现,在增大 net_write_timeout 后,Server 端会消耗更多的内存,有时甚至会导致 swap 的使用(并不确定是不是修改 net_write_timeout 所至)。建议在mysqldump 之前修改 net_write_timeout 为一个较大的值(如1800),在 mysqldump 结束后,在将这个值修改到默认的60。(备注:net_write_timeout不是mysqldump的配置参数,而是mysql的参数)