目录
- 一、为什么要备份数据?
- 二、备份工具介绍
- 三、数据备份的方式
- 3.1 完全备份
- 3.1.1 备份mysql数据库
- 3.1.2 恢复mysql数据库
- 3.2 增量备份
- 3.2.1 备份mysql数据库
- 3.2.2 恢复mysql数据库
- 3.3 差异备份
- 3.3.1 备份mysql数据库
- 3.3.2 恢复mysql数据库
- 四、总结
一、为什么要备份数据?
首先我们得知道为什么要做数据备份,我认为作为一个合格的云计算运维工程师,对数据做定期的备份是必备的基本技能和反射条件。对数据的备份能够防止系统崩溃或人为失误操作带来的数据丢失的安全隐患。我们都知道数据有多份冗余,但不等于备份,比如像xfs和ext4这些文件系统,它们都属于日志式的文件系统,对数据能进行相应的日志缓存,但也只能防止系统的突然崩溃或断电带来的数据丢失,因为它们可以通过日志进行回溯追踪,从而恢复相应的数据。那如何对mysql数据库备份呢?那得通过相关备份工具来实现了。接下来将会详细介绍如何通过xtrabackup工具来进行mysql数据库的备份及恢复过程。
二、备份工具介绍
备份工具 | 说明 | 备份类型 |
libbackup | 官方备份工具,收费 | 物理备份 |
xtrabackup | 开源社区备份工具 | 物理备份 |
mysqldump | 官方自带备份工具,开源免费 | 逻辑备份 |
mysqlbackup | 官方备份工具 | 物理备份 |
三、数据备份的方式
这三种数据备份的方式我在xfs文件系统的完全备份、增量备份及数据恢复一文中简单介绍过,大家可以去看一看。
3.1 完全备份
每次对数据进行完整的备份,即对整个数据库的备份、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础。
3.1.1 备份mysql数据库
添加测试数据:
(1)备份测试数据(完全备份)
innobackupex --user=root --password='ZRSanqy@123' /xtrabackup/
(2)备份目录下查看备份结果
ls /xtrabackup/
3.1.2 恢复mysql数据库
(1)停止数据库
systemctl stop mysqld
(2)删除mysql数据(用于恢复测试)
rm -rf /var/lib/mysql/*
rm -rf /var/log/mysqld.log
(3)重演恢复
innobackupex --apply-log /xtrabackup/2020-08-20_14-55-22/
(4)查看mysql恢复到指定的目录
cat /etc/my.cnf
(5)mysql数据恢复
innobackupex --copy-back /xtrabackup/2020-08-20_14-55-22/
(6)修改恢复的目录属主和属组
chown mysql.mysql /var/lib/mysql -R
(7)启动mysqld服务
systemctl start mysqld
(8)查看数据库中的数据
select * from test.t1
数据恢复成功。
3.2 增量备份
只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。以上次完整备份或上次的增量备份的时间为时间点,仅备份这之间的数据变化。
3.2.1 备份mysql数据库
事先准备测试数据:
(1)备份测试数据(完全备份)
innobackupex --user=root --password='ZRSanqy@123' /xtrabackup
ls /xtrabackup
(2)一次增量备份
innobackupex --user=root --password='ZRSanqy@123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2020-08-20_16-53-22/ --在全备份基础上的第一次增量备份
(3)二次增量备份
再次准备测试数据:
innobackupex --user=root --password='ZRSanqy@123' --incremental /xtrabackup/ --incremental-basedir=/xtrabackup/2020-08-20_17-11-18/ --在第一次增量备份基础上的第二次增量备份
3.2.2 恢复mysql数据库
(1)停止数据库
systemctl stop mysqld
(2)删除mysql数据(用于恢复测试)
rm -rf /var/lib/mysql/*
(3)依次重演恢复
- 完全备份重演恢复
innobackupex --apply-log --redo-only /xtrabackup/2020-08-20_16-53-22/
- 一次增量备份重演恢复
innobackupex --apply-log --redo-only /xtrabackup/2020-08-20_16-53-22/ --incremental-dir=/xtrabackup/2020-08-20_17-11-18/
- 二次增量备份重演恢复
innobackupex --apply-log --redo-only /xtrabackup/2020-08-20_16-53-22/ --incremental-dir=/xtrabackup/2020-08-20_17-49-22
(4)mysql数据恢复
innobackupex --copy-back /xtrabackup/2020-08-20_16-53-22/ --重演恢复完后再次恢复全备份数据即可
(5)修改恢复的目录属主和属组
chown mysql.mysql /var/lib/mysql -R
(6)启动mysqld服务
systemctl start mysqld
(7)查看数据库中的数据
select * from test.t1
3.3 差异备份
备份那些自从第一次次完全备份之后被修改过的所有文件,备份的时间起点是从第一次次完整备份起,且以后每次备份都是和第一次完整备份进行比较(注意是第一次,不是上一次),备份自第一次完整备份以来所有的修改过的文件。备份数据量会越来越大。
3.3.1 备份mysql数据库
事先准备测试数据:
这里以3.2节增量备份恢复的数据作为原数据进行数据备份恢复测试。
(1)备份测试数据(完全备份)
innobackupex --user=root --password='ZRSanqy@123' /xtrabackup/ --完整备份
(2)一次差异备份
添加测试数据:
innobackupex --user=root --password='ZRSanqy@123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2020-08-20_19-22-22/ --基于完整备份的第一次差异备份
(3)二次差异备份
再次添加测试数据:
innobackupex --user=root --password='ZRSanqy@123' --incremental /xtrabackup --incremental-basedir=/xtrabackup/2020-08-20_19-22-22/ --基于完整备份的第二次差异备份
3.3.2 恢复mysql数据库
(1)停止数据库
systemctl stop mysqld
(2)删除mysql数据(用于恢复测试)
rm -rf /var/lib/mysql/*
(3)依次重演恢复
- 完全备份重演恢复(恢复全量的redo log)
innobackupex --apply-log --redo-only /xtrabackup/2020-08-20_19-22-22/
- 重演恢复某次差异备份(恢复差异的redo log)
innobackupex --apply-log --redo-only /xtrabackup/2020-08-20_19-22-22/ --incremental-dir=/xtrabackup/2020-08-20_19-48-32/ --这里选择重演恢复第二次的差异备份
(4)mysql数据恢复
innobackupex --copy-back /xtrabackup/2020-08-20_19-22-22/ --重演恢复完后再次恢复全备份数据即可
(5)修改恢复的目录属主和属组
chown mysql.mysql /var/lib/mysql -R
(6)启动mysqld服务
systemctl start mysqld
(7)查看数据库中的数据
select * from test.t1
四、总结
- mysql的三种备份数据和恢复数据的方式方法是一样的,重要的是要掌握其实原理。
- 对于完全备份来说,操作步骤是三者中最简单的,由于每次都是对整个数据的完全备份,所以其备份速度相对较慢,所占备份存储也大,但它在备份和恢复时不拖泥带水,也很方便。
- 对于增量备份来说,它的每次增量备份都是基于其上一次增量备份后到现在产生的数据,因此其备份的数据量小,占用空间小,备份速度快。但它的数据恢复较两种方式来说相对复杂。在数据恢复时,需要从上一次的完整备份起按备份时间顺序,逐个备份版本进行恢复,恢复时间长,如中间某次的备份数据损坏,将导致数据的丢失。
- 对于差异备份来说,占用空间比增量备份大,比完整备份小,恢复时仅需要恢复第一个完整版本和最后一次的差异版本,恢复速度介于完整备份和增量备份之间。