一、全量备份与增量备份
1、全量备份的概念
全量数据就是数据库中所有的数据(或某一个库的全部数据);全量备份就是把数据库中所有的数据进行备份。
以lnnodb引擎数据库为例,备份数据库中所有库的所有数据的命令为: mysqldump -B --master-data=2 --single-transaction -A |gzip > /opt/all.sql.gz 备份dadong一个库中所有数据的命令为: mysqldump -B --master-data=2 --single-transaction dadong |gzip > /opt/all.sql.gz
1.1 、全量备份应用场景
# 迁移或升级数据库时。
# 增加从库的时候
#认为执行DDL,DML语句破坏数据库数据时,(此时主从库没办法了,所有库都会执行)
#跨机房灾备时,此时需要将全备拷贝到异地。
#若是因为硬件或删除物理文件导致数据故障,就不需要用备份数据恢复了,可以直接把主库关闭,在从库上配置好VIP等配置后,启动从库提供服务即可。
2、增量备份的概念
增量数据就是指上一次全量备份数据后到下一次全备之前的数据库锁更新的数据,在使用mysqldump命令做全备时,增量数据就是mysql的binlog日志。
3、全量备份与增量备份结合
3.1、按天全备与增量备份
下面以mysqldump命令和binlog日志增量数据为例讲解企业中按天全备和按周全备的方法。
3.1.1、按天全备特点
# 优点:恢复数据时需要的数据文件数量少,恢复时间短,维护成本低。
# 缺点:每天一个全备,占用空间多,占用系统资源多,经常备份会影响用户体验。
中小企业用的最多的策略就是按天全备,然后根据空间情况保留全备份数,例如仅保留7天内的备份数据,如何企业数据很重要,可以使用磁带机等设备留存1年以上的备份数据。
binlog增量的清理可以通过在my.cnf中配置“过期清理天数”相关参数(expire_logs_days=7)来实现,例如保留7天内的binlog日志,理论上如果每天进行全备,那么binlog只要保留1天就够了。
3.2、 按周全备与增量备份
3.2.1、按周全备特点
# 优点:每周仅有一个完整备份,因此占用磁盘总空间大小,占用系统资源小,备份次数少,用户体验好一些。
# 缺点:恢复时数据文件多,导致恢复麻烦,维护成本高,恢复时间长。
大型企业由于数据量特大,每天全备时间太长,有可能采用周备的策略,这样有利于节省数据存储空间且不影响用户访问数据库的体验。
二、备份方式
1 、逻辑备份
利用mysqldump命令备份数据的过程,实际上就是把数据(包括库表)从MySQL库里以SQL语句的形式直接输出或者生成备份文件的过程,这种备份成SQL语句的方式称为逻辑备份。
1.1、逻辑备份的特点
逻辑备份的优点为操作简单,方便,可靠,并且备份的数据可以跨平台,跨版本,甚至跨软件,跨操作系统,还可以实现分库分表备份;逻辑备份也有一定的缺点。例如:备份速度比物理备份慢,恢复的效率也不是很高。
1.2、逻辑备份常用工具
mysqldump是mysql官方自带的最常用逻辑备份工具,还能实现分表分库备份,也是本章的重点备份工具。除此以外,还有一个mydumper工具,他是一个在GPL许可下发布的高性能mysql备份和恢复工具集。
1.3、逻辑备份的企业应用场景
适用于数据量不是特别大的场景,例如:参考值为打包前不大于30G数据的数据库,30GB的值主要是考虑备份效率的问题,以及管理员使用复杂度的平衡。
不过,在跨版本,跨软件升级或迁移数据的时候,此时物理备份一般就不能使用了。
什么时候会用到mysqldump的数据?
恢复数据到测试库
人为通过SQL将数据删除的时候
主从复制
1.4、备份多个表:
语法:mysqldump -u 用户名 -p 数据库名 表名1 表名2 >备份的文件名
mysqldump 库1 表1 表2 表3 >库1.sql mysqldump 库2 表1 表2 表3 >库2.sql 语法: 1、备份一个或多个表 mysqldump [options] db_name [table_name……] 2、备份一个或多个库 mysqldump [options] –databases dbname…… 3、备份所有数据库 mysqldump [options] –all-databases
压缩解压备份
#压缩 [root@DB02 ~]# mysqldump -B --master-data=2 dadong|gzip >/opt/t.sql.gz #解压 [root@DB02 ~]# zcat t.sql.gz >t1.sql [root@DB02 ~]# gzip -d t.sql.gz ##解压后删除安装包
1.5、分库备份
分库备份实际上就是执行一个备份语句备份一个库,如果数据库中有多个库,就执行多条相同的备份单个库的备份语句就可以备份多个库了,注意每个库都可以用对应备份的库作为库名,结尾加.sql。
分库备份的意义在于:有时一个企业的数据库里会有多个库,例如(www,bbs,blog),但是出问题的时候很可能是某一个库,如果在备份时把所有库都备份成一个数据文件的话,恢复某一个库的数据时比较麻烦。
分库备份:for循环 mysqldump -uroot -p'dadong123' -B dadong ... mysqldump -uroot -p'dadong123' -B dadong_utf8 ... mysqldump -uroot -p'dadong123' -B mysql ... ...... 分库备份 for name in `mysql -e "show databases;"|sed '1d'` do mysqldump -uroot -pdadong123 -B $name >/tmp/${name}.sql done
1.6、MySQLdump介绍
mysqldump是mysql数据库自带一个很优秀的备份命令。mysqldump的工作原理:利用mysqldump命令备份数据的过程,实际就是把数据从MySQL库里以逻辑的sql语句的形式直接输出或生成备份的文件的过程。
mysqldump -u 用户名 -p 密码 参数 数据库名 >备份的文件名.sql ###-u和-p后面可以无空格
特别说明:为了防止密码外泄,我们已经将密码写入配置文件中,在本章中,会使用不带用户名和密码的命令,例如用下面命令: [root@DB02 ~]# mysql </opt/bak.sql [root@DB02 ~]# mysql -uroot -pdadong123 </opt/bak.sql
1.6.1、mysqldump重要参数说明
mysqldump重要参数 |
参数说明 |
-B --database |
会在备份的数据中增加建库(create)及“use库”的语句,可以直接接多个库名,同时备份多个库。B参数会在数据库恢复的时候自动创建建表语句。 |
-A --all-databases |
备份所有的数据库 |
-F ,--flush-logs |
刷新binlog日志,生成新的binlog文件,将来增量恢复从这个新的binlog文件开始,当备份多个库时,每个库都会刷新一次binlog,如果想只刷新一次binlog,可加上--lock-all-tables或--master-data参数。 |
-x ,--lock-all-tables |
备份时对所有数据库的表执行全局读锁,期间同时禁止-single-transaction 和--lock-tables参数功能。 |
-l,--lock-tables |
锁定所有的表为只读。 |
--single-transaction |
在备份lnnoDB引擎数据表时,通常会启用该选项来获取一个一致性的数据快照备份,他的工作原理是设定本次备份会话的隔离级别为pepeatable read,并将整个备份放在一个事务里,以确保执行本次dump会话时,不会看到其他连接会话已经提交了的数据,即备份开始时刻的数据是什么样的,备份出来就是什么样子,也就相当于锁表备份数据,但是这个参数是容许备份期间写入数据的,而不是-x锁表后的备份期间不能写入数据,启用该参数会关闭--lock-tables |
-R --routines |
备份存储过程和函数数据 |
-d ,--no-data |
只备份库表结构(SQL语句形式),没有行数据 |
-t,--no-create-info |
只备份表内行数据(SQL语句形式),没有表结构 |
-T,--tab=name |
将库表和数据分离成不同的文件,行数据是纯文本,表结构是SQL语句,5.6版本默认没有权限操作,需要修改my.cnf参数。 |
--master-data={1|2} |
在备份结果中增加binlog日志文件名及对应的binlog位置点(即change master …语句)。--master-data=2 记录备份那一时刻的二进制日志的位置,并且注释掉,1是不注释的 |
--triggers |
备份触发器数据 |
--compact |
只显示很少的有用输出,适合学习和测试环境调试用。 |
当使用mysqldump的--single-transaction对innodb表进行备份时,会开启一个事务,并将整个备份过程放到一个事务里,
以确保执行本次dump会话时,不会看到其他连接会话已经提交了的数据,即备份开始时刻的数据是什么样,备份出来就是什么样子,
也就相当于锁表后备份的数据,但是这个参数是容许备份期间写入数据的,而不是在使用-x参数锁表后,备份期间无法写入任何数据。操作例子如下: [root@DB02 ~]# mysqldump -B --master-data=2 --single-transaction dadong |gzip >/opt/all.sql.gz
2、物理备份
2.1、物理备份的方法
冷备
mysql的物理备份方法之一是使用cp,rsync,tar,scp等复制工具把mysql数据文件复制成多份,由于在备份期间数据仍然有写入操作,所以,直接复制的方式备份会引起数据丢失。
另外在恢复数据库时,对新数据库的路径,配置也有要求,一般要和原库的配置保持一致(版本,路径,配置尽可能一样)。
为了确保备份期间的数据一致性,可以选择人工停库或锁库后再进行物理复制,而这在生产环境中一般是不容许的,除非是可以申请停机或锁表时间,
所以使用传统Linux命令拷贝工具还是比较粗放的冷备份方式,应避免使用,一般在进行大规模数据库迁移时,先停库,然后物理迁移,是很有效率的方案。
热备
除了在Linux命令行通过命令直接复制mysql数据文件外,还有一些其他第三方的开源或商业物理热备工具。如xtrabackup,使用这个工具可以实现物理全备及增量备份。
热备不影响用户体验
2.2、物理备份的特点
物理备份的优缺点正好和逻辑备份相反,因此在企业里应根据需求,互补使用。
# 优点:速度快,效率高。
# 缺点:不容易跨平台,跨版本,跨软件,跨操作系统,可以实现分库分表备份,但恢复麻烦很多,软件的使用也比较复杂一些。
2.3、物理备份常用工具
Linux下冷备份工具为cp,tar,备份时需要锁表或停库确保数据一致性,开源的热备份(基于innodb)工具则是xtrabackup.
2.4、物理备份常用场景
#数据库总数据量超过30GB的,可使用xtrabackup热备工具进行备份,提高效率。
# 可以选择在数据库的从库上进行备份,备份时停止SQL线程应用数据到数据库,然后通过cp或tar打包备份,这也是不错的冷备方案,不影响数据库的服务。
2.5、物理备份与逻辑备份对比
|
逻辑备份 |
物理备份 |
备份原理 |
以SQL语句形式存储 |
直接复制磁盘物理文件或其他非SQL语句方式的备份 |
相关命令 |
mysqldump,mysql,mysqlbinlog |
cp,rsync,scp,xtrabackup(热备) |
备份要求 |
需要锁表但不需要停库,锁表会影响数据库更新,lnnodb引擎可以不锁表,而采用事务备份方案 |
冷备需要锁表或停机,热备不需要锁表(仅事务引擎,例如lnnodb)或停机 |
配置特点 |
恢复时与系统版本,库的配置甚至与版本无关 |
物理复制需要系统,配置,版本尽可能的一致 |
性能特点 |
速度慢 |
速度快 |
方便性考虑 |
安全,容易掌握,容易控制,一般不会丢失数据 |
冷备简单,但应用场景少,热备工具操作复杂一些,较难掌握。 |