mysql备份与复制

This commit is contained in:
罗祥
2019-08-19 17:57:03 +08:00
parent 283f13b371
commit 3fcf2cb888
2 changed files with 177 additions and 39 deletions

View File

@ -1,10 +1,37 @@
# 数据备份与恢复
## 一、备份
## 一、备份简介
### 2.1 备份分类
按照不同的思考维度,通常将数据库的备份分为以下几类:
**物理备份 与 逻辑备份**
+ 物理备份:备份的是完整的数据库目录和数据文件。由于其基本都是 IO 复制,并不含任何逻辑转换,因此其备份和恢复速度通常都比较快。
+ 逻辑备份:通过数据库结构和内容信息来进行备份。因为要执行逻辑转换,因此其速度较慢,并且在以文本格式保存时,其输出文件的大小要远大于物理备份。逻辑备份和还原的粒度可以从服务器级别(所有数据库)精确到具体表,但备份不会包括日志文件、配置文件等与数据库无关的内容。
**全量备份 与 增量备份**
+ 全量备份:备份服务器在给定时间点上的所有数据。
+ 增量备份:备份在给定时间跨度内(从一个时间点到另一个时间点)对数据所做的更改。
**在线备份 与 离线备份**
+ 在线备份:在数据库服务运行状态下进行备份。此时其他客户端依旧可以连接到数据库,但为了保证数据的一致性,在备份期间必然会存在对数据加锁的操作,此时客户端的访问仍然可能受限。
+ 离线备份:在数据库服务停机状态下进行备份。此时备份过程更加简单,但会此时由于无法提供对外服务,通常会对业务造成比较大的影响。
### 2.2 备份工具
MySQL 支持的备份工具有很多种,这里列出常用的三种:
+ **mysqldump**:这是 MySQL 自带的备份工具,其采用的备份方式是逻辑备份,支持全库备份、单库备份、单表备份。由于其采用的是逻辑备份,所以生成的备份文件比物理备份的大,且所需恢复时间也比较长。
+ **mysqlpump**:这是 MySQL 5.7 之后新增的备份工具,在 mysqldump 的基础上进行了功能的扩展,支持多线程备份,支持对备份文件进行压缩,能够提高备份的速度和降低备份文件所需的储存空间。
+ **Xtrabackup**:这是 Percona 公司开发的实时热备工具,能够在不停机的情况下进行快速可靠的热备份,并且备份期间不会间断数据库事务的处理。它支持数据的全备和增备,并且由于其采用的是物理备份的方式,所以恢复速度比较快。
## 二、mysqldump
### 2.1 基本语法
### 2.1 常用参数
mysqldump 的基本语法如下:
@ -104,11 +131,61 @@ mysql> source /root/mysqldata/titles_bak.sql;
### 2.3 增量备份
## 三、mysqlpump
### 3.1 简介
## 三、Xtrabackup
mysqlpump 在 mysqldump 的基础上进行了扩展增强,其主要的优点如下:
### 3.1 安装
- 能够并行处理数据库及其中的对象,从而可以加快备份进程;
- 能够更好地控制数据库及数据库对象(表,存储过程,用户帐户等);
- 能够直接对备份文件进行压缩;
- 备份时能够显示进度指标(估计值);
- 备份用户时生成的是 CREATE USER 与 GRANT 语句,而不是像 mysqldump 一样直接备份成数据,可以方便用户按需恢复。
### 3.2 常用参数
mysqlpump 的使用和 mysqldump 基本一致,这里不再进行赘述。以下主要介绍部分新增的可选项,具体如下:
+ **--default-parallelism=N**
每个并行处理队列的默认线程数。默认值为 2。
+ **--parallel-schemas=[N:]db_list**
用于并行备份多个数据库db_list 是一个或多个以逗号分隔的数据库名称列表N 为使用的线程数,如果没有设置,则使用 --default-parallelism 参数的值。
+ **--users**
将用户信息备份为 CREATE USER 语句和 GRANT语句 。如果想要只备份用户信息,则可以使用下面的命令:
```shell
mysqlpump --exclude-databases=% --users
```
+ **--compress-output=algorithm**
默认情况下mysqlpump 不对备份文件进行压缩。可以使用该选项指定压缩格式,当前支持 LZ4 和 ZLIB 两种格式。需要注意的是压缩后的文件可以占用更少的存储空间,但是却不能直接用于备份恢复,需要先进行解压,具体如下:
```shell
# 采用lz4算法进行压缩
mysqlpump --compress-output=LZ4 > dump.lz4
# 恢复前需要先进行解压
lz4_decompress input_file output_file
# 采用ZLIB算法进行压缩
mysqlpump --compress-output=ZLIB > dump.zlib
zlib_decompress input_file output_file
```
MySQL 发行版自带了上面两个压缩工具,不需要进行额外安装。以上就是 mysqlpump 新增的部分常用参数,完整参数可以参考官方文档:[mysqlpump — A Database Backup Program](https://dev.mysql.com/doc/refman/8.0/en/mysqlpump.html#option_mysqlpump_compress-output)
## 四、Xtrabackup
### 4.1 安装
Xtrabackup 可以直接使用 yum 命令进行安装,这里我的 MySQL 为 8.0 ,对应安装的 Xtrabackup 也为 8.0,命令如下:
@ -120,7 +197,7 @@ yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install percona-xtrabackup-80
```
### 3.2 全量备份
### 4.2 全量备份
#### 1. 创建备份
@ -164,22 +241,26 @@ chown -R mysql:mysql /usr/app/mysql-8.0.17/data
再次启动即可完成备份恢复。
### 3.3 增量备份
### 4.3 增量备份
使用 Xtrabackup 进行增量备份时,每一次增量备份都需要以上一次的备份为基础,之后再将增量备份运用到第一次全备之上,从而完成备份。具体操作如下:
#### 1. 创建备份
这里首先创建一个全备作为基础:
```shell
xtrabackup --user=root --password --backup --target-dir=/data/backups/base/
```
之后修改库中任意数据,然后进行第一次增量备份,此时需要使用 incremental-basedir 指定基础目录为全备目录:
```shell
xtrabackup --user=root --password --backup --target-dir=/data/backups/inc1 \
--incremental-basedir=/data/backups/base
```
再修改库中任意数据,然后进行第二次增量备份,此时需要使用 incremental-basedir 指定基础目录为上一次增备目录:
```shell
xtrabackup --user=root --password --backup --target-dir=/data/backups/inc2 \
@ -188,25 +269,47 @@ xtrabackup --user=root --password --backup --target-dir=/data/backups/inc2 \
#### 2. 准备备份
准备基础备份:
```shell
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base
```
将第一次备份作用于全备数据:
```shell
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc1
```
将第二次备份作用于全备数据:
```shell
xtrabackup --prepare --target-dir=/data/backups/base \
--incremental-dir=/data/backups/inc2
```
在准备备份时候,除了最后一次增备外,其余的准备命令都需要加上 `--apply-log-only` 选项来阻止事务的回滚,因为备份时未提交的事务可能正在进行,并可能在下一次增量备份中提交。如全备中的某些事务可能在第一次备份中才会提交,如果不进行阻止,那么增量备份将没有任何意义。
#### 3. 恢复备份
恢复备份和全量备份时相同,只需要最终准备好的全备数据复制到 MySQL 的数据目录下即可:
```shell
xtrabackup --copy-back --target-dir=/data/backups/base
# 必须修改文件权限,否则无法启动
chown -R mysql:mysql /usr/app/mysql-8.0.17/data
```
此时增量备份就已经完成。需要说明的是:按照上面的情况,如果第二次备份之后发生了宕机,那么第二次备份后到宕机前的数据依然没法通过 Xtrabackup 进行恢复,此时就只能采用上面介绍的分析二进制日志的恢复方法。由此可以看出,无论是采用何种备份方式,二进制日志都是非常重要的,因此最好对其进行实时备份。
## 五、二进制日志的备份
## 参考资料
+ [Chapter 7 Backup and Recovery](https://dev.mysql.com/doc/refman/8.0/en/backup-and-recovery.html)
+ [mysqldump — A Database Backup Program](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)
+ [mysqlpump — A Database Backup Program](https://dev.mysql.com/doc/refman/8.0/en/mysqlpump.html)
+ [Percona XtraBackup - Documentation](https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html)