3. Mysql之xtrabackup命令实战03
1.前言
在前面的两小节,分别介绍xtrabackup工具的一些特点以及优缺点,且在第二小节中介绍了它的备份工作原理。
2.实战(全量和增量)
版本:mysql server: 8.0.25 xtrabackup version:8.0.25
全量备份命令:
xtrabackup --defaults-file=xxxx --user=xxxx --password=xxxx --compress --throttle=300 --no-timestamp --stream-xbstream --use-memory=200MB --tmpdir=/backup/tmp --ftwrl-wait-timeout=120 --ftwrl-wait-threshold=120 --kill-long-queries-timeout=60 --kill-long-query-type=all --ftwrl-wait-query-type=all --no-version-check --target-dir=xxxx --backup
--no-timestamp:带上该参数后就不会在你指定的路径下再生成一个带有日期的目录,然后目录下面才是是你用innobackupex执行后的文件(我觉得备份时不要带上该参数,这样可以显示出全备时具体的时间,好方便管理)。
全量恢复命令:
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123 --prepare --target-dir=/data/backups/base
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123 --copy-back --target-dir=/data/backups/base
apply-log:目的是将redo进行重做,将已经提交的事务写到数据文件中,未提交的事务使用undo回滚掉,该过程是模拟CSR过程。
copy-back: 目的是将innobackupex出的文件全都拷贝到该配置文件所对应的目录中,或者使用move-back
增量备份
说明:
(1)增量备份的方式,是基于上一次备份进行增量。 (2)增量备份无法单独恢复。必须基于全备进行恢复。 (3)所有增量必须要按顺序合并到全备中。
步骤:
先进行全备,然后第一次增量备份基于第一次的全备
xtrabackup --defaults-file=xxxx --user=xxxx --password=xxxx --compress --throttle=300 --no-timestamp --stream-xbstream --use-memory=200MB --tmpdir=/backup/tmp --ftwrl-wait-timeout=120 --ftwrl-wait-threshold=120 --kill-long-queries-timeout=60 --kill-long-query-type=all --ftwrl-wait-query-type=all --no-version-check --target-dir=xxxx --backup
第一次增备(基于第一次全备)
xtrabackup --incremental-basedir=/data/backups/base --target-dir=/data/backups/inc1 --backup
--incremental-basedir:后面跟全备目录的绝对路径
第二次增备(主要是基于第二增量备份的)
xtrabackup --backup --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1
第三次、第四次等等........
增量备份恢复(过程)
1.先apply全量备份 xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base 2.然后再apply第一增量备份到全量备份中
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/incr1
3.然后再apply第二次增量备份到全量备份中
xtrabackup --prepare --target-dir=/data/backups/base --incremental-dir=/data/backups/incr2
4.最后将恢复的全量备份copy-back(类似于全量备份恢复)
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123 --copy-back --target-dir=/data/backups/base
3.基于时间点恢复
innobackupex命令本身不支持基于时间点的备份和恢复,所以可以先使用innobackupex进行全备,然后使用binlog来实现基于时间的恢复
- 完全备份用innobackup就可以了
- binlog备份可以使用binlog server(早期的binlog server在使用--raw选项时,可能会导致最后一个事务的commit标记丢失,从而导致最后一个事务在执行恢复是被回滚),或者使用rsync命令来备份binlog日志
3.1执行完全备份、binlog备份
在需要执行备份的数据库服务器上,查看当前binlog文件有哪些,一般在生产环境中备份数据需要被单独放在备份NFS服务器上,或者通过SCP、SSH传输到备份专用服务器上,不会放到本地
远程备份命令:
mysqlbinlog -R --raw --host='192.168.31.201' --user=rpl --password='123' --port=3307 --stop-never -r /data/binlogserver/ binlog.00001
##--host:主库的IP地址 --user:主库上备份用户 --password:主库上的备份用户的密码 这样我用的是主从复制是创建的复制用户来进行binlog备份的。 binlog.000001表示从
第一个binlog日志开始备份。
参数介绍:
- –defaults-file=file_name:仅读取该选项指定的配置文件
- –host=host_name, -h host_name:在使用binlog server时,指定从哪台mysql server主机上获取二进制日志
- –password[=password], -p[password]:连接到服务器时使用的密码
- –port=port_num, -P port_num:用于连接到远程server的TCP / IP端口号
- –raw:默认情况下,不使用–raw选项,mysqlbinlog读取二进制日志文件,并解析为文本格式输出事件(直接打印在标准输出中,可以使用输出重定向到文件中,也可以使用–result-file选项指定输出文件), –raw选项告诉mysqlbinlog仍然以读取binlog时的原始二进制格式输出。该选项需要结合–read-from-remote-server选项使用
- –read-from-remote-server, -R 1、使用该选项时,mysqlbinlog会伪装成一个slave,连接读取,请求指定的binlog file,主库获取接收到这个请求之后就创建一个binlog dump线程推送binlog给mysqlbinlog server。 2、从MySQL server读取二进制日志,而不是读取本地日志文件。对于这些选项–host,–password,–port,–protocol,–socket和–user,除非给出了–read-from-remote-server选项结合使用,否则单独指定这些TCP/IP连接选项将被忽略不生效
- –result-file=name, -r name:不与–raw选项一并使用时,此选项指定一个mysqlbinlog解析的文本存放的文件,当单独使用–raw选项时,mysqlbinlog会使用从远程server传输的原始binlog格式写入本地文件中,默认情况下输出文件与原始日志文件使用相同的文件名称。如果与–raw选项一并使用时,–result-file选项值会修改输出文件名的前缀,如:原本是mysql-bin.000001,使用–result-file=binlog,则输出文件名为binlogmysql-bin.000001
说明:这里binlog备份一般使用脚本进行备份的,参考脚本如下:

