目录

一、关于备份

1、备份原因和目标

2、备份技术

3、备份方式:完全备份、增量备份、差异备份

二、percona-xtrabackup

1、简介

2、获得软件包

3、安装

4、完全备份

5、增量备份

6、差异备份


一、关于备份

1、备份原因和目标

备份原因:丢、删

备份目标:数据的一致性、服务的可用性

2、备份技术

物理备份/冷备份:直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL。tar,cp,scp

逻辑备份/热备份:备份是建表、建库、插入等操作所执行的SQL语句(DDL DML DCL),适用于中小型数据库。mysqldump,mydumper

3、备份方式:完全备份、增量备份、差异备份

  • 完全备份:

       每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础。

  • 增量备份

        只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。以上次完整备份或上次的增量备份的时间为时间点,仅备份这之间的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份起到最后一次增量备份依次恢复,如中间某次的备份数据损坏,将导致数据的丢失。

  • 差异备份

        备份那些自从上次完全备份之后被修改过的所有文件,备份的时间起点是从上次完整备份起,备份数据量越来越大。恢复数据时,只需恢复上次的完全备份与最近的一次差异备份。

二、percona-xtrabackup

1、简介

        它是开源免费的支持 MySQL 数据库热备份的软件,它能对InnoDB 和 XtraDB 存储引擎的数据库非阻塞地备份。它不暂停服务创建 Innodb 热备份;为 mysql 做增量备;在 mysql 服务器之间做在线表迁移;使创建 replication 更加容易;备份 mysql 而不增加服务器的负载。
         percona 是一家老牌的 mysql 技术咨询公司。它不仅提供 mysql 的技术支持、培训、咨询,还发布了 mysq 的分支版本﹣ percona Server 。并围绕percona Server 还发布了一系列的 mysql 工具。

2、获得软件包

官方站点:https:www.percona.com

选择版本

3、安装

安装yum仓库

[root@localhost ~]# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

YUM安装percona-xtrabackup

[root@localhost ~]# ls /etc/yum.repos.d/    
CentOS-Base.repo                mysql-community-source.repo
epel.repo                       percona-original-release.repo
mysql-community-debuginfo.repo  percona-prel-release.repo
mysql-community.repo

//这里看一下percona-xtrabackup的安装包有什么版本
[root@localhost ~]# yum list | grep percona-xtrabackup
percona-xtrabackup.x86_64                2.3.10-1.el7                  percona-release-x86_64
percona-xtrabackup-22.x86_64             2.2.13-1.el7                  percona-release-x86_64
percona-xtrabackup-22-debuginfo.x86_64   2.2.13-1.el7                  percona-release-x86_64
percona-xtrabackup-24.x86_64             2.4.26-1.el7                  percona-release-x86_64
percona-xtrabackup-24-debuginfo.x86_64   2.4.26-1.el7                  percona-release-x86_64
percona-xtrabackup-80.x86_64             8.0.29-22.1.el7               percona-release-x86_64
percona-xtrabackup-80-debuginfo.x86_64   8.0.29-22.1.el7               percona-release-x86_64
percona-xtrabackup-debuginfo.x86_64      2.3.10-1.el7                  percona-release-x86_64
percona-xtrabackup-test.x86_64           2.3.10-1.el7                  percona-release-x86_64
percona-xtrabackup-test-22.x86_64        2.2.13-1.el7                  percona-release-x86_64
percona-xtrabackup-test-24.x86_64        2.4.26-1.el7                  percona-release-x86_64
percona-xtrabackup-test-80.x86_64        8.0.29-22.1.el7               percona-release-x86_64

//这里我数据库的版本是57的
[root@localhost ~]# yum install -y percona-xtrabackup-24.x86_64
[root@localhost ~]# yum list | grep percona-xtrabackup    //看一下安装是否成功,有@就是已经安装了
percona-xtrabackup-24.x86_64             2.4.26-1.el7                  @percona-release-x86_64

percona-xtrbackup安装成功之后就是备份啦

4、完全备份

完全备份流程

