MySQL数据库Drop Down后的紧急处置_MySQL
前言
今天下午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文件。还好。用
<ol class="dp-sql"><li class="alt"><span><span>mysqlbinlog </span><span class="comment">--no-defaults mysql-bin.000026 > mysql-bin.000026.txt</span><span> </span></span></li></ol>
导出了SQL,检查下:
<ol class="dp-sql"> <li class="alt"><span><span># </span><span class="keyword">at</span><span> 472331597 </span></span></li> <li><span>#130619 18:04:23 server id 1 end_log_pos 472331772 Query thread_id=2657 exec_time=0 error_code=0 </span></li> <li class="alt"><span><span class="keyword">SET</span><span> </span><span class="keyword">TIMESTAMP</span><span>=1371636263/*!*/; </span></span></li> <li><span><span class="keyword">UPDATE</span><span> USR_RESOURCE </span><span class="keyword">SET</span><span> MODIDATE = </span><span class="string">'2013-06-19 18:04:23'</span><span>,SILVER = 283 </span><span class="keyword">WHERE</span><span> USERCODE=</span><span class="string">'001UR1371634524003511'</span><span> </span></span></li> <li class="alt"><span>/*!*/; </span></li> <li><span># <span class="keyword">at</span><span> 472331772 </span></span></li> <li class="alt"><span>#130619 18:04:23 server id 1 end_log_pos 472331799 Xid = 226001034 </span></li> <li><span><span class="keyword">COMMIT</span><span>/*!*/; </span></span></li> <li class="alt"><span># <span class="keyword">at</span><span> 472331799 </span></span></li> <li><span>#130619 18:04:23 server id 1 end_log_pos 472331871 Query thread_id=2657 exec_time=0 error_code=0 </span></li> <li class="alt"><span><span class="keyword">SET</span><span> </span><span class="keyword">TIMESTAMP</span><span>=1371636263/*!*/; </span></span></li> <li><span><span class="keyword">BEGIN</span><span> </span></span></li> </ol>
大概是这种结构。
冷静下来,分析了。我还原数据库,只要从建库开始第一个sql重新执行到最后一个。理论上数据库就会被还原。但是bin文件里面是所有的SQL操作,我要筛选出 达洛克战记2服 的。网上说用 cat / more / less 等命令。我靠,这他妈也太复杂了把?
于是我zip了所有bin文件,回传到本地,用c#写了个过滤代码,找到 use darok2_2,知道这段内容都是 达洛克战记2服 的数据。
<ol class="dp-c"> <li class="alt"><span><span class="keyword">public</span><span> </span><span class="keyword">void</span><span> test() </span></span></li> <li><span>{ </span></li> <li class="alt"><span> FileStream stream = File.OpenRead(@<span class="string">"E:\玩转中国\程序设计\达洛克战记\xtar-backup\svn\达洛克战记2x\svn\server-deploy\mysql-bin.000027.txt\mysql-bin.000027.txt"</span><span>); </span></span></li> <li><span> StreamReader reader = <span class="keyword">new</span><span> StreamReader(stream, Encoding.GetEncoding(</span><span class="string">"GBK"</span><span>)); </span></span></li> <li class="alt"><span> </span></li> <li><span> FileStream streamO = File.Create(@<span class="string">"E:\玩转中国\程序设计\达洛克战记\xtar-backup\svn\达洛克战记2x\svn\server-deploy\mysql-bin.000027.txt\000027.out.txt"</span><span>); </span></span></li> <li class="alt"><span> StreamWriter writer = <span class="keyword">new</span><span> StreamWriter(streamO, Encoding.GetEncoding(</span><span class="string">"GBK"</span><span>)); </span></span></li> <li><span> </span></li> <li class="alt"><span> Encoding gbk = Encoding.GetEncoding(<span class="string">"GBK"</span><span>); </span></span></li> <li><span> Encoding utf = Encoding.Default; </span></li> <li class="alt"><span> </span></li> <li><span> <span class="keyword">string</span><span> strLine = reader.ReadLine(); </span></span></li> <li class="alt"><span> </span></li> <li><span> <span class="keyword">while</span><span> (strLine != </span><span class="keyword">null</span><span>) </span></span></li> <li class="alt"><span> { </span></li> <li><span> </span></li> <li class="alt"><span> <span class="keyword">if</span><span> (!strLine.StartsWith(</span><span class="string">"use darok2_2"</span><span>, StringComparison.OrdinalIgnoreCase)) </span></span></li> <li><span> { </span></li> <li class="alt"><span> strLine = reader.ReadLine(); </span></li> <li><span> <span class="keyword">continue</span><span>; </span></span></li> <li class="alt"><span> } </span></li> <li><span> </span></li> <li class="alt"><span> <span class="keyword">do</span><span> </span></span></li> <li><span> { </span></li> <li class="alt"><span> <span class="keyword">if</span><span> (strLine == </span><span class="keyword">null</span><span>) </span></span></li> <li><span> <span class="keyword">break</span><span>; </span></span></li> <li class="alt"><span> </span></li> <li><span> <span class="keyword">if</span><span> (strLine.StartsWith(</span><span class="string">"use"</span><span>, StringComparison.OrdinalIgnoreCase) && !strLine.StartsWith(</span><span class="string">"use darok2_2"</span><span>, StringComparison.OrdinalIgnoreCase)) </span></span></li> <li class="alt"><span> { </span></li> <li><span> strLine = reader.ReadLine(); </span></li> <li class="alt"><span> <span class="keyword">break</span><span>; </span></span></li> <li><span> } </span></li> <li class="alt"><span> </span></li> <li><span> <span class="keyword">if</span><span> (strLine.StartsWith(</span><span class="string">"INSERT"</span><span>, StringComparison.OrdinalIgnoreCase) || strLine.StartsWith(</span><span class="string">"DELETE"</span><span>, StringComparison.OrdinalIgnoreCase) || strLine.StartsWith(</span><span class="string">"UPDATE"</span><span>, StringComparison.OrdinalIgnoreCase)) </span></span></li> <li class="alt"><span> { </span></li> <li><span> writer.Write(strLine); </span></li> <li class="alt"><span> writer.WriteLine(<span class="string">";"</span><span>); </span></span></li> <li><span> } </span></li> <li class="alt"><span> <span class="keyword">else</span><span> </span></span></li> <li><span> { </span></li> <li class="alt"><span> } </span></li> <li><span> strLine = reader.ReadLine(); </span></li> <li class="alt"><span> </span></li> <li><span> } </span></li> <li class="alt"><span> <span class="keyword">while</span><span> (</span><span class="keyword">true</span><span>); </span></span></li> <li><span> } </span></li> <li class="alt"><span> </span></li> <li><span> writer.Flush(); </span></li> <li class="alt"><span> writer.Close(); </span></li> <li><span> </span></li> <li class="alt"><span> reader.Close(); </span></li> <li><span>} </span></li> </ol>
这样,我就得到过滤出来的SQL文件了。本地我建了个数据库测试下,发现第一句就卡死了??HOLD住!!!
再细心看看,发现中文到了txt全部是乱码了。安静思考了下:
linux数据库用的是GBK。因此bin文件导出的格式一定是GBK。那么代码用GBK读取,然后GBK写入就ok了(代码里面已经修复了)
再导入,顺利了。
进入数据库在看,发现中文还是乱码。。。。奇怪。那可能是mysql设置的问题了,和linux环境下不一致。我只要把这些过滤的SQL在达洛克服务器上走一遍应该就ok了。
上传SQL,运行脚本:
<ol class="dp-sql"><li class="alt"><span><span>mysql -uxxxx -pxxxx darok2_2 <span class="keyword">out</span><span>.txt. </span></span></span></li></ol>
等了10分钟。。。进入腾讯朋友网,开启游戏。一切又光明了。
总结:
各位看官,别看我洋洋洒洒几句废话貌似几分钟的事情。在那个接近崩溃,连数据库渣都没的条件下。我是多么惨的度过了2个小时。
mysqlbinlog
各位真心要记在心里。如果有全量备份+这个增量备份,基本上数据是不会丢失的。嗨。真实虚惊一场啊。
原文链接:http://www.cnblogs.com/zc22/p/3145080.html

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Le langage Go est un langage de programmation efficace, concis et facile à apprendre. Il est privilégié par les développeurs en raison de ses avantages en programmation simultanée et en programmation réseau. Dans le développement réel, les opérations de base de données font partie intégrante. Cet article explique comment utiliser le langage Go pour implémenter les opérations d'ajout, de suppression, de modification et de requête de base de données. Dans le langage Go, nous utilisons généralement des bibliothèques tierces pour faire fonctionner les bases de données, telles que les packages SQL couramment utilisés, gorm, etc. Ici, nous prenons le package SQL comme exemple pour présenter comment implémenter les opérations d'ajout, de suppression, de modification et de requête de la base de données. Supposons que nous utilisons une base de données MySQL.

