通過延時從庫+binlog復(fù)制,恢復(fù)誤操作數(shù)據(jù),你學(xué)會了嗎?
一、介紹環(huán)境
數(shù)據(jù)庫版本 | 實例角色 | ip地址 | 端口 |
GreatSQL 8.0.32-26 | master | 192.168.134.199 | 5725 |
GreatSQL 8.0.32-26 | slave | 192.168.134.199 | 5726 |
二、主庫配置
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5725.sock -p
greatsql> CREATE USER 'repl'@'%' IDENTIFIED BY '123';
greatsql> GRANT REPLICATION SLAVE ON . TO 'repl'@'%';
三、配置延時從庫
greatsql> CHANGE MASTER TO
master_host='192.168.134.199',
master_port=5725,
master_user='repl',
master_password='123',
master_auto_position=1,
master_delay = 7200;
greatsql> START SLAVE;
greatsql> SHOW SLAVE STATUS\G
圖片
四、模擬主庫誤刪除數(shù)據(jù)表
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5725.sock -p sysbench
greatsql> DROP TABLE sbtest2;
五、延時從庫恢復(fù)數(shù)據(jù)到主庫故障前
1、為了防止恢復(fù)失敗,先備份一下從庫。
可以使用Xtrabackup/mysqldump,進行備份從庫,這里演示使用 Xtrabackup 備份從庫
$ xtrabackup --defaults-file=/data1/greatsql/greatsql5726/my5726.cnf -S /tmp/greatsql5726.sock --backup --slave-info \
--stream=xbstream --target-dir=/backup/full.xb
2、我們找到主庫誤操作在哪個binlog里面,并需要確認誤操作的binlog位置信息。
$ /usr/local/greatsql/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -vvv ./* | grep -rli 'drop'
$ /usr/local/greatsql/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -vvv mysql-bin.000002 |less
圖片
3、停止sql_thread線程,設(shè)置不延時復(fù)制,設(shè)置復(fù)制停止在誤操作binlog位置點。
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5726.sock -p
greatsql> STOP SLAVE;
greatsql> CHANGE MASTER TO master_delay = 0;
greatsql> START SLAVE io_thread;
greatsql> START SLAVE sql_thread until SQL_BEFORE_GTIDS='2fc5a82c-2ac3-11ee-9f7f-00163e402951:187';
greatsql> SHOW SLAVE STATUS\G
4、等待復(fù)制到需要的停止的位置點,sql_thread 已經(jīng)停止
圖片
5、查看從庫誤操作的表,備份出來恢復(fù)到主庫
greatsql> SHOW TABLES FROM sysbench;
greatsql> SELECT COUNT(*) FROM sysbench.sbtest2;
shell> /usr/local/greatsql/bin/mysqldump -S /tmp/mysql5726.sock --set-gtid-purged=OFF --single-transaction --master-data=2 --max-allowed-packet=32M -q sysbench sbtest2 > sbtest2.sql
6、將 sbtest2 表備份數(shù)據(jù)恢復(fù)到主庫里
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5725.sock -p -A sysbench
greatsql> SET sql_log_bin = off;
greatsql> SOURCE sbtest2.sql;
greatsql> EXIT;
7、從庫跳過誤操作的gtid,重新設(shè)置延時從庫,從庫繼續(xù)復(fù)制主庫
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5726.sock -p
greatsql> STOP SLAVE;
greatsql> SET gtid_next='2fc5a82c-2ac3-11ee-9f7f-00163e402951:187';
greatsql> BEGIN;COMMIT;
greatsql> SET gtid_next='automatic';
greatsql> CHANGE MASTER TO master_delay = 7200;
greatsql> START SLAVE;
greatsql> SHOW SLAVE STATUS\G
六、總結(jié)防范誤操作
如何避免誤刪庫、刪表等誤操作,以及如何提高數(shù)據(jù)庫的安全性。
1.常見危險誤操作
在線上生產(chǎn)環(huán)境中的任何操作都要十分謹慎,可能因為微小疏忽造成無法挽回的巨大損失。
比較常見的線上誤操作有幾種:
- 想要刪除當前目錄下的文件,卻不小心執(zhí)行了 rm -fr /,把整個系統(tǒng)中的所有文件都給強行刪了。
- 誤以為是測試環(huán)境,想要刪除某個數(shù)據(jù)對象,卻把線上生產(chǎn)環(huán)境的數(shù)據(jù)庫、表等數(shù)據(jù)對象給刪除了。
- 誤以為是測試環(huán)境,想要關(guān)閉或重啟數(shù)據(jù)庫實例,甚至是關(guān)閉或重啟主機操作系統(tǒng)。
- 服務(wù)器更換硬盤等熱插拔操作,現(xiàn)場工程師搞錯信息,把正常的服務(wù)器給插拔了。
- 只想更新或刪除部分數(shù)據(jù),但由于還沒來得及寫好 WHERE 條件,不小心按下了回車鍵,導(dǎo)致全表被更新或刪除。
可以防范的方法有幾個:
- 總是確認每個數(shù)據(jù)庫是否有可靠的備份策略,以及備份文件的有效性。
- 配置好一個延遲復(fù)制實例,避免在主節(jié)點上誤操作刪除數(shù)據(jù)后,還可以在從節(jié)點上實現(xiàn)快速恢復(fù)。
- 避免層層跳轉(zhuǎn)的服務(wù)器連接方式,每跳轉(zhuǎn)一次,就會多誤操作的可能性。
- 完成操作后立即退出生產(chǎn)業(yè)務(wù)服務(wù)器,減少犯錯誤的機會。
- 經(jīng)常性確認服務(wù)器、數(shù)據(jù)庫和路徑標示,并且在每次操作前都要反復(fù)確認服務(wù)器信息。
- 每個服務(wù)器主機系統(tǒng)上都要設(shè)置唯一的主機名,提高辨識度。
- 生產(chǎn)環(huán)境和測試環(huán)境要物理隔絕開,使之不能相互連接。
- 連接生產(chǎn)環(huán)境使用專門的操作機或必須先撥VPN等,多加一道防護門檻。
- 避免同時打開多個終端或操作窗口,這非常容易導(dǎo)致犯錯。
- 所有重要操作執(zhí)行前,都先在文檔中寫清楚,并逐一檢查確認無誤。
- 每個數(shù)據(jù)庫的賬號只授予必要的權(quán)限,避免權(quán)限過高而有了更多破壞的機會。
- 不要在生產(chǎn)環(huán)境執(zhí)行刪除操作,而是改成RENAME操作,先改名,確認無誤后再刪除,而不是直接刪除。
- 在數(shù)據(jù)庫中設(shè)置 sql_safe_updates=1,盡量避免被全表更新、刪除的風(fēng)險。
2.數(shù)據(jù)安全維護建議
為了讓 GreatSQL 數(shù)據(jù)庫運行更安全,建議遵循以下幾點規(guī)范:
- 在應(yīng)用端,所有用戶請求及輸入數(shù)據(jù)都要做預(yù)處理,不能直接提交到數(shù)據(jù)庫,避免被SQL注入。
- 定期掃描應(yīng)用端用戶請求日志,掃描異常請求并及時處理。
- 應(yīng)用服務(wù)器端部署防火墻,阻斷用戶非法請求。
- 應(yīng)用程序上線前,都需要進行必要安全掃描,避免常見SQL注入等風(fēng)險。
- 數(shù)據(jù)庫端定期掃描請求特征,判斷是否有符合安全隱患的請求,及時阻斷處理。
- 數(shù)據(jù)庫端啟用審計(AUDIT)、SQL防火墻等組件,及時發(fā)現(xiàn)并阻斷非法請求。
- 數(shù)據(jù)庫中存儲的敏感數(shù)據(jù),務(wù)必先進行單向加密,避免被破解、信息泄漏。
- 生產(chǎn)環(huán)境中的數(shù)據(jù),導(dǎo)入開發(fā)測試環(huán)境前,要先進行轉(zhuǎn)碼脫敏操作,避免信息泄漏。
- 做好連接請求檢測和監(jiān)控,發(fā)現(xiàn)有異常頻繁請求時,及時阻斷處理。