Mysql数据库的备份与恢复

Mysql数据库的备份与恢复
Flaw任务背景
一、真实案例
某天,公司领导安排刚入职不久的小冯同学将生产环境中的数据(MySQL数据库)全部导入到测试环境给测试人员使用。当小冯去拿备份数据时发现,备份数据是1个礼拜之前的。原因是之前运维同事通过脚本每天对数据库进行备份,根据结果判断应该是脚本的问题导致备份失败。于是乎,领导让小冯重新制定备份策略对数据库进行备份,并且把数据导入到测试环境。
二、案例背后的核心技术
1)掌握MySQL的备份工具使用及各自特点
2)熟悉SHELL脚本
3)熟悉MySQL数据的导入导出
三、今日任务场景
“手里有粮,心里不慌,数据有备,喜气洋洋”。对于重要的数据做好备份,是我们每个运维人员和DBA的重要职责。备份只==是一种手段==,我们最终目的是当数据出现问题时能够及时的通过备份==进行恢复==。所以,现在需要你对我们现有的MySQL数据库进行==备份策略的制定==以及实施。
任务要求
- 选择==合适的工具==和==方法==对mysql数据库进行备份
- 编写脚本实现自动化备份
课程目标
- 了解MySQL常见的==备份方式和类型==
- 能够使用==mysqldump工具==进行数据库的备份。如全库备份,库级别备份,表级别备份
- 能够使用mysqldump工具+binlog日志实现增量备份
- 理解==xtrabackup工具==实现增量备份的==原理==和方法
- 能够使用xtrabackup工具对数据库进行全备和增备
理论储备
一、MySQL备份概述
1、关于备份你要知道的
思考:备份和冗余有什么区别?
备份: 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方。
冗余: 数据有多份冗余,但不等备份,只能防止机械故障带来的数据丢失,例如主备模式、数据库集群。
2、备份什么
数据库:==一堆物理文件的集合==;日志文件(二进制日志)+数据文件+配置文件
DBFILE BINLOG my.cnf
3、备份过程须考虑的因素
- 必须制定==详细的备份计划(策略)==(备份频率、时间点、周期)
- 备份数据应该放在==非数据库本地==,并建议==有多份副本==
- 必须做好==数据恢复的演练==(每隔一段时间,对备份的数据在测试环境中进行模拟恢复,保证当出现数据灾难的时候能够及时恢复数据。)
- 根据数据应用的场合、特点==选择正确的备份工具==。
- 数据的一致性
- 服务的可用性
4、备份类型
㈠ 逻辑备份
- 备份的是建表、建库、插入等操作所执行SQL语句(DDL DML DCL)。
- 适用于==中小型数据库,效率相对较低==。 一般在数据库正常提供服务的前提下进行,如:mysqldump、mydumper、into outfile(表的导出导入)等。
㈡ 物理备份
- 直接复制==数据库文件==
- 适用于==大型数据库==环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。
- 一般是在==数据库彻底关闭或者不能完成正常提供服务==的前提下进行的备份);如:tar、cp、==xtrabackup==(数据库可以==正常提供服务==)、lvm snapshot、rsync等
㈢ 在线热备(冗余)
- MySQL的replication架构,如M-S|M-S-S|M-M-S等
- 实时在线备份
5、备份工具
㈠ 社区版安装包中的备份工具
① mysqldump(逻辑备份,只能==全量备份==)
1)企业版和社区版都包含
2)本质上使用==SQL语句描述数据库==及数据并导出
3)在MYISAM引擎上锁表,Innodb引擎上锁行
4)数据量很大时不推荐使用
② mysqlhotcopy(物理备份工具)
1)企业版和社区版都包含
2)perl写的一个脚本,本质上是使用锁表语句后再拷贝数据
3)==只==支持MYISAM数据引擎
㈡ 企业版安装包中的备份工具
mysqlbackup
1)在线备份
2)增量备份
3)部分备份
4)在某个特定时间的一致性状态的备份
㈢ 第三方备份工具
① XtraBackup和innobackupex(物理备份)
1)Xtrabackup是一个对InnoDB做数据备份的工具,支持==在线热备份==(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
2)Xtrabackup有两个主要的工具:xtrabackup、innobackupex
a、xtrabackup只能备份==InnoDB和XtraDB==两种数据表,不能备份myisam类型的表。
b、innobackupex是将Xtrabackup进行封装的perl脚本,所以能同时备份处理innodb和myisam的存储引擎,但在处理myisam时需要加一个读锁。
② mydumper(逻辑备份,备份SQL语句)
多线程备份工具
https://launchpad.net/mydumper/mydumper-0.9.1.tar.gz 2015-11-06(最后更新时间)
6、备份方法
- 完全备份(全备)
- 增量备份(增量备份基于全量备份)
二、MySQL的逻辑备份
1、mysqldump基本备份
本质:导出的是sql语句文件
优点:无论是什么存储引擎,都可以用mysqldump备成sql语句
缺点:速度较慢,导入时可能会出现格式不兼容的突发状况.==无法直接做增量备份==.
提供三种级别的备份,表级,库级和全库级
㈠ 基本语法
1 | 表级别备份 |
㈡ 常用参数
| 常用参数 | 描述说明 |
|---|---|
| –flush-logs, -F | 开始备份前刷新日志 |
| –flush-privileges | 备份包含mysql数据库时刷新授权表 |
| –lock-all-tables, -x | MyISAM一致性,服务可用性(针对所有库所有表) |
| –lock-tables, -l | 备份前锁表(针对要备份的库) |
| –single-transaction | 适用InnoDB引擎,保证一致性,服务可用性 |
| –master-data=2 | 表示将二进制日志位置和文件名写入到备份文件并在dump文件中注释掉这一行 |
| –master-data=1 | 表示将二进制日志位置和文件名写入到备份文件,在dump文件中不注释这一行 |
–master-data参数其他说明:
1)恢复时会执行,默认是1
2)需要RELOAD privilege并必须打开二进制文件
3)这个选项会自动打开–lock-all-tables,关闭–lock-tables
㈢ 举例说明
1 | 表级备份: |
㈣ 小结
- mysqldump工具备份的是==SQL语句==,故备份不需要停服务
- 使用备份文件==恢复==时,要保证==数据库处于运行状态==
- 只能实现全库,指定库,表级别的==某一时刻的备份==,本身==不能增量备份==
- 适用于==中小型==数据库
2、mysqldump实现增量备份
核心思路:结合binglog实现增量
- ==备份的目的为了数据出问题进行恢复==
- 二进制日志文件默认会记录下所有对数据库数据变化的操作(增、删、改)
- 二进制文件同时还会记录具体sql执行时的环境、==时间以及起始位置和结束位置==(pos值)
- 通过获取二进制文件里的SQL操作来进行==数据的恢复==
㈠ 实现思路
- 先做全量备份(mysqldump)
- 对数据库做更改操作
- 备份二进制日志文件
- 模拟故障进行
- 数据恢复
- 测试验证
㈡ 实现步骤
① 全库备份
1 | # mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > /tmp/all.sql -p |
② 更改数据库
1 | mysql> select * from db01.t1; |
③ 备份二进制文件
1 | 方法1:直接拷贝物理文件 |
④ 故障模拟
1 | mysql> drop database db01; |
⑤ 全量恢复
1 | 1. 通过刚刚全量备份进行恢复 |
⑥ ==二进制日志恢复到最新状态==
1 | # mysqlbinlog --start-position=120 /opt/mybinlog.000002 |mysql -p |
㈢ 小结
- mysqldump工具只能恢复到==备份那一时刻==
- 通过==二进制日志==来恢复到最新数据
- 二进制日志也可以跳过sql恢复
- 二进制日志恢复数据的==重点就是找对相应的position值或者时间点==
3、逻辑导入导出(==了解==)
无论是什么存储引擎,以下方式本身是一种数据导出的方法,同时可以用来辅助备份,它可以对一个表的其中一列或者某几列做备份。备份的是==数据记录。==
㈠ 语法
导出数据:
1 | select 字段 into outfile '/path/file' from table_name; |
恢复数据:
1 | 方法1: |
㈡ 举例说明1
把db01库的emp表导出成文本,然后误删掉数据后进行恢复
1 | mysql> select * into outfile '/tmp/backup/emp.bak' from emp; |
㈢ 举例说明2
创建一个表,把你系统里的/etc/passwd导入到数据库
1 | 1. 创建表password |
三、MySQL的物理备份
1、xtrabackup备份介绍
㈠ xtrabackup优缺点
优点:
- 备份过程==快速、可靠(==因为是物理备份);
- 支持==增量备份==,更为灵活
- 备份过程不会打断正在执行的事务;
- 能够基于压缩等功能节约磁盘空间和流量;
- 自动实现备份检验;
- ==还原速度快==;
缺点:
- 只能对==innodb表增量备份==,myisam表增量备份时是全备
- innobackupex备份MyISAM表之前要对全库进行加READ LOCK,阻塞写操作,若备份是在从库上进行的话会影响主从同步,造成延迟。对InnoDB表备份不会阻塞读写。
㈡ ==xtrabackup备份原理==
- innobackupex首先会==启动==一个==xtrabackup_log==后台检测的进程,实时检测mysql的==redo log==的变化,一旦发现redo有新的日志写入,立刻将日志写入到日志文件==xtrabackup_log==中。
- ==物理==拷贝i==nnodb的数据文件和系统表空间文件idbdata1==到对应的以默认时间戳为备份目录的地方
- 复制结束后,执行==flush table with read lock==操作进行全库锁表准备备份非InnoDB文件
- 物理复制.frm .myd .myi等非InnoDB引擎文件到备份目录
- 查看二进制日志的位置
- 解锁表unlock tables
- ==停止==xtrabackup_log进程
图片来自网络
㈢ ==xtrabackup备份恢复原理==
具体文字描述如下(了解):
- 在InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。
- xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。
- 上面就是xtrabackup的备份过程。接下来是准备(prepare)过程。在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像MySQL刚启动时要做的一样)。当这个过程结束后,数据库就可以做恢复还原了。
- 以上的过程在xtrabackup的编译二进制程序中实现。程序innobackupex可以允许我们备份MyISAM表和frm文件从而增加了便捷和功能。Innobackupex会启动xtrabackup,直到xtrabackup复制数据文件后,然后执行FLUSH TABLES WITH READ LOCK来阻止新的写入进来并把MyISAM表数据刷到硬盘上,之后复制MyISAM数据文件,最后释放锁。
- 备份MyISAM和InnoDB表最终会处于一致,在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。这个时间点与执行FLUSH TABLES WITH READ LOCK的时间点相同,所以MyISAM表数据与InnoDB表数据是同步的。类似Oracle的recover和restore,InnoDB的prepare过程可以称为recover(恢复),MyISAM的数据复制过程可以称为restore(还原)。
- ==Mysql5.7.3以后开启二进制日志需要加上server-id选项,不然报错==
2、xtrabackup全备及恢复
㈠ 实现思路
- innobackupex工具安装
- innobackupex进行全备,备份集==不能直接用于恢复==
- ==预备阶段==,备份过程中产生的xtrabackup_log==应用到全量备份集==
- 模拟故障(删除数据)
- 进行全库恢复
- 测试验证
㈡ 实现步骤
① 安装工具
1 | [root@db01 ~]# yum -y install libev-4.15-3.el7.x86_64.rpm |
② 全库备份
1)创建测试表
1 | create database db02; |
2)创建备份用户并授权
说明:管理员root用户拥有所有权限,可以省略
1 | 创建备份用户admin,并授予相应权限 |
3)全库备份
1 | [root@db01 ~]# innobackupex --user=admin --password=123 /full_xtrabckup |
③ 应用日志到备份集(==预备==)
1 | --apply-log 表示应用日志到备份集 |
④ 故障模拟
1 | 删除数据目录里的所有文件 |
⑤ 数据恢复
1 | --copy-back 表示从备份集拷贝文件到数据目录 |
说明:恢复完毕务必要==更改数据文件权限==!
1 | [root@db01 ~]# chown -R mysql.mysql /usr/local/mysql/data/ |
⑥ 测试验证
1 | mysql> select * from db02.t1; |
㈢ 小结
3、xtrabackup增量备份及恢复
㈠ 增备恢复原理
㈡ 实现思路
- 全量备份(==增量基于全备==)
- 应用日志到全量备份集中(预备)
- 更改数据
- 增量备份
- 应用==增备的备份集到全量备份集中==
- 模拟故障
- 数据恢复
- 测试验证
㈢ 实现步骤
① xtrabackup全量备份
1 | 清空环境 |
② 应用日志到全量备份集
1 | --apply-log 表示应用日志 |
③ 修改数据
1 | mysql> insert into db02.t1 values(2,'harry'),(3,'jack'); |
④ xtrabackup增量备份
1 | 语法: |
⑤ 应用增备备份集到全量备份集
1 | 语法: |
⑥ 模拟故障
1 | 删除所有数据库文件并停止mysql进程 |
⑦ 数据恢复
1 | 注意:在准备步骤完成后,还原时只需要还原完全备份即可 |
⑧ 测试验证
1 | mysql> select * from db02.t1; |
四、MySQL备份经验分享
1、逻辑备份(mysqldump)
某同学使用mysqldump工具对数据库每天进行备份,有一天数据库有问题需要进行恢复,他发现数据不能恢复到最新状态,原因是因为他只是全库备份数据,没有备份二进制日志文件导致。
所以,大家一定要明白:
① mysqldump工具只能恢复到==备份那一时刻==
② 通过==二进制日志==来恢复到最新数据
2、物理备份(xtrabackup)
① 如果数据库在第1次增量备份后发生故障,那么数据恢复时只能够使用xtrabackup全量备份加xtrabackup增量备份的时间点,即==恢复到第1次增量备份结束的点==
② 如果要将数据库恢复到最新状态,需要==结合binlog日志恢复==
③ 以上全量和增量的备份集是不能用的,需要将xtrabackup_log(事务日志,在备份过程中数据库的更改)应用到全量的备份集中才有效(应用日志==必须按照顺序去应用==:全备—>增备1—>增备2…)
④ 应用所有日志到全量备份集中时,需注意
1) 除了==最后一次增量备份==应用日志可以不加–redo-only外,其他都要加;只应用已经提交的事务,不回滚未提交的事务!!!
2) 应用日志到全量备份集中时一定要==严格按照时间顺序执行,否则无效==!
3) 在恢复数据时,确保数据目录为空;数据库服务是停止状态
课后实战
根据任务要求完成MySQL数据库的备份。
- 备份策略制定(了解业务|运营)|备份周期(1周)、备份时间点(避开业务高峰)
- 备份工具选择(mysqldump |xtrabackup)
- 脚本编写
- 计划任务执行
1 | 30 01 * * 0 bash full_backup.sh |















