现在公司的服务器没有上云,也没有专业的运维或dba 。 研究下mysql备份恢复技术,做个兜底保障,万一哪天机房、机器坏了。
数据库备份分类
- 热备,冷备、温备(只读)
- 逻辑备份(生成sql,或导出文件格式) 、物理备份 (备份底层文件)
- 完全备份,增量备份
- 日志备份(备份binlog,防止一些手误,代码写错,误删除数据,通过binlog可以恢复数据)
mysqldump做全量备份,binlog做增量备份
mysqldump是逻辑备份,热备份,全量备份(也可以部分备份的) 工具。
1mysqldump -uroot -p123456 --database d1 --single-transaction --flush-logs --master-data=2 > xxx.sql
- –flush-logs 备份后切换binlog文件
- –master-data 记录切换后的binlog文件名
- –single-transaction 在rr隔离级别下进行(innodb)
切换binlog文件
需要增量备份时,切换binlog文件
1mysqladmin -uroot -p123456 flush-logs # 切换新的binlog文件,(正在用的是不能搞的,因为他正在写)
把所有增量的binlog文件进行备份(最新的那个别备份)
还原
-
首先恢复旧的全量备份
source xxx.sql
-
然后将binlog增量还原至数据库
mysqlbinlog MySQL-bin.000002 MySQL-bin.000003... | mysql -u root -p 123456
xtrabackup 备份及恢复
xtrabackup 是 物理,热,全量+增量备份 的工具。percona公司开发的开源版本,实现了ibbackup的全部功能
xtrabackup 8.0->mysql8.0
xtrabackup 2.4 ->mysql5.1,5.5,5.6,5.7
- 直接备份innodb 底层数据文件
- 导出不需要转换,速度快
- 工作时对数据库的压力较小
- 更容易实现增量备份
直接拷贝裸文件可行吗
- 理论上可行,但是与很多问题
- 要同时备份frm文件,ibd文件,binlog文件,redolog文件等
- 必须冷备份,影响业务。
- 在不同版本的数据库和操作系统还原还要兼容问题。
如何实现物理+热+全量备份
思路:利用redo log,备份idb文件+备份期间的redo log
- 1.启动redo log 监听线程
- 拷贝idb数据文件
- 停止收集redo log
- 加FTWRL锁拷贝元数据frm
如何实现物理还原
思路:mysqld crash 崩溃恢复流程
- 还原idb文件,重访redo log
安装xtrabackup
1wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.27/binary/tarball/percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12.tar.gz
2tar zxvf percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12.tar.gz
3mv zxvf percona-xtrabackup-2.4.27-Linux-x86_64.glibc2.12 /opt/xtrabackup
全量备份
1/opt/xtrabackup/bin/innobackupex --user=root --password=123456 /opt/xtrabackup/bakdir
2# /opt/xtrabackup/bakdir 指定备份到哪个目录,自己指定
数据还原
停掉mysqld
先要把原来的目录移动走
1innobackupex version 2.4.27 based on MySQL server 5.7.40 Linux (x86_64) (revision id: aae8e82)
2Original data directory /db/data is not empty!
1mv /db/data /db/data_bak # 原来的目录不能为空
2# 制定恢复的dir 路径
3/opt/xtrabackup/bin/innobackupex --copy-back /opt/xtrabackup/bakdir/2022-12-10_10-43-09
4# or 用这个
5/opt/xtrabackup/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /opt/xtrabackup/bakdir/2022-12-10_10-43-09
6
7systemctl start mysql # 报错 the server quit without updating PID file
8#修改权限
9chown -R mysql:mysql /db/data
10systemctl start mysql
增量备份
1innobackupex --user=root --password=123456 --incremental bakdir/ --incremental-basedir='(全量路径)' #基于这个进行增量
2# bakdir 指定备份到哪个目录
增量备份合并到全量备份
分别看下全量和增量备份出来的 xtrabackup_checkpoints , xtrabackup_binlog_info文件内容,看看合并后的变化,
如果出问题了就用上面的还原命令即可,
1# --redo-only只应用redo日志,不执行undo回滚未提交的数据,等最后一次增量备份合并完成后再进行应用undo日志回滚数据。
2innobackupex --apply-log --redo-only 全量路径
3innobackupex --apply-log --incremental-dir=增量备份路径(bakdir/YYYY-YY-YY) 全量路径
Xtrlabackup采用了备份idb+备份期间到redo log 方式。
物理备份是一种高效的备份方式。
Xtrlabackup是最常用的mysql 物理备份工具
物理备份的缺点备份文件无法直接阅读。