一、简介数据的备份与恢复

1、为什么备份?

  • 灾难恢复:人为错误、硬件故障(冗余)、软件故障(bug)、自然灾害、黑客攻击、误操作、…;
  • 测试;

2、备份时应该注意些什么?

  • 能容忍最多丢失多少数据;
  • 恢复数据需要在多长时间内完成;
  • 需要恢复哪些数据;
  • 做恢复演练:测试备份的可用性;增强恢复操作效率;

2、备份的数据集的范围:

  • 完全备份:整个数据集;
  • 部分备份:数据集的一部分,比如部分表;

3、全量备份、增量备份、差异备份:

  • 完全备份
  • 增量备份:仅备份自上一次完全备份或 增量备份以来变量的那部数据;
  • 差异备份:仅备份自上一次完全备份以来变量的那部数据;

4、根据数据服务是否在线:

  • 热备:读写操作均可进行的状态下所做的备份;
  • 温备:可读但不可写状态下进行的备份;
  • 冷备:读写操作均不可进行的状态下所做的备份;

注意:在实际生产环境中,很少有把服务器机器停下来进行备份,一般是在运行中进行备份数据,而且专门备份的数据相比之下都是较大的数据,所以一般情况使用的是物理热备。

5、备份策略:

  • 全量+差异 + binlogs
  • 全量+增量 + binlogs

6、备份工具:

  • mysqldump:mysql服务自带的备份工具,是一种逻辑备份工具,它支持一下方式备份:
    完全、部分备份;
    InnoDB:热备;
    MyISAM:温备;

  • cp/tar
    lvm2:快照(请求一个全局锁),之后立即释放锁,达到几乎热备的效果;物理备份;
    注意:不能仅备份数据文件;要同时备份事务日志;
    前提:要求数据文件和事务日志位于同一个逻辑卷;

  • innobackup[收费] / xtrabackup[免费]:
    由Percona提供,开源工具,支持对InnoDB做热备,物理备份工具;
    完全备份、部分备份;
    完全备份、增量备份;
    完全备份、差异备份;

二、实现数据库全量+增量+二进制日志备份与恢复

Xtrabackup是MySQL数据库的备份不可多得的工具之一。提供了全备,增备,数据库级别,表级别备份等等。
percona-xtrabackup软件包中中包含了两个工具,一个是xtrabackup,另一个是innobackupex,innobackupex由per进行封装,在对innodb表进行备份时会自动调用xtraback工具,所以对InnoDB表做备份的实际是xtrabackup这个工具,xtrabackup也只能对innodb表做备份,这是一个专门对innodb开发的热备工具,而对myisam这样的其他引擎的表则由innobackupex来负责备份,若是全备份加增量的方案,那每次增量innobackupex工具对非innodb表都是全备份且会请求读锁。
xtrabackup对innodb表进行备份时不再只是简单复制文件,而是利用在innodb存储引擎层中的LSN(日志序列号)的新旧来识别这一数据页是否需要备份。
xtraback工具对innodb引擎完美支持真正的热备份,备份好的数据中数据文件与事务日志的文件因innodb cache等因素的存在,所以备份好的数据和事务日志中的数据往往是不一致的,所以,在做数据恢复时需要把事务日志中已提交的事务做redo,没有提交的事务做undo操作,这就是在做数据恢复时要做的准备工作,即prepare。
在以下地址可以下载到xtrabackup:http://www.percona.com/downloads/XtraBackup/,可以根据自己的需要选择稳定版本或者最新版本以及操作系统、源码包或者rpm包等等。
我下载了最新版的rpm包:percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm
使用yum安装可以把依赖的包一起安装上

[root@node2 ~]#yum install percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm

每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。
实验环境:两台安装centos7系统的主机,A主机上安装Mariadb数据库,并且已经初始化,B主机上安装了Mariadb数据库,没有初始化。并且A和B都安装了percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm
需要注意的是,增量备份仅能应用于InnoDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
在A主机上:
创建一个数据库test,并且在数据下创建一个students表,里面添加了若干数据数据。

表结构
MariaDB [(none)]> DESC test.students;
+--------+---------------------+------+-----+---------+----------------+
| Field  | Type                | Null | Key | Default | Extra          |
+--------+---------------------+------+-----+---------+----------------+
| id     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| name   | char(30)            | NO   |     | NULL    |                |
| age    | tinyint(3) unsigned | YES  | MUL | NULL    |                |
| gender | enum('F','M')       | YES  |     | NULL    |                |
| major  | varchar(100)        | YES  |     | NULL    |                |
+--------+---------------------+------+-----+---------+----------------+
5 rows in set (0.05 sec)
表中的数据
MariaDB [(none)]> select * from test.students;
.............................
| 3089 | stu89    |   95 | M      | NULL   |
| 3090 | stu90    |   87 | F      | NULL   |
+------+----------+------+--------+--------+

