目录
1.什么是物理备份
物理备份: 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本 。
备份类型
- 完全备份(全量备份)-----完整备份
每次都将所有数据(不管自第一次备份以来有没有修改过),进行一次完整的复制,备份后会清除文件的存档属性,方便日后增量备份或者差异备份进行版本比较。
特点:占用空间大,备份速度慢,但恢复时一次恢复到位,恢复速度快。
- 增量备份:---------------每次备份上一次备份到现在产生的新数据。
在第一次完整备份之后,第二次开始每次都将添加了存档属性的文件进行备份,并且在备份之后再把这些存档属性清除。为什么要清除存档属性呢?这就是为了下一次备份的时候判断是否有文件变化,因为用户在每次备份以后修改这些被清除存档属性的文件,存档属性就会自动加上,相当于用户告诉系统,这些文件有变化,你下一次就备份这些文件,其他没有存档属性的就不需要备份,这就是增量备份的工作机制。
特点:因每次仅备份自上一次备份(注意是上一次,不是第一次)以来有变化的文件,所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢 复,恢复时间长。
- 差异备份------------------只备份跟完整备份不一样的
在第一次完整备份之后,第二次开始每次都将所有文件与第一次完整备份的文件做比较,把自第一次完整备份以来所有修改过的文件进行备份,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。因此,差异备份在备份完毕之后不需要清除文件的存档属性,因为这些文件和下一次备份没有什么关系,它仅仅和第一次完整备份的数据进行比较(第一次完整备份之后是清除存档属性的)。
特点:占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。
2.安装xtrabackup
安装xtrabackup
# wget http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
# rpm -ivh percona-release-0.1-4.noarch.rpm
[root@mysql-server yum.repos.d]# vim percona-release.repo关闭yum源中的gpgcheck
[root@mysql-server yum.repos.d]# yum -y install percona-xtrabackup-24.x86_64
3.使用xtrabackup备份及恢复数据
1.全量备份
① 创建全量被封数据的目录并备份数据。
[root@master1 ~]# mkdir /xtrabackup/full -p
[root@master1 ~]# innobackupex --user=root --password=224216 /xtrabackup/full/
[root@master1 ~]# cd /xtrabackup/full/
[root@master1 full]# ll
总用量 0
drwxr-x--- 10 root root 281 10月 21 16:30 2023-10-21_16-30-50
出现OK!时说明全量备份成功。
② 停止数据库并清理数据后恢复数据
[root@master1 mysql]# rm -rf /var/lib/mysql/*
③ 确认数据库目录
恢复之前需要确认配置文件内有数据库目录指定,不然xtrabackup不知道恢复到哪里
# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
④恢复之前的验证恢复:
语法:innobackupex --apply-log /xtrabackup/full/2023-10-21_16-30-50/
出现OK!说明验证成功!!!
⑤恢复数据
语法: innobackupex --copy-back /xtrabackup/full/2023-10-21_16-30-50/
出现OK!说明恢复成功!!!
恢复数据后修改/var/lib/mysql下文件的权限。# chown mysql.mysql /var/lib/mysql -R
之后启动mysql登录查看。
2.增量备份
备份数据:
①第一次先做全量备份
[root@master1 ~]# innobackupex --user=root --password=224216 /xtrabackup/inter/
[root@master1 ~]# ls /xtrabackup/inter/
2023-10-21_16-52-10
②写入数据后做第一次增量备份
语法:innobackupex --user=root --password=224216 --incremental /xtrabackup/inter --incremental-basedir=/xtrabackup/inter/2023-10-21_16-52-10/
!!#!#!## --incremental(增量备份的路径)
--incremental-basedir(基于上一次备份为目录做增量备份)
mysql> insert into db1.test1 values (001);
[root@master1 ~]# innobackupex --user=root --password=224216 --incremental /xtrabackup/inter --incremental-basedir=/xtrabackup/inter/2023-10-21_16-52-10/
...省略...
231021 17:01:19 Backup created in directory '/xtrabackup/inter/2023-10-21_17-01-15/'
MySQL binlog position: filename 'mysql-bin.000013', position '765'
231021 17:01:19 [00] Writing /xtrabackup/inter/2023-10-21_17-01-15/backup-my.cnf
231021 17:01:19 [00] ...done
231021 17:01:19 [00] Writing /xtrabackup/inter/2023-10-21_17-01-15/xtrabackup_info
231021 17:01:19 [00] ...done
xtrabackup: Transaction log of lsn (2831166) to (2831175) was copied.
231021 17:01:19 completed OK!
③写入数据做基于上一次备份的增量备份
mysql> insert into db1.test1 values (002);
[root@master1 ~]# innobackupex --user=root --password=224216 --incremental /xtrabackup/inter/ --incremental-basedir=/xtrabackup/inter/2023-10-21_17-01-15/
...省略...
231021 17:08:05 Backup created in directory '/xtrabackup/inter/2023-10-21_17-08-02/'
MySQL binlog position: filename 'mysql-bin.000013', position '1016'
231021 17:08:05 [00] Writing /xtrabackup/inter/2023-10-21_17-08-02/backup-my.cnf
231021 17:08:05 [00] ...done
231021 17:08:05 [00] Writing /xtrabackup/inter/2023-10-21_17-08-02/xtrabackup_info
231021 17:08:05 [00] ...done
xtrabackup: Transaction log of lsn (2831516) to (2831525) was copied.
231021 17:08:05 completed OK!
查看所备份的数据
恢复数据:
增量备份恢复流程
1. 停止数据库
2. 清理环境
3. 依次重演回滚redo log--> 恢复数据
4. 修改权限
5. 启动数据库
6. binlog恢复
①停止数据库清理数据
[root@master1 ~]# systemctl stop mysqld
[root@master1 ~]# rm -rf /var/lib/mysql/*
②重演回滚数据:重演回滚就是将增量数据整合到第一次全量备份中去。
--incremental-dir指定增量备份的目录
语法:innobackupex --apply-log --redo-only /xtrabackup/inter/2023-10-21_16-52-10/(回滚重演全量备份)
innobackupex --apply-log --redo-only /xtrabackup/inter/2023-10-21_16-52-10/ --incremental-dir=/xtrabackup/inter/2023-10-21_17-01-15/ (回滚重演增量备份)
###回滚重演全量备份
[root@master1 ~]# innobackupex --apply-log --redo-only /xtrabackup/inter/2023-10-21_16-52-10/
###回滚重演第一次增量备份
[root@master1 ~]# innobackupex --apply-log --redo-only /xtrabackup/inter/2023-10-21_16-52-10/ --incremental-dir=/xtrabackup/inter/2023-10-21_17-01-15/
###回滚重演第二次增量备份
[root@master1 ~]# innobackupex --apply-log --redo-only /xtrabackup/inter/2023-10-21_16-52-10/ --incremental-dir=/xtrabackup/inter/2023-10-21_17-08-02/
③恢复数据
这里恢复的是回滚重演后全量备份的数据,因为增量备份的数据已经整合到全量备份中去了。
[root@master1 ~]# innobackupex --copy-back /xtrabackup/inter/2023-10-21_16-52-10/
④修改权限
[root@mysql-server ~]# chown -R mysql.mysql /var/lib/mysql
[root@mysql-server ~]# systemctl start mysqld
登陆上去看一下:
3.差异备份(基于第一次全量备份做的)
###!!!###!!!
差异备份的原理和增量备份原理不同,只是语法相同。
备份数据
①第一次先做全量备份
[root@master1 ~]# innobackupex --user=root --password=224216 /xtrabackup/diff/
②写入数据第一次差异备份
mysql> insert into db1.test1 values(3);
[root@master1 diff]# innobackupex --user=root --password=224216 --incremental /xtrabackup/diff/ --incremental-basedir=/xtrabackup/diff/2023-10-21_17-29-59/
③写入数据第二次差异备份
mysql> insert into db1.test1 values(4);
[root@master1 diff]# innobackupex --user=root --password=224216 --incremental /xtrabackup/diff/ --incremental-basedir=/xtrabackup/diff/2023-10-21_17-29-59/
恢复数据
①清理数据回滚重演(这里回滚第二次差异备份就可以恢复全部数据)
[root@master1 diff]# systemctl stop mysqld
[root@master1 diff]# rm -rf /var/lib/mysql/*
[root@master1 diff]# innobackupex --apply-log --redo-only /xtrabackup/diff/2023-10-21_17-29-59/ #回滚全量备份
[root@master1 diff]# innobackupex --apply-log --redo-only /xtrabackup/diff/2023-10-21_17-29-59/ --incremental-dir=/xtrabackup/diff/2023-10-21_17-36-14/ #回滚第二次差异备份
②恢复数据
[root@master1 diff]# innobackupex --copy-back /xtrabackup/diff/2023-10-21_17-29-59/
③修改权限
[root@mysql-server ~]# chown -R mysql.mysql /var/lib/mysql
[root@mysql-server ~]# systemctl start mysqld
登陆上去看一下:
#!#!#!# 注意差异备份和增量备份第一次都基于全量备份做备份但是备份的原理不同。