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文章
617瀏覽量
28665 -
MySQL
+關注
關注
1文章
831瀏覽量
26769
原文標題:提升企業數據處理能力:MySQL在大規模應用中的最佳實踐與案例解析
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論