备份
全量备份

mkdir /mysdate/backups -pv    #创建备份文件存放的目录
[root@node2 ~]#innobackupex --user=root --password=magedu --host=localhost /mydate/backups/    #全量备份
.....................
.....................
171114 09:57:11 completed OK!
[root@node2 ~]#cd /mydate/backups/
[root@node2 /mydate/backups]#ls
2017-11-11_10-02-09          #以当前时间命令的备份文件
[root@node2 /mydate/backups]#ll 2017-11-11_10-02-09/
total 18460
-rw-r-----. 1 root root      417 Nov 11 10:02 backup-my.cnf    配置信息
-rw-r-----. 1 root root 18874368 Nov 11 10:02 ibdata1
drwxr-x---. 2 root root     4096 Nov 11 10:02 mysql
drwxr-x---. 2 root root     4096 Nov 11 10:02 performance_schema
drwxr-x---. 2 root root     4096 Nov 11 10:02 test
-rw-r-----. 1 root root      113 Nov 11 10:02 xtrabackup_checkpoints  二进制文件的信息,备份的那一刻,处在什么位置
-rw-r-----. 1 root root      449 Nov 11 10:02 xtrabackup_info      备份的信息,版本,时间
-rw-r-----. 1 root root     2560 Nov 11 10:02 xtrabackup_logfile

第一次修改数据

MariaDB [(none)]> INSERT INTO test.students VALUE (3100,'xiaoming',18,'M','shuxue');
MariaDB [(none)]> select * from test.students;
.............................
| 3089 | stu89    |   95 | M      | NULL   |
| 3090 | stu90    |   87 | F      | NULL   |
| 3100 | xiaoming |   18 | M      | shuxue |
+------+----------+------+--------+--------+

修改数据后,第一次增量备份

[root@node2 ~]#innobackupex --user=root --password=magedu --host=localhost --incremental /mydate/backups/ --incremental-basedir=/mydate/backups/2017-11-14_09-51-50
[root@node2 /mydate/backups/2017-11-14_09-51-50]#cat  xtrabackup_checkpoints    #查看备份文件
backup_type = full-backuped     # 全量备份
from_lsn = 0                #从0位置开始
to_lsn = 2622741            #到2622741
last_lsn = 2622741
compact = 0
recover_binlog_info = 0

第二次修改数据

MariaDB [(none)]> DELETE FROM test.students WHERE id='3090';
Query OK, 1 row affected (0.05 sec)
MariaDB [(none)]> select * from test.students;
.............................
| 3089 | stu89    |   95 | M      | NULL   |
| 3100 | xiaoming |   18 | M      | shuxue |
+------+----------+------+--------+--------+

第二次修改数据后增量备份

[root@node2 ~]#innobackupex --user=root --password=magedu --host=localhost --incremental /mydate/backups/ --incremental-basedir=/mydate/backups/2017-11-14_09-57-07
[root@node2 /mydate/backups]#ll
total 12
drwxr-x---. 5 root root 4096 Nov 14 09:51 2017-11-14_09-51-50      #全量备份文件
drwxr-x---. 5 root root 4096 Nov 14 09:57 2017-11-14_09-57-07      #第一次增量备份文件
drwxr-x---. 5 root root 4096 Nov 14 10:08 2017-11-14_10-08-11      #第二次增量备份文件
[root@node2 /mydate/backups/2017-11-14_09-57-07]#cat xtrabackup_checkpoints
backup_type = incremental   #增量备份
from_lsn = 2622741          #从2622741
to_lsn = 2623193            #至2623193
last_lsn = 2623193
compact = 0
recover_binlog_info = 0

第三次修改

MariaDB [(none)]> UPDATE test.students SET major='yingyu' WHERE id='3100';
MariaDB [(none)]> select * from test.students;
......................
| 3089 | stu89    |   95 | M      | NULL   |
| 3100 | xiaoming |   18 | M      | yingyu |
+------+----------+------+--------+--------+

修改之后,这时候,服务器宕机,数据库崩溃,需要我们恢复数据,但是二进制日志还在。
查看最后一次增量备份完成的位置,以确定后面的操作二进制日志开始纪录的位置,并二进制日志还原数据增量备份之后的数据

[root@node2 /mydate/backups/2017-11-14_10-08-11]#cat xtrabackup_binlog_info
ON.000001   651

备份增量备份之后的二进制日志文件

