MySQL备份功能在实际应用中的重要程度不需要多说,在误删重要数据后或者数据库被攻击后,备份数据的作用就突显出来了。
MySQL备份方式从不同的角度分析有不同的分类。 从运行状态分析,有冷备份和热备份之分。冷备份一般是在数据库关闭或者暂时不对外提供服务时,选择某一时间节点对完整数据库进行快照备份。热备份一般是在数据库运行的状态下,直接对数据进行备份,不影响MySQL对外提供服务。这里主要讲下这两种方式的实现。
冷备份
-
直接通过MySQL自带的mysqldump工具进行备份
备份实现
# mysqldump -u账号 -p密码 要备份的数据库名 > 要备份到的目录及文件名 mysqldump -uroot -proot test > /data/backup/test.sql
恢复实现
mysql -f -uroot -proot test < /data/backup/test.sql
-
使用 mydumper 工具进行备份
mydumper是一个针对MySQL和drizzle的高性能多线程的备份和恢复工具。此工具的开发人员分别来自MySQL、facebook、skysql公司,目前已经有一些大型产品业务测试并使用了该工具。
它的特性/优点:
- 由C语言编写
- 相比于MySQL自带的 mysqldump,其速度快了近10倍
- 具有事务性和非事务性表一致的快照(适用于0.2.2+)
- 可快速进行文件压缩(File compression on-the-fly)
- 支持导出binlog
- 可多线程恢复(适用于0.2.1+)
- 可以用守护进程的工作方式,定时扫描和输出连续的二进制日志
它的安装
# 安装需要的依赖 yum install glib2-devel zlib-devel pcre-devel cmake # 下载。也可以直接在GitHub上下载安装包或者rpm git clone https://github.com/maxbube/mydumper.git cd mydumper cmake . make && make install
安装完可以输出下版本号测试是否安装成功
[root@localhost mydumper]# mydumper -V mydumper 0.10.6, built against MySQL 5.7.34 [root@localhost mydumper]#
备份实现
mydumper -u root -p root -B test -o /data/backup/test.sql
恢复实现
myloader -u root -p root -B test -d /data/backup/test.sql
参数介绍
-host / -h:连接的MySQL服务器
-user / -u:用户备份的连接用户
-password / -p:用户的密码
-port / -P:连接端口
-socket / -S:连接socket文 件
-database / -B:需要备份的数据库
-table-list / -T:需要备份的表,用逗号(,)分隔
-outputdir / -o:输出的目录
-build-empty-files / -e:默认无数据则只有表结构文件
-regex / -x:支持正则表达式,如mydumper-regex'(2l(mysqltest)'
-ignore-engines / -i:忽略的存储引擎
-no-schemas / -m:不导出表结构
-long-query-guard:长查询,默认60s
-kill-long-queries / -k:可以设置kill长查询
-verbose / -v:0=silent,1=errors, 2=warmings,3=info,默认是2
-binlogs / -b:导出binlog
-daemon / -D:启用守护进程模式
-snapshot-interval / -I:dump快照间隔时间,默认60s
-logfile / -L:目志输出,一般在Daemon模式下使用。
mydumper与mysqldump备份数据效率的对比
[root@localhost backup]# time mysqldump -uroot -proot test > /data/backup/test1.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. real 0m0.033s user 0m0.006s sys 0m0.005s [root@localhost backup]# time mydumper -u root -p root -B test -o /data/backup/test.sql real 0m0.019s user 0m0.005s sys 0m0.007s [root@localhost backup]#
这里由于数据量很少,差距看的不是很明显,但还是可以看出mydumper要比mysqldump效率高不少
暴力备份,直接拷贝存放数据文件的 data 目录(不推荐)
热备份
-
InnoDB Hot Backup
InnoDB Hot Backup 是MySQL社区版的热备份工具,但是它是收费的,只能试用30天,只有购买企业版才可以得到永久使用权。
-
xtrabackup
xtrabackup 是Percona公司发布的一个开源热备份工具,支持在线热备份(备份时不影响数据读写),是商业备份工具 InnoDB Hot Backup 的一个很好的替代品。
xtrabackup中包含两个工具:
- xtrabackup:用于热备份InnoDB及XtraDB表中数据的工具,不能备份其他类型的表,也不能备份数据表结构
- innobackupex:是将xtrabackup进行封装的perl 脚本,可以说是xtrabackup的升级版,它提供了备份MyISAM表的能力。由于它的功能更为全面完善,所以一般选择它来进行热备份
安装方式:
下载地址:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
操作手册:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
注意事项:
1、xtrabackup安装的版本需要和MySQL对应。xtrabackup8.0只能备份MySQL8.0的数据。如果MySQL版本没有达到8.0, 则不能使用这个版本。
2、xtrabackup8.0及以上高版本没有innobackupex命令
这里MySQL版本是5.7,所以下载的 xtrabackup2.4 版本
[root@localhost ~]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/perconaxtrabackup-24-2.4.4-1.el7.x86_64.rpm [root@localhost ~]# yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm [root@localhost ~]# rpm -qa | grep xtrabackup percona-xtrabackup-24-2.4.4-1.el7.x86_64 [root@localhost ~]#
查看当前 xtrabackup 版本及对应支持的MySQL版本
[root@localhost ~]# xtrabackup -v xtrabackup version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2) [root@localhost ~]#
常用参数:
--host 指定主机 --user 指定用户名 --password 指定密码 --port 指定端口 --databases 指定数据库 --incremental 创建增量备份 --incremental-basedir 指定包含完全备份的目录 --incremental-dir 指定包含增量备份的目录 --apply-log 对备份进行预处理操作 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。 因此,此时数据文件仍处于不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。 --redo-only 不回滚未提交事务 --copy-back 恢复备份目录
备份操作:
# 完成后会自动在指定的备份目录下创建一个当前时间的文件夹 innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --databases test --backup /data/backup/test
恢复操作:
# 停止MySQL service mysql stop # 将存放mysql数据文件的data目录备份 mv /www/server/data /www/server/data_backup # 恢复操作,会自动创建data目录,创建的位置是my.cnf配置文件中配置的data目录地址 innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/test/2021-07-08_00-22-18 # 修改data目录权限 chown -R mysql:mysql /www/server/data # 启动MySQL service mysql start
原理解释:
- innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;
- xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的 checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待 状态(等待文件被创建)
- xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)
- innobackupex收到xtrabackup通知后哦,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、 MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。
- 当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;
- xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;
- innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;
- 最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。