innobackupex --user=root --password='Qian@123' /xtrabackup/full    //把备份点数据放在/xtrabackup/full目录下
ls /xtrabackup/full/    //查看备份目录,数据库,配置文件,日志文件
2022-10-12_09-07-58(这个是我们备份的时间)
[root@localhost ~]# cd /xtrabackup/full/2022-10-12_09-07-58/
[root@localhost 2022-10-12_09-07-58]# ls(可以看到我们备份的内容都在这了,可以提前看一下数据库的内容,是否和我们备份的内容一样,以免有些内容备份失败)
backup-my.cnf   ibdata1             sys                     xtrabackup_info
hhh             mysql               test1                   xtrabackup_logfile
ib_buffer_pool  performance_schema  xtrabackup_checkpoints

cat /xtrabackup/full/2022-10-09_16-02-34/xtrabackup_binlog_info  //查看二进制日志位置
//这里要开启binlog才能看得见,登录数据库,看一下binlog开了没有,OFF就是没开
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.01 sec)
//去/etc/my.cnf里面开启二进制

完全恢复流程

systemctl stop mysqld    //停止数据库
rm -rf /var/lib/mysql/*    //清理环境(模拟损坏)
rm -rf /var/log/mysqld.log
innobackupex --apply-log /xtrabackup/full/2022-10-09_16-02-34/  //生成回滚日志,指定备份点
innobackupex --copy-back /xtrabackup/full/2022-10-09_16-02-34/  //恢复文件

//登录验证
[root@localhost ~]# ls -l /var/lib/mysql/
total 122920
drwxr-x---. 2 root root       20 Oct 12 09:48 hhh
-rw-r-----. 1 root root      436 Oct 12 09:48 ib_buffer_pool
-rw-r-----. 1 root root 12582912 Oct 12 09:47 ibdata1
-rw-r-----. 1 root root 50331648 Oct 12 09:47 ib_logfile0
-rw-r-----. 1 root root 50331648 Oct 12 09:47 ib_logfile1
-rw-r-----. 1 root root 12582912 Oct 12 09:48 ibtmp1
drwxr-x---. 2 root root     4096 Oct 12 09:48 mysql
drwxr-x---. 2 root root     8192 Oct 12 09:48 performance_schema
drwxr-x---. 2 root root     8192 Oct 12 09:48 sys
drwxr-x---. 2 root root       20 Oct 12 09:48 test1
-rw-r-----. 1 root root      427 Oct 12 09:48 xtrabackup_info
-rw-r-----. 1 root root        1 Oct 12 09:48 xtrabackup_master_key_id
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql //修改属主和属组
[root@localhost ~]# ls -l /var/lib/mysql/
total 122920
drwxr-x---. 2 mysql mysql       20 Oct 12 09:48 hhh
-rw-r-----. 1 mysql mysql      436 Oct 12 09:48 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Oct 12 09:47 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Oct 12 09:47 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Oct 12 09:47 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 Oct 12 09:48 ibtmp1
drwxr-x---. 2 mysql mysql     4096 Oct 12 09:48 mysql
drwxr-x---. 2 mysql mysql     8192 Oct 12 09:48 performance_schema
drwxr-x---. 2 mysql mysql     8192 Oct 12 09:48 sys
drwxr-x---. 2 mysql mysql       20 Oct 12 09:48 test1
-rw-r-----. 1 mysql mysql      427 Oct 12 09:48 xtrabackup_info
-rw-r-----. 1 mysql mysql        1 Oct 12 09:48 xtrabackup_master_key_id

systemctl start mysqld
mysql -uroot -p'Qian@123'

5、增量备份

增量备份流程

//准备一个数据库,写点内容
mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)

mysql> use testdb;
Database changed

mysql> create table test(id int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test values(1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from test;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
[root@localhost ~]# rm -rf /xtrabackup/*
[root@localhost ~]# date 10110000    //修改一下时间(模拟)
[root@localhost ~]# innobackupex --user=root --password='Qian@123' /xtrabackup/    //做一次完整备份
[root@localhost ~]# ls /xtrabackup/
2022-10-11_00-00-51

[root@localhost ~]# date 10122207    //更新时间
[root@localhost ~]# mysql -uroot -p'Qian@123'    //更新数据库,再写点内容
mysql> insert into testdb.test values (2);
Query OK, 1 row affected (0.01 sec)
mysql> select * from testdb.test;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)
//basedir基于2022-10-11_00-00-51的备份会生成一个今天的备份
[root@localhost ~]# innobackupex --user=root --password='Qian@123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2022-10-11_00-00-51
221012 22:15:19 completed OK!    //完成备份
[root@localhost ~]# ls /xtrabackup/
2022-10-11_00-00-51  2022-10-12_22-15-17
//下一次的备份就可以基于2022-10-12_22-15-17的备份来完成备份

增量恢复流程

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# ls /xtrabackup/2022-10-11_00-00-51/
backup-my.cnf   ibdata1             sys     xtrabackup_checkpoints
hhh             mysql               test1   xtrabackup_info
ib_buffer_pool  performance_schema  testdb  xtrabackup_logfile
[root@localhost ~]# rm -rf /var/lib/mysql/*
//回滚合并,这里只是2022-10-11_00-00-51的
[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/2022-10-11_00-00-51

//回滚合并,这里是2022-10-12_22-15-17
[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/2022-10-11_00-00-51 --incremental-dir=/xtrabackup/2022-10-12_22-15-17

//恢复备份,这里直接用2022-10-11_00-00-51,后面的备份已经跟他合并在一起了,直接恢复完整备份就可以了
[root@localhost ~]# innobackupex --copy-back /xtrabackup/2022-10-11_00-00-51/
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql/
[root@localhost ~]# ls -l /var/lib/mysql/
total 12328
drwxr-x---. 2 mysql mysql       20 Oct 12 22:33 hhh
-rw-r-----. 1 mysql mysql      436 Oct 12 22:33 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Oct 12 22:33 ibdata1
drwxr-x---. 2 mysql mysql     4096 Oct 12 22:33 mysql
drwxr-x---. 2 mysql mysql     8192 Oct 12 22:33 performance_schema
drwxr-x---. 2 mysql mysql     8192 Oct 12 22:33 sys
drwxr-x---. 2 mysql mysql       20 Oct 12 22:33 test1
drwxr-x---. 2 mysql mysql       52 Oct 12 22:33 testdb
-rw-r-----. 1 mysql mysql      497 Oct 12 22:33 xtrabackup_info
-rw-r-----. 1 mysql mysql        1 Oct 12 22:33 xtrabackup_master_key_id
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql -uroot -p'Qian@123'    //可以看到数据已经恢复了
mysql> select * from testdb.test;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.01 sec)


6、差异备份

差异备份流程

//更新一下数据库的内容,方便做测试
mysql> use testdb;
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
mysql> create table test2(id int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test2 values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test2;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
//改一下时间,做一下完整备份
[root@localhost ~]# date 10090101
[root@localhost ~]# innobackupex --user=root --password='Qian@123' /xtrabackup
221009 01:01:10 completed OK!
[root@localhost ~]# ls /xtrabackup/
2022-10-09_01-01-07
//改个时间
[root@localhost ~]# date 10100000
//在表中再插个数据
[root@localhost ~]# mysql -uroot -p'Qian@123' -e 'insert into testdb.test2 values(2)'
//备份
[root@localhost ~]# innobackupex --user=root --password='Qian@123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2022-10-09_01-01-07
[root@localhost ~]# ls /xtrabackup/
2022-10-09_01-01-07  2022-10-10_00-06-54

[root@localhost ~]# date 10111111
[root@localhost ~]# mysql -uroot -p'Qian@123' -e 'insert into testdb.test2 values(3)'
[root@localhost ~]# innobackupex --user=root --password='Qian@123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2022-10-09_01-01-07
[root@localhost ~]# ls /xtrabackup/
2022-10-09_01-01-07  2022-10-10_00-06-54  2022-10-11_11-13-05

差异恢复流程

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# rm -rf /var/lib/mysql/*
[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/2022-10-09_01-01-07/
221011 11:16:11 completed OK!

[root@localhost ~]# innobackupex --apply-log --redo-only /xtrabackup/2022-10-09_01-01-07 --incremental-dir=/xtrabackup/2022-10-11_11-13-05
[root@localhost ~]# innobackupex --copy-back /xtrabackup/2022-10-09_01-01-07/
[root@localhost ~]# chown -R mysql.mysql /var/lib/mysql
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# mysql -uroot -p'Qian@123'
mysql> select * from testdb.test2;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.02 sec)

更多推荐