Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁);mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合。

安装MySQL

# 下载安装repo源
[root@localhost ~]# wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
[root@localhost ~]# rpm -ivh mysql-community-release-el7-5.noarch.rpm
# 安装
[root@localhost ~]# yum -y install mysql-server
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# chkconfig mysqld on

下载安装xtrabackup rpm包

# 安装依赖关系
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
# 下载软件包,并安装软件
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@localhost ~]# mysql
mysql> create database cyj;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| cyj                |
| mysql              |
| performance_schema |
+--------------------+
mysql> use cyj;
mysql> create table test(id int, name char(10));
mysql> insert into test values (1,'cyj');
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | cyj  |
+------+------+

全量备份恢复mysql数据

授权可以操作用户

mysql> grant all on *.* to 'backup'@'localhost' identified by '123.com';

创建备份目录

[root@localhost ~]# mkdir /backup

备份数据库中的数据

–defaults-file=/etc/my.cnf指定配置文件位置是为了获得datadir位置

[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf \
--user=backup --password='123.com' /backup
200430 22:53:33 completed OK!

备份完成后,会在指定的保存目录中生成一个时间戳目录,该时间戳目录名称也是恢复时的apply-log

[root@localhost ~]# ls /backup/
2020-04-30_22-53-31

模拟数据丢失

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# mv /var/lib/mysql/* /backup/

恢复mysql数据

# 初始化备份数据
[root@localhost ~]# innobackupex --use-memory=512M 、
--apply-log /backup/2020-04-30_22-53-31/
...
200430 23:02:26 completed OK!
# 恢复数据
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf 、
--copy-back /backup/2020-04-30_22-53-31/
# 设置权限
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql
[root@localhost ~]# ls /var/lib/mysql
cyj  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  performance_schema  xtrabackup_info

验证数据

[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql
mysql> use cyj;
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | cyj  |
+------+------+

增量备份恢复

增量备份是基于全量备份的,所以在增量备份操作之前需要先进行全量备份

新增数据库数据

mysql> insert into test values (2, 'pjf');
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | cyj  |
|    2 | pjf  |
+------+------+

这次只备份第二条数据

[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=backup \
--password='123.com' --incremental /backup \
--incremental-basedir=/backup/2020-04-30_22-53-31

–incremental表示增量备份的存储位置

–incremental-basedir指定全量备份时间戳目录,因为本次增量备份是基于全量备份。

如果是第二次的增量备份就需要基于第一次增量备份的时间戳,这里需要注意!!!

比较增量备份和全量备份的文件大小

明显增量备份比较少

[root@localhost ~]# du -sh /backup/2020-04-30_22-53-31/
131M    /backup/2020-04-30_22-53-31/
[root@localhost ~]# du -sh /backup/2020-04-30_23-09-17/
2.2M    /backup/2020-04-30_23-09-17/

模拟数据丢失

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# mv /var/lib/mysql/* /tmp/

查看数据库数据

[root@localhost ~]# systemctl start mysqld
# 虽然删除了所有的数据库,但是在启动数据库时,还会将数据库初始化,出现最开始的自带数据库
[root@localhost ~]# mysql
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

增量恢复步骤

# 初始化全量备份一次
[root@localhost ~]# innobackupex --apply-log --redo-only /backup/2020-04-30_22-53-31/
# 初始化增量一次
[root@localhost ~]# innobackupex --apply-log /backup/2020-04-30_22-53-31/ --incremental-dir=/backup/2020-04-30_23-09-17
# 不使用redo-only初始化全量一次
[root@localhost ~]# innobackupex --apply-log /backup/2020-04-30_22-53-31/

因为之前我们模拟数据丢失后,又启动数据库了,所以数据库目录是有数据的,恢复的前提目录必须是空的,所以要再删一次

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# rm -rf /var/lib/mysql/* 

恢复数据

# 因为初始化时,将增量备份的内容放入了全量中,所只需要恢复全量即可
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf \
--copy-back /backup/2020-04-30_22-53-31/

查看mysql目录

[root@localhost ~]# ls /var/lib/mysql
cyj  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  performance_schema  xtrabackup_info

查看mysql库表

[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql
mysql> use cyj;
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | cyj  |
|    2 | pjf  |
+------+------+

恢复成功~

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0