前言
由于最近開學季,我司又做的是高校相關的業務,所以比較忙,都沒有什么時間來寫文章,人一旦太忙的話就容易忙中出錯。我呢就在前幾天,不是,是我有個朋友在前幾天去操作線上的數據庫時,差點表演了一波刪庫跑路。

提前說明:真的是我朋友,不是我。真的是我朋友,不是我。真的是我朋友,不是我。不過為了敘事方便,以下把“我朋友”簡稱為“我”。
事情是這樣的,我在對比部分表結構時發現這個庫和其他庫的表結構差的比較多,所以以為這個環境是沒有在使用的環境,就直接對這幾張表進行了一個覆蓋操作,剛好這幾張表還是和學生錢包相關的,然后到晚上10點多公司的前方駐校人員在群里反饋說是為什么錢包里錢變成0.0了,我一看到這個就直接嚇尿了,想著是不是該跑路了。

不過幸好看過一些數據庫恢復的方案,還是略知一二。
數據恢復
1.開啟binlog日志
我使用的binlog日志來恢復數據,要用binlog肯定首先得確保binlog日志是開啟狀態的,可以用命令來查看。
show variables like 'log_%';復制代碼

可以看到它是ON狀態的,表示已開啟,如果它是OFF狀態的話,在my.cnf中[mysqld]后添加配置后重啟mysql服務來開啟。
# my.cnf文件 [mysqld] log-bin=mysql-bin server-id=1復制代碼
2.查看binlog日志
確保開啟binlog日之后,可以通過命令來查看binlog日志狀態。
# 查看binlog日志的目錄show master status;復制代碼

# 查看binlog日志內容show binlog events IN 'mysql-bin.000002';復制代碼

- Log_name 表示binlog日志名稱
- Pos 表示pos起始點
- Event_type 表示此次操作的類型
- Server_id 表示機器id,由my.cnf中配置指定
- End_log_pos 表示pos結束點
- Info 表示具體語句

# 進入存儲binlog日志的文件木了,可以通過這條命令查看詳情 mysqlbinlog --base64-output=decode-rows -v mysql-bin.000002;復制代碼

# 將binlog日志轉為txt導出 mysqlbinlog --base64-output=decode-rows -v mysql-bin.000002 > sql.txt復制代碼
3.恢復數據
binlog日志恢復數據的話,常用的有命令行恢復,或者是把binlog日志拷貝出來,用讀取binlog的工具來轉成.sql文件,然后把里面的需要用到的sql都復制出來然后再跑一遍,這里主要講的是命令行恢復的方法。
命令行恢復主要是通過排查binlog日志,確認要恢復的起始點和結束點后,輸入命令進行恢復。或者是預估一下自己誤操作失誤的時間,通過一個時間段來恢復數據。
# 通過起始點和結束點恢復 mysqlbinlog --start-position="582" --stop-position="9414" mysql-bin.000002 | mysql -uroot -proot;復制代碼
# 通過起始時間和結束時間來恢復,傳入的時間可以是一個yyyy-MM-dd HH:mm:ss 的時間格式,也可以是一個時間戳 mysqlbinlog --start-datetime="2020-9-1 8:25:04" --stop-datetime="2020-9-1 20:00:00" mysql-bin.000002 | mysql -uroot -proot復制代碼


可以看到,在輸入恢復命令后,我清空的數據庫數據又回來了。
4.問題
binlog日志雖然可以恢復數據,但是也存在問題,當binlog日志在不斷增大后,會進行自動刪除,那就導致已經刪除的那部分日志的數據就恢復不了了。
不過binlog日志的大小和保存時間都是在可以在mysql中進行設置的。不過還是推薦做好每日的備份,這樣可保萬無一失。
# 設置文件大小,單位是字節,下面換算是100Mset global max_binlog_size=104857600; # 設置文件保存天數,下面是保存7天,默認值為0,表示"沒有自動刪除"set global expire_logs_days = 7;復制代碼
每日備份
對于線上環境來說,做好每日備份和binlog一起用才是王道。線上一般都是部署在linux上的,所以這里就簡單列一下linux的定時備份方法。
1.檢查是否安裝定時任務,安裝crontab
yum install crontabs復制代碼
2.設置定時任務
/var/spool/cron/root ?此文件為crontab定時任務,可通過crontab -e或者直接修改此文件修改.
crontab -l查看定時任務.
3.創建一個shell腳本
touch xxx.sh
mysqldump -uroot -p"密碼" 數據庫名 > /mysql/person_`date +%Y%m%d`.sql復制代碼
4.修改文件權限
chmod 777 xxx.sh
5.打開定時任務文件
crontab -e
每天凌晨2點執行 00 2 * * * /xxx.sh復制代碼
完結!
想了解更多編程學習,敬請關注php培訓欄目!