今天下午3點,我按照慣例,打開遊戲服務器,開新服部署嘛,遊戲在騰訊開放平臺,簡單。閉着眼睛都OK。因而一輪子的複製黏貼拷貝,把服務器加起來,而後啓動查看日誌。前端
。。。。忽然發現不斷的有Exception??搞什麼飛機??丟失表Usr_user??剛纔不是導了數據庫嗎?不存在?怎麼會??mysql
我瞬間意識到。我攤上事了,我攤上大事了。。檢查剛纔的複製黏貼,發現我沒改數據庫名,這一會兒把第二個服的數據庫整個幹掉了。linux
我擦!!不會吧??背後一涼就軟灘在凳子上了。sql
備份?沒有。數據庫
數據庫還有渣嗎?select count(*) .... 0!c#
備份????真的沒有。。。。緩存
怎麼能沒備份啊!!@@!服務器
怎麼辦?幾十個玩家充值了幾千元。連個渣也沒了。less
找玩家求饒?送禮包?? 你以爲玩家會放過你????天真。svn
linux服務器 + mysql數據庫 + 遊戲緩存 + flash的as3前端。怎麼搞。。。我完蛋了。
我要HOLD住!冷靜,雖然大腦一片空白。立刻Google找mysql有無自動備份的。。。沒看到。問同事,求助。我靠,他們怎麼好像沒反應啊。。。
這個時候,有個哥們提示我,用 mysqlbinlog。
這玩意是什麼。立刻google,知道mysql自身會有個操做的備份。我靠!但願來了。趕快進入mysql目錄,查看下。果真看到幾十個bin文件。
網上繼續搜。大概知道mysql會保存30天內的數據庫操做在bin文件。OK。
咱們達洛克2服纔剛運行了2天,算起來應該就是最後2個bin文件。還好。用
mysqlbinlog --no-defaults mysql-bin.000026 > mysql-bin.000026.txt
導出了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
大概是這種結構。
冷靜下來,分析了。我還原數據庫,只要從建庫開始第一個sql從新執行到最後一個。理論上數據庫就會被還原。可是bin文件裏面是全部的SQL操做,我要篩選出 達洛克戰記2服 的。網上說用 cat / more / less 等命令。我靠,這他媽也太複雜了把?
因而我zip了全部bin文件,回傳到本地,用c#寫了個過濾代碼,找到 use darok2_2,知道這段內容都是 達洛克戰記2服 的數據。
public void test() { FileStream stream = File.OpenRead(@"E:\玩轉中國\程序設計\達洛克戰記\xtar-backup\svn\達洛克戰記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:\玩轉中國\程序設計\達洛克戰記\xtar-backup\svn\達洛克戰記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文件了。本地我建了個數據庫測試下,發現第一句就卡死了??HOLD住!!!
再細心看看,發現中文到了txt所有是亂碼了。安靜思考了下:
linux數據庫用的是GBK。所以bin文件導出的格式必定是GBK。那麼代碼用GBK讀取,而後GBK寫入就ok了(代碼裏面已經修復了)
再導入,順利了。
進入數據庫在看,發現中文仍是亂碼。。。。奇怪。那多是mysql設置的問題了,和linux環境下不一致。我只要把這些過濾的SQL在達洛克服務器上走一遍應該就ok了。
上傳SQL,運行腳本:
mysql -uxxxx -pxxxx darok2_2 < 000027.out.txt.
等了10分鐘。。。進入騰訊朋友網,開啓遊戲。一切又光明瞭。
各位看官,別看我洋洋灑灑幾句廢話貌似幾分鐘的事情。在那個接近崩潰,連數據庫渣都沒的條件下。我是多麼慘的度過了2個小時。
mysqlbinlog
各位真心要記在內心。若是有全量備份+這個增量備份,基本上數據是不會丟失的。嗨。真實虛驚一場啊。