专职DBA-Xtrabackup物理备份恢复
Xtrabackup是Percona公司专门针对MySQL数据库开发的一款开源免费的物理热备工具。
可以对InnoDB和XtraDB事物引擎的数据库实现非阻塞(即不锁表)方式备份。
可以对MyISAM非事物引擎实现锁表方式备份。
1.Xtrabackup的主要特点:
直接复制物理文件,备份恢复数据速度快,安全可靠。
备份期间执行的事物不会间断,备份InnoDB数据不会影响业务。
备份期间不会增加太多数据库的性能压力。
支持对备份的数据进行自动校验。
支持全量、增量、压缩备份及流备份。
支持在线迁移表以及快速创建新的从库。
支持几乎所有版本的MySQL分支。
2.首先你要理解数据库里面的几个数据文件:
.idb文件 以独立表空间存储的InnoDB引擎类型的数据文件。
.ibdata文件 以共享表空间存储的InnoDB引擎类型的数据文件。
.frm文件 存放与表相关的元数据(meta)信息以及表结构的定义信息。
.MYD文件 存放MyISAM引擎表的数据文件。
.MYI文件 存放MyISAM引擎的索引信息文件。
3.事务型引擎的ACID特性
MySQL的InnoDB是事务型引擎。
MariaDB的XtraDB是事务型引擎。
事务型引擎的共同特性:4个
原子性:事务的所有SQL语句操作,要么全部成功,要么全部失败。
一致性:事务开始之前和结束之后,数据库应保证数据的完整性不被破坏。
隔离性:当多个事务并发访问同一个数据源时,数据库能够保持每个访问的事务之间是隔离的,互不影响的。
持久性:事务处理完成之后,事务所做的更改都会是持久化存储,不会丢失数据。
4.InnoDB引擎内部知识
InnoDB的表空间分为:共享表空间和独立表空间。
tablespace表空间:是一个逻辑的概念,表空间里存放的是表的数据和索引,这些表的数据和索引又有不同的存储方式,表空间最终体现的是磁盘上数据库的各种物理数据文件。
independent tablespaces独立表空间:在开启InnoDB的innodb_file_per_table=on这个参数(5.6版本以后默认开启)之后,对于每一个新建的InnoDB表,数据库目录下都会多出来一个对应的存放该表数据的.ibd文件(老表不会)。
shared tablespaces共享表空间:5.6版本以前,MySQL的默认配置就是共享表空间模式,即所有表的数据都会在一个或几个大数据文件中存放。
page页:MySQL的每个表空间都是由若干个页组成的,且每个实例里的每个表空间内都有相同的页大小,默认值是16KB,可以通过innodb_page_size调整页的大小,每个页中都包含了表的数据。组成表空间数据的最小单位是页。
extent区段:在表空间中,系统会把每若干个页进行分组管理,这个组就叫作区段,默认一个区段的大小是64个页。
segments段:段是由多个不同的区组成的更大的分组。当一个段增加的时候,InnoDB第一次分配32个页给这个段,此后,InnoDB开始分配整个区段给这个段,InnoDB可以一次性添加4个区段给一个大的段,从而确保数据存储时能有一个良好的顺序性。

