innobackupex备份与恢复

innobackupex备份与恢复,第1张

innobackupex备份与恢复

目录

innobackupex备份与恢复

完全备份与恢复

完全备份

完全恢复

恢复单张表

*** 作步骤

完全备份

相关命令

增量备份与恢复

增量备份

增量恢复


innobackupex备份与恢复

完全备份与恢复 完全备份
  • 命令格式

—— ]# innobackupex --user 用户名 --password 密码 备份目录名 --no-timestamp

注:备份目录不需要提前创建,执行命令的时候会自动创建该目录

  • 示例

主机192.168.233.130用来备份数据

主机192.168.233.150用来恢复数据

1、先在主机192.168.233.150上安装percona软件

[root@DB ~]# ls /root      //上传软件bao

[root@DB ~]# wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo      //使用epel源解决依赖包libev-4.15-7.el7.x86_64

[root@DB ~]# yum -y install libev-4.15-7.el7.x86_64

[root@DB ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-community-libs-compat-5.7.17-1.el7.x86_64.rpm       //解决依赖包mysql-community-libs-compat-5.7.17-1.el7.x86_64.rpm

[root@DB ~]# rpm -ivh mysql-community-libs-compat-5.7.17-1.el7.x86_64.rpm

[root@DB ~]# yum -y install perl-DBD-MySQL perl-Digest-MD5 

[root@DB ~]# rpm -ivh percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm     

[root@DB ~]# rpm -qa | grep percona

percona-xtrabackup-24-2.4.8-1.el7.x86_64

2、在主机192.168.233.130上做完全备份

用innobackupex命令进行备份时,只有是InnoDB存储引擎的表,才能实现真正意义上的增量备,如果表的存储引擎不是InnoDB的话,那么备份的还是所有数据。目前使用的是5.7版本的数据库,他提供的数据库服务表的默认存储引擎就是innoDB。

[root@DB ~]# mysql -uroot -p123456        //登录数据库服务器,使用的MySQL版本是5.7.17

mysql> show engines;       //查看数据库服务的默认存储引擎

mysql> show create table db3.user;         //查看db3库中的user表的存储引擎

1)以日期命名的备份文件名

[root@DB ~]# innobackupex --user root --password 123456 /allbak     //备份数据

[root@DB ~]# ls /allbak/      //查看备份目录

2022-01-03_10-44-56

[root@DB ~]# ls /allbak/2022-01-03_10-44-56/         //查看备份数据

[root@DB ~]# rm -rf /allbak       //删除备份数据

2)自定义备份文件名

[root@DB ~]# innobackupex --user root --password 123456 /allbak --no-timestamp     //不用日期命名备份文件存储的子目录名进行数据备份

[root@DB ~]# ls /allbak      //查看备份数据的备份信息

[root@DB ~]# scp -r /allbak/ [email protected]:/root/        //将备份数据拷贝给主机192.168.233.150

完全恢复
  • 命令格式

—— ]# innobackupex --apply-log 备份目录名     //准备恢复数据

—— ]#innobackupex --copy-back 备份目录名     //恢复数据

  • 恢复数据,步骤如下

1、停止数据库服务

2、清空数据库目录

3、准备恢复数据

4、拷贝数据

5、修改数据库目录的所有者和所属组用户为mysql

6、启动服务

7、管理员登录查看数据

  • 示例

在主机192.168.233.150上执行数据完全恢复

[root@DB2 ~]# ls /root/allbak/        //查看备份数据的备份信息

1、停止数据库服务

[root@DB2 ~]# systemctl stop mysqld

2、清空数据库目录

[root@DB2 ~]# rm -rf /var/lib/mysql/*     

[root@DB2 ~]# ls /var/lib/mysql/       //因为要用主机130的备份数据恢复,数据库目录下必须是空的,不能有数据

3、准备恢复数据

[root@DB2 ~]# innobackupex --apply-log /root/allbak/         //准备恢复数据

4、拷贝数据

[root@DB2 ~]# innobackupex --copy-back /root/allbak/       //恢复备份,自动将备份目录下的文件拷贝到数据库目录

[root@DB2 ~]# ls -l /var/lib/mysql

//注:在执行innobackupex --copy-back命令的时候,是由 *** 作系统的root用户来执行的,所以现在数据库目录下的所属者和所属组都是root

5、修改数据库目录的所有者和所属组用户为mysql

[root@DB2 ~]# chown -R mysql:mysql /var/lib/mysql       //使用递归,将数据库目录及以下的目录文件的属主和属组修改为mysql

[root@DB2 ~]# ls -l /var/lib/mysql

6、启动服务

[root@DB2 ~]# systemctl start mysqld

[root@DB2 ~]# netstat -lntup | grep 3306        //查看服务是否运行正常

