正在執行的網站系統,MySQL資料庫,資料量25G,日業務增量10-15M。
每天23:00,計劃任務呼叫mysqldump執行全備指令碼
上午10點開發人員誤刪除一個核心業務表,如何恢復?
a.直接使用臨時庫頂替原生產庫,前端應用割接到新庫b.將誤刪除的表單獨匯出,然後匯入到原生產環境
模擬資料
#!/bin/bash
num=1
whiletrue
;
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)開啟業務
某大型網站,mysql資料庫,資料量500G,每日更新量100M-200M
xtrabackup,每週六0:00進行全備,週一到週五及週日00:00進行增量備份。
週三下午2點出現資料庫意外刪除表操作。
模擬資料
#!/bin/bash
num=1
whiletrue
;
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.000003 184023
[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

文末福利

即將步入2025年,不少小夥伴在考慮來年的工作方向。
僅目前來說,傳統運維衝擊年薪30W+的轉型方向就是SRE&DevOps崗位。









