在免费下载并使用的MySQL开源社区版本中,默认并不包含MEB(MySQL Enterprise Backup,MySQL企业版备份工具)物理热备工具,因为它是一款Oracle自研的企业级软件,用户需要付费才能使用。该工具功能强大,能够为MySQL数据库全局、增量、部分、流、压缩和加密备份与恢复等场景提供优秀的解决方案。对于甲骨文公司的付费用户而言,使用MEB工具来满足企业自身的备份与恢复需求,不失为一种明智的选择。
MEB软件介绍
MEB可用于提供在线的、非阻塞的企业级多平台热备份,包括Linux、Windows、Mac和Solaris。虽然MySQL企业备份工具可以备份非Innodb数据(如MYISAM表),但是要备份的MySQL服务器实例必须支持InnoDB。若备份任务是使用“--innodb=OFF”或“--skip-innodb”选项启动的,那么备份进程将会失败,服务器必须包含至少一个InnoDB表。MyISAM表和其他类型的文件不能像InnoDB表那样以非阻塞的方式进行备份,备份时将处于温备的模式。这就意味着在备份这些表时,与这些对象相关的DML业务将被锁定并等待。
1.下载MEB软件安装包并安装
MEB是Oracle旗下的一款企业级软件,要想下载该软件安装包,就必须开通MOS(MY ORACLE SUPPORT)账号,并且拥有相应的下载权限。在MOS站点下载MEB软件安装包的截图如图6-1所示。
下载并安装MEB,命令如下:
shell> unzip p29358807_410_Linux-x86-64.zip
shell> md5sum meb-4.1.3-linux-glibc2.12-x86-64bit.tar.gz
shell> tar zxvf meb-4.1.3-linux-glibc2.12-x86-64bit.tar.gz
shell> cd meb-4.1.3-linux-glibc2.12-x86-64bit
shell> ./bin/mysqlbackup --version
MySQL Enterprise Backup version 4.1.3 Linux-4.1.12-37.4.1.el6uek.x86_64-x86_64
...
注意:不同的MEB版本需要与不同的MySQL版本严格对应。
MySQL Enterprise Backup 8.0 only supports MySQL 8.0.
MySQL Enterprise Backup 4.1.3 only supports MySQL 5.7.
MySQL Enterprise Backup 3.12.4 only supports MySQL 5.6 and earlier.
2.创建MEB备份账户
通常,用户都会选择使用MySQL系统账户root@localhost来进行备份。如果企业对账户的使用设置了严格的管控和限制,就需要创建最小权限的备份账户,以执行备份任务。创建MEB备份账户的命令如下:
mysql> CREATE USER 'mysqlbackup'@'localhost' IDENTIFIED BY 'Abcd321#';
mysql> GRANT RELOAD ON *.* TO 'mysqlbackup'@'localhost';
mysql> GRANT CREATE, INSERT, DROP, UPDATE ON mysql.backup_progress TO
'mysqlbackup'@'localhost';
mysql> GRANT CREATE, INSERT, SELECT, DROP, UPDATE, ALTER ON mysql.backup_history
TO 'mysqlbackup'@'localhost';
mysql> GRANT REPLICATION CLIENT ON *.* TO 'mysqlbackup'@'localhost';
mysql> GRANT SUPER ON *.* TO 'mysqlbackup'@'localhost';
mysql> GRANT PROCESS ON *.* TO 'mysqlbackup'@'localhost';
mysql> GRANT SELECT ON performance_schema.replication_group_members TO
'mysqlbackup'@'localhost';
注意:如果使用的是多主组复制设置,那么请确保所有的主节点都授予了这些权限。
3.MEB配置文件和参数
MEB既可以在命令行上指定选项,也可以在选项文件中作为配置参数指定。将数据库配置信息传递给mysqlbackup的首选方法是使用“--default-file”选项,如果使用了该选项,则它必须是MEB命令中出现的第一个选项。通常,MEB遵循以MySQL的风格来处理配置选项,即将[mysqlbackup]和[client]组作为命令行选项进行传递。运行mysqlbackup时指定的任何命令行选项都将覆盖配置文件中的值,对于重复的选项,应以最后读取的值为准。MEB还可以读取[mysqld]组中的选项,在无法连接到MySQL实例时,检测与源库相关的参数。在mysqlbackup选项名称中,连字符(-)和下划线(_)可以互换使用,类似于使用相同约定的mysqld参数。
MEB程序需要根据如下优先级读取需要备份的MySQL数据的位置。
1)正在运行的MySQL实例的连接信息。
2)在mysqlbackup命令行上指定的参数。
3)MySQL配置文件(默认情况下是指Unix上的my.cnf和Windows上的my.ini)。
MEB备份与恢复示例
全局备份与恢复
基于MEB实现全局(实例级)的备份和恢复,通常有三个阶段,分别是备份(backup)、日志应用(apply log)和复制恢复(copy back)。在备份阶段,程序首先会发起多个后台线程,最先记录备份开始时的LSN(Log Sequence Number,日志序列号),然后开始复制共享系统表空间文件、Undo和所有InnoDB类型文件,完成之后会持有短暂的全局锁,这期间会复制所有非InnoDB类型的文件并记录数据页中最新的LSN,然后将备份期间产生的数据变更信息写入ibbackup_logfile文件,同时记录二进制日志的文件名和位置(如果当前实例中已开启了二进制日志特性),以便部署和复制,此日志输出格式为MEB_<Timestamp>_backup.log。日志应用阶段,基于现有备份片(Backup Pieces),程序可根据备份时记录的最新LSN解析ibbackup_logfile文件,并批量应用日志记录,以保证数据的一致性,此日志的输出格式为MEB_<Timestamp>_apply_log.log;复制恢复阶段,程序依次将共享系统表空间文件,Undo、InnoDB类型文件,非InnoDB类型和Redo文件等复制到目标位置,此日志的输出格式为MEB_<Timestamp>_copy_back.log。当三个阶段的操作均成功完成,就可以启动该备份恢复的实例,对外提供服务了。
MEB全局备份有两种实现方式,既可以将MySQL实例备份到指定目录,也可以将其备份到单个映像文件中。
目录备份与恢复
1)备份全局实例到指定目录。创建与备份相关的目录结构,命令如下:
shell> mkdir -p /backups/{data,tmpdata,conf}
shell> chown -R mysql:mysql /backups
mysqlbackup启动联机热备时,可以通过“--host”“--user”和“--password”选项建立与MySQL实例的连接,以便获取与备份相关的信息并记录到相关的备份文件中。并在首次执行备份时,在MySQL系统库下自动创建backup_history和backup_progress两张表,以记录备份任务执行的相关信息,包括备份的时间、类型、格式、LSN、二进制日志位置、执行状态、错误信息、锁定时间和备份执行各阶段的状态等。
注意:在选项文件[client]组中指定连接选项,若password选项值包含了特殊字符,则需要加上单引号,否则调用mysqlbackup程序时会报连接失败的错误。
执行全局备份,命令如下:
shell> ./mysqlbackup -uroot -p --socket=/mysql/product/scene1/data/mysql.sock \
--backup-dir=/backups/data --with-timestamp backup
...
IMPORTANT: Please check that mysqlbackup run completes successfully.
At the end of a successful 'backup' run mysqlbackup
prints "mysqlbackup completed OK!".
...
mysqlbackup completed OK!
为了方便起见,可以使用“--with-timestamp”选项在备份目录下创建以时间戳命名的唯一子目录,以保存备份数据,该方式允许删除和归档超过一定时间的备份数据。使用目录备份时,若未指定“--with-timestamp”选项,则需要为每个备份作业指定一个唯一的目录。
2)全局备份应用日志记录,命令如下:
shell> ./mysqlbackup --backup-dir=/backups/data/2020-01-21_10-45-39 apply-log
...
IMPORTANT: Please check that mysqlbackup run completes successfully.
At the end of a successful 'apply-log' run mysqlbackup
prints "mysqlbackup completed OK!".
...
mysqlbackup completed OK!
3)全局备份复制恢复至目标位置(原地恢复)。首先,创建临时实例scenetmp数据目录,命令如下:
shell> mkdir -p /mysql/product/scenetmp/{data,log,binlog,relaylog,redo,undo, mysql-files}
然后,在选项文件/etc/my.cnf中添加临时实例[mysqld@scenetmp]和[mysqlbackup@scenetmp]选项组,命令如下:
shell> cp /etc/my.cnf /etc/my.cnf.bak && vi /etc/my.cnf
[mysqld@scenetmp]
datadir=/mysql/product/scenetmp/data
innodb_log_group_home_dir=/mysql/product/scenetmp/redo