MySQL备份与恢复

1、数据备份概述

备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低。

数据丢失的场景举例:

  • 硬件故障
  • 软件故障
  • 自然灾害
  • 黑客攻击
  • 误操作 (占比最大)

1.1 衡量备份恢复重要指标

衡量备份恢复有两个重要的指标:

  • 恢复点目标(RPO)
    • 恢复点目标是指数据能恢复到什么程度
  • 恢复时间目标(RTO)
    • 恢复时间目标是指数据恢复需要多长时间

1.2 数据库备份分类

数据库备份方式分很多种,从物理与逻辑的角度来看,备份可分为:

  • 物理备份:指对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)。
    • 冷备份:在关闭数据库时进行的备份操作,能够较好地保证数据库的完整性。
    • 热备份:在数据库运行状态中进行操作,这种备份方法依赖于数据库的日志文件。
  • 逻辑备份:指对数据库逻辑组件(如"表"等数据库对象)的备份。

数据库的备份从策略角度来看,备份可分为以下几类:

  • 完全备份:每次对数据进行完整的备份。可以备份整个数据库,包含用户表、系统表、索引、视图和存储过程等所有数据库对象。但它需要花费更多的时间和空间,所以,做一次完全备份的周期要长些。
  • 差异备份:备份那些自从上次完全备份之后被修改过的文件,只备份数据库部分的内容。它比最初的完全备份小,因为只包含自上次完全备份以来所改变的数据库。它的优点是存储和恢复速度快。
  • 增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份。

2、MySQL备份工具

2.1 mysqldump备份工具

MySQL官方提供了Mysqldump逻辑备份工具,它的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert语句,当我们需要还原这些数据时,只要执行这些insert语句,即可将对应的数据还原。

//mysqldump命令语法:
mysqldump [选项] 数据库名 [表名] > 备份文件名

选项列表:

选项名 含义
--host 服务器IP地址
--port 服务器端口号
--user MySQL 用户名
--password MySQL 密码
--databases 指定要备份的数据库
--all-databases 备份mysql服务器上的所有数据库
--compact 压缩模式,产生更少的输出
--comments 添加注释信息
--complete-insert 输出完成的插入语句
--lock-tables 备份前,锁定所有数据库表
–no-create-db / --no-create-info 禁止生成创建数据库语句
--force 当出现错误时仍然继续备份操作
--default-character-set 指定默认字符集
--add-locks 备份数据库表时锁定数据库表

数据库备份实例演示:

备份所有数据库:
mysqldump -uroot -p --all-databases > /backup/mysqldump/all.db

备份指定数据库:
mysqldump -uroot -p test > /backup/mysqldump/test.db

备份指定数据库,指定表(多个库或表以空格间隔):
mysqldump -uroot -p mysql db event > /backup/mysqldump/2table.db

备份指定数据库排除某些表:
mysqldump -uroot -p test --ignore-table=test.t1 --ignore-table=test.t2 > /backup/mysqldump/test2.db

数据库还原实例演示:

//mysqldump工具导入数据库备份,在导入备份数据库前,需要先手动创建数据库并且数据库名称和原来保持一致
mysql -uroot -p -e "create database db_name"
mysql -uroot -p  db_name < /backup/mysqldump/db_name.db

//soure方法
mysql > use db_name
mysql > source /backup/mysqldump/db_name.db

2.2 tar冷备份工具

tar归档工具,使用tar直接归档数据库文件也可实现数据库的备份,但需要数据库处于停止运行状态。

//先关闭mariadb服务
systemctl stop mariadb.service

//备份所有的数据库文件
cd /var/lib/mysql/
tar -zcvf /root/mysql_`date +%F`.tar.gz *

//还原备份的数据,还原之后记得修改文件属主
tar -xvf /root/mysql_2021-03-08.tar.gz -C /var/lib/mysql/

chown -R mysql:mysql /var/lib/mysql/

systemctl start mariadb.service

2.3 Xtrabackup备份工具

XtraBackup(PXB)工具是Percona公司用perl语言开发的一个用于 MySQL数据库物理热备的备份工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写)。

Xtrabackup中包含两个工具:

  • xtrabackup :用于热备份innodb,xtradb引擎表的工具,不能备份其他表。
  • innobackupex :提供了用于myisam(会锁表)和innodb引擎,及混合使用引擎备份的能力。

Xtrabackup的优点:

  • 备份速度快,物理备份可靠
  • 备份过程不会打断正在执行的事务(无需锁表)
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动备份校验
  • 还原速度快
  • 可以流传,将备份传输到另外一台机器上
  • 在不增加服务器负载的情况备份数据
  • 支持增量备份