tcp6       0      0 :::3306                 :::*                    LISTEN      21089/mysqld

7、管理员登录查看数据

[root@DB2 ~]# mysql -uroot -p123456      //注:此处使用的是主机130的授权库,所以登录密码和主机130的密码一样

mysql> show databases;         //查看数据,恢复数据成功

注:完全备份的innobackupex --apply-log准备恢复数据的准备内容:

[root@DB ~]# ls /allbak/

//如图所示,文件xtrabackup_logfile里的内容是日志信息,存放的是已经备份完成的信息;文件ibdata1里面存放的是备份完成之后又向表中插入的数据;文件xtrabackup_checkpoints是用来记录本次备份数据的信息;

[root@DB ~]# cat /allbak/xtrabackup_checkpoints       //主机130没有使用过备份目录恢复过数据,查看记录备份信息文件的内容

//如图所示,备份类型是full-backup,意思是已经进行过了备份,还没有执行准备恢复数据的命令

[root@DB2 ~]# cat /root/allbak/xtrabackup_checkpoints      //主机150使用过备份目录恢复过数据,查看记录备份信息文件的内容

//如图所示,备份类型是full-prepared,执行过准备恢复数据之后类型就会从full-backup变为full-prepared

innobackupex --apply-log准备恢复数据是指把备份完成之后又往备份完成表中写入的数据,和已备份的数据合并到一块,合并完之后再将这个数据拷贝到数据库目录下的 *** 作。在备份的过程中是不会对表加锁的。

恢复单张表 *** 作步骤
  • 具体 *** 作如下

—— 删除表空间

—— 导出表信息

—— 拷贝表信息文件到数据库目录下

—— 修改表信息文件的所有者及组用户为mysql

—— 导入表空间

—— 删除数据库目录下的表信息文件

—— 查看表记录

注:表空间指的是存储数据的文件,innoDB存储引擎的空间文件是

mysql> desc db3.user;       //查看db3库下user表的表结构

[root@DB mysql]# ls /var/lib/mysql/db3      //查看数据目录中的db3目录下的文件     

db.opt user.frm user.ibd

//db3库下user表的表结构就存储在user.frm文件中;表中数据存放在user.ibd文件中,空间就是存储数据的,综上所述,表名.ibd文件就是表空间文件。当我们在数据库服务器中,使用delete命令删除了表中记录,那么表空间文件(.ibd文件)也就没有数据记录了,但是表空间还是存在的。

完全备份

我们首先需要完全备份数据库数据, *** 作步骤同上面完全备份的 *** 作,做过完全备份就无须在进行本 *** 作了。

相关命令
  • 具体命令如下:

—— mysql> alter table 库名.表名 discard tablespace;        //删除表空间文件

—— ]# innobackupex --apply-log --export 数据完全备份目录      //导出表信息

—— ]# cp 数据完全备份目录/数据库名目录/表名.{ibd,cfg,exp} 数据库目录/库名/        //拷贝表信息文件

—— ]# chown mysql:mysql 数据库目录/库名        //修改所有者/组

—— mysql> alter table 库名.表名 import tablespace;       //导入表空间

—— mysql> select * from 库名.表名;       //查看表记录

—— ]# rm -rf 数据库目录/库名/表名.{cfg,exp}       //删除表信息文件

  • 示例

在主机192.168.233.150上删除db3库下的user表,模拟表丢失,进行恢复单张表 *** 作。

[root@DB2 ~]# mysql -uroot -p123456

mysql> use db3;

mysql> delete from db3.user;       //删除db3库下的user表中的记录

mysql> select * from db3.user;         //表中数据已被清空

Empty set (0.00 sec)

mysql> show tables;       //虽然清空了表记录,但是表还在的,模拟表数据丢失

1、删除表空间

mysql> alter table db3.user discard tablespace;       //删除表空间文件

mysql> select * from db3.user;

ERROR 1814 (HY000): Tablespace has been discarded for table 'user'

[root@DB2 ~]# ls /var/lib/mysql/db3         //表空间文件(.ibd文件)已被删除

db.opt  user.frm

2、导出表信息

[root@DB2 ~]# ls /root/allbak/db3       //查看备份数据的表结构文件和表空间文件

db.opt  user.frm  user.ibd

[root@DB2 ~]# innobackupex --apply-log --export /root/allbak/        //从备份数据中导出表信息

[root@DB2 ~]# ls /root/allbak/db3       //查看备份文件多了user.cfg user.exp这两个文件,这两个文件都是二进制文件,存放的是备份时的备份信息

db.opt  user.cfg  user.exp  user.frm  user.ibd

3、拷贝表信息文件到数据库目录下

[root@DB2 ~]# cp /root/allbak/db3/user.{cfg,exp,ibd} /var/lib/mysql/db3/       //将表信息文件user.cfg、user.exp和表空间文件user.ibd拷贝到数据库目录下