Analyse de l'encodage du langage Go : comparaison UTF-8 et GBK Dans le langage Go, le traitement de l'encodage des chaînes est l'une des tâches courantes. Parmi eux, UTF-8 et GBK sont deux méthodes de codage de caractères couramment utilisées. Cet article effectuera une comparaison détaillée entre UTF-8 et GBK, discutera de leurs différences et de leur utilisation, et joindra des exemples de code spécifiques. 1. Introduction à UTF-8 et GBK UTF-8 : UTF-8 est une méthode de codage Unicode de longueur variable qui peut représenter des caractères dans presque toutes les langues du monde. UTF-8

Le mappage polymorphe Hibernate peut mapper les classes héritées à la base de données et fournit les types de mappage suivants : join-subclass : crée une table séparée pour la sous-classe, incluant toutes les colonnes de la classe parent. table par classe : créez une table distincte pour les sous-classes, contenant uniquement des colonnes spécifiques aux sous-classes. union-subclass : similaire à join-subclass, mais la table de classe parent réunit toutes les colonnes de la sous-classe.

Les dernières versions d'Apple des systèmes iOS18, iPadOS18 et macOS Sequoia ont ajouté une fonctionnalité importante à l'application Photos, conçue pour aider les utilisateurs à récupérer facilement des photos et des vidéos perdues ou endommagées pour diverses raisons. La nouvelle fonctionnalité introduit un album appelé "Récupéré" dans la section Outils de l'application Photos qui apparaîtra automatiquement lorsqu'un utilisateur a des photos ou des vidéos sur son appareil qui ne font pas partie de sa photothèque. L'émergence de l'album « Récupéré » offre une solution aux photos et vidéos perdues en raison d'une corruption de la base de données, d'une application d'appareil photo qui n'enregistre pas correctement dans la photothèque ou d'une application tierce gérant la photothèque. Les utilisateurs n'ont besoin que de quelques étapes simples