1 #!/bin/sh 2 BACKUP_BIN=/usr/local/mysql/bin/mysqlbinlog 3 LOCAL_BACKUP_DIR=/data/backup/binlog_bk 4 BACKUP_LOG=/data/backup/bakbinlog.log 5 REMOTE_HOST=192.168.56.100 6 #REMOTE_PORT=3306 7 SERVER_ID=20003306 8 REMOTE_USER=wanbin 9 REMOTE_PASS=mysql 10 #time to wait before reconnecting after failure 11 SLEEP_SECONDS=10 12 ##create local_backup_dir if necessary 13 ##mkdir -p ${LOCAL_BACKUP_DIR} 14 cd ${LOCAL_BACKUP_DIR} 15 ## 运行while循环,连接断开后等待指定时间,重新连接 16 while : 17 FIRST_BINLOG=$(mysql --host=${REMOTE_HOST} --user=${REMOTE_USER} --password=${REMOTE_PASS} -e 'show binary logs'|grep -v "Log_name"|awk '{print $1}'|head -n 1) 18 do 19 if [ `ls -A "${LOCAL_BACKUP_DIR}" |wc -l` -eq 0 ];then 20 LAST_FILE=${FIRST_BINLOG} ##如果备份目录中没有备份文件则 LAST_FILE=FIRST_FILE 21 else 22 LAST_FILE=`ls -l ${LOCAL_BACKUP_DIR} |tail -n 1 |awk '{print $9}'` ##last_file取序列最大的binlog文件 23 fi 24 ${BACKUP_BIN} -R --raw --host=${REMOTE_HOST} --user=${REMOTE_USER} --password=${REMOTE_PASS} ${LAST_FILE} --stop-never --stop-never-slave-server-id=${SERVER_ID} 25 echo "`date +"%Y/%m/%d %H:%M:%S"` mysqlbinlog停止,返回代码:$?" | tee -a ${BACKUP_LOG} 26 echo "${SLEEP_SECONDS}秒后再次连接并继续备份" | tee -a ${BACKUP_LOG} 27 sleep ${SLEEP_SECONDS} 28 done
4.总结:
基于时间的恢复:先恢复全备(这里就是用innobackupex进行备份恢复,比如说一天一全备),然后备份binlog日志(这里通过mysqlbinlog命令进行远程备份),可以通过修改上述binlog备份脚本,可以每10s中进行备份,如果你不能允许10s的话,可以设置1s设置实时备份。
如果我们的机器在某天的时刻突然宕机了,那么我们可以用前一天的全备+(全备完成之后的时刻到宕机时刻)的binlog备份就能完成整个数据库的恢复了。
-->这里我们要分析出数据库全备完成时刻到数据库宕机时刻之间的binlog 日志在哪个范围(找出来)
-->使用mysqlbinlog -h xxxx -u -p --start-position=xxx mysql-bin.00001 mysql-bin.000002 mysql-bin.00003 >/backup/binlog.sql
-->souce /backup/binlog.sql
这里有一篇关于binlog server的好文:https://cloud.tencent.com/developer/article/1072453
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下