[root@DB2 ~]# ls /var/lib/mysql/db3       //查看数据库目录文件是否拷贝成功

db.opt  user.cfg  user.exp  user.frm  user.ibd

4、修改表信息文件的所有者及组用户为mysql

[root@DB2 ~]# ls -l /var/lib/mysql/db3

//如图所示,由于cp命令是root用户执行的,所以拷贝过来的三个文件的所属者和所属组都是root,我们需要修改表信息文件的所有者及组用户为mysql。

[root@DB2 ~]# chown mysql:mysql /var/lib/mysql/db3/user.*;     //修改表信息文件的所有者及组用户为mysql

[root@DB2 ~]# ls -l /var/lib/mysql/db3

5、导入表空间

mysql> alter table db3.user import tablespace;         //导入表空间

mysql> select * from db3.user;      //查看表记录,发现数据已经恢复

6、删除数据库目录下的表信息文件

[root@DB2 ~]# rm -rf /var/lib/mysql/db3/user.exp

[root@DB2 ~]# rm -rf /var/lib/mysql/db3/user.cfg

//注:数据恢复完成后,表信息文件user.cfg和user.exp就没有用了,所以删除数据库目录下的表信息文件

增量备份与恢复 增量备份
  • 增量备份

—— 备份上次备份后,所有新产生的数据。

—— 首次备份做的是完全备份,接下来的备份做的是增量备份

  • 命令格式

—— ]# innobackupex --user 用户名 --password 密码 --incremental 增量目录 --incremental-basedir=目录名 --no-timestamp

注:增量目录是备份时自己定义的,不用事先创建。只需备份的时候用--incremental指定备份的目录名,就会自动创建存储。--incremental-basedir=目录名,是上次备份文件存储的路径。

  • 示例

主机192.168.233.130用来备份数据

主机192.168.233.150用来恢复数据

1、做增量备份前,首先需要做完全备份。我们已在主机192.168.233.130上做过完全备份了。

[root@DB ~]# cat /allbak/xtrabackup_checkpoints        //我们通过查看备份信息文件xtrabackup_checkpoints,来确认该目录下的备份数据是不是完全备份

//如图所示,我们可以根据backup_type(备份类型)的值full-backuped(完全备份),看出这个目录下的备份数据是完全备份。

2、向主机192.168.233.130上插入新数据

mysql> create database db5;      //创建新库db5

mysql> create table db5.a(age int);        //创建新表a

mysql> insert into db5.a values(18);       //向表a中插入数据

mysql> insert into db5.a values(18);

mysql> insert into db5.a values(18);

mysql> create table db5.b(name char(10));       //创建新表b

mysql> insert into db5.b values("bob");            //向表b中插入数据

mysql> insert into db5.b values("bob");

mysql> insert into db5.b values("bob");

mysql> select * from db5.a;       //查看a表的数据

mysql> select * from db5.b;        //查看b表的数据

3、在主机192.168.233.130上做第一次增量备份

[root@DB ~]# innobackupex --user root --password 123456 --incremental /new1dir --incremental-basedir=/allbak --no-timestamp      //将数据库服务器现在的数据,和--incremental-basedir后面指定的之前备份的数据进行对比,将新产生的数据存放在--incremental后指定的目录里面。

[root@DB ~]# ls /new1dir/      //查看增量备份的数据

4、向主机192.168.233.130上再次插入数据

mysql> insert into db5.a values(20);

mysql> select * from db5.a;      //查看新插入的数据

mysql> insert into db5.b values("tom");

mysql> select * from db5.b;       //查看新插入的数据

5、在主机192.168.233.130上做第二次增量备份

[root@DB ~]# innobackupex --user root --password 123456 --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp        //将数据库服务器现在的数据,和--incremental-basedir后面指定的之前增量备份的数据进行对比,将新产生的数据存放在--incremental后指定的目录里面。

[root@DB ~]# ls /new2dir/

增量恢复
  • 命令格式

—— ]# innobackupex --apply-log --redo-only 目录名 --incremental-dir=目录名      //准备恢复数据

—— ]# innobackupex --copy-back 目录名       //恢复数据

注:完全备份的innobackupex --apply-log准备恢复数据的准备内容:

准备恢复数据就是将这三次的备份的日志信息合并在一起,然后用第一次完全备份的目录/allbak下的文件来存储合并的信息

查看三次备份文件的备份信息:

[root@DB ~]# cat /allbak/xtrabackup_checkpoints       //查看完全备份的备份信息

//如图所示,备份数据/allbak的备份类型是完全备份,日志起始序列号是0,日志结束序列号是2936790

[root@DB ~]# cat /new1dir/xtrabackup_checkpoints         //查看第一次增量备份的备份信息