[root@node2 ~]#mysqlbinlog -j 651 /var/lib/mysql/ON.000001 > /root/mysql.sql

把A机器上的备份的文件,以及二进制日志文件拷贝到B机器上,准备做恢复操作。
注意:备份的数据不应该和原数据存放在一起,如果遭受遭难,那么备份的数据和原数据一起被损坏,备份就失去意义了。
恢复
准备增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放之后”,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。全量备份文件中完成和未完成的,执行提交和回滚操作。
全量备份文件中完成和未完成的,执行提交和回滚操作

[root@localhost ~]#innobackupex --apply-log --redo-only /root/2017-11-14_09-51-50  

第一次增量备份文件中完成和未完成的,执行提交和回滚操作

[root@localhost ~]#innobackupex --apply-log --redo-only /root/2017-11-14_09-51-50 --incremental-dir /root/2017-11-14_09-57-07

第二次增量备份文件中完成和未完成的,执行提交和回滚操作

[root@localhost ~]#innobackupex --apply-log --redo-only /root/2017-11-14_09-51-50 --incremental-dir /root/2017-11-14_10-08-11

全部在滚回提交一次

[root@localhost ~]#innobackupex --apply-log /root/2017-11-14_09-51-50

同时可以注意到,备份开始的位置是全量备份最初的位置,结束的位置,是第二次增量备份结束的位置。

[root@localhost ~/2017-11-14_09-51-50]#cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0    #开始
to_lsn = 2623711   #结束
last_lsn = 2623711
compact = 0
recover_binlog_info = 0

恢复全量+第一次增量+第二次增量备份数据

[root@localhost ~]#innobackupex --copy-back 2017-11-14_09-51-50    #恢复数据

如下,数据库中已经有对应的数据

[root@localhost /var/lib/mysql]#ll
total 40980
-rw-r-----. 1 root root 18874368 Nov 14 11:02 ibdata1
-rw-r-----. 1 root root  5242880 Nov 14 11:02 ib_logfile0
-rw-r-----. 1 root root  5242880 Nov 14 11:02 ib_logfile1
-rw-r-----. 1 root root 12582912 Nov 14 11:02 ibtmp1
drwxr-x---. 2 root root     4096 Nov 14 11:02 mysql
drwxr-x---. 2 root root     4096 Nov 14 11:02 performance_schema
drwxr-x---. 2 root root     4096 Nov 14 11:02 test
-rw-r-----. 1 root root       16 Nov 14 11:02 xtrabackup_binlog_pos_innodb
-rw-r-----. 1 root root      564 Nov 14 11:02 xtrabackup_info

把备份数据文件的所属主和所属组修改为mysql

[root@localhost /var/lib/mysql]#chown -R mysql.mysql ./
[root@localhost /var/lib/mysql]#ll
total 40980
-rw-r-----. 1 mysql mysql 18874368 Nov 14 11:02 ibdata1
-rw-r-----. 1 mysql mysql  5242880 Nov 14 11:02 ib_logfile0
-rw-r-----. 1 mysql mysql  5242880 Nov 14 11:02 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Nov 14 11:02 ibtmp1
drwxr-x---. 2 mysql mysql     4096 Nov 14 11:02 mysql
drwxr-x---. 2 mysql mysql     4096 Nov 14 11:02 performance_schema
drwxr-x---. 2 mysql mysql     4096 Nov 14 11:02 test
-rw-r-----. 1 mysql mysql       16 Nov 14 11:02 xtrabackup_binlog_pos_innodb
-rw-r-----. 1 mysql mysql      564 Nov 14 11:02 xtrabackup_info

登陆数据库,需要注意的是,登陆的用户名,密码都是原数据的用户名和密码

MariaDB [(none)]> select * from test.students;
| 3088 | stu88    |   38 | M      | NULL   |
| 3089 | stu89    |   95 | M      | NULL   |
| 3100 | xiaoming |   18 | M      | shuxue |
+------+----------+------+--------+--------+
1089 rows in set (0.07 sec)

细心的朋友可以看到,我们并没有完全恢复数据,还有增量备份之后的数据还没恢复。

MariaDB [(none)]> SET @@session.sql_log_bin=OFF;
MariaDB [(none)]> \. /tmp/mysql.sql
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> SET @@session.sql_log_bin=ON;
Query OK, 0 rows affected (0.00 sec)

恢复完成,和宕机之前数据做对比,完全一样,恢复成功
MariaDB [(none)]> select * from test.students;
| 3088 | stu88 | 38 | M | NULL |
| 3089 | stu89 | 95 | M | NULL |
| 3100 | xiaoming | 18 | M | yingyu |
+——+———-+——+——–+——–+
1089 rows in set (0.01 sec)

