视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL数据库DropDown后的紧急处置_MySQL
2020-11-09 18:42:50 责编:小采
文档
前言

今天下午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文件。还好。用

  1. mysqlbinlog --no-defaults mysql-bin.000026 > mysql-bin.000026.txt

导出了SQL,检查下:

  1. # at 472331597
  2. #130619 18:04:23 server id 1 end_log_pos 472331772 Query thread_id=2657 exec_time=0 error_code=0
  3. SET TIMESTAMP=1371636263/*!*/;
  4. UPDATE USR_RESOURCE SET MODIDATE = '2013-06-19 18:04:23',SILVER = 283 WHERE USERCODE='001UR1371634524003511'
  5. /*!*/;
  6. # at 472331772
  7. #130619 18:04:23 server id 1 end_log_pos 472331799 Xid = 226001034
  8. COMMIT/*!*/;
  9. # at 472331799
  10. #130619 18:04:23 server id 1 end_log_pos 472331871 Query thread_id=2657 exec_time=0 error_code=0
  11. SET TIMESTAMP=1371636263/*!*/;
  12. BEGIN

大概是这种结构。

冷静下来,分析了。我还原数据库,只要从建库开始第一个sql重新执行到最后一个。理论上数据库就会被还原。但是bin文件里面是所有的SQL操作,我要筛选出 达洛克战记2服 的。网上说用 cat / more / less 等命令。我靠,这他妈也太复杂了把?

于是我zip了所有bin文件,回传到本地,用c#写了个过滤代码,找到 use darok2_2,知道这段内容都是 达洛克战记2服 的数据。

  1. public void test()
  2. {
  3. FileStream stream = File.OpenRead(@"E:\玩转中国\程序设计\达洛克战记\xtar-backup\svn\达洛克战记2x\svn\server-deploy\mysql-bin.000027.txt\mysql-bin.000027.txt");
  4. StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("GBK"));
  5. FileStream streamO = File.Create(@"E:\玩转中国\程序设计\达洛克战记\xtar-backup\svn\达洛克战记2x\svn\server-deploy\mysql-bin.000027.txt\000027.out.txt");
  6. StreamWriter writer = new StreamWriter(streamO, Encoding.GetEncoding("GBK"));
  7. Encoding gbk = Encoding.GetEncoding("GBK");
  8. Encoding utf = Encoding.Default;
  9. string strLine = reader.ReadLine();
  10. while (strLine != null)
  11. {
  12. if (!strLine.StartsWith("use darok2_2", StringComparison.OrdinalIgnoreCase))
  13. {
  14. strLine = reader.ReadLine();
  15. continue;
  16. }
  17. do
  18. {
  19. if (strLine == null)
  20. break;
  21. if (strLine.StartsWith("use", StringComparison.OrdinalIgnoreCase) && !strLine.StartsWith("use darok2_2", StringComparison.OrdinalIgnoreCase))
  22. {
  23. strLine = reader.ReadLine();
  24. break;
  25. }
  26. if (strLine.StartsWith("INSERT", StringComparison.OrdinalIgnoreCase) || strLine.StartsWith("DELETE", StringComparison.OrdinalIgnoreCase) || strLine.StartsWith("UPDATE", StringComparison.OrdinalIgnoreCase))
  27. {
  28. writer.Write(strLine);
  29. writer.WriteLine(";");
  30. }
  31. else
  32. {
  33. }
  34. strLine = reader.ReadLine();
  35. }
  36. while (true);
  37. }
  38. writer.Flush();
  39. writer.Close();
  40. reader.Close();
  41. }

这样,我就得到过滤出来的SQL文件了。本地我建了个数据库测试下,发现第一句就卡死了??HOLD住!!!

再细心看看,发现中文到了txt全部是乱码了。安静思考了下:

linux数据库用的是GBK。因此bin文件导出的格式一定是GBK。那么代码用GBK读取,然后GBK写入就ok了(代码里面已经修复了)

再导入,顺利了。

进入数据库在看,发现中文还是乱码。。奇怪。那可能是mysql设置的问题了,和linux环境下不一致。我只要把这些过滤的SQL在达洛克服务器上走一遍应该就ok了。

上传SQL,运行脚本:

  1. mysql -uxxxx -pxxxx darok2_2 < 000027.out.txt.

等了10分钟。。进入腾讯朋友网,开启游戏。一切又光明了。

总结:

各位看官,别看我洋洋洒洒几句废话貌似几分钟的事情。在那个接近崩溃,连数据库渣都没的条件下。我是多么惨的度过了2个小时。

mysqlbinlog

各位真心要记在心里。如果有全量备份+这个增量备份,基本上数据是不会丢失的。嗨。真实虚惊一场啊。

原文链接:http://www.cnblogs.com/zc22/p/3145080.html

下载本文
显示全文
专题