5.InnoDB备份相关名词
redo日志:redo日志,也叫事务日志,作用是记录InnoDB引擎中每一个数据发生的变化信息。主要用于保证InnoDB数据的完整性,以及丢失数据后的恢复。同时还可以有效的提升数据库的IO等性能。
redolog对应的配置参数是:
innodb_log_file_size和innodb_log_files_in_group
mysql> show global variables like "innodb_log%";
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| innodb_log_buffer_size | 16777216 |
| innodb_log_checksums | ON |
| innodb_log_compressed_pages | ON |
| innodb_log_file_size | 50331648 |
| innodb_log_files_in_group | 2 |
| innodb_log_group_home_dir | ./ |
| innodb_log_write_ahead_size | 8192 |
+-----------------------------+----------+
7 rows in set (0.00 sec)
undo日志:undo log记录事务的逆向逻辑操作或者逆向物理操作对应的数据变化的内容,undo日志默认存放在共享表空间ibdata*文件中,与redo日志功能不同的是undo日志主要用于回滚数据库崩溃前未完整提交的事务数据,确保数据恢复前后是一致的。
LSN:Log Sequence Number是指日志序列号,是一个64位的整型数字。LSN的作用是当记录redo日志时,使用LSN唯一标识一条变化的数据。
checkpoint:用来标识数据库崩溃后,应恢复的redo日志的起始点。
6.Xtrabackup恢复的工作原理
(1).Percona Xtrabackup软件是基于InnoDB等事务引擎自带的redo和undo功能来保持备份和恢复前后数据一致性的,从而确保数据库的数据安全可靠。
(2).redo会存储每一个innodb表中的数据修改记录。
(3).当innodb数据库启动时,会检查数据文件和redo日志文件,将已经提交到redo中的数据应用(提交)到数据文件并保存。
(4).然后根据undo信息将修改过但没有提交的数据记录进行回滚(不提交到数据文件中)。
7.Xtrabackup执行全备的原理过程
(1).当执行innobackupex开始备份时,XBK首先会记录当前redo日志的位置(就是对应的LSN号),同时还会在后台启动一个进程持续监视redo日志文件的变化,并将变化的信息都记录到xtrabackup_logfile中。
(2).开始复制InnoDB对应的物理数据文件(*.ibd和*.ibdataN),备份完毕之后。
(3).执行flush tables with read lock;命令对整个数据库进行锁表。
(4).开始复制MyISAM对应的物理数据文件(.FRM,.MYD,.MYI),备份完毕之后。
(5).获取binlog二进制日志位置点信息。
(6).停止记录xtrabackup_logfile,并执行unlock tables;解锁,恢复整个数据库的可读可写状态。
(7).备份完成。
8.Xtrabackup执行全备恢复的过程
(1).用XBK恢复数据时,要经过准备恢复prepare和实际恢复restore两个步骤。
(2).在准备恢复过程结束后,InnoDB表的数据(即备份的物理文件)就恢复到了复制InnoDB文件结束时的时间点。
(3).这个时间点也是全库锁表复制MyISAM引擎数据时的起点,所以最终恢复的数据和数据库的数据是一致的。
(4).全备的数据有两部分,一部分是全备的物理文件,一部分是Xtrabackup-log日志文件。
9.Xtrabackup执行增量备份的过程
(1).Innobackupex增量备份的就是对复制全备之后的InnoDB中变更的“页”数据。
(2).增量复制时会以全备中xtrabackup_checkpoints logfile文件对应的LSN号为依据。
(3).将大于给定的LSN号的页数据(就是增量数据)进行备份复制InnoDB的redo日志到xtrabackup_logfile。
(4).以后的每一次增量备份都要基于上一次的增量备份,最终实现备份的数据都是连续的、无缺失的。
针对MyISAM引擎的备份依然是锁表备份。
增量备份仅复制InnoDB中变化的页数据,而非所有的物理文件。
总结:增量备份过程:
(1).记录LSN并监控redo日志的变化,且将变化实时记录到xtrabackup_logfile。
(2).开始复制*.ibd和*.ibdataN中变化的页数据。
(3).执行flush tables with read lock;命令。
(4).开始复制MyISAM对应的物理数据文件.FRM .MYD .MYI。
(5).获取二进制日志binlog位置信息。
(6).停止记录xtrabackup_logfile并执行unlock tables;解锁。
(7).增量备份完成。
10.Xtrabackup执行增量恢复的过程
(1).增量恢复是以全备数据为基础的,增量恢复的数据主要涉及全备数据、增量数据、Xtrabackup_log日志文件。
(2).先将增量备份中变化的页数据应用到全备数据中。
(3).读取Xtrabackup_log应用redo数据到全备数据中,同时回滚未提交的事务。
11.Xtrabackup工具安装
[root@db01 ~]# yum -y install perl perl-devel perl-Time-HiRes perl-DBD-MySQL libaio libaio-devel
[root@db01 ~]# rm -rf /etc/my*
https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.15/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm
[root@db01 ~]# cd /disk/
[root@db01 /disk]# wget https://mirrors.cloud.tencent.com/percona/centos/7Server/RPMS/x86_64/percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm
[root@db01 /disk]# yum -y install percona-xtrabackup-24-2.4.15-1.el7.x86_64.rpm
[root@db01 ~]# ls -l `which xtrabackup innobackupex`
lrwxrwxrwx 1 root root 10 Sep 2 00:12 /usr/bin/innobackupex -> xtrabackup
-rwxr-xr-x 1 root root 21730616 Jul 5 15:59 /usr/bin/xtrabackup
创建用于Xtrabackup备份数据的用户
[root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p
mysql> create user 'backup'@'localhost' identified by '123';
Query OK, 0 rows affected (0.01 sec)
mysql> grant reload,lock tables,process,replication client on *.* to 'backup'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
Xtrabackup软件主要包含两个命令工具
Xtrabackup:InnoDB、XtraDB
Innobackupex 推荐:InnoDB、XtraDB、MyISAM。事务引擎数据不用锁表,非事务引擎数据需要锁表。
12.全备与恢复全备实验
数据准备
[root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p
mysql> use app;
Database changed
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 29 |
+----------+
1 row in set (0.00 sec)
开始全备
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp /backup/mysql/3306/full
[root@db01 ~]# ls -lh /backup/mysql/3306/full/
total 13M
drwxr-x--- 2 root root 48 Sep 2 02:18 app 备份生产库
drwxr-x--- 2 root root 20 Sep 2 02:18 app01 备份生产库
-rw-r----- 1 root root 492 Sep 2 02:18 backup-my.cnf 配置文件备份
-rw-r----- 1 root root 739 Sep 2 02:18 ib_buffer_pool
-rw-r----- 1 root root 12M Sep 2 02:18 ibdata1 共享表空间备份
drwxr-x--- 2 root root 4.0K Sep 2 02:18 mysql 备份mysql数据库
drwxr-x--- 2 root root 8.0K Sep 2 02:18 performance_schema
drwxr-x--- 2 root root 8.0K Sep 2 02:18 sys
-rw-r----- 1 root root 64 Sep 2 02:18 xtrabackup_binlog_info binlog位置信息
-rw-r----- 1 root root 135 Sep 2 02:18 xtrabackup_checkpoints checkpoints信息
-rw-r----- 1 root root 643 Sep 2 02:18 xtrabackup_info xtrabackup信息
-rw-r----- 1 root root 2.5K Sep 2 02:18 xtrabackup_logfile xtrabackup日志文件
[root@db01 /backup/mysql/3306/full]# cat xtrabackup_binlog_info
mysql-bin.000006 838 a3ad97d4-b449-11e9-97c5-000c290c6b6c:1-151
[root@db01 /backup/mysql/3306/full]# cat xtrabackup_checkpoints
backup_type = full-backuped #备份类型
from_lsn = 0 #checkpoints起始点
to_lsn = 4024638 #checkpoints结束点
last_lsn = 4024647
compact = 0
recover_binlog_info = 0
flushed_lsn = 4024647
回滚未提交的事物日志数据
[root@db01 ~]# innobackupex --apply-log --use-memory=50M /backup/mysql/3306/full/
利用全备开始恢复数据
[root@db01 ~]# mysqladmin -S /data/mysql/3306/mysql.sock -p shutdown
[root@db01 ~]# netstat -tunlpa | grep mysql
[root@db01 ~]# ps -ef | grep mysql
root 7360 6721 0 02:30 pts/0 00:00:00 grep --color=auto mysql
模拟数据删除
[root@db01 ~]# mv /data/mysql/3306/data /data/mysql/3306/data_rm
[root@db01 ~]# mkdir -p /data/mysql/3306/data
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --copy-back --rsync /backup/mysql/3306/full/
或者# mv /backup/mysql/3306/full/* /data/mysql/3306/data/
[root@db01 ~]# chown -R mysql:mysql /data/mysql/3306/data
[root@db01 ~]# mysqld --defaults-file=/data/mysql/3306/my.cnf &
[root@db01 ~]# ps -ef | grep mysql
mysql 6289 6721 1 02:38 pts/0 00:00:00 mysqld --defaults-file=/data/mysql/3306/my.cnf
root 6518 6721 0 02:38 pts/0 00:00:00 grep --color=auto mysql
[root@db01 ~]# netstat -tunlpa | grep mysql
tcp6 0 0 :::3306 :::* LISTEN 7489/mysqld
[root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p -e "select count(*) from app.t1;"
Enter password:
+----------+
| count(*) |
+----------+
| 29 |
+----------+
恢复成功
13.增量备份与增量恢复
第一次增量备份是基于全备进行的。
之后的增量备份是基于上一次的增量。
先进行全备:
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp /backup/base_full
增加模拟数据,然后做增量备份
[root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p
mysql> use app;
mysql> insert into t1 values(30,'zhouwanchun');
Query OK, 1 row affected (0.01 sec)
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 30 |
+----------+
1 row in set (0.00 sec)
开始做第一次增量备份
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --incremental-basedir=/backup/base_full --incremental /backup/one_inc
再次模拟增加数据,然后做第二次增量备份。
mysql> use app;
mysql> insert into t1 values(31,'zhouwanchun');
Query OK, 1 row affected (0.01 sec)
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 31 |
+----------+
1 row in set (0.00 sec)
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --parallel=3 --incremental-basedir=/backup/one_inc --incremental /backup/two_inc
开始做增量数据恢复
先恢复全备--再恢复第一次增量--然后再恢复第二次增量--以此类推
应用redo日志恢复全备数据
非最后一次合并增量数据一定要加--redo-only参数,就是应用redo日志恢复数据,而不执行undo回滚未提交的数据。等到最后一次增量合并完成后再进行undo回滚数据。
[root@db01 ~]# innobackupex --apply-log --use-memory=32M --redo-only /backup/base_full/
合并第一次的增量数据到全备数据目录
[root@db01 ~]# innobackupex --apply-log --use-memory=32M --redo-only --incremental-dir=/backup/one_inc /backup/base_full/
合并第二次的增量数据到全备数据目录
[root@db01 ~]# innobackupex --apply-log --use-memory=32M --incremental-dir=/backup/two_inc /backup/base_full/
对最后的全量数据做redo日志应用,执行undo回滚数据
[root@db01 ~]# innobackupex --apply-log --use-memory=32M /backup/base_full/
[root@db01 ~]# mkdir -p /data/mysql/3306/data
开始恢复数据
[root@db01 ~]# mysqladmin -S /data/mysql/3306/mysql.sock -p shutdown
[root@db01 ~]# netstat -lnp | grep mysql
[root@db01 ~]# mv /data/mysql/3306/data /data/mysql/3306/data_rm2
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --copy-back --rsync /backup/base_full/
[root@db01 ~]# chown -R mysql.mysql /data/mysql/3306/data
[root@db01 ~]# mysqld --defaults-file=/data/mysql/3306/my.cnf &
[root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p -e "select count(*) from app.t1;"
Enter password:
+----------+
| count(*) |
+----------+
| 31 |
+----------+
中小型企业MySQL Xtrabackup物理增量恢复实战
完整物理恢复数据库数据,必要条件:
1.有XBK全备。
2.有全备之后所有的XBK增量。
3.有最后一次XBK增量以后的所有binlog日志文件。
[root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p
mysql> use app01;
mysql> create table t1(id int not null primary key auto_increment,name varchar(64) not null);
mysql> insert into t1(name) values('zhouwanchun');
mysql> insert into t1(name) values('zhouwanchun');
mysql> insert into t1(name) values('zhouwanchun');
mysql> select * from t1;
+----+-------------+
| id | name |
+----+-------------+
| 1 | zhouwanchun |
| 2 | zhouwanchun |
| 3 | zhouwanchun |
+----+-------------+
3 rows in set (0.00 sec)
先模拟3月21日0点开始对数据库进行全备
[root@db01 ~]# date -s "2018-03-21"
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp /backup/new_base_full
然后模拟3月21日0点全备之后(0:00-24:00)用户继续写入数据
mysql> use app01;
mysql> insert into t1(name) values('zhouwanchun');
mysql> insert into t1(name) values('zhouwanchun');
mysql> insert into t1(name) values('zhouwanchun');
mysql> select * from t1;
+----+-------------+
| id | name |
+----+-------------+
| 1 | zhouwanchun |
| 2 | zhouwanchun |
| 3 | zhouwanchun |
| 4 | zhouwanchun |
| 5 | zhouwanchun |
| 6 | zhouwanchun |
+----+-------------+
6 rows in set (0.00 sec)
然后在3月22日0点做增量备份
[root@db01 ~]# date -s "2018-03-22"
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --incremental-basedir=/backup/new_base_full --incremental /backup/new_one_inc
模拟在3月22日0点增量备份之后(0:00-24:00)用户继续写入数据
mysql> use app01;
mysql> insert into t1(name) values('zhouwanchun');
mysql> insert into t1(name) values('zhouwanchun');
mysql> insert into t1(name) values('zhouwanchun');
mysql> select * from t1;
+----+-------------+
| id | name |
+----+-------------+
| 1 | zhouwanchun |
| 2 | zhouwanchun |
| 3 | zhouwanchun |
| 4 | zhouwanchun |
| 5 | zhouwanchun |
| 6 | zhouwanchun |
| 7 | zhouwanchun |
| 8 | zhouwanchun |
| 9 | zhouwanchun |
+----+-------------+
9 rows in set (0.00 sec)
模拟3月22日上午10:00管理员误删app01数据库
[root@db01 ~]# date -s "2018-03-22 10:00"
mysql> drop database app01;
这时候app01对应的业务瘫痪,经过排查发现app01数据库不复存在了。
移走binlog增量文件,防止二次破坏。
[root@db01 ~]# mkdir -p /backup/binlog
[root@db01 ~]# cp -a /data/mysql/3306/logs/ /backup/binlog/
开始合并之前全备和增量
[root@db01 ~]# innobackupex --apply-log --use-memory=32M --redo-only /backup/new_base_full/
[root@db01 ~]# innobackupex --apply-log --use-memory=32M --incremental-dir=/backup/new_one_inc /backup/new_base_full/
然后应用redo,回滚undo
[root@db01 ~]# innobackupex --apply-log --use-memory=32M /backup/new_base_full/
开始恢复binlog日志数据
因为3月22日0点-10点之间的所有数据,并不在全备里,也不在增量里。而是在binlog文件里。
[root@db01 ~]# cat /backup/new_one_inc/xtrabackup_binlog_info
mysql-bin.000009 2462 a3ad97d4-b449-11e9-97c5-000c290c6b6c:1-151,
af771b85-cce7-11e9-9e4c-000c290c6b6c:1-6,
e2333e39-d63d-11e9-a0de-000c290c6b6c:1-9
[root@db01 ~]# ls -l /backup/binlog/logs/
total 800
-rw-r----- 1 mysql mysql 1797 Aug 29 2019 mysql-bin.000001
-rw-r----- 1 mysql mysql 241 Aug 29 2019 mysql-bin.000002
-rw-r----- 1 mysql mysql 217 Aug 29 2019 mysql-bin.000003
-rw-r----- 1 mysql mysql 780070 Aug 29 2019 mysql-bin.000004
-rw-r----- 1 mysql mysql 217 Aug 29 2019 mysql-bin.000005
-rw-r----- 1 mysql mysql 861 Sep 2 2019 mysql-bin.000006
-rw-r----- 1 mysql mysql 217 Sep 2 2019 mysql-bin.000007
-rw-r----- 1 mysql mysql 1813 Sep 13 2019 mysql-bin.000008
-rw-r----- 1 mysql mysql 3432 Mar 22 10:00 mysql-bin.000009
-rw-r----- 1 mysql mysql 351 Sep 13 2019 mysql-bin.index
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000009
Position: 3432
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: a3ad97d4-b449-11e9-97c5-000c290c6b6c:1-151,
af771b85-cce7-11e9-9e4c-000c290c6b6c:1-6,
e2333e39-d63d-11e9-a0de-000c290c6b6c:1-13
1 row in set (0.00 sec)
mysql> show binlog events in 'mysql-bin.000009';
[root@db01 ~]# mysqlbinlog -d app01 --skip-gtids --include-gtids='e2333e39-d63d-11e9-a0de-000c290c6b6c:9-13' --exclude-gtids='e2333e39-d63d-11e9-a0de-000c290c6b6c:13' /backup/binlog/logs/mysql-bin.000009 > 1.sql
根据业务要么停库处理,要么对外禁止访问数据库。
[root@db01 ~]# iptables -I INPUT -p tcp --dport 3306 ! -s 10.0.0.11 -j DROP
进行全备和增量恢复
[root@db01 ~]# mysqladmin -S /data/mysql/3306/mysql.sock -p shutdown
[root@db01 ~]# netstat -lnp | grep mysql
[root@db01 ~]# mv /data/mysql/3306/data /data/mysql/3306/data_rm3
[root@db01 ~]# mkdir -p /data/mysql/3306/data
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --copy-back --rsync /backup/new_base_full/
[root@db01 ~]# chown -R mysql.mysql /data/mysql/3306/data
[root@db01 ~]# mysqld --defaults-file=/data/mysql/3306/my.cnf &
[root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p -e "select * from app01.t1;"
Enter password:
+----+-------------+
| id | name |
+----+-------------+
| 1 | zhouwanchun |
| 2 | zhouwanchun |
| 3 | zhouwanchun |
| 4 | zhouwanchun |
| 5 | zhouwanchun |
| 6 | zhouwanchun |
+----+-------------+
最后恢复3月22日0点到10点的增量数据
[root@db01 ~]# mysql -S /data/mysql/3306/mysql.sock -p
mysql> set sql_log_bin=0;
mysql> source /root/1.sql;
mysql> set sql_log_bin=1;
mysql> select * from app01.t1;
+----+-------------+
| id | name |
+----+-------------+
| 1 | zhouwanchun |
| 2 | zhouwanchun |
| 3 | zhouwanchun |
| 4 | zhouwanchun |
| 5 | zhouwanchun |
| 6 | zhouwanchun |
| 7 | zhouwanchun |
| 8 | zhouwanchun |
| 9 | zhouwanchun |
+----+-------------+
9 rows in set (0.00 sec)
使用XBK物理分库分表备份
必须开启独立表空间模式
mysql> show global variables like "innodb_file_per_table";
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)
备份单个库app01
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --databases="app01" /backup/app01_full
备份多个库
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --databases="app app01" /backup/app_app01_full
备份单个表
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --databases="app01.t1" /backup/app01_t1
备份多个表
[root@db01 ~]# innobackupex --defaults-file=/data/mysql/3306/my.cnf --user=root --password=123 --socket=/data/mysql/3306/mysql.sock --no-timestamp --databases="app01.t1 app.t1" /backup/app01_t1_app_t1
也可以使用--tables-file、--include参数等
使用XBK物理分库分表的恢复
[root@db01 ~]# innobackupex --apply-log --export /backup/app01_t1/
初始化一个数据库3307
[root@db01 ~]# mysqld --defaults-file=/data/mysql/3307/my.cnf --initialize-insecure
[root@db01 ~]# cat /data/mysql/3307/error.log
确保没有报错信息
[root@db01 ~]# cp -a /backup/app01_t1/* /data/mysql/3307/data/
cp: overwrite ‘/data/mysql/3307/data/ib_buffer_pool’? y
cp: overwrite ‘/data/mysql/3307/data/ibdata1’? y
cp: overwrite ‘/data/mysql/3307/data/ib_logfile0’? y
cp: overwrite ‘/data/mysql/3307/data/ib_logfile1’? y
[root@db01 ~]# chown -R mysql.mysql /data/mysql/3307/data
[root@db01 ~]# mysqld --defaults-file=/data/mysql/3307/my.cnf &
[root@db01 ~]# ps -ef | grep mysql
[root@db01 ~]# netstat -lnp | grep mysql
[root@db01 ~]# mysql -S /data/mysql/3307/mysql.sock
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| app01 |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use app01;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_app01 |
+-----------------+
| t1 |
+-----------------+
1 row in set (0.00 sec)
mysql> select * from t1;
+----+-------------+
| id | name |
+----+-------------+
| 1 | zhouwanchun |
| 2 | zhouwanchun |
| 3 | zhouwanchun |
| 4 | zhouwanchun |
| 5 | zhouwanchun |
| 6 | zhouwanchun |
| 7 | zhouwanchun |
| 8 | zhouwanchun |
| 9 | zhouwanchun |
+----+-------------+
9 rows in set (0.00 sec)
如果有需要,可以通过mysqldump导出后恢复到生产库。