05__mysql-备份与恢复
MySQL备份与还原(重要)
一、MySQL备份概述
1、备份过程须考虑的因素
- 必须制定==详细的备份计划(策略)==(备份频率、时间点、周期)
- 备份数据应该放在==非数据库本地==,并建议==有多份副本==
- 必须做好==数据恢复的演练==(每隔一段时间,对备份的数据在测试环境中进行模拟恢复,保证当出现数据灾难的时候能够及时恢复数据。)
- 根据数据应用的场合、特点==选择正确的备份工具==。
- 数据的一致性
- 服务的可用性
2、备份类型
☆ 逻辑备份
- 备份的是建表、建库、插入等操作所执行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等
- 实时在线备份
3、备份工具
☆ 社区版安装包中的备份工具
① mysqldump (逻辑备份,只能==全量备份==)
1)企业版和社区版都包含
2)本质上使用==SQL语句描述数据库==及数据并导出
3)在MYISAM引擎上锁表,Innodb引擎上锁行(备份进行时,表不可写)
4)数据量很大时不推荐使用
② mysqlhotcopy(物理备份工具)
1)企业版和社区版都包含
2)perl写的一个脚本,本质上是使用锁表语句后再拷贝数据(备份进行时,行不可写)
3)==只==支持MYISAM数据引擎
☆ 企业版安装包中的备份工具
① mysqlbackup
1)在线备份
2)增量备份
3)部分备份
4)在某个特定时间的一致性状态的备份
② 第三方备份工具
- XtraBackup(物理备份)
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(最后更新时间)
二、MySQL的逻辑备份
1、mysqldump备份(全量)
本质:导出的是sql语句文件
优点:无论是什么存储引擎,都可以用mysqldump备成sql语句
缺点:速度较慢,导入时可能会出现格式不兼容的突发状况.==无法直接做增量备份==.
提供三种级别的备份,表级,库级和全库级
① 备份语法
表级别备份
mysqldump [OPTIONS] [database] [tables]
mysql> mysqldump -p123 db01 emp > /tmp/mysqlbak/emp.sql 备份单个表
mysql> mysqldump -p123 db01 emp dept > /tmp/mysqlbak/emp.sql 备份多个表
--------------------------------------------------------------
库级别备份
mysqldump [OPTIONS] --databases [OPTIONS] [DB1 DB2 DB3...]
mysql> mysqldump --databases db01 -p > /tmp/mysqlbak/db01.sql 备份单个库
mysql> mysqldump --databases db01 db02 -p > /tmp/mysqlbak/db01.sql 备份多个库
----------------------------------------------------------------
全库级别备份
mysqldump [OPTIONS] --all-databases [OPTIONS]
mysql> mysqldump --all-databases --master-data --single-transaction > all.sql
② 常用参数
常用参数:
--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
③恢复语法
表级恢复:
mysql -p [database] < /tmp/mysqlbak/emp.sql
或者在mysql数据库内使用source命令来执行外部的sql文件
mysql> source /tmp/mysqlbackup/emp.sql
库级恢复:
mysql -p < /tmp/mysqlbak/db01.sql
# mysql -p </tmp/mysqlbak/db01.sql
mysql> source /tmp/mysqlbak/db01.sql
总结:
- mysqldump工具备份的是==SQL语句==,故备份不需要停服务
- 使用备份文件==恢复==时,要保证==数据库处于运行状态==
- 只能实现全库,指定库,表级别的==某一时刻的备份==,本身==不能增量备份==
- 适用于==中小型==数据库
2、mysqldump结合二进制日志增量备份
☆ 增量备份核心思路
- ==备份的目的为了数据出问题进行恢复==
- 二进制日志文件默认会记录下所有对数据库数据变化的操作(增、删、改)
- 二进制文件同时还会记录具体sql执行时的环境、==时间以及起始位置和结束位置==(pos值)
- 通过获取二进制文件里的SQL操作来进行==数据的恢复==
二进制日志是个啥?
☆ MySQL有哪些日志?
① ==错误日志==
**作用:**存放数据库的启动、停止或运行时的错误信息,==用于排错==。
-
默认是==开启==的,可以通过修改==my.cnf==文件自定义,如:
log_error=/path默认存在在$datadir/hostname.err
② 一般查询日志
作用:
当客户端连接或断开时,服务器会将信息写入该日志,并记录从客户端收到的每一条SQL语句。当您怀疑客户端的错误并想知道客户端发送给mysqld的确切信息时,一般查询日志可能非常有用。
- 默认情况下,一般查询日志是==被禁用==的。 如果要开启,可以使用以下参数:
general_log[={0|1} 0表示禁用,1表示开启.
- 默认情况下,系统会在数据目录下创建以host_name.log命名的一般查询日志。如果要自己指定,可以使用以下参数:
指定一般查询日志的路径及文件名
general_log_file=/path/file.log
该参数用于定义general log和slow log的输出目标
log-output=[value,...]
value=[TABLE|FILE|NONE],默认值为FILE
TABLE表示将日志记录到表中,general_log表或者slow_log表中
FILE表示将日志记录的文本文件中
NONE表示不记录到表或者文件
注意:
如果log-output=NONE,则即使启用了日志,也不会写入条目。
如果log-output不等于NONE,但是没有启用日志也不会写入条目。
③ 慢查询日志
作用:
慢查询日志记录的是一些==SQL语句==,可用于查找需要很长时间才能执行的查询,因此可用于优化。但是,检查一个很长的慢查询日志可能成为一项艰巨的任务。为了简化这一过程,您可以使用mysqldumpslow命令处理慢查询日志文件,以汇总日志中显示的查询。
- 默认情况下慢查询日志是==关闭==的,可以使用以下参数开启,0代表关闭;1代表启用
打开或关闭慢查询日志
slow_query_log={1|0}
指定慢查询日志的路径及文件名,默认$datadir/host_name-slow.log
slow_query_log_file=/path/file_name.log
定义日志的输出目标
log-output=[value,...]
long_query_time=n 单位是秒s
表示查询语句超过n秒被记录到slow log里,最小值为0,默认值为10
④ ==二进制日志==
作用:
二进制日志记录==数据库的所有更改==操作(DDL/DML/DCL),不包含select或者show这类语句。
- 用于==主从复制==中,master主服务器将二进制日志中的更改操作发送给slave从服务器,从服务器执行这些更改操作是的和主服务器的更改相同。
- 用于==数据的恢复==操作。
- 默认二进制日志是==关闭==的,可以使用
log-bin=/path/binlog
参数开启 - ==mysqlbinlog==工具查看
⑤ 中继日志
作用:
用于==主从复制==,master主服务器将自己的二进制日志发送给slave从服务器,slave先保存在自己的==中继日志中==,然后再执行自己本地的relay log里的sql达到数据库更改和master保持一致。
- 默认中继日志==没有开启==,可以使用
relay-log=/path/xxxx
参数开启
☆ 全量+增量备份实践
实践步骤:mysqldump+binlog
核心思路:
1. 先做全量备份(mysqldump)
2. 对数据库做更改操作
3. 备份二进制日志文件
4. 模拟故障进行
5. 数据恢复
6. 测试验证
- 步骤
- 全库备份
# mysqldump --single-transaction
--flush-logs 刷新
--master-data=2 记录位置
--all-databases > /tmp/all.sql -p
# mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > /tmp/all.sql -p
Enter password:123
如报错,注意/usr/local/mysql目录权限问题
报错1:mysqldump: Error: Binlogging on server not active
vim my.cnf
在【mysqld】 中 加入:
log-bin=mysql-bin
重启mysqld生效。
- 更改数据库
mysql> select * from db01.t1;
+------+--------+---------+-----------+
| id | name | salary | dept |
+------+--------+---------+-----------+
| 1 | harry | 1300.00 | 市场部 |
| 2 | amy | 2200.00 | 人事部 |
| 3 | tom | 600.00 | 财务部 |
| 4 | jack | 3300.00 | 市场部 |
| 5 | momo | 1700.00 | 市场部 |
| 6 | sarsha | 1300.00 | 人事部 |
| 7 | xiaom | 4300.00 | 市场部 |
+------+--------+---------+-----------+
mysql> select * from db02.t1;
+----+-------+
| id | name |
+----+-------+
| 1 | harry |
| 2 | tom |
+----+-------+
2 rows in set (0.00 sec)
更改:
mysql> delete from db01.t1 where id=7;
mysql> insert into db01.t1 values(88,'aaa',11111.23,'安保部'),(99,'bbb',22222.22,'运维部');
mysql> update db02.t1 set name='jack' where id=2;
mysql> select * from db01.t1;
+------+--------+----------+-----------+
| id | name | salary | dept |
+------+--------+----------+-----------+
| 1 | harry | 1300.00 | 市场部 |
| 2 | amy | 2200.00 | 人事部 |
| 3 | tom | 600.00 | 财务部 |
| 4 | jack | 3300.00 | 市场部 |
| 5 | momo | 1700.00 | 市场部 |
| 6 | sarsha | 1300.00 | 人事部 |
| 88 | aaa | 11111.11 | 安保部 |
| 99 | bbb | 22222.22 | 运维部 |
+------+--------+----------+-----------+
8 rows in set (0.00 sec)
mysql> select * from db02.t1;
+----+-------+
| id | name |
+----+-------+
| 1 | harry |
| 2 | jack |
+----+-------+
2 rows in set (0.00 sec)
- 备份二进制文件
方法1:直接拷贝物理文件
方法2:备份改变过的数据(SQL)
# mysqlbinlog --start-position=120 binlog.000005 > /opt/mybinlog.sql
- 故障模拟
mysql> drop database db01;
Query OK, 7 rows affected (0.07 sec)
mysql> drop database db02;
Query OK, 3 rows affected (0.01 sec)
- 全量恢复
1. 通过刚刚全量备份进行恢复
# mysql < /tmp/all.sql -p
2. 进入数据库查看结果
mysql> select * from db01.t1;
+------+--------+---------+-----------+
| id | name | salary | dept |
+------+--------+---------+-----------+
| 1 | harry | 1300.00 | 市场部 |
| 2 | amy | 2200.00 | 人事部 |
| 3 | tom | 600.00 | 财务部 |
| 4 | jack | 3300.00 | 市场部 |
| 5 | momo | 1700.00 | 市场部 |
| 6 | sarsha | 1300.00 | 人事部 |
| 7 | xiaom | 4300.00 | 市场部 |
+------+--------+---------+-----------+
7 rows in set (0.01 sec)
mysql> select * from db02.t1;
+----+-------+
| id | name |
+----+-------+
| 1 | harry |
| 2 | tom |
+----+-------+
2 rows in set (0.00 sec)
说明:以上数据不是最新数据
- ==二进制日志恢复到最新状态==
# mysqlbinlog --start-position=120 /opt/mybinlog.000002 |mysql -p
说明:
1.只有起始位置--start-position=120说明从120往后所有记录
2.一般SQL语句前面的at xxx代表该语句的position值
mysql> select * from db01.t1;
+------+--------+----------+-----------+
| id | name | salary | dept |
+------+--------+----------+-----------+
| 1 | harry | 1300.00 | 市场部 |
| 2 | amy | 2200.00 | 人事部 |
| 3 | tom | 600.00 | 财务部 |
| 4 | jack | 3300.00 | 市场部 |
| 5 | momo | 1700.00 | 市场部 |
| 6 | sarsha | 1300.00 | 人事部 |
| 88 | aaa | 11111.11 | 安保部 |
| 99 | bbb | 22222.22 | 运维部 |
+------+--------+----------+-----------+
总结:
1. mysqldump工具只能恢复到备份那一时刻
2. 通过二进制日志来恢复到最新数据
3. 二进制日志也可以跳过sql恢复
4. 二进制日志恢复数据的重点就是找对相应的position值或者时间点
三、逻辑导入导出(==了解==)
- 逻辑导入即将表的内容导出成文档
1、导出数据:
select 字段 into outfile '导入文件的路径' from 表名;
select * into outfile '/tmp/emp.txt' from db01.emp;
报错:
导出时报错权限拒绝
解决:目标目录没有创建权限
2、导入数据:
方法1:
load data local infile '导入文件的路径' into table 表名;
说明:该方法要求在编译数据库时要加上--enable-local-infile参数才可以使用
load data local infile '/tmp/emp.txt' into table emp;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
----------------------------------------------------------------
方法2:
mysqlimport 库名 导入文件的路径 [选项] -p
选项:
--fields-terminated-by=':' 指定换行符为:
--lines-terminated-by='\n' 指定换行符为\n
PS:
1,导入之前需要先创建好表
2,表名必须与导入文档名一致
\n 代表linux系统回车键的行结束符号
windows默认为\r\n
# mysqlimport dbname /path/file -p
3、报错解决
mysql> select * into outfile '/tmp/backup/emp.bak' from emp;
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
原因:没有给目录授权
解决:修改配置文件加入以下内容,重启数据库
vim my.cnf
secure_file_priv=‘’
----------------------------------------------------------------------
mysql> select * into outfile '/tmp/backup/emp.bak' from emp;
ERROR 1 (HY000): Can't create/write to file '/tmp/backup/emp.bak' (Errcode: 13 - Permission denied)
原因:mysql用户没有权限在/tmp/backup目录里创建文件
解决办法:
[root@mysql01 ~]# ll -d /tmp/backup/
drwxr-xr-x 2 root root 22 Aug 3 16:35 /tmp/backup/
[root@mysql01 ~]# setfacl -m u:mysql:rwx /tmp/backup/
4、 举例说明
创建一个表,把你系统里的/etc/passwd导入到数据库
1. 创建表password
CREATE TABLE `password` (
`uname` varchar(50) DEFAULT NULL,
`pass` char(2) DEFAULT NULL,
`uid` int(11) DEFAULT NULL,
`gid` int(11) DEFAULT NULL,
`comment` varchar(80) DEFAULT NULL,
`home` varchar(50) DEFAULT NULL,
`shell` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 创建password.txt文件(文件内容必须是\t分割的多列)并导入到数据库
方法一:使用sed或者awk处理成新文本
方法二:直接用mysqlimport指定分隔符
mysqlimport 库名 导入文件的路径 [选项] -p
# mysqlimport db1 /tmp/password --fields-terminated-by=':' --lines-terminated-by='\n' -p
四、MySQL的物理备份-xtrabackup
1、详解
① 优缺点
优点:
- 备份过程==快速、可靠(==因为是物理备份);
- 支持==增量备份==,更为灵活
- 备份过程不会打断正在执行的事务;
- 能够基于压缩等功能节约磁盘空间和流量;
- 自动实现备份检验;
- ==还原速度快==;
缺点:
- 只能对==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进程
注:redo log又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。
在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。
每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组至少有2个重做日志文件,如默认的
ib_logfile0
和ib_logfile1
③ ==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、 安装
① 安装工具
[root@db01 ~]# yum -y install libev-4.15-3.el7.x86_64.rpm
[root@db01 ~]# yum -y install percona-xtrabackup-24-2.4.7-2.el7.x86_64.rpm
[root@db01 ~]# rpm -ql percona-xtrabackup-24
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/share/doc/percona-xtrabackup-24-2.4.7
/usr/share/doc/percona-xtrabackup-24-2.4.7/COPYING
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz
②创建备份专用用户并授权
说明:管理员root用户拥有所有权限,可以省略
创建备份用户admin,并授予相应权限
mysql> grant reload,process,lock tables,replication client on *.* to 'admin'@'localhost' identified by '123';
mysql> flush privileges;
说明:
在数据库中需要以下权限:
RELOAD和LOCK TABLES权限:为了执行FLUSH TABLES WITH READ LOCK
REPLICATION CLIENT权限:为了获取binary log位置
PROCESS权限:查看数据库的存储引擎,显示有关在服务器中执行的线程的信息(即有关会话执行的语句的信息),允许使用SHOW ENGINE
3、了解软件文件
了解相关文件:
xtrabackup_checkpoints:
备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。
LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。
xtrabackup_binlog_info:
mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。
xtrabackup_info:
xtrabackup工具在备份时记录的使用工具及数据库信息
backup-my.cnf:备份命令用到的配置选项信息
xtrabackup_logfile:xtrabackup记录innodb事物日志的信息
3、全量备份及恢复
1<全备
全备语法:
innobackupex -S 指定套接字文件 --user=备份用户名 --password=密码 备份文件存储路径
--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。
-------------------------------------------------------------------------
说明:备份目录默认会自动创建,也可以手动创建
[root@db01 ~]# innobackupex -S /tmp/mysql1.sock --user=backer --password=123 /tmp/
[root@db01 ~]# innobackupex --user=admin --password=123 --apply-log /full_xtrabckup/2019-01-23_22-57-28/
[root@db01 ~]# ll /full_xtrabckup/2019-01-23_22-57-28/
2<应用日志到备份文件存储目录
语法:
innobackupex --user=admin --password=123 --apply-log --redo-only 全备份文件存储目录
选项:
--apply-log 表示应用日志到备份文件存储目录
--redo-only 表示只应用已经提交的事务,不回滚未提交的事务
[root@db01 ~]# innobackupex --user=admin --password=123 --apply-log /full_xtrabckup/2019-01-23_22-57-28/
说明:
在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。
3<数据恢复
语法
innobackupex --defaults-file=/$datadir/my.cnf --copy-back 备份文件存储路径
选项:
-S 套接字文件
--copy-back 表示从备份集拷贝文件到数据目录,后接备份文件存储路径
--defaults-file=/$datadir/my.cnf 指定mysql配置文件(用于读取数据目录位置)
-----------------------------------------------------------------------------
栗子:
# innobackupex --copy-back /full_xtrabckup/2019-01-23_22-57-28/
说明:
1. innobackupex工具是物理拷贝文件,所以在恢复时不需要连接数据库,这样就不需要初始化数据库并启动服务。
2. 数据目录必须是为空的,innobackupex --copy-back不会覆盖已存在的文件,除非指定--force-non-empty-directories参数;
3.还原时需要先关闭服务
如遇以下错误:
innobackupex version 2.4.7 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 05f1fcf)
Error: datadir must be specified.
原因:innobackupex工具不知道数据目录在哪里
解决:指定配置文件位置--defaults-file=/path/my.cnf
4<更改数据文件权限
[root@db01 ~]# chown -R mysql.mysql /$datadir/data/
启动数据库:
[root@db01 ~]# service mysql start
Starting MySQL. SUCCESS!
4、增量备份及恢复
1<增量备份环境准备说明
清空环境
[root@db01 ~]# rm -rf /full_xtrabckup/
全量备份
[root@db01 ~]# innobackupex --user=admin --password=123 /full_xtrabckup
应用日志到全量备份集
[root@db01 ~]# innobackupex --user=admin --password=123 --apply-log --redo-only /full_xtrabckup/2019-01-23_23-59-58/
--apply-log 表示应用日志
--redo-only 表示只应用已经提交的事务,不回滚未提交的事务
注意:如果已经回滚了未提交事务,那么就无法再应用增量备份。
2< 增量备份
语法:
innobackupex -S 套接字文件 --user=备份用户名 --password=密码 --incremental 增量备份存储目录 --incremental-basedir=全量备份所在的目录
说明:
1. --incremental 增量备份数据目录(以产生的时间命名)
2.--incremental-basedir=全量备份所在的目录
3.在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。
[root@db01 ~]# innobackupex --user=admin --password=123 --incremental /incre_backup --incremental-basedir=/full_xtrabckup/2019-01-23_23-59-58/
3< 应用增备备份集到全量备份集
语法:
innobackupex -S 套接字文件 --user=备份用户名 --password=密码 --apply-log /全量备份所在的目录 --incremental-dir=/增量备份存储目录
选项
--apply-log 指定全量备份集目录
说明:
1.--redo-only除了最后一个不用加之外,其他的增量应用都要加,最后一个应用的时候可以直接进入回滚未提交事务阶段;如果加了也没事,服务启动的时候会进入recovery过程,来回滚
2.应用增量备份的时候只能按照备份的顺序来应用。如果应用顺序错误,那么备份就不可用。如果无法确定顺序,可以使用xtrabackup-checkpoints来确定顺序。
[root@db01 ~]# innobackupex --user=admin --password=123 --apply-log /full_xtrabckup/2019-01-23_23-59-58/ --incremental-dir=/incre_backup/2019-01-24_00-13-41/
4<数据恢复
语法:
innobackupex --defaults-file=/$datadir/my.cnf --user=备份用户名 --password=密码 --copy-back /全量备份所在的目录
注意:在准备步骤完成后,还原时只需要还原完全备份即可
[root@db01 ~]# innobackupex --user=admin --password=123 --copy-back / /
修改数据目录权限
[root@db01 ~]# chown -R mysql. /usr/local/mysql/data/
启动数据库
[root@db01 ~]# service mysql start
Starting MySQL.Logging to '/usr/local/mysql/data/mysql3307.err'.
. SUCCESS!
5、xtrabackup总结
-
如果数据库在第1次增量备份后发生故障,那么数据恢复时只能够使用xtrabackup全量备份加xtrabackup增量备份的时间点,即==恢复到第1次增量备份结束的点==
-
如果要将数据库恢复到最新状态,需要==结合binlog日志恢复==
-
以上全量和增量的备份集是不能用的,需要将xtrabackup_log(事务日志,在备份过程中数据库的更改)应用到全量的备份集中才有效(应用日志==必须按照顺序去应用==:全备—>增备1—>增备2...)
-
应用所有日志到全量备份集中时,需注意
-
除了==最后一次增量备份==应用日志可以不加--redo-only外,其他都要加;
只应用已经提交的事务,不回滚未提交的事务!!!
-
应用日志到全量备份集中时一定要==严格按照时间顺序执行,否则无效==!
- 在恢复数据时,确保数据目录为空;数据库服务是停止状态`··
-