1.企业故障恢复案例
背景:
正在运行的网站系统,MySQL数据库,数据量25G,日业务增量10-15M。
备份策略:
每天23:00,计划任务调用mysqldump执行全备脚本
故障时间点:
上午10点开发人员误删除一个核心业务表,如何恢复?
思路:
1)停业务避免数据的二次伤害
2)找一个临时的库,恢复前一天的全备
3)截取前一天23:00到第二天10点误删除之间的binlog,恢复到临时库
4)测试可用性和完整性
5)开启业务前的两种方式
a.直接使用临时库顶替原生产库,前端应用割接到新库
b.将误删除的表单独导出,然后导入到原生产环境
6)开启业务
模拟数据
#!/bin/bash num=1 while true;do mysql -uroot -p123 -e "insert into proc.proc1 value($num);commit;" (( num++ )) sleep 1 done
备份
[root@db02 ~]# mysqldump -A -R --triggers --master-data=2 --single-transaction|gzip > /tmp/full_$(date +%F).sql.gz
模拟误删除数据
mysql> drop table proc.proc;
恢复思路
1)停业务避免数据的二次伤害 [root@db02 ~]# /etc/init.d/mysqld stop 2) 准备新环境 [root@m01 scripts]# ./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/application/mysql/data [root@m01 scripts]# /etc/init.d/mysqld start 3)找一个临时的库,恢复前一天的全备 [root@db02 ~]# scp /tmp/full_2022-08-19.sql.gz 172.16.1.61:/tmp/ [root@m01 scripts]# zcat /tmp/full_2022-08-19.sql.gz |mysql 3)截取前一天23:00到第二天10点误删除之间的binlog,恢复到临时库 起始位置点: [root@db02 ~]# zcat /tmp/full_2022-08-19.sql.gz |head -25 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=7138; 结束位置点:42855 第二段起始位置点:42975 第二段结束位置点:58870 [root@db02 ~]# mysqlbinlog --start-position=7138 --stop-position=42855 /application/mysql/data/mysql-bin.000002 > /tmp/inc1.sql [root@db02 ~]# mysqlbinlog --start-position=42975 --stop-position=58870 /application/mysql/data/mysql-bin.000002 > /tmp/inc2.sql [root@db02 ~]# scp /tmp/inc* 172.16.1.61:/tmp/ 4)测试可用性和完整性 5)开启业务前的两种方式 a.直接使用临时库顶替原生产库,前端应用割接到新库 b.将误删除的表单独导出,然后导入到原生产环境 6)开启业务
2.企业级增量恢复实战
背景:
某大型网站,mysql数据库,数据量500G,每日更新量100M-200M
备份策略:
xtrabackup,每周六0:00进行全备,周一到周五及周日00:00进行增量备份。
故障场景:
周三下午2点出现数据库意外删除表操作。
如何恢复???
模拟数据
#!/bin/bash num=1 while true;do mysql -uroot -p123 -e "insert into proc.proc1 value($num);commit;" (( num++ )) sleep 1 done
备份
## 上周六全备 周六 00点 备周一到周五数据 [root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp /backup/full_$(date +%F) [root@db02 ~]# cat /backup/full_2022-08-19/xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 2335986976 last_lsn = 2335986976 compact = 0 recover_binlog_info = 0 ## 第一次增备 周日的00点 备的周六增量数据 周六00点之后到周日00点之前 [root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir /backup/full_$(date +%F) /backup/inc_6 [root@db02 ~]# cat /backup/inc_6/xtrabackup_checkpoints backup_type = incremental from_lsn = 2335986976 to_lsn = 2336208335 last_lsn = 2336223316 compact = 0 recover_binlog_info = 0 ## 第二次增备 周一的00点 备的周日增量数据 周日00点之后到周一00点之前 [root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir /backup/inc_6 /backup/inc_7 [root@db02 ~]# cat /backup/inc_7/xtrabackup_checkpoints backup_type = incremental from_lsn = 2336208335 to_lsn = 2336236884 last_lsn = 2336249656 compact = 0 recover_binlog_info = 0 ## 第三次增备 周二的00点 备的周一增量数据 周一00点之后到周二00点之前 [root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir /backup/inc_7 /backup/inc_1 [root@db02 ~]# cat /backup/inc_1/xtrabackup_checkpoints backup_type = incremental from_lsn = 2336236884 to_lsn = 2336264378 last_lsn = 2336264942 compact = 0 recover_binlog_info = 0 ## 第四次增备 周三的00点 备的周二增量数据 周二00点之后到周三00点之前 [root@db02 ~]# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir /backup/inc_1 /backup/inc_2 [root@db02 ~]# cat /backup/inc_2/xtrabackup_checkpoints backup_type = incremental from_lsn = 2336264378 to_lsn = 2336273708 last_lsn = 2336273708 compact = 0 recover_binlog_info = 0 ## binlog截取 周三00点之后到周三下午14点之间的数据
删除数据
mysql> select * from ts; +----+------+ | id | A | +----+------+ | 1 | 300 | | 2 | 200 | +----+------+ mysql> drop table test.ts;
恢复思路
1.停业务,停库 [root@db02 ~]# /etc/init.d/mysqld stop 2.准备新环境 3.清空data目录 [root@db02 ~]# mv /application/mysql/data/ /usr/local/src/ 4.重做数据 1)全备只做redo不做undo [root@db02 ~]# innobackupex --apply-log --redo-only /backup/full_2022-08-19/ 2)周六的增量数据合并到full中只做redo不做undo [root@db02 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc_6 /backup/full_2022-08-19/ 3)周日六的增量数据合并到full中只做redo不做undo [root@db02 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc_7 /backup/full_2022-08-19/ 4)周一的增量数据合并到full中只做redo不做undo [root@db02 ~]# innobackupex --apply-log --redo-only --incremental-dir=/backup/inc_1 /backup/full_2022-08-19/ 5)周二的增量数据合并到full中redo和undo都做 [root@db02 ~]# innobackupex --apply-log --incremental-dir=/backup/inc_2 /backup/full_2022-08-19/ 6)全备整体做一遍redo和undo [root@db02 ~]# innobackupex --apply-log /backup/full_2022-08-19/ 5.恢复数据 [root@db02 ~]# innobackupex --copy-back /backup/full_2022-08-19/ 6.授权 [root@db02 ~]# chown -R mysql.mysql /application/mysql/data 7.启动数据库 [root@db02 ~]# /etc/init.d/mysqld start 8.binlog截取 周三00点之后到周三下午14点之间的数据 第一段起始位置点:184023 [root@db02 ~]# cat /backup/full_2022-08-19/xtrabackup_binlog_info mysql-bin.000003184023 [root@db02 ~]# mysqlbinlog -vvv --base64-output=decode-row /usr/local/src/data/mysql-bin.000003 |grep -i drop -C 5 第一段结束位置点:200666 第二段起始位置点:200781 [root@db02 ~]# mysqlbinlog -vvv --base64-output=decode-row /usr/local/src/data/mysql-bin.000003 第二段结束位置点:205830 ## 截取 [root@db02 ~]# mysqlbinlog --start-position=184023 --stop-position=200666 /usr/local/src/data/mysql-bin.000003 > /tmp/inc_1.sql [root@db02 ~]# mysqlbinlog --start-position=200781 --stop-position=205830 /usr/local/src/data/mysql-bin.000003 > /t
链接:https://www.cnblogs.com/wangchengww/p/16603009.html
全部0条评论
快来发表一下你的评论吧 !