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主从复制

 

posted @ 2017-12-19 16:58  蓝叶子Sheep  阅读(111)  评论(0)    收藏  举报