mysql enterprise backup
一、MySQL Enterprise Backup的特点
MySQL Enterprise Backup是一款专门用于备份MySQL数据库发工具。它是一个跨平台的高性能备份工具,它具有丰富的功能,包括:热备份,增量备份,选择备份,直接备份到云,加密,压缩备份等。
此工具是针对Innodb引擎进行优化的,但它同时可以备份和恢复所有MySQL能支持的引擎。它以block级别进行并行备份,性能大大优于逻辑备份工具如mysqldump。
它是一款商业收费软件。
二、下载和安装
到Oracle的edelivery网站上下载:
安装:
[root@centos7 mysqlbackup]# unzip V1031511-01.zip
Archive: V1031511-01.zip
extracting: mysql-commercial-backup-8.0.31-1.1.el7.x86_64.rpm
extracting: README.txt
[root@centos7 mysqlbackup]# ll
总用量 14500
-rw-r--r-- 1 root root 7418976 9月 14 10:22 mysql-commercial-backup-8.0.31-1.1.el7.x86_64.rpm
-rw-r--r-- 1 root root 224 10月 6 14:48 README.txt
-rw-r--r-- 1 root root 7419492 10月 28 09:51 V1031511-01.zip
[root@centos7 mysqlbackup]# rpm -ivh mysql-commercial-backup-8.0.31-1.1.el7.x86_64.rpm
警告:mysql-commercial-backup-8.0.31-1.1.el7.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:mysql-commercial-backup-8.0.31-1.################################# [100%]
三、mysqlbackup备份准备工作
本章介绍使用mysqlbakcup的准备工作和使用方法;
备份无小事,在备份之前,需要做好以下的准备工作,保证备份的正常运行。
3.1 备份的准备工作
需要做准备的工作如下几点:
3.1.1 备份位置和空间的配置。
建议备份的目录和数据库文件的目录区分开,避免备份把空间撑爆了而导致系统不能使用;
3.1.2 设置备份策略(备份频率、备份保留周期)
同时计算下每次备份所需要的磁盘空间再根据备份策略合理安排备份的空间;
3.1.3 创建单独的备份用户
其他业务分开账号的使用,数据库作为重要的系统,一般都会每年变更管理密码的,这里单独使用一个避免后期还需要变更;
备份用户所需要的基本权限如下,也可以直接赋予所有权限。
create user 'mysqlbackup'@'localhost' identified by 'Abcd@1234';
GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_progress TO 'mysqlbackup'@'localhost';
GRANT CREATE, INSERT, SELECT, DROP, UPDATE ON mysql.backup_history TO 'mysqlbackup'@'localhost';
GRANT REPLICATION CLIENT ON *.* TO 'mysqlbackup'@'localhost';
GRANT SUPER ON *.* TO 'mysqlbackup'@'localhost';
GRANT LOCK TABLES, SELECT, CREATE, DROP, FILE ON *.* TO 'mysqlbackup'@'localhost';
grant BACKUP_ADMIN on *.* to 'mysqlbackup'@'localhost';
#经实验验证,需要的权限不止以上权限,所有直接赋予全部权限
grant all on *.* to 'mysqlbackup'@'localhost';
3.2 备份库主要选项
备份其实主要的内容也就是backup、restore和校验。每个阶段使用的主要参数如下:
- Backup operations: backup, backup-and-apply-log, backup-to-image
- Update operations: apply-log, apply-incremental-backup
- Restore operations: copy-back, copy-back-and-apply-log
- Validation operation: validate Single-file backup
- operations: image-to-backup-dir, backup-dir-to-image, list-image, extract
在3.12.3以下的版本backup-and-apply-log这个备份的时候不能结合参数compress使用。mysqlbackup官方的文档建议使用backup-to-image选项,该方法性能更好,而且备份的文件也更小。
备注:
When used with the apply-log or copy-back-and-apply-log operation, uncompresses a compressed backup before applying the InnoDB log. When used with the copy-back operation,uncompresses a compressed prepared backup (created by the backup-and-apply-log command with the --compress option) before restoring it to a server (only supported for MySQL Enterprise Backup 3.12.3 and later).
backup-to-imageProduces a single-file backup holding the backup data. In most cases, single-file backups are preferred over directory backups, which are created using the backup command.
3.3 备份库主要参数
可以通过mysqlbackup --help会显示丰富的参数说明,这边列几个比较常见的参数:
参数 | 说明 | 备注 |
---|---|---|
–backup-dir | The directory to store the backup data. | |
–backup-image | Specifies the path name of the backup image. | 结合backup-to-image使用 |
–compress | Create backup in compressed format. | 默认级别是1 |
–compress-level | Specifies the level of compression. | Specify value from 0-9. Specify value 0 to disable compression. Specify value 1 for fastest compression. Specify value 9 for best compression. |
–uncompress | Uncompress the compressed backup before an apply-log,copy-back, or copy-back-and-apply-log operation. | 如果备份是有使用compress,还原的时候就得使用该参数 |
–datadir | Path to mysql server data directory. | |
–defaults-file | Only read default options from the given file. | |
–force | Force overwriting of data, log, or image files, depending on the operation. | 进行强制覆盖 |
–incremental | Specifies that the associated backup or backup-to-image operation is incremental. | 增量备份选项 |
–incremental-backup-dir | Specifies the location under which to store data from an incremental backup. | 增量备份保存位置 |
–incremental-base | The specification of base backup for --incremental option. | 上次完整备份的位置 |
–with-timestamp | Create a subdirectory underneath the backup directory with a name formed from the timestamp of the backup operation. | 根据时间戳生成一个文件,因为备份的时候需要在一个空的目录保存文件,所以一般建议使用整个参数 |
四、备份与还原
4.1 backup-to-image
4.1.1 全量备份与还原
备份image
备份命令:
mysqlbackup \
--user=mysqlbackup --password=Abcd@1234 \
--backup-image=my_full_bak.mbi \
--backup-dir=/backup \
--show-progress \
--compress \
--with-timestamp \
backup-to-image
参数解释:
–backup-image 生成的备份image名称
–backup-dir 生成的备份image所在目录
–show-progress 显示备份进度[可选项]
–compress 对备份image进行压缩节省空间[可选项]
–with-timestamp 在backup-dir目录下生成’年-月-日-时-分-秒’的目录存储备份image
backup-to-image 声明这是备份为image的备份
备份后目录结构如下:
[root@centos7 backup]# ll /backup/2022-10-28_11-44-53/
总用量 56136
-rw-r--r-- 1 root root 255 10月 28 11:44 backup-my.cnf
drwxr-x--- 2 root root 6 10月 28 11:44 datadir
drwxr-x--- 2 root root 159 10月 28 11:44 meta
-rw-r----- 1 root root 57447891 10月 28 11:44 my_full_bak.mbi
-rw-r----- 1 root root 22562 10月 28 11:44 server-all.cnf
-rw-r----- 1 root root 507 10月 28 11:44 server-my.cnf
查看与检验image
可以通过list-image查看备份image中的文件内容,list命令:
[root@centos7 backup]# mysqlbackup --backup-image=/backup/2022-10-28_11-44-53/my_full_bak.mbi list-image
可以通过validate验证备份image的有效性,validate命令:
[root@centos7 backup]# mysqlbackup \
--backup-image=/backup/2022-10-28_11-44-53/my_full_bak.mbi \
validate
还原image
还原数据库备份之前必须做完成以下前提:
- 关闭mysqld服务
- 清空mysql的datadir目录
还原命令:
mysqlbackup \
--datadir=/var/lib/mysql \
--backup-image=/backup/2022-10-28_11-44-53/my_full_bak.mbi \
--backup-dir=/backup/2022-10-28_11-44-53/tmp \
--uncompress \
copy-back-and-apply-log
参数解释:
–datadir mysql server的数据库datadir,数据将还原至此。
–backup-image image备份的路径与名称。
–backup-dir image临时工作目录用于释放image都此目录,必须为空。
–uncompress [可选项]。
copy-back-and-apply-log 应用redolog并且copy datafile至datadir。
4.1.2 增量备份与还原
备份image
做增量备份之前,需要做一次全备,作为基础。
全量备份:
mysqlbackup \
--user=mysqlbackup \
--password=Abcd@1234 \
--backup-image=my_full_bak.mbi \
--backup-dir=/backup \
--show-progress \
--compress \
--with-timestamp \
backup-to-image
增量备份,[方法A]:
mysqlbackup \
--user=mysqlbackup \
--password=Abcd@1234 \
--with-timestamp \
--compress \
--incremental \
--incremental-base=dir:/backup/2022-10-28_13-51-59 \
--backup-dir=/backup \
--backup-image=my_inc_bak.mbi \
backup-to-image
此种方法不是很科学,因为在参数中需要指定详细的时间戳作为base进行备份。
增量备份,[方法B]:
mysqlbackup \
--user=mysqlbackup \
--password=Abcd@1234 \
--with-timestamp \
--compress \
--incremental \
--incremental-base=history:last_backup \
--backup-dir=/backup/ \
--backup-image=my_inc_bak.mbi \
backup-to-image
–incremental-base=dir:/data/backup/2022-10-28_13-51-59是上次全备或增备所在目录,那么这次增量备份就要基于这个目录中的备份为基准。
–incremental-base=history:last_backup是直接使用history:last_backup代替上一次的备份,省去人工寻找目录的麻烦,MEB会自动到backup_history表中查找上一次备份的目录。这是MEB为我们做的易用性改进。
多个增量备份,只需要多次执行上面的命令即可。
还原image
恢复过程要遵循先恢复全量备份,再恢复增量备份的过程
还原数据库备份之前必须做完成以下前提:
- 关闭mysqld服务
- 清空mysql的datadir目录
systemctl stop mysqld.service
mv /var/lib/mysql /var/lib/mysql_bak
还原全备命令:
mysqlbackup \
--datadir=/var/lib/mysql \
--backup-image=/backup/2022-10-28_13-51-59/my_full_bak.mbi \
--backup-dir=/backup/2022-10-28_13-51-59/tmp \
--uncompress \
copy-back-and-apply-log
还原增备命令:
mysqlbackup \
--backup-image=/backup/2022-10-28_13-58-26/my_inc_bak.mbi \
--backup-dir=/backup/2022-10-28_13-58-26/tmp \
--datadir=/var/lib/mysql \
--incremental \
copy-back-and-apply-log
如果多个增量还原,只需按照备份的顺序,多次执行上面的命令即可。注意----backup-image每次都要用当前增量备份的目录。
4.2 datafile
4.2.1 全量备份与还原
备份datafile
备份命令:
mysqlbackup \
--user=mysqlbackup \
--password=Abcd@1234 \
--backup-dir=/backup \
--show-progress \
--compress \
--with-timestamp \
backup
参数解释:
–backup-dir 生成的备份datafile所在目录。
–show-progress 显示备份进度[可选项]。
–compress 对备份image进行压缩节省空间[可选项]。
–with-timestamp 在backup-dir目录下生成’年-月-日-时-分-秒’的目录存储备份image。
backup:声明这是备份为datafile的备份。
备份后目录结构如下:
[root@centos7 2022-10-28_14-09-31]# ll
总用量 36
-rw-r--r-- 1 root root 255 10月 28 14:09 backup-my.cnf
drwxr-x--- 8 root root 4096 10月 28 14:09 datadir
drwxr-x--- 2 root root 127 10月 28 14:09 meta
-rw-r----- 1 root root 22562 10月 28 14:09 server-all.cnf
-rw-r----- 1 root root 507 10月 28 14:09 server-my.cnf
还原datafile
还原数据库备份之前必须做完成以下前提:
- 关闭mysqld服务
- 清空mysql的datadir目录
分步还原
第一步:apply-log
因为在备份期间数据库还在读写,把这期间产生的redolog贴回数据文件上,以达到数据一致性
mysqlbackup \
--backup-dir=/backup/2022-10-28_14-09-31 \
--uncompress \
apply-log
第二步:copy-back
把已经达到数据一致性的数据文件copy到mysql的datadir目录下,此时不能再用uncompress参数,因此apply-log时已经uncompress过了。
mysqlbackup \
--datadir=/var/lib/mysql \
--backup-dir=/backup/2022-10-28_14-09-31 \
copy-back
合并还原
以上两步可以合为一步完成,即把apply-log与copy-back合并为copy-back-and-apply-log,它首先会把redolog贴回datafile并初始化新的redolog,然后把backupdir目录下的全部数据copy回mysql的datadir
mysqlbackup \
--datadir=/var/lib/mysql \
--backup-dir=/backup/2022-10-28_14-09-31 \
--uncompress \
--show-progress \
copy-back-and-apply-log
参数解释:
–datadir mysql server的datadir目录,就是要还原到这里。
–backup-dir 生成的备份datafile所在目录。
–show-progress 显示还原进度[可选项]。
–uncompress [可选项]
–apply-log 把备份期间的redo log贴回datafile。
–copy-back 把datafile复制回datadir目录。
–copy-back-and-apply-log 把备份期间的redolog贴回datafile再把datafile复制回datadir目录。
注意:mysqlbackup 8.0.21版本开始可以识别备份是否为compress,如果是,那么它在还原时会自动uncompress,不需要显示告诉它。所以这个选项是可选。
4.2.2 增量备份与还原
备份datafile
与image方式类似,做增量备份之前,需要做一次全备,作为基础。
全量备份:
mysqlbackup \
--user=mysqlbackup \
--password=Abcd@1234 \
--backup-dir=/backup \
--show-progress \
--compress \
--with-timestamp \
backup
增量备份,[方法A]:
mysqlbackup \
--user=mysqlbackup \
--password=Abcd@1234 \
--with-timestamp \
--compress \
--incremental \
--incremental-base=dir:/backup/2022-10-28_14-22-53 \
--incremental-backup-dir=/backup \
backup
增量备份,[方法B]:
mysqlbackup \
--user=mysqlbackup \
--password=Abcd@1234 \
--with-timestamp \
--compress \
--incremental \
--incremental-base=history:last_backup \
--incremental-backup-dir=/backup \
backup
与image方式备份相似,–incremental-base的写法也有两种,还是建议使用–incremental-base=history:last_backup,自动寻找上一次备份。
多个增量备份,只需要多次执行上面的命令即可。
还原datafile
还原数据库备份之前必须做完成以下前提:
- 关闭mysqld服务
- 清空mysql的datadir目录
全备apply-log
因为在备份期间数据库还在读写,把这期间产生的redolog贴回数据文件上,以达到数据一致性。
mysqlbackup \
--backup-dir=/backup/2022-10-28_14-22-53 \
apply-log
增备apply-incremental-backup
增备apply-incremental-backup命令:
mysqlbackup \
--incremental-backup-dir=/backup/2022-10-28_14-27-40 \
--backup-dir=/backup/2022-10-28_14-22-53 \
apply-incremental-backup
如果多个增量还原,只需按照备份的顺序,多次执行上面的命令即可。注意–incremental-backup-dir每次都要用当前增量备份的目录。
copy-back
将备份copy-back到datadir命令:
mysqlbackup \
--datadir=/var/lib/mysql \
--backup-dir=/backup/2022-10-28_14-22-53 \
copy-back-and-apply-log
五、注意事项
5.1 操作细节
还原后,datadir目录下的数据文件用户属组不是mysql,因此要修改其属组,否则mysqld访问无法启动。
修改属组命令:
chown mysql.mysql /var/lib/mysql -R
启动mysqld服务:
systemctl start mysqld
5.2 安全配置
以上命令中存在安全漏洞:用户名和密码是明文写在命令中的,且命令冗长,不易操作。如何配置能让mysqlbackup更安全呢?
将user、password写到my.cnf中,mysqlbackup --defaults-file=/etc/my.cnf方式吗?掩耳盗铃罢了,因为在my.cnf中同样是明文的。这里我们使用mysql_config_editor来处理,既能隐藏密码,又能减少命令复杂度。mysql_config_editor 是什么,读者可以自行查阅官方文档,下面直接上命令:
配置:
将mysqlbackup要使用的登录连接信息通过mysql_config_editor加密保存起来:
mysql_config_editor set --login-path=mysqlbackup --user=mysqlbackup --password
Enter password:
#此处输入password后回车
查看:
看一看加密保存的信息:
[root@centos7 lib]# mysql_config_editor print --login-path mysqlbackup
[mysqlbackup]
user = "mysqlbackup"
password = *****
可以看到,密码被加密存储了。
改造:
mysqlbackup命令就可以如下改造,直接调用此加密信息:
改造前命令:
mysqlbackup \
--user=mysqlbackup \
--password=Abcd@1234 \
--backup-dir=/backup \
--show-progress \
--compress \
--with-timestamp \
backup
改造后:
mysqlbackup \
--login-path=mysqlbackup \
--backup-dir=/backup \
--show-progress \
--compress \
--with-timestamp \
backup
通过改造前后对比,安全性与易用性都得到加强。