Maison base de données tutoriel mysql MySQL数据库Drop Down后的紧急处置_MySQL

MySQL数据库Drop Down后的紧急处置_MySQL

Jun 01, 2016 pm 01:31 PM
gbk 处置 数据库

前言

今天下午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>
Copier après la connexion

导出了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>
Copier après la connexion

大概是这种结构。

冷静下来,分析了。我还原数据库,只要从建库开始第一个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>
Copier après la connexion

这样,我就得到过滤出来的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>
Copier après la connexion

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

总结:

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

mysqlbinlog

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

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Comment le langage Go implémente-t-il les opérations d'ajout, de suppression, de modification et de requête de la base de données ? Comment le langage Go implémente-t-il les opérations d'ajout, de suppression, de modification et de requête de la base de données ? Mar 27, 2024 pm 09:39 PM

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 d'encodage de langue Go : comparaison UTF-8 et GBK Analyse d'encodage de langue Go : comparaison UTF-8 et GBK Mar 28, 2024 pm 01:54 PM

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

Comment Hibernate implémente-t-il le mappage polymorphe ? Comment Hibernate implémente-t-il le mappage polymorphe ? Apr 17, 2024 pm 12:09 PM

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.

iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées Jul 18, 2024 am 05:48 AM

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

Une analyse approfondie de la façon dont HTML lit la base de données Une analyse approfondie de la façon dont HTML lit la base de données Apr 09, 2024 pm 12:36 PM

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.

Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP Jun 04, 2024 pm 01:42 PM

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())

Comment gérer les erreurs de connexion à la base de données en PHP Comment gérer les erreurs de connexion à la base de données en PHP Jun 05, 2024 pm 02:16 PM

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 Analyse des principes de base du système de gestion de base de données MySQL Mar 25, 2024 pm 12:42 PM

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

See all articles