HTML ne peut pas lire directement la base de données, mais cela peut être réalisé via JavaScript et AJAX. Les étapes comprennent l'établissement d'une connexion à la base de données, l'envoi d'une requête, le traitement de la réponse et la mise à jour de la page. Cet article fournit un exemple pratique d'utilisation de JavaScript, AJAX et PHP pour lire les données d'une base de données MySQL, montrant comment afficher dynamiquement les résultats d'une requête dans une page HTML. Cet exemple utilise XMLHttpRequest pour établir une connexion à la base de données, envoyer une requête et traiter la réponse, remplissant ainsi les données dans les éléments de la page et réalisant la fonction de lecture HTML de la base de données.

Comment utiliser MySQLi pour établir une connexion à une base de données en PHP : Inclure l'extension MySQLi (require_once) Créer une fonction de connexion (functionconnect_to_db) Appeler la fonction de connexion ($conn=connect_to_db()) Exécuter une requête ($result=$conn->query()) Fermer connexion ( $conn->close())

Pour gérer les erreurs de connexion à la base de données en PHP, vous pouvez utiliser les étapes suivantes : Utilisez mysqli_connect_errno() pour obtenir le code d'erreur. Utilisez mysqli_connect_error() pour obtenir le message d'erreur. En capturant et en enregistrant ces messages d'erreur, les problèmes de connexion à la base de données peuvent être facilement identifiés et résolus, garantissant ainsi le bon fonctionnement de votre application.

Analyse des principes de base du système de gestion de base de données MySQL MySQL est un système de gestion de base de données relationnelle couramment utilisé qui utilise le langage de requête structuré (SQL) pour le stockage et la gestion des données. Cet article présentera les principes de base du système de gestion de base de données MySQL, y compris la création de bases de données, la conception de tables de données, l'ajout de données, la suppression, la modification et d'autres opérations, et fournira des exemples de code spécifiques. 1. Création d'une base de données Dans MySQL, vous devez d'abord créer une instance de base de données pour stocker les données. Le code suivant peut créer un fichier nommé "mon
