悲傷的故事,當不小心刪了線上的數據庫

悲傷的故事,當不小心刪了線上的數據庫

相關學習推薦:mysql教程

前言

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

悲傷的故事,當不小心刪了線上的數據庫

  提前說明:真的是我朋友,不是我。真的是我朋友,不是我。真的是我朋友,不是我。不過為了敘事方便,以下把“我朋友”簡稱為“我”。

  事情是這樣的,我在對比部分表結構時發現這個庫和其他庫的表結構差的比較多,所以以為這個環境是沒有在使用的環境,就直接對這幾張表進行了一個覆蓋操作,剛好這幾張表還是和學生錢包相關的,然后到晚上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培訓欄目!

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享