前言
咱们试着想想, 在生产环境中什么最重要?若是咱们服务器的硬件坏了能够维修或者换新, 软件问题能够修复或从新安装, 可是若是数据没了呢?这多是最恐怖的事情了吧, 我感受在生产环境中应该没有什么比数据跟更为重要. 那么咱们该如何保证数据不丢失、或者丢失后能够快速恢复呢?只要看完这篇, 你们应该就能对
MySQL
中实现数据备份和恢复能有必定的了解。html
为何须要备份数据?
其实在
前言
中也大概说明了为何要备份数据, 可是咱们仍是应该具体了解一下为何要备份数据前端在生产环境中咱们数据库可能会遭遇各类各样的不测从而致使数据丢失, 大概分为如下几种.node
硬件故障mysql
软件故障sql
天然灾害shell
黑客攻击数据库
误操做 (占比最大)vim
因此, 为了在数据丢失以后可以恢复数据, 咱们就须要按期的备份数据, 备份数据的策略要根据不一样的应用场景进行定制, 大体有几个参考数值, 咱们能够根据这些数值从而定制符合特定环境中的数据备份策略服务器
可以容忍丢失多少数据网络
恢复数据须要多长时间
须要恢复哪一些数据
数据的备份类型
数据的备份类型根据其自身的特性主要分为如下几组
彻底备份
部分备份
彻底备份指的是备份整个数据集( 即整个数据库 )、部分备份指的是备份部分数据集(例如: 只备份一个表)
而部分备份又分为如下两种
增量备份
差别备份
增量备份指的是备份自上一次备份以来(增量或彻底)以来变化的数据; 特色: 节约空间、还原麻烦
差别备份指的是备份自上一次彻底备份以来变化的数据 特色: 浪费空间、还原比增量备份简单示意图
MySQL备份数据的方式
在
MySQl
中咱们备份数据通常有几种方式
热备份
温备份
冷备份
热备份指的是当数据库进行备份时, 数据库的读写操做均不是受影响
温备份指的是当数据库进行备份时, 数据库的读操做能够执行, 可是不能执行写操做
冷备份指的是当数据库进行备份时, 数据库不能进行读写操做, 即数据库要下线
MySQL
中进行不一样方式的备份还要考虑存储引擎是否支持
MyISAM
热备 ×
温备 √
冷备 √
InnoDB
热备 √
温备 √
冷备 √
咱们在考虑完数据在备份时, 数据库的运行状态以后还须要考虑对于
MySQL
数据库中数据的备份方式物理备份通常就是经过
tar
,cp
等命令直接打包复制数据库的数据文件达到备份的效果
逻辑备份通常就是经过特定工具从数据库中导出数据并另存备份(逻辑备份会丢失数据精度)
物理备份
逻辑备份
备份须要考虑的问题
定制备份策略前, 咱们还须要考虑一些问题
咱们要备份什么?
通常状况下, 咱们须要备份的数据分为如下几种
数据
二进制日志, InnoDB事务日志
代码(存储过程、存储函数、触发器、事件调度器)
服务器配置文件
备份工具
这里咱们列举出经常使用的几种备份工具
mysqldump
: 逻辑备份工具, 适用于全部的存储引擎, 支持温备、彻底备份、部分备份、对于InnoDB存储引擎支持热备cp, tar 等归档复制工具
: 物理备份工具, 适用于全部的存储引擎, 冷备、彻底备份、部分备份lvm2 snapshot
: 几乎热备, 借助文件系统管理工具进行备份mysqlhotcopy
: 名存实亡的的一个工具, 几乎冷备, 仅支持MyISAM存储引擎xtrabackup
: 一款很是强大的InnoDB/XtraDB热备工具, 支持彻底备份、增量备份, 由percona
提供
设计合适的备份策略
针对不一样的场景下, 咱们应该制定不一样的备份策略对数据库进行备份, 通常状况下, 备份策略通常为如下三种
直接cp,tar复制数据库文件
mysqldump+复制BIN LOGS
lvm2快照+复制BIN LOGS
xtrabackup
以上的几种解决方案分别针对于不一样的场景
若是数据量较小, 可使用第一种方式, 直接复制数据库文件
若是数据量还行, 可使用第二种方式, 先使用mysqldump对数据库进行彻底备份, 而后按期备份BINARY LOG达到增量备份的效果
若是数据量通常, 而又不过度影响业务运行, 可使用第三种方式, 使用
lvm2
的快照对数据文件进行备份, 然后按期备份BINARY LOG达到增量备份的效果若是数据量很大, 而又不过度影响业务运行, 可使用第四种方式, 使用
xtrabackup
进行彻底备份后, 按期使用xtrabackup
进行增量备份或差别备份
实战演练
使用cp进行备份
咱们这里使用的是使用yum安装的
mysql-5.1
的版本, 使用的数据集为从网络上找到的一个员工数据库
查看数据库的信息
mysql> SHOW DATABASES; #查看当前的数据库, 咱们的数据库为employees +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> USE employees; Database changed mysql> SHOW TABLES; #查看当前库中的表 +---------------------+ | Tables_in_employees | +---------------------+ | departments | | dept_emp | | dept_manager | | employees | | salaries | | titles | +---------------------+ 6 rows in set (0.00 sec) mysql> SELECT COUNT(*) FROM employees; #因为篇幅缘由, 咱们这里只看一下employees的行数为300024 +----------+ | COUNT(*) | +----------+ | 300024 | +----------+ 1 row in set (0.05 sec)
向数据库施加读锁
mysql> FLUSH TABLES WITH READ LOCK; #向全部表施加读锁 Query OK, 0 rows affected (0.00 sec)
备份数据文件
[root@node1 ~]# mkdir /backup #建立文件夹存放备份数据库文件 [root@node1 ~]# cp -a /var/lib/mysql/* /backup #保留权限的拷贝源数据文件 [root@node1 ~]# ls /backup #查看目录下的文件 employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock test
模拟数据丢失并恢复
[root@node1 ~]# rm -rf /var/lib/mysql/* #删除数据库的全部文件 [root@node1 ~]# service mysqld restart #重启MySQL, 若是是编译安装的应该不能启动, 若是rpm安装则会从新初始化数据库 mysql> SHOW DATABASES; #由于咱们是rpm安装的, 链接到MySQL进行查看, 发现数据丢失了! +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.00 sec) [root@node1 ~]# rm -rf /var/lib/mysql/* #这一步能够不作 [root@node1 ~]# cp -a /backup/* /var/lib/mysql/ #将备份的数据文件拷贝回去 [root@node1 ~]# service mysqld restart #重启MySQL #从新链接数据并查看 mysql> SHOW DATABASES; #数据库已恢复 +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> USE employees; mysql> SELECT COUNT(*) FROM employees; #表的行数没有变化 +----------+ | COUNT(*) | +----------+ | 300024 | +----------+ 1 row in set (0.06 sec) ##完成
使用mysqldump+复制BINARY LOG备份
咱们这里使用的是使用yum安装的
mysql-5.1
的版本, 使用的数据集为从网络上找到的一个员工数据库咱们经过mysqldump进行一次彻底备份, 再修改表中的数据, 而后再经过binary log进行恢复 二进制日志须要在mysql配置文件中添加 log_bin=on 开启
mysqldump
命令介绍
mysqldump
是一个客户端的逻辑备份工具, 能够生成一个重现建立原始数据库和表的SQL语句, 能够支持全部的存储引擎, 对于InnoDB支持热备
#基本语法格式 shell> mysqldump [options] db_name [tbl_name ...] 恢复须要手动CRATE DATABASES shell> mysqldump [options] --databases db_name ... 恢复不须要手动建立数据库 shell> mysqldump [options] --all-databases 恢复不须要手动建立数据库 其余选项: -E, --events: 备份事件调度器 -R, --routines: 备份存储过程和存储函数 --triggers: 备份表的触发器; --skip-triggers --master-date[=value] 1: 记录为CHANGE MASTER TO 语句、语句不被注释 2: 记录为注释的CHANGE MASTER TO语句 基于二进制还原只能全库还原 --flush-logs: 日志滚动 锁定表完成后执行日志滚动
查看数据库的信息
mysql> SHOW DATABASES; #查看当前的数据库, 咱们的数据库为employees +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> USE employees; Database changed mysql> SHOW TABLES; #查看当前库中的表 +---------------------+ | Tables_in_employees | +---------------------+ | departments | | dept_emp | | dept_manager | | employees | | salaries | | titles | +---------------------+ 6 rows in set (0.00 sec) mysql> SELECT COUNT(*) FROM employees; #因为篇幅缘由, 咱们这里只看一下employees的行数为300024 +----------+ | COUNT(*) | +----------+ | 300024 | +----------+ 1 row in set (0.05 sec)
使用mysqldump
备份数据库
[root@node1 ~]# mysql -uroot -p -e 'SHOW MASTER STATUS' #查看当前二进制文件的状态, 并记录下position的数字 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 106 | | | +------------------+----------+--------------+------------------+ [root@node1 ~]# mysqldump --all-databases --lock-all-tables > backup.sql #备份数据库到backup.sql文件中 mysql> CREATE DATABASE TEST1; #建立一个数据库 Query OK, 1 row affected (0.00 sec) mysql> SHOW MASTER STATUS; #记下如今的position +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 191 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) [root@node1 ~]# cp /var/lib/mysql/mysql-bin.000003 /root #备份二进制文件 [root@node1 ~]# service mysqld stop #中止MySQL [root@node1 ~]# rm -rf /var/lib/mysql/* #删除全部的数据文件 [root@node1 ~]# service mysqld start #启动MySQL, 若是是编译安装的应该不能启动(需从新初始化), 若是rpm安装则会从新初始化数据库 mysql> SHOW DATABASES; #查看数据库, 数据丢失! +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.00 sec) mysql> SET sql_log_bin=OFF; #暂时先将二进制日志关闭 Query OK, 0 rows affected (0.00 sec) mysql> source backup.sql #恢复数据,所需时间根据数据库时间大小而定 mysql> SET sql_log_bin=ON; 开启二进制日志 mysql> SHOW DATABASES; #数据库恢复, 可是缺乏TEST1 +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) [root@node1 ~]# mysqlbinlog --start-position=106 --stop-position=191 mysql-bin.000003 | mysql employees #经过二进制日志增量恢复数据 mysql> SHOW DATABASES; #如今TEST1出现了! +--------------------+ | Database | +--------------------+ | information_schema | | TEST1 | | employees | | mysql | | test | +--------------------+ 5 rows in set (0.00 sec) #完成
使用lvm2快照备份数据
作实验以前咱们先回顾一下
lvm2-snapshot
的知识
LVM
快照简单来讲就是将所快照源分区一个时间点全部文件的元数据进行保存,若是源文件没有改变,那么访问快照卷的相应文件则直接指向源分区的源文件,若是源文件发生改变,则快照卷中与之对应的文件不会发生改变。快照卷主要用于辅助备份文件。 这里只简单介绍,点击查看详细介绍
部署lvm环境
添加硬盘; 这里咱们直接实现SCSI硬盘的热插拔, 首先在虚拟机中添加一块硬盘, 不重启 [root@node1 ~]# ls /dev/sd* #只有如下几块硬盘, 可是咱们不重启可让系统识别新添加的硬盘 /dev/sda /dev/sda1 /dev/sda2 [root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host0/scan [root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host1/scan [root@node1 ~]# echo '- - -' > /sys/class/scsi_host/host2/scan [root@node1 ~]# ls /dev/sd* #看!sdb识别出来了 /dev/sda /dev/sda1 /dev/sda2 /dev/sdb [root@node1 ~]# fdisk /dev/sdb #分区 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0xd353d192. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +15G Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. You have new mail in /var/spool/mail/root [root@node1 ~]# partx -a /dev/sdb BLKPG: Device or resource busy error adding partition 1 ##建立逻辑卷 [root@node1 ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created [root@node1 ~]# vgcreate myvg /dev/sdb1 Volume group "myvg" successfully created [root@node1 ~]# lvcreate -n mydata -L 5G myvg Logical volume "mydata" created. [root@node1 ~]# mkfs.ext4 /dev/mapper/myvg-mydata #格式化 [root@node1 ~]# mkdir /lvm_data [root@node1 ~]# mount /dev/mapper/myvg-mydata /lvm_data #挂载到/lvm_data [root@node1 ~]# vim /etc/my.cnf #修改mysql配置文件的datadir以下 datadir=/lvm_data [root@node1 ~]# service mysqld restart #重启MySQL ####从新导入employees数据库########略过####
查看数据库的信息
mysql> SHOW DATABASES; #查看当前的数据库, 咱们的数据库为employees +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> USE employees; Database changed mysql> SHOW TABLES; #查看当前库中的表 +---------------------+ | Tables_in_employees | +---------------------+ | departments | | dept_emp | | dept_manager | | employees | | salaries | | titles | +---------------------+ 6 rows in set (0.00 sec) mysql> SELECT COUNT(*) FROM employees; #因为篇幅缘由, 咱们这里只看一下employees的行数为300024 +----------+ | COUNT(*) | +----------+ | 300024 | +----------+ 1 row in set (0.05 sec)
建立快照卷并备份
mysql> FLUSH TABLES WITH READ LOCK; #锁定全部表 Query OK, 0 rows affected (0.00 sec) [root@node1 lvm_data]# lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata #建立快照卷 Logical volume "mydata-snap" created. mysql> UNLOCK TABLES; #解锁全部表 Query OK, 0 rows affected (0.00 sec) [root@node1 lvm_data]# mkdir /lvm_snap #建立文件夹 [root@node1 lvm_data]# mount /dev/myvg/mydata-snap /lvm_snap/ #挂载snap mount: block device /dev/mapper/myvg-mydata--snap is write-protected, mounting read-only [root@node1 lvm_data]# cd /lvm_snap/ [root@node1 lvm_snap]# ls employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index test [root@node1 lvm_snap]# tar cf /tmp/mysqlback.tar * #打包文件到/tmp/mysqlback.tar [root@node1 ~]# umount /lvm_snap/ #卸载snap [root@node1 ~]# lvremove myvg mydata-snap #删除snap
恢复数据
[root@node1 lvm_snap]# rm -rf /lvm_data/* [root@node1 ~]# service mysqld start #启动MySQL, 若是是编译安装的应该不能启动(需从新初始化), 若是rpm安装则会从新初始化数据库 mysql> SHOW DATABASES; #查看数据库, 数据丢失! +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | test | +--------------------+ 3 rows in set (0.00 sec) [root@node1 ~]# cd /lvm_data/ [root@node1 lvm_data]# rm -rf * #删除全部文件 [root@node1 lvm_data]# tar xf /tmp/mysqlback.tar #解压备份数据库到此文件夹 [root@node1 lvm_data]# ls #查看当前的文件 employees ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.000003 mysql-bin.index test mysql> SHOW DATABASES; #数据恢复了 +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | test | +--------------------+ 4 rows in set (0.00 sec) ##完成
使用Xtrabackup备份
为了更好地演示, 咱们此次使用
mariadb-5.5
的版本, 使用xtrabackup
使用InnoDB可以发挥其最大功效, 而且InnoDB的每一张表必须使用单独的表空间, 咱们须要在配置文件中添加innodb_file_per_table = ON
来开启
下载安装xtrabackup
咱们这里经过wget percona官方的rpm包进行安装 [root@node1 ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.4/binary/redhat/6/x86_64/percona-xtrabackup-2.3.4-1.el6.x86_64.rpm [root@node1 ~]# yum localinstall percona-xtrabackup-2.3.4-1.el6.x86_64.rpm #须要EPEL源
xtrabackup
介绍
Xtrabackup
是由percona
提供的mysql
数据库备份工具,据官方介绍,这也是世界上唯一一款开源的可以对innodb和xtradb数据库进行热备的工具。特色:
备份过程快速、可靠;
备份过程不会打断正在执行的事务;
可以基于压缩等功能节约磁盘空间和流量;
自动实现备份检验;
还原速度快;
xtrabackup
实现彻底备份
咱们这里使用
xtrabackup
的前端配置工具innobackupex
来实现对数据库的彻底备份使用
innobackupex
备份时, 会调用xtrabackup
备份全部的InnoDB表, 复制全部关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件, 同时还会备份触发器和数据库配置文件信息相关的文件, 这些文件会被保存至一个以时间命名的目录.
备份过程
[root@node1 ~]# mkdir /extrabackup #建立备份目录 [root@node1 ~]# innobackupex --user=root /extrabackup/ #备份数据 ###################提示complete表示成功********************* [root@node1 ~]# ls /extrabackup/ #看到备份目录 2016-04-27_07-30-48
通常状况, 备份完成后, 数据不能用于恢复操做, 由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。所以, 此时的数据文件仍不一致, 因此咱们须要”准备”一个彻底备份
[root@node1 ~]# innobackupex --apply-log /extrabackup/2016-04-27_07-30-48/ #指定备份文件的目录 #通常状况下下面三行结尾表明成功***************** InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 369661462 160427 07:40:11 completed OK! [root@node1 ~]# cd /extrabackup/2016-04-27_07-30-48/ [root@node1 2016-04-27_07-30-48]# ls -hl #查看备份文件 total 31M -rw-r----- 1 root root 386 Apr 27 07:30 backup-my.cnf drwx------ 2 root root 4.0K Apr 27 07:30 employees -rw-r----- 1 root root 18M Apr 27 07:40 ibdata1 -rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile0 -rw-r--r-- 1 root root 5.0M Apr 27 07:40 ib_logfile1 drwx------ 2 root root 4.0K Apr 27 07:30 mysql drwx------ 2 root root 4.0K Apr 27 07:30 performance_schema drwx------ 2 root root 4.0K Apr 27 07:30 test -rw-r----- 1 root root 27 Apr 27 07:30 xtrabackup_binlog_info -rw-r--r-- 1 root root 29 Apr 27 07:40 xtrabackup_binlog_pos_innodb -rw-r----- 1 root root 117 Apr 27 07:40 xtrabackup_checkpoints -rw-r----- 1 root root 470 Apr 27 07:30 xtrabackup_info -rw-r----- 1 root root 2.0M Apr 27 07:40 xtrabackup_logfile
恢复数据
[root@node1 ~]# rm -rf /data/* #删除数据文件 ***不用启动数据库也能够还原************* [root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ #恢复数据, 记清使用方法 #########咱们这里是编译安装的mariadb因此须要作一些操做########## [root@node1 data]# killall mysqld [root@node1 ~]# chown -R mysql:mysql ./* [root@node1 ~]# ll /data/ #数据恢复 total 28704 -rw-rw---- 1 mysql mysql 16384 Apr 27 07:43 aria_log.00000001 -rw-rw---- 1 mysql mysql 52 Apr 27 07:43 aria_log_control -rw-rw---- 1 mysql mysql 18874368 Apr 27 07:43 ibdata1 -rw-rw---- 1 mysql mysql 5242880 Apr 27 07:43 ib_logfile0 -rw-rw---- 1 mysql mysql 5242880 Apr 27 07:43 ib_logfile1 -rw-rw---- 1 mysql mysql 264 Apr 27 07:43 mysql-bin.000001 -rw-rw---- 1 mysql mysql 19 Apr 27 07:43 mysql-bin.index -rw-r----- 1 mysql mysql 2166 Apr 27 07:43 node1.anyisalin.com.err [root@node1 data]# service mysqld restart MySQL server PID file could not be found! [FAILED] Starting MySQL.. [ OK ] MariaDB [(none)]> SHOW DATABASES; #查看数据库, 已经恢复 +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec
增量备份
#########建立连两个数据库以供测试##################### MariaDB [(none)]> CREATE DATABASE TEST1; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> CREATE DATABASE TEST2; Query OK, 1 row affected (0.00 sec) [root@node1 ~]# innobackupex --incremental /extrabackup/ --incremental-basedir=/extrabackup/2016-04-27_07-30-48/ [root@node1 ~]# ls /extrabackup/2016-04-27_07-57-22/ #查看备份文件 total 96 -rw-r----- 1 root root 386 Apr 27 07:57 backup-my.cnf drwx------ 2 root root 4096 Apr 27 07:57 employees -rw-r----- 1 root root 49152 Apr 27 07:57 ibdata1.delta -rw-r----- 1 root root 44 Apr 27 07:57 ibdata1.meta drwx------ 2 root root 4096 Apr 27 07:57 mysql drwx------ 2 root root 4096 Apr 27 07:57 performance_schema drwx------ 2 root root 4096 Apr 27 07:57 test drwx------ 2 root root 4096 Apr 27 07:57 TEST1 drwx------ 2 root root 4096 Apr 27 07:57 TEST2 -rw-r----- 1 root root 21 Apr 27 07:57 xtrabackup_binlog_info -rw-r----- 1 root root 123 Apr 27 07:57 xtrabackup_checkpoints -rw-r----- 1 root root 530 Apr 27 07:57 xtrabackup_info -rw-r----- 1 root root 2560 Apr 27 07:57 xtrabackup_logfile
BASEDIR指的是彻底备份所在的目录,此命令执行结束后,
innobackupex
命令会在/extrabackup
目录中建立一个新的以时间命名的目录以存放全部的增量备份数据。另外,在执行过增量备份以后再一次进行增量备份时,其--incremental-basedir
应该指向上一次的增量备份所在的目录。须要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是彻底备份。
整理增量备份
[root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ [root@node1 ~]# innobackupex --apply-log --redo-only /extrabackup/2016-04-27_07-30-48/ --incremental-dir=/extrabackup/2016-04-27_07-5 7-22/
恢复数据
[root@node1 ~]# rm -rf /data/* #删除数据 [root@node1 ~]# innobackupex --copy-back /extrabackup/2016-04-27_07-30-48/ #整理增量备份以后能够直接经过全量备份还原 [root@node1 ~]# chown -R mysql.mysql /data/ [root@node1 ~]# ls /data/ -l total 28732 -rw-rw---- 1 mysql mysql 8192 Apr 27 08:05 aria_log.00000001 -rw-rw---- 1 mysql mysql 52 Apr 27 08:05 aria_log_control drwx------ 2 mysql mysql 4096 Apr 27 08:05 employees -rw-r----- 1 mysql mysql 18874368 Apr 27 08:05 ibdata1 -rw-r----- 1 mysql mysql 5242880 Apr 27 08:05 ib_logfile0 -rw-r----- 1 mysql mysql 5242880 Apr 27 08:05 ib_logfile1 drwx------ 2 mysql mysql 4096 Apr 27 08:05 mysql -rw-rw---- 1 mysql mysql 245 Apr 27 08:05 mysql-bin.000001 -rw-rw---- 1 mysql mysql 19 Apr 27 08:05 mysql-bin.index -rw-r----- 1 mysql mysql 1812 Apr 27 08:05 node1.anyisalin.com.err -rw-rw---- 1 mysql mysql 5 Apr 27 08:05 node1.anyisalin.com.pid drwx------ 2 mysql mysql 4096 Apr 27 08:05 performance_schema drwx------ 2 mysql mysql 4096 Apr 27 08:05 test drwx------ 2 mysql mysql 4096 Apr 27 08:05 TEST1 drwx------ 2 mysql mysql 4096 Apr 27 08:05 TEST2 -rw-r----- 1 mysql mysql 29 Apr 27 08:05 xtrabackup_binlog_pos_innodb -rw-r----- 1 mysql mysql 530 Apr 27 08:05 xtrabackup_info MariaDB [(none)]> SHOW DATABASES; #数据还原 +--------------------+ | Database | +--------------------+ | information_schema | | TEST1 | | TEST2 | | employees | | mysql | | performance_schema | | test | +--------------------+ 7 rows in set (0.00 sec) #关于xtrabackup还有不少强大的功能没有叙述、有兴趣能够去看官方文档
总结
备份方法 | 备份速度 | 恢复速度 | 便捷性 | 功能 | 通常用于 |
---|---|---|---|---|---|
cp | 快 | 快 | 通常、灵活性低 | 很弱 | 少许数据备份 |
mysqldump | 慢 | 慢 | 通常、可无视存储引擎的差别 | 通常 | 中小型数据量的备份 |
lvm2快照 | 快 | 快 | 通常、支持几乎热备、速度快 | 通常 | 中小型数据量的备份 |
xtrabackup | 较快 | 较快 | 实现innodb热备、对存储引擎有要求 | 强大 | 较大规模的备份 |
其实咱们还能够经过
Master-Slave Replication
进行备份。