//如图所示,备份数据/allbak的备份类型是增量备份,日志起始序列号是2936790,日志结束序列号是2949507

[root@DB ~]# cat /new2dir/xtrabackup_checkpoints         //查看第二次增量备份的备份信息

//如图所示,备份数据/allbak的备份类型是增量备份,日志起始序列号是2949507,日志结束序列号是2950197

注:日志序列号的范围就是本次备份的时候,数据库执行的命令。第一增量备份的日志起始序列号是完全备份的日志结束序列号,第二次增量备份的日志起始序列号是第一次增量备份的日志结束序列号,这三个备份数据的序列号合起来,即序列号从0到2950197,就等于当前数据库服务器的所有数据的日志信息,就是现在数据库的已有数据信息。

1、把主机192.168.233.130上备份的数据拷贝给要恢复数据的主机192.168.233.150上

[root@DB ~]# scp -r /allbak/ [email protected]:/opt/

[root@DB ~]# scp -r /new1dir/ [email protected]:/opt/

[root@DB ~]# scp -r /new2dir/ [email protected]:/opt/

2、在主机192.168.233.150上准备恢复数据

[root@DB2 ~]# ls /opt       //查看拷贝过来的备份数据

[root@DB2 ~]# innobackupex --apply-log --redo-only /opt/allbak/        //准备恢复数据

[root@DB2 ~]# cat /opt/allbak/xtrabackup_checkpoints        //查看备份数据的信息

//如图所示,完全备份的备份信息中的backup_type(日志类型)变为log-applied(日志请求)

[root@DB2 ~]# innobackupex --apply-log --redo-only /opt/allbak/ --incremental-dir=/opt/new1dir      //将首次完全备份的数据与第一次增量备份的数据进行合并

//准备恢复数据,从/opt/allbak/完全备份的数据目录下的开始合并, --incremental-dir定义用/opt/new1dir目录下的数据去合并,注意此处合并的数据应从首次增量备份的数据去合并,即用/opt/new1dir目录下的数据去合并,这块的顺序是不能乱,不能从第二次增量备份的数据去合并,即不能用/opt/new2dir目录下的数据去合并。因为完全备份下的日志结束序列号要和增量备份数据下的日志起始序列号要相对应,即完全备份下的日志结束序列号的值要和增量备份数据下的日志起始序列号的值相等,否则会报错。

[root@DB2 ~]# cat /opt/allbak/xtrabackup_checkpoints        //查看与第一次增量备份数据合并后完全备份的信息

//如图所示,此时完全备份的日志结束序列号发生改变,变为了第一次增量备份的日志结束序列号的值,说明合并成功,现在/opt/allbak目录下的数据,就是首次完全备份的数据加第一次增量备份的数据。

[root@DB2 ~]# innobackupex --apply-log --redo-only /opt/allbak/ --incremental-dir=/opt/new2dir     //将首次完全备份与第一次增量备份数据的合并数据,在与第二次增量备份的数据进行合并

[root@DB2 ~]# cat /opt/allbak/xtrabackup_checkpoints

//如图所示,此时完全备份的日志结束序列号再次发生改变,变为第二次增量备份的日志结束序列号,说明合并成功,此时首次完全备份的数据已与二次增量备份的数据合并到了一块,即三次备份的数据都已在/opt/allbak目录下。

3、删除增量备份的备份目录

[root@DB2 ~]# rm -rf /opt/new1dir/

[root@DB2 ~]# rm -rf /opt/new2dir/       //因为此时增量备份的数据都已经合并到了/opt/allbak目录下了,所以这两个增量备份的备份文件已经没用了

4、停止数据库服务,清空数据库目录

如果数据库目录不是空的,直接拷贝数据会报错

[root@DB2 ~]# innobackupex --copy-back /opt/allbak/

//如图所示,错误提示数据库目录不是空的

[root@DB2 ~]# systemctl stop mysqld

[root@DB2 ~]# rm -rf /var/lib/mysql/*

5、拷贝数据到数据库目录

[root@DB2 ~]# innobackupex --copy-back /opt/allbak/

[root@DB2 ~]# ls -l /var/lib/mysql

6、修改数据库目录的所有者和所属组用户为mysql

[root@DB2 ~]# chown -R mysql:mysql /var/lib/mysql

[root@DB2 ~]# ls -l /var/lib/mysql

7、启动数据库服务

[root@DB2 ~]# systemctl start mysqld

[root@DB2 ~]# netstat -lntup | grep 3306

tcp6       0      0 :::3306                 :::*                    LISTEN      29121/mysqld

8、管理员登录查看数据

[root@DB2 ~]# mysql -uroot -p123456

mysql> show databases; 

mysql> select * from db5.a;

mysql> select * from db5.b;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5694178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存