//语法:
xtrabackup | innobackupex  [--defaults-file=#] [--backup | --prepare | --copy-back | --move-back] [OPTIONS]

Xtrabackup工具备份常用选项:

选项类别 命令全名 含义
通用选项 --user=name 数据库账号名
通用选项 --password 数据库密码
通用选项 --host=name 数据库主机IP地址
通用选项 --port=name 数据库主机端口号
通用选项 --defaults-file 定义包含默认配置的文件的路径。
通用选项 --socket=name 数据库socket文件地址
备份选项 --backup 创建备份并且放入--target-dir目录中
备份选项 --target-dir 备份文件的存放目录路径,如果目录不存在,xtrabakcup会创建。如果目录存在且为空则成功。不会覆盖已存在的文件。
备份选项 --databases=name 指定要备份的数据库
增量选项 --incremental-basedir 使用增量备份
压缩/解压选项 --compress compress压缩
压缩/解压选项 --compress-threads=n 启用n个线程进行压缩
压缩/解压选项 --decompress 准备数据之前先解压
准备选项 --prepare 实现同步回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
准备选项 --apply-log-only 阻止回滚未提完成的事务(最后一次增量备份的准备不需要此选项)
准备选项 --incremental-dir 指定增量备份,与全备合并
还原选项 --copy-back 做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。
还原选项 --move-back 这个选项与–copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项会移除backup文件,用时候必须小心。
//下载安装Xtrabackup备份工具
wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.22-15/binary/redhat/8/x86_64/percona-xtrabackup-80-8.0.22-15.1.el8.x86_64.rpm

dnf -y localinstall percona-xtrabackup-80-8.0.22-15.1.el8.x86_64.rpm 

//完全备份
trabackup --backup --databases=test --target-dir=/backup/xtrabackup/ -uroot -p123456

//恢复阶段:准备备份,恢复之前需要准备备份
xtrabackup --prepare --target-dir=/backup/xtrabackup/

//恢复数据(保证要还原的数据库服务器的data目录为空)
rm -rf /var/lib/mysql/*		//模拟数据丢失

xtrabackup --copy-back --target-dir=/backup/xtrabackup/

chown -R mysql:mysql /var/lib/mysql    

systemctl restart mysqld

增量备份:

//先创建完全备份
xtrabackup --backup --databases=test --target-dir=/backup/xtrabackup/ -uroot -p123456

//创建第一次增量备份
xtrabackup --backup --databases=test --target-dir=/backup/inc1/ --incremental-basedir=/backup/xtrabackup/  -uroot -p123456

//创建第二次增量备份
xtrabackup --backup --databases=test --target-dir=/backup/inc2/ --incremental-basedir=/backup/inc1/ -uroot -p123456

//恢复阶段:准备全量备份
xtrabackup --prepare --apply-log-only --target-dir=/backup/xtrabackup/

//准备第一次增量备份,将第一次增量备份与全备合并
xtrabackup --prepare --apply-log-only --target-dir=/backup/xtrabackup/ --incremental-dir=/backup/inc1

//准备第二次增量备份,将第二次增量备份与全备合并
xtrabackup --prepare --target-dir=/backup/xtrabackup/ --incremental-dir=/backup/inc2/

//恢复数据(保证要还原的数据库服务器的data目录为空)
rm -rf /var/lib/mysql/*		//模拟数据丢失

xtrabackup --copy-back --target-dir=/backup/xtrabackup/

chown -R mysql:mysql /var/lib/mysql    

systemctl restart mysqld

2.4 Mariabackup备份工具

Mariabackup是MariaDB提供的一个开源工具,用于对InnoDB,Aria和MyISAM表进行物理在线备份。这个工具基于Percona的XtraBackup解决方案。

//语法:
mariabackup [--defaults-file=#] [--backup | --prepare | --copy-back | --move-back] [OPTIONS]

完全备份与恢复:

//全量备份
mariabackup --backup --target-dir /root/mariadb-backup-`date +%F` --user root --password "1"


//恢复阶段:准备全备数据,恢复之前必须准备
mariabackup --prepare --target-dir /root/mariadb-backup-2021-03-10/ --user root --password "1"

//恢复数据(保证要还原的数据库服务器的data目录为空)
rm -rf /var/lib/mysql/*		//模拟数据丢失

mariabackup --copy-back --target-dir /root/mariadb-backup-2021-03-10/ --user root --password "1"

chown -R mysql.mysql /var/lib/mysql/

systemctl restart mariadb.service

增量备份与恢复:

//全量备份,增量备份前需要先进行一次全量备份
mariabackup --backup --target-dir /root/mariadb-backup-`date +%F` --user root --password "1"

//基于全量备份,进行第一次增量备份
mariabackup --backup --target-dir /root/mariadb-backup-`date +%F`-inc1 --incremental-basedir /root/mariadb-backup-2021-03-10/ --user root --password "1"

//恢复阶段:现在有2个备份,一个是全备一个是增量备份
//准备全备数据
mariabackup --prepare --apply-log-only --target-dir /root/mariadb-backup-2021-03-10/ --user root --password "1"

//将增量备份与全备合并
mariabackup --prepare --target-dir /root/mariadb-backup-2021-03-10/ --incremental-dir /root/mariadb-backup-2021-03-10-inc1/ --user root --password "1"

//如果有多次增量备份,按照增量备份顺序依次将增量备份与全备合并,记得加--apply-log-only选项,最后一次增量备份不需要添加该选项

//恢复数据(保证要还原的数据库服务器的data目录为空)
rm -rf /var/lib/mysql/*		//模拟数据丢失

mariabackup --copy-back --target-dir /root/mariadb-backup-2021-03-10/ --user root --password "1"

chown -R mysql.mysql /var/lib/mysql/

systemctl restart mariadb.service