MySQL數(shù)據(jù)庫Drop Down后的緊急處置
前言
今天下午3點(diǎn),我按照慣例,打開游戲服務(wù)器,開新服部署嘛,游戲在騰訊開放平臺,簡單。閉著眼睛都OK。于是一輪子的復(fù)制黏貼拷貝,把服務(wù)器加起來,然后啟動查看日志。
。。。。突然發(fā)現(xiàn)不斷的有Exception?搞什么?丟失表Usr_user??剛才不是導(dǎo)了數(shù)據(jù)庫嗎?不存在?怎么會?
我瞬間意識到。我攤上事了,我攤上大事了。。檢查剛才的復(fù)制黏貼,發(fā)現(xiàn)我沒改數(shù)據(jù)庫名,這一下子把第二個服的數(shù)據(jù)庫整個干掉了。
我擦?。〔粫???背后一涼就軟灘在凳子上了。
備份?沒有。
數(shù)據(jù)庫還有渣嗎?select count(*) .... 0!
備份?真的沒有。
怎么能沒備份??!
怎么辦?幾十個玩家充值了幾千元。連個影子也沒了。
找玩家求饒?送禮包?? 你覺得玩家會放過你?天真。
linux服務(wù)器 + mysql數(shù)據(jù)庫 + 游戲緩存 + flash的as3前端。怎么搞。。。我完蛋了。
HOLD住!
我要HOLD?。±潇o,雖然大腦一片空白。馬上Google找mysql有無自動備份的。。。沒看到。問同事,求助。我靠,他們怎么好像沒反應(yīng)啊。。。
這個時候,有個哥們提示我,用 mysqlbinlog。
這玩意是什么。馬上google,知道m(xù)ysql自身會有個操作的備份。我靠!希望來了。趕快進(jìn)入mysql目錄,查看下。果然看到幾十個bin文件。
網(wǎng)上繼續(xù)搜。大概知道m(xù)ysql會保存30天內(nèi)的數(shù)據(jù)庫操作在bin文件。OK。
我們達(dá)洛克2服才剛運(yùn)行了2天,算起來應(yīng)該就是最后2個bin文件。還好。用
- mysqlbinlog --no-defaults mysql-bin.000026 > mysql-bin.000026.txt
導(dǎo)出了SQL,檢查下:
- # at 472331597
- #130619 18:04:23 server id 1 end_log_pos 472331772 Query thread_id=2657 exec_time=0 error_code=0
- SET TIMESTAMP=1371636263/*!*/;
- UPDATE USR_RESOURCE SET MODIDATE = '2013-06-19 18:04:23',SILVER = 283 WHERE USERCODE='001UR1371634524003511'
- /*!*/;
- # at 472331772
- #130619 18:04:23 server id 1 end_log_pos 472331799 Xid = 226001034
- COMMIT/*!*/;
- # at 472331799
- #130619 18:04:23 server id 1 end_log_pos 472331871 Query thread_id=2657 exec_time=0 error_code=0
- SET TIMESTAMP=1371636263/*!*/;
- BEGIN
大概是這種結(jié)構(gòu)。
冷靜下來,分析了。我還原數(shù)據(jù)庫,只要從建庫開始第一個sql重新執(zhí)行到最后一個。理論上數(shù)據(jù)庫就會被還原。但是bin文件里面是所有的SQL操作,我要篩選出 達(dá)洛克戰(zhàn)記2服 的。網(wǎng)上說用 cat / more / less 等命令。我靠,這他媽也太復(fù)雜了把?
于是我zip了所有bin文件,回傳到本地,用c#寫了個過濾代碼,找到 use darok2_2,知道這段內(nèi)容都是 達(dá)洛克戰(zhàn)記2服 的數(shù)據(jù)。
- public void test()
- {
- FileStream stream = File.OpenRead(@"E:\玩轉(zhuǎn)中國\程序設(shè)計(jì)\達(dá)洛克戰(zhàn)記\xtar-backup\svn\達(dá)洛克戰(zhàn)記2x\svn\server-deploy\mysql-bin.000027.txt\mysql-bin.000027.txt");
- StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("GBK"));
- FileStream streamO = File.Create(@"E:\玩轉(zhuǎn)中國\程序設(shè)計(jì)\達(dá)洛克戰(zhàn)記\xtar-backup\svn\達(dá)洛克戰(zhàn)記2x\svn\server-deploy\mysql-bin.000027.txt\000027.out.txt");
- StreamWriter writer = new StreamWriter(streamO, Encoding.GetEncoding("GBK"));
- Encoding gbk = Encoding.GetEncoding("GBK");
- Encoding utf = Encoding.Default;
- string strLine = reader.ReadLine();
- while (strLine != null)
- {
- if (!strLine.StartsWith("use darok2_2", StringComparison.OrdinalIgnoreCase))
- {
- strLine = reader.ReadLine();
- continue;
- }
- do
- {
- if (strLine == null)
- break;
- if (strLine.StartsWith("use", StringComparison.OrdinalIgnoreCase) && !strLine.StartsWith("use darok2_2", StringComparison.OrdinalIgnoreCase))
- {
- strLine = reader.ReadLine();
- break;
- }
- if (strLine.StartsWith("INSERT", StringComparison.OrdinalIgnoreCase) || strLine.StartsWith("DELETE", StringComparison.OrdinalIgnoreCase) || strLine.StartsWith("UPDATE", StringComparison.OrdinalIgnoreCase))
- {
- writer.Write(strLine);
- writer.WriteLine(";");
- }
- else
- {
- }
- strLine = reader.ReadLine();
- }
- while (true);
- }
- writer.Flush();
- writer.Close();
- reader.Close();
- }
這樣,我就得到過濾出來的SQL文件了。本地我建了個數(shù)據(jù)庫測試下,發(fā)現(xiàn)第一句就卡死了??HOLD住?。?!
再細(xì)心看看,發(fā)現(xiàn)中文到了txt全部是亂碼了。安靜思考了下:
linux數(shù)據(jù)庫用的是GBK。因此bin文件導(dǎo)出的格式一定是GBK。那么代碼用GBK讀取,然后GBK寫入就ok了(代碼里面已經(jīng)修復(fù)了)
再導(dǎo)入,順利了。
進(jìn)入數(shù)據(jù)庫在看,發(fā)現(xiàn)中文還是亂碼。。。。奇怪。那可能是mysql設(shè)置的問題了,和linux環(huán)境下不一致。我只要把這些過濾的SQL在達(dá)洛克服務(wù)器上走一遍應(yīng)該就ok了。
上傳SQL,運(yùn)行腳本:
- mysql -uxxxx -pxxxx darok2_2 < 000027.out.txt.
等了10分鐘。。。進(jìn)入騰訊朋友網(wǎng),開啟游戲。一切又光明了。
總結(jié):
各位看官,別看我洋洋灑灑幾句廢話貌似幾分鐘的事情。在那個接近崩潰,連數(shù)據(jù)庫渣都沒的條件下。我是多么慘的度過了2個小時。
mysqlbinlog
各位真心要記在心里。如果有全量備份+這個增量備份,基本上數(shù)據(jù)是不會丟失的。嗨。真實(shí)虛驚一場啊。
原文鏈接:http://www.cnblogs.com/zc22/p/3145080.html
【編輯推薦】
- MariaDB 5.3將支持ALTER TABLE的進(jìn)度提示
- MySQL創(chuàng)始人打造MariaDB 全面兼容MySQL 5.1
- MariaDB 2周年了
- 教你五步優(yōu)化你的MongoDB
- NoSQL在企業(yè)中的發(fā)展歷程