一個線上運營着3000+人的游戲,因為我不小心一個DROP DATABASE,全沒了。 怎么辦??跟我HOLD住!!!


前言

 今天下午3點,我按照慣例,打開游戲服務器,開新服部署嘛,游戲在騰訊開放平台,簡單。閉着眼睛都OK。於是一輪子的復制黏貼拷貝,把服務器加起來,然后啟動查看日志。

。。。。突然發現不斷的有Exception??搞什么飛機??丟失表Usr_user??剛才不是導了數據庫嗎?不存在?怎么會??

我瞬間意識到。我攤上事了,我攤上大事了。。檢查剛才的復制黏貼,發現我沒改數據庫名,這一下子把第二個服的數據庫整個干掉了。

我擦!!不會吧??背后一涼就軟灘在凳子上了。

備份?沒有。

數據庫還有渣嗎?select count(*) ....  0!

備份????真的沒有。。。。

怎么能沒備份啊!!@@!

怎么辦?幾十個玩家充值了幾千元。連個渣也沒了。

找玩家求饒?送禮包?? 你覺得玩家會放過你????天真。

linux服務器 + mysql數據庫 + 游戲緩存 + flash的as3前端。怎么搞。。。我完蛋了。

 

HOLD住!

 我要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

各位真心要記在心里。如果有全量備份+這個增量備份,基本上數據是不會丟失的。嗨。真實虛驚一場啊。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM