MySQL物理备份工具Xtrabackup
第1章 Xtrabackup介绍

1.1 Xtrabackup的主要特点有:
l 直接拷贝物理文件,备份和恢复数据的速度非常快、安全可靠。
l 在备份期间执行的事务不会间断,备份InnoDB数据不影响业务。
l 备份期间不增加大多数据库的性能压力。
l 支持对备份的数据自动校验。
l 支持全量、增量、压缩备份及流备份。
l 支持在线迁移表以及快速创建新的从库。
l 支持几乎所有版本的MySQL和MariaDB。
第2章 Xtrabackup备份涉及的数据库名词
2.1 MySQL数据文件扩展名知识说明
|
文件扩展名 |
文件作用说明 |
|
.idb文件 |
以独立表空间存储的InnoDB引擎类型的数据文件扩展名 |
|
.ibdata文件 |
以共享表空间存储的InnoDB引擎类型的数据文件扩展名 |
|
.frm文件 |
存放与表相关的元数据(meta)信息及表结构的定义信息 |
|
.MYD文件 |
存放MyISAM引擎表的数据文件扩展名 |
|
.MYI文件 |
存放MyISAM引擎表的索引信息文件扩展名 |
2.2 事务性引擎的ACID特性
在MySQL中,InnoDB和MariaDB中的XtraDB都是事务性引擎,事务性引擎的共同特征是具备事务的4个特性,原子性、一致性、隔离性、持久性,又称ACID特性,
ACID特性说明
|
ACID特性 |
说明 |
|
原子性(Atomicity) |
事务的所有SQL语句操作,要么全部成功,要么全部失败 |
|
一致性(Consistency) |
事务开始之前和结束之后,数据库保证数据的完整性不被破坏 |
|
隔离性(Isolation) |
当多个事务并发访问同一个数据源时,数据库能够保持每个访问的事务之间是隔离的,互不影响。 |
|
持久性(Durability) |
事务处理完成之后,事务所做的更改都会是持久化存储,不会丢失数据 |

2.3 INNODB引擎内部知识结构图及说明。

有关上述知识的简单逻辑图

2.4 有关InnoDB引擎内部知识相关名词


2.5 INNODB日志及Xtrabackup备份原理词汇。

第3章 Xtrabackup备份恢复工作原理流程
3.1 Xtrabackup恢复工作原理过程说明

3.2 Xtrabackup备份原理过程说明

3.3 备份原理流程图

3.4 Xtrabackup软件附带的备份工具说明

3.5 innobackupex命令相关参数

第4章 Xtrabackup的安装即使用
4.1 安装
1、下载epel源,下载所需要的依赖包
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
2、下载Xtrabackup的安装包并安装
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
yum -y install percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm
备份命令:
[root@db02 ~]# 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.4
/usr/share/doc/percona-xtrabackup-24-2.4.4/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
xtrabackup
innobackupex ******
4.2 配置
mkdir /application/mysql/logs -p
chown -R mysql.mysql /application/mysql/logs
4.3 配置MySQL的配置文件/etc/my.cnf
[client]
user=root
password=oldboy123
[mysqld]
basedir = /application/mysql/
datadir = /application/mysql/data/
###########binlog############
log_bin = /application/mysql/logs/oldboy-bin
expire_logs_days = 7
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld_safe]
log-error = /application/mysql/logs/oldboy.err
4.4 重启数据库
/etc/init.d/mysqld restart
4.5 全备备份
mkdir /server/backup -p
innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp /server/backup/full
4.6 恢复数据前的准备(合并xtrabackup_log_file和备份的物理文件)
innobackupex --apply-log --use-memory=32M /server/backup/full/
4.7 恢复
4.7.1 停库:
/etc/init.d/mysqld stop
lsof -i :3306
4.7.2 破坏数据:
cd /application/mysql/
mv data /opt/
4.7.3 恢复
cp -a /server/backup/full/ /application/mysql/data
chown -R mysql.mysql /application/mysql/data
4.7.4 启动:
/etc/init.d/mysqld start
mysql -e "select * from oldboy.test"
4.7.5 成功。
第5章 老男孩教育增量备份及恢复:
5.1 全量备份
单实例:innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp /server/backup/base_full
多实例:innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=oldboy123 --socket=/data/3306/mysql.sock --no-timestamp /server/backup/new_full
5.2 第一次增量备份
mysql> insert into test values(8,'outman');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(9,'outgirl');
Query OK, 1 row affected (0.00 sec)
单实例:innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp --incremental-basedir=/server/backup/base_full --incremental /server/backup/one_inc
多实例:innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=oldboy123 --socket=/data/3306/mysql.sock --no-timestamp --incremental-basedir=/server/backup/new_full --incremental /server/backup/one_inc
5.3 第二次增量
写入数据
mysql> use oldboy
mysql> insert into test values(10,'two_inc1');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(11,'two_inc2');
Query OK, 1 row affected (0.00 sec)
增量备份 主要运用--incremental-basedir=/server/backup/one_inc/
单实例:innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp --parallel=3 --incremental-basedir=/server/backup/one_inc/ --incremental /server/backup/two_inc
多实例:innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=oldboy123 --socket=/data/3306/mysql.sock --no-timestamp --incremental-basedir=/server/backup/one_inc --incremental /server/backup/two_inc
5.4 增量恢复准备:
innobackupex --apply-log --use-memory=32M --redo-only /server/backup/base_full/
innobackupex --apply-log --use-memory=32M --redo-only --incremental-dir=/server/backup/one_inc /server/backup/base_full/
innobackupex --apply-log --use-memory=32M --incremental-dir=/server/backup/two_inc /server/backup/base_full/
5.5 恢复过程:
5.5.1 停库
[root@db02 backup]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
5.5.2 破坏数据
[root@db02 backup]# cd /application/mysql
[root@db02 mysql]# mv data /tmp/
5.5.3 恢复数据文件并授权
[root@db02 mysql]# cp -a /server/backup/base_full data
[root@db02 mysql]# chown -R mysql.mysql data
5.5.4 启动数据库检查结果
[root@db02 mysql]# /etc/init.d/mysqld start
Starting MySQL......... SUCCESS!
[root@db02 mysql]# mysql -e "select * from oldboy.test;"
+----+----------+
| id | name |
+----+----------+
| 1 | oldboy |
| 2 | oldgirl |
| 3 | inca |
| 4 | zuma |
| 5 | kaka |
| 6 | bingbing |
| 7 | xiaoting |
| 8 | outman |
| 9 | outgirl |
| 10 | two_inc1 |
| 11 | two_inc2 |
+----+----------+
第6章 中小企业MySQL Xtrabackup物理增量恢复案例实战
条件:
1.具备全量备份(xtrabckup备份的全备)。
2.具备全量之后的所有增量备份(xtrabckup备份的增量)。
3.具备最后一次增量备份以后的所有MySQL的Binlog增量日志。
6.1 模拟数据
use oldboy
delete from test;
insert into test values(1,'full01');
insert into test values(2,'full02');
insert into test values(3,'full03');
insert into test values(4,'full04');
insert into test values(5,'full05');
检查:
select * from test;
6.2 2017/06/26(周一) 0点全量备份
date -s "2017/06/26"
innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp /server/backup/new_base_full
数据库继续更新:
mysql -e "use oldboy;insert into test values(6,'new_inc_one_1');"
mysql -e "use oldboy;insert into test values(7,'new_inc_one_2');"
mysql -e "select * from oldboy.test;"
6.3 2017/06/27(周二) 0点增量备份
第一次增量备份
date -s "2017/06/27"
innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp --incremental-basedir=/server/backup/new_base_full --incremental /server/backup/new_one_inc
数据库继续更新:
mysql -e "use oldboy;insert into test values(8,'binlog_data_1');"
mysql -e "use oldboy;insert into test values(9,'binlog_data_2');"
mysql -e "select * from oldboy.test;"
6.4 2017/06/28(周三) 0点增量备份
第二次增量备份
date -s "2017/06/28"
innobackupex --defaults-file=/etc/my.cnf --user=root --password=oldboy123 --socket=/application/mysql-5.6.34/tmp/mysql.sock --no-timestamp --incremental-basedir=/server/backup/new_one_inc --incremental /server/backup/new_two_inc
数据库继续更新:
mysql -e "use oldboy;insert into test values(10,'realbinlog_data_3');"
mysql -e "use oldboy;insert into test values(11,'realbinlog_data_4');"
mysql -e "select * from oldboy.test;"
6.5 2017/06/28(周三上午)-10点出故障了
mysql -e "use oldboy;update test set name='oldboy';"
mysql -e "select * from oldboy.test;"
6.6 开始恢复
6.6.1 a.建议停库:
最好用iptables
iptables -I INPUT -p tcp --dport 3306 -j DROP
/etc/init.d/mysqld stop
6.7 准备恢复数据库:合并数据文件
innobackupex --apply-log --use-memory=32M --redo-only /server/backup/new_base_full/
innobackupex --apply-log --use-memory=32M --redo-only --incremental-dir=/server/backup/new_one_inc /server/backup/new_base_full/
innobackupex --apply-log --use-memory=32M --incremental-dir=/server/backup/new_two_inc /server/backup/new_base_full/
数据文件准备完毕.
6.8 开始正式恢复
cd /application/mysql
mv data data.ori
\cp -a /server/backup/new_base_full data
chown -R mysql.mysql data
================偷偷的看一下======================
[root@db02 mysql]# /etc/init.d/mysqld start
Starting MySQL.... SUCCESS!
[root@db02 mysql]# mysql -e "select * from oldboy.test;"
+----+---------------+
| id | name |
+----+---------------+
| 1 | full01 |
| 2 | full02 |
| 3 | full03 |
| 4 | full04 |
| 5 | full05 |
| 6 | new_inc_one_1 |
| 7 | new_inc_one_2 |
| 8 | binlog_data_1 |
| 9 | binlog_data_2 |
+----+---------------+
[root@db02 mysql]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS!
==================================================
6.9 处理binlog(00-10点数据)
6.9.1 a.查看binlog位置点
[root@db02 mysql]# cat /server/backup/new_two_inc/xtrabackup_binlog_info
oldboy-bin.000011 2399
6.9.2 b.解析binlog
cd /application/mysql/logs/
mysqlbinlog -d oldboy --start-position=2399 oldboy-bin.000011 -r bin1.sql
mysqlbinlog -d oldboy oldboy-bin.000012 >>bin1.sql
(根据你的情况调整)
本次不用操作,但工作中可能有会有很多个binlog文件.
#mysqlbinlog -d oldboy oldboy-bin.000012 oldboy-bin.000013 oldboy-bin.000014 >>bin2.sql
6.9.3 c.删除错误的update一行。update test set name='oldboy'
grep update bin1.sql
sed -i "/update test set name='oldboy'/d" bin1.sql
grep update bin1.sql
6.9.4 d.开始恢复
iptables -I INPUT -p tcp --dport 3306 -j DROP
/etc/init.d/mysqld start
6.9.5 e.导入binlog
mysql oldboy <bin1.sql
6.9.6 检查:
[root@db02 logs]# mysql -e "select * from oldboy.test;"
+----+-------------------+
| id | name |
+----+-------------------+
| 1 | full01 |
| 2 | full02 |
| 3 | full03 |
| 4 | full04 |
| 5 | full05 |
| 6 | new_inc_one_1 |
| 7 | new_inc_one_2 |
| 8 | binlog_data_1 |
| 9 | binlog_data_2 |
| 10 | realbinlog_data_3 |
| 11 | realbinlog_data_4 |
+----+-------------------+
6.10 调整防火墙规则
iptables -D INPUT -p tcp --dport 3306 -j DROP
6.11 和开发/运营交流,检查数据恢复情况.
专业故障恢复报告\发邮件\当面分享.
over.
下节内容:
周二:
1.MySQL数据库日志与应用实践
2.MySQL数据库字符集
3.引擎和事务
4.MySQL主从复制
浙公网安备 33010602011771号