提升企業資料處理能力:MySQL在大規模應用中的最佳實踐與案例解析

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

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)開啟業務

2.企業級增量恢復實戰
背景:
某大型網站,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

連結:https://www.cnblogs.com/wangchengww/p/16603009.html
                                                              (版權歸原作者所有,侵刪)

文末福利

即將步入2025年,不少小夥伴在考慮來年的工作方向。

僅目前來說,傳統運維衝擊年薪30W+的轉型方向就是SRE&DevOps崗位。

為了幫助大家早日擺脫繁瑣的基層運維工作,給大家整理了一套【2024最新運維資料高階運維工程師必備技能資料包(文末一鍵領取),內容有多詳實豐富看下圖!
共有 20 個模組
1.38張最全工程師技能圖譜
2.面試大禮包
3.Linux書籍
4.go書籍
······
6.自動化運維工具
18.訊息佇列合集
 以上所有資料獲取請掃碼
識別上方二維碼
備註:2024最新運維資料
100%免費領取
(是掃碼領取,不是在公眾號後臺回覆,別看錯了哦)


相關文章