Percona Xtrabackup实现mysql全量备份和增量备份

时间:2022-12-08 10:12:49

########################################################################
###        安装mysql或者mariaDB本地也要装mysql或者mariaDB相关的包          ##
########################################################################


#######################################
##   xtrabackup 的安装                ###
#######################################
[root@localhost ~]# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm # 安装指定的yum源
[root@localhost ~]# yum -y install percona-xtrabackup.x86_64 # 安装软件

#######################################
##  全量备份服务器的mysql数据         ###
#######################################
1)创建当天备份数据保存的路径
[root@localhost ~]# mkdir -p /backup/mysql/full/2015-05-07
2)全量备份服务器的数据(不压缩)
[root@localhost full]# /usr/bin/innobackupex --user=root --password=123456789 --host=localhost --port=3306 --defaults-file=/etc/my.cnf /backup/mysql/full/2015-05-07/
3) 修改配置文件,增加[mysqld] 选项防止在恢复数据时报错
[root@localhost full]# vi /etc/my.cnf
[mysqld]
datadir="/var/lib/mysql"
########################################
###   全量备份数据恢复                ####
########################################
1) 停止mysql
[root@localhost full]# service mysql stop

2) 模拟数据丢失
[root@localhost ~]# mv /var/lib/mysql /var/lib/mysql_bak
Bye

3) 用上面备份的数据恢复
    通过--apply-log指明将日志应用到数据文件上
    [root@localhost full]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --apply-log /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/

    3.1 如果数据库目录为空,可以使用--copy-back选项用于执行恢复操作。因为使用--copy-back恢复要求恢复的目录必须为空
    [root@localhost full]# mv /var/lib/mysql /var/lib/mysql_old
    [root@localhost full]# mkdir /var/lib/mysql
    [root@localhost full]# /usr/bin/innobackupex --user=root --password=123456789 --copy-back --defaults-file=/etc/my.cnf   /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/
    [root@localhost full]# chown -R mysql:mysql /var/lib/mysql  # 修改所有者,所属组
    [root@localhost full]# service mysql start # 启动mysql
    [root@localhost full]# mysql -u root -p  # 登录查看数据是否恢复
    Enter password:
    MariaDB [(none)]> show databases;  # 发现数据已经恢复
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test_db            |
    +--------------------+
    3.2 如果数据库目录不为空,使用直接copy的方法恢复数据(不常用)
    rm -f /var/lib/mysql/ibdata/ib* # 如果innodb数据文件放在单独的目录,需要单独删除。 我这里不是单独放置的
    [root@localhost full]# rm -f /var/lib/mysql/ib*  # 删除innodb数据文件  # 如果是恢复MyISAM引擎的数据表则没必要执行这一步
    [root@localhost full]# rm -rf /var/lib/mysql/test_db # 删除指定的数据库test_db
    # 恢复
    [root@localhost full]# cp -r /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/test_db /var/lib/mysql/
    [root@localhost full]# cp -r /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ib* /var/lib/mysql/  # 如果innodb数据文件放在单独的目录,需要单独复制
    [root@localhost full]# chown -R mysql:mysql /var/lib/mysql  # 修改所有者,所属组
    [root@localhost full]# service mysql start
    [root@localhost full]# mysql -u root -p123456789  # 登录数据库查看数据已经恢复
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test_db            |
    +--------------------+
    4 rows in set (0.00 sec)

    MariaDB [(none)]> use test_db;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A

    Database changed
    MariaDB [test_db]> select * from test_table1;
    +------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
|    4 | zhaoliu  |
|    5 | guqi     |
+------+----------+
5 rows in set (0.00 sec) # 数据已经恢复
    

##############################################
###              增量备份                    ##
##############################################
1)开启二进制日志
[root@localhost ~]# vi /etc/my.cnf
[mysqld]
datadir="/var/lib/mysql"
log-bin=/data/mysql/log/mysql-bin
[root@localhost ~]#  service mysql restart
2)增量备份是建立在全量备份的基础上的所以先确保有一次全量备份,全量备份前面已经介绍

3) 我们往数据库中添加数据,进行第一次增量备份
MariaDB [test_db]> insert into test_table1 values(6,'xiaoming');
Query OK, 1 row affected (0.00 sec)

MariaDB [test_db]> select * from test_table1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
|    4 | zhaoliu  |
|    5 | guqi     |
|    6 | xiaoming |
+------+----------+
6 rows in set (0.00 sec)
[root@localhost ~]# mkdir -p /backup/mysql/increment/2015-05-07 # 创建增量备份保存的路径

4) 进行第一次增量备份
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --incremental-force-scan --incremental /backup/mysql/increment/2015-05-07 --incremental-basedir=/backup/mysql/full/2015-05-07/2015-05-07_18-14-25/ # 第一次增量备份 (如果是mariadb不添加--incremental-force-scan参数可能会因为不支持FLUSH CHANGED_PAGE_BITMAPS而报错导致增量备份失败)
第一次增量备份生成的文件夹为/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/

5) 再次往数据表中插入内容
MariaDB [test_db]> insert into test_table1 values(7,'xiaohong');
Query OK, 1 row affected (0.05 sec)

6)进行第二次增量备份
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --incremental-force-scan --incremental /backup/mysql/increment/2015-05-07 --incremental-basedir=/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/
第二次增量备份生成的文件夹为/backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/

7)查看最后一次增量备份时所对应的二进制日志及位置
[root@localhost ~]# cat /backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/xtrabackup_binlog_info
mysql-bin.000001    833    0-1-3
MariaDB [(none)]> show master status
    -> ;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      833 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)  # 可以看到如果没有在增量备份后再对数据库进行增删改操作。则从增量备份中得出的信息和从二进制日志中看到的是一样的。


###################################################################
###         增量备份数据还原                                    ###
###################################################################
恢复增量备份
增量备份的还原操作跟完整的还原有点不一样,首先必须使用--apply-log --redo-only对完整备份的目录及所有增量备份目录进行操作,然后就可以像还原完整备份时的操作了。(apply increment log to full data)
1 模拟数据丢失
[root@localhost ~]# service mysql stop
[root@localhost ~]# rm -rf /var/lib/mysql
[root@localhost ~]# mkdir /var/lib/mysql

2 通过--apply-log --redo-only指明将日志应用到数据文件上
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/

3 把第一次增量备份的数据应用到全量备份上
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/  --incremental-dir=/backup/mysql/increment/2015-05-07/2015-05-07_18-41-41/

4 把第二次增量备份的数据应用到全量备份上
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf --apply-log --redo-only /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/  --incremental-dir=/backup/mysql/increment/2015-05-07/2015-05-07_18-48-32/

5 恢复数据(这里和全量备份的恢复相同了)
[root@localhost ~]# /usr/bin/innobackupex --user=root --password=123456789 --defaults-file=/etc/my.cnf  --copy-back /backup/mysql/full/2015-05-07/2015-05-07_18-14-25/

6 更改权限,启动服务,登录mysql,查看数据是否恢复
[root@localhost ~]# chown -R mysql:mysql /var/lib/mysql
[root@localhost ~]# service mysql start
MariaDB [test_db]> select * from test_table1;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    2 | lisi     |
|    3 | wangwu   |
|    4 | zhaoliu  |
|    5 | guqi     |
|    6 | xiaoming |
|    7 | xiaohong |
+------+----------+
7 rows in set (0.00 sec)  # 数据已经恢复