专职DBA-Xtrabackup物理备份恢复

Posted zhouwanchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了专职DBA-Xtrabackup物理备份恢复相关的知识,希望对你有一定的参考价值。

专职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导出后恢复到生产库。

 

以上是关于专职DBA-Xtrabackup物理备份恢复的主要内容,如果未能解决你的问题,请参考以下文章

专职DBA-mysqldump逻辑备份恢复

mysqldump+binlog的备份与恢复

mysql进阶

OracleRMAN物理备份技术之管理维护

MYSQL的备份与恢复--物理备份xrabackup

MySQL数据库的物理备份逻辑备份和恢复