MySQL 数据恢复
MySQL 數(shù)據(jù)恢復(fù)
前言
前兩天因為沒注意的誤操作, 直接把某個數(shù)據(jù)表清掉了, 心慌慌. 怪自己學(xué)藝不精, 當(dāng)時整了一下午也沒把數(shù)據(jù)找回來. 當(dāng)晚回來閉關(guān)研究, 終于在凌晨1點多整出來了, 特此記錄, 以備不時之需.
對于 MySQL 數(shù)據(jù)的備份, 主要有兩種: 全量備份和增量備份.
- 全量備份: 將數(shù)據(jù)庫中的所有數(shù)據(jù)全部進行備份. 相當(dāng)于復(fù)制粘貼的步驟. 全量備份要保存所有數(shù)據(jù), 占用空間大, 必然不可能精確到每一秒.
- 增量備份: 對數(shù)據(jù)庫的所有變動進行備份. 增量備份可以將數(shù)據(jù)庫的變動全部保存下來, 但也不可能一直保存, 否則備份文件的體積超級大.
而對數(shù)據(jù)庫數(shù)據(jù)的恢復(fù)操作, 思路也很簡單, 使用全量備份和增量備份相配合, 以某個時間點的全量備份為基礎(chǔ), 通過增量備份使數(shù)據(jù)庫數(shù)據(jù)恢復(fù)到具體的某個時間節(jié)點.
為了防止下次遇到這種情況再抓狂, 我決定對數(shù)據(jù)庫進行定時備份. 通過全量和增量的備份文件來面對下一次事故的發(fā)生(當(dāng)然, 我是肯定不會再出現(xiàn)了, 防止之后其他人誤操作吧)
數(shù)據(jù)的備份操作基本如下:
當(dāng)需要恢復(fù)時, 找到當(dāng)天的全量備份數(shù)據(jù)恢復(fù), 然后在這基礎(chǔ)上進行增量恢復(fù)即可恢復(fù)到某個特定的時間點. 好, 開搞.
定時全量備份
思路很簡單, 通過mysqldump命令進行全量備份, 一個簡單的定時 shell 腳本即可滿足. 腳本如下:
#!/bin/bash # 備份文件保留天數(shù) FileRetainDay=30 # 備份目錄 BakDir=/Users/hujing/dir/tmp/mysqldump_log # 數(shù)據(jù)庫用戶名 User=root # 數(shù)據(jù)庫密碼 Password=root # 今天的日期 Date=`date +%Y-%m-%d` cd $BakDir mysqldump -u$User -p$Password --quick --all-databases --flush-logs > $Date.sql # --quit: 不使用緩存 # --flush-logs: 刷新數(shù)據(jù)庫的 logbin 文件 # --all-databases: 備份所有數(shù)據(jù)庫 # 刪除30天前的備份文件 find $BakDir -mtime +$FileRetainDay -type f -name "*.sql" | xargs rm腳本很簡單. 接下來通過crontab定時每天跑一次:
1 0 * * * bash /Users/hujing/dir/tmp/mysql_back.sh
每天的12點1分跑一次. 這樣30天以內(nèi)的數(shù)據(jù)備份文件就有了.
增量備份
全量備份搞定了, 剩下增量備份. 增量備份就是 mysql 的binlog了.
以下幾個 MySQL 的命令行查詢命令可查看當(dāng)前binlog狀態(tài):
- show binary logs 查看當(dāng)前存在的 log 文件
- show variables like '%log_bin%' 查看 binlog 是否開啟及文件位置
- show master status 查看當(dāng)前使用的 binlog
- show binlog events in 'binlog.000001' 查看日志文件內(nèi)容
binlog相關(guān)配置:
# 開啟 binlog log_bin=ON # binlog 日志文件前綴 log_bin_basename=/var/lib/mysql/binlog # 索引文件 log_bin_index=/var/lib/mysql/binlog.index # 文件過期時間, 過期文件會自動刪除 expire_logs_days=7 # 每個文件的最大保存大小 max_binlog_size=1024M很好, 現(xiàn)在我們也有了增量備份文件.
數(shù)據(jù)恢復(fù)
當(dāng)需要恢復(fù)數(shù)據(jù)時, 如何根據(jù)這兩個備份文件進行恢復(fù)呢?
打個比方, 當(dāng)前時間是: 2020-9-4 23:00:00. 此時, 我做了清表的瘋狂操作. 如何恢復(fù)數(shù)據(jù)?
1. 通過全量備份, 將數(shù)據(jù)恢復(fù)到今天凌晨的時刻
進入 MySQL命令行, 執(zhí)行數(shù)據(jù)恢復(fù)文件:
source /Users/hujing/dir/tmp/mysqldump_log/2020-09-04.sql
此時, 數(shù)據(jù)庫已經(jīng)恢復(fù)到本日凌晨的時刻. 請注意, 這步操作會將今日生成的數(shù)據(jù)刪除.
2. 通過增量備份, 將數(shù)據(jù)恢復(fù)到指定時間節(jié)點
通過mysqlbin工具, 將指定時間的數(shù)據(jù)庫變更操作導(dǎo)出:
mysqlbinlog -v --start-datetime="2020-09-04 00:00:00" --stop-datetime="2020-09-04 23:00:00" /var/lib/mysql/binlog.0000* > s.sql
同樣通過source命令執(zhí)行此sql文件. 此時, 數(shù)據(jù)就已經(jīng)恢復(fù)了.
膚淺的記錄一下, 雖然現(xiàn)在可以恢復(fù)數(shù)據(jù)了, 但是還有很多問題沒有解決, 比如, 如何只恢復(fù)一張表的數(shù)據(jù)等等.
吃一塹長一智, 之后對數(shù)據(jù)庫的操作要慎之又慎.
總結(jié)
以上是生活随笔為你收集整理的MySQL 数据恢复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络-信道复用技术
- 下一篇: GO 切片实力踩坑