前言相關(guān)學(xué)習(xí)推薦:mysql教程
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、網(wǎng)頁(yè)空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、邱縣網(wǎng)站維護(hù)、網(wǎng)站推廣。
由于最近開(kāi)學(xué)季,我司又做的是高校相關(guān)的業(yè)務(wù),所以比較忙,都沒(méi)有什么時(shí)間來(lái)寫(xiě)文章,人一旦太忙的話(huà)就容易忙中出錯(cuò)。我呢就在前幾天,不是,是我有個(gè)朋友在前幾天去操作線(xiàn)上的數(shù)據(jù)庫(kù)時(shí),差點(diǎn)表演了一波刪庫(kù)跑路。
提前說(shuō)明:真的是我朋友,不是我。真的是我朋友,不是我。真的是我朋友,不是我。不過(guò)為了敘事方便,以下把“我朋友”簡(jiǎn)稱(chēng)為“我”。
事情是這樣的,我在對(duì)比部分表結(jié)構(gòu)時(shí)發(fā)現(xiàn)這個(gè)庫(kù)和其他庫(kù)的表結(jié)構(gòu)差的比較多,所以以為這個(gè)環(huán)境是沒(méi)有在使用的環(huán)境,就直接對(duì)這幾張表進(jìn)行了一個(gè)覆蓋操作,剛好這幾張表還是和學(xué)生錢(qián)包相關(guān)的,然后到晚上10點(diǎn)多公司的前方駐校人員在群里反饋說(shuō)是為什么錢(qián)包里錢(qián)變成0.0了,我一看到這個(gè)就直接嚇尿了,想著是不是該跑路了。
不過(guò)幸好看過(guò)一些數(shù)據(jù)庫(kù)恢復(fù)的方案,還是略知一二。
數(shù)據(jù)恢復(fù)1.開(kāi)啟binlog日志我使用的binlog日志來(lái)恢復(fù)數(shù)據(jù),要用binlog肯定首先得確保binlog日志是開(kāi)啟狀態(tài)的,可以用命令來(lái)查看。
show variables like 'log_%';復(fù)制代碼
可以看到它是ON狀態(tài)的,表示已開(kāi)啟,如果它是OFF狀態(tài)的話(huà),在my.cnf中[mysqld]
后添加配置后重啟mysql服務(wù)來(lái)開(kāi)啟。
# my.cnf文件 [mysqld] log-bin=mysql-bin server-id=1復(fù)制代碼2.查看binlog日志
確保開(kāi)啟binlog日之后,可以通過(guò)命令來(lái)查看binlog日志狀態(tài)。
# 查看binlog日志的目錄show master status;復(fù)制代碼
# 查看binlog日志內(nèi)容show binlog events IN 'mysql-bin.000002';復(fù)制代碼Log_name 表示binlog日志名稱(chēng)Pos 表示pos起始點(diǎn)Event_type 表示此次操作的類(lèi)型Server_id 表示機(jī)器id,由my.cnf中配置指定End_log_pos 表示pos結(jié)束點(diǎn)Info 表示具體語(yǔ)句
# 進(jìn)入存儲(chǔ)binlog日志的文件木了,可以通過(guò)這條命令查看詳情 mysqlbinlog --base64-output=decode-rows -v mysql-bin.000002;復(fù)制代碼
# 將binlog日志轉(zhuǎn)為txt導(dǎo)出 mysqlbinlog --base64-output=decode-rows -v mysql-bin.000002 > sql.txt復(fù)制代碼3.恢復(fù)數(shù)據(jù)
binlog日志恢復(fù)數(shù)據(jù)的話(huà),常用的有命令行恢復(fù),或者是把binlog日志拷貝出來(lái),用讀取binlog的工具來(lái)轉(zhuǎn)成.sql文件,然后把里面的需要用到的sql都復(fù)制出來(lái)然后再跑一遍,這里主要講的是命令行恢復(fù)的方法。
命令行恢復(fù)主要是通過(guò)排查binlog日志,確認(rèn)要恢復(fù)的起始點(diǎn)和結(jié)束點(diǎn)后,輸入命令進(jìn)行恢復(fù)?;蛘呤穷A(yù)估一下自己誤操作失誤的時(shí)間,通過(guò)一個(gè)時(shí)間段來(lái)恢復(fù)數(shù)據(jù)。
# 通過(guò)起始點(diǎn)和結(jié)束點(diǎn)恢復(fù) mysqlbinlog --start-position="582" --stop-position="9414" mysql-bin.000002 | mysql -uroot -proot;復(fù)制代碼
# 通過(guò)起始時(shí)間和結(jié)束時(shí)間來(lái)恢復(fù),傳入的時(shí)間可以是一個(gè)yyyy-MM-dd HH:mm:ss 的時(shí)間格式,也可以是一個(gè)時(shí)間戳 mysqlbinlog --start-datetime="2020-9-1 8:25:04" --stop-datetime="2020-9-1 20:00:00" mysql-bin.000002 | mysql -uroot -proot復(fù)制代碼
可以看到,在輸入恢復(fù)命令后,我清空的數(shù)據(jù)庫(kù)數(shù)據(jù)又回來(lái)了。
4.問(wèn)題binlog日志雖然可以恢復(fù)數(shù)據(jù),但是也存在問(wèn)題,當(dāng)binlog日志在不斷增大后,會(huì)進(jìn)行自動(dòng)刪除,那就導(dǎo)致已經(jīng)刪除的那部分日志的數(shù)據(jù)就恢復(fù)不了了。
不過(guò)binlog日志的大小和保存時(shí)間都是在可以在mysql中進(jìn)行設(shè)置的。不過(guò)還是推薦做好每日的備份,這樣可保萬(wàn)無(wú)一失。
# 設(shè)置文件大小,單位是字節(jié),下面換算是100Mset global max_binlog_size=104857600; # 設(shè)置文件保存天數(shù),下面是保存7天,默認(rèn)值為0,表示"沒(méi)有自動(dòng)刪除"set global expire_logs_days = 7;復(fù)制代碼每日備份
對(duì)于線(xiàn)上環(huán)境來(lái)說(shuō),做好每日備份和binlog一起用才是王道。線(xiàn)上一般都是部署在linux上的,所以這里就簡(jiǎn)單列一下linux的定時(shí)備份方法。
1.檢查是否安裝定時(shí)任務(wù),安裝crontabyum install crontabs復(fù)制代碼2.設(shè)置定時(shí)任務(wù)
/var/spool/cron/root 此文件為crontab定時(shí)任務(wù),可通過(guò)crontab -e
或者直接修改此文件修改.
crontab -l
查看定時(shí)任務(wù).
touch xxx.sh
mysqldump -uroot -p"密碼" 數(shù)據(jù)庫(kù)名 > /mysql/person_`date +%Y%m%d`.sql復(fù)制代碼4.修改文件權(quán)限
chmod 777 xxx.sh
crontab -e
每天凌晨2點(diǎn)執(zhí)行 00 2 * * * /xxx.sh復(fù)制代碼
完結(jié)!
想了解更多編程學(xué)習(xí),敬請(qǐng)關(guān)注php培訓(xùn)欄目!