恢复完成后,不要着急上线,赶紧做一次全量备份,生成新的序列。

MySQL数据库之全量+增量+二进制日志的备份与恢复相关推荐

  1. mysqldump全量恢复_【MySQL】全量+增量的备份/恢复

    生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...

  2. 基于Solr DIH实现MySQL表数据全量索引和增量索引

    实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data Import Handler)组件,对data-config.xml进行简单 ...

  3. solr mysql 增量索引_基于Solr DIH实现MySQL表数据全量索引和增量索引

    实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data Import Handler)组件,对data-config.xml进行简单 ...

  4. mysql 热备份 数据一致性_MySQL 使用 XtraBackup 进行数据热备份指导 [全量+增量]

    背景 最近一直涉猎 MySQL 数据库的操作.集群部署 注意到,为保证数据安全,掌握数据备份是极为重要的 相比小型服务的冷备份而言 在此推荐并整理更受推崇的 XtraBackup 下的热备份技巧 ☞ ...

  5. mysqldump备份(全量+增量)

    在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据. 线上数据库备份场景: 每周日执行一次全量备份,然后每天下午1点执行MySQLdump增量备 ...

  6. ODPS 数据全量/增量同步方案

    随着业务量增加,原采用的mysql 对大量业务数据的处理效率降低,公司采购的ODPS(MaxCompute) 阿里数据处理平台,进行数据的处理. 一.源数据库 -> ODPS 全量同步,直接同步 ...

  7. MySQL数据库——5分钟带你了解日志管理、数据备份与恢复!!!

    MySQL数据库--5分钟带你了解日志管理.数据备份与恢复!!! 前言 一.MySQL日志管理 1.1 日志的分类 1)错误日志 2) 通用查询日志 3) 二进制日志(binlog) 4) 慢查询日志 ...

  8. “全量增量” 与 “增量同步” 一文了解清楚【建议收藏】

    大家在同步数据的时候都会接触到2个名词,"全量增量" 与 "增量同步" ,名字都长得差不多,但是意思和操作却不一样:比如部门领导给你方案,那我们要如何去选择其中 ...

  9. solr mysql增量导入_10.Solr4.10.3数据导入(DIH全量增量同步Mysql数据)

    1.创建MySQL数据 create databasesolr;usesolr;DROP TABLE IF EXISTSstudent;CREATE TABLEstudent ( idchar(10) ...

最新文章

  1. OpenCV 【十】——Gamma校正 ——图像灰度变化
  2. GPT-4参数将达10兆!此表格预测全新语言模型参数将是GPT-3的57倍
  3. KVM虚拟化存储管理
  4. Android--DPAD键的事件处理
  5. 雅虎开源发布/订阅消息平台Pulsar
  6. 13个JavaScript单行式代码
  7. 摔跤视频软件测试,Apple Watch 4摔倒检测立功:成功救人一命,网友:马上入手!...
  8. macos php无法访问,Mac上,Apache启动正常,却无法访问localhost和127.0.0.1
  9. 一些难懂的笑话,看看你懂得多少? [转帖]
  10. TCP/IP详解卷1 - wireshark抓包分析
  11. 初解vue脚手架vue-cli,及demo示例(一)
  12. apache、nginx验证
  13. 魔兽世界怀旧服务器维护,魔兽世界怀旧服转服维护服务 关闭部分服务器
  14. Atitit vue.js 把ajax数据 绑定到form表单
  15. traceview使用总结
  16. 打印机扫描找不到计算机用户名,打印机扫描到pc显示不可用 打印机扫描到pc显示不可用的解决方法...
  17. OEM/ODM/OBM
  18. 01 - Win10+Ubuntu双系统安装换清华源 - 研0
  19. 计算机编程学完图形化接下来学啥,为什么学习少儿编程要从图形化开始
  20. vue PC 端使用腾讯地图定位

热门文章

  1. 计算机输入开机密码无法进入,电脑进不了开机输入帐号密码后无法进入桌面. – 手机爱问...
  2. WEB自动化测试总结篇
  3. Mindspore r0.7版本运行Lenet_MNIST
  4. mybatis的xml文件里提示Tag name expected的解决方案
  5. springboot全局配置文件可设置的属性
  6. 个人知识管理利器wiz
  7. 基于SCL语言的模拟量平均值滤波FB库功能介绍及创建FB库的具体方法
  8. 基于jsp+mysql+Spring+mybatis的SSM实现简单宿舍管理系统
  9. zplayer->开源网页嵌入式播放器使用体验
  10. 【​区块链】相关专业名词术语