데이터 베이스 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>
로그인 후 복사

导出了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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Go 언어는 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 어떻게 구현합니까? Go 언어는 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 어떻게 구현합니까? Mar 27, 2024 pm 09:39 PM

Go 언어는 효율적이고 간결하며 배우기 쉬운 프로그래밍 언어입니다. 동시 프로그래밍과 네트워크 프로그래밍의 장점 때문에 개발자들이 선호합니다. 실제 개발에서 데이터베이스 작업은 필수적인 부분입니다. 이 기사에서는 Go 언어를 사용하여 데이터베이스 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. Go 언어에서는 일반적으로 사용되는 SQL 패키지, Gorm 등과 같은 타사 라이브러리를 사용하여 데이터베이스를 운영합니다. 여기서는 sql 패키지를 예로 들어 데이터베이스의 추가, 삭제, 수정 및 쿼리 작업을 구현하는 방법을 소개합니다. MySQL 데이터베이스를 사용하고 있다고 가정합니다.

Go 언어 인코딩 분석: UTF-8과 GBK 비교 Go 언어 인코딩 분석: UTF-8과 GBK 비교 Mar 28, 2024 pm 01:54 PM

Go 언어 인코딩 분석: UTF-8 대 GBK 비교 Go 언어에서 문자열 인코딩 처리는 일반적인 작업 중 하나입니다. 그중 UTF-8과 GBK는 일반적으로 사용되는 두 가지 문자 인코딩 방법입니다. 이 기사에서는 UTF-8과 GBK를 자세히 비교하고 차이점과 사용법을 논의하며 특정 코드 예제를 첨부합니다. 1. UTF-8 및 GBK UTF-8 소개: UTF-8은 전 세계 거의 모든 언어의 문자를 표현할 수 있는 가변 길이 유니코드 인코딩 방법입니다. UTF-8

Hibernate는 어떻게 다형성 매핑을 구현합니까? Hibernate는 어떻게 다형성 매핑을 구현합니까? Apr 17, 2024 pm 12:09 PM

Hibernate 다형성 매핑은 상속된 클래스를 데이터베이스에 매핑할 수 있으며 다음 매핑 유형을 제공합니다. Join-subclass: 상위 클래스의 모든 열을 포함하여 하위 클래스에 대한 별도의 테이블을 생성합니다. 클래스별 테이블: 하위 클래스별 열만 포함하는 하위 클래스에 대한 별도의 테이블을 만듭니다. Union-subclass: Joined-subclass와 유사하지만 상위 클래스 테이블이 모든 하위 클래스 열을 통합합니다.

iOS 18에는 손실되거나 손상된 사진을 검색할 수 있는 새로운 '복구된' 앨범 기능이 추가되었습니다. iOS 18에는 손실되거나 손상된 사진을 검색할 수 있는 새로운 '복구된' 앨범 기능이 추가되었습니다. Jul 18, 2024 am 05:48 AM

Apple의 최신 iOS18, iPadOS18 및 macOS Sequoia 시스템 릴리스에는 사진 애플리케이션에 중요한 기능이 추가되었습니다. 이 기능은 사용자가 다양한 이유로 손실되거나 손상된 사진과 비디오를 쉽게 복구할 수 있도록 설계되었습니다. 새로운 기능에는 사진 앱의 도구 섹션에 '복구됨'이라는 앨범이 도입되었습니다. 이 앨범은 사용자가 기기에 사진 라이브러리에 포함되지 않은 사진이나 비디오를 가지고 있을 때 자동으로 나타납니다. "복구된" 앨범의 출현은 데이터베이스 손상으로 인해 손실된 사진과 비디오, 사진 라이브러리에 올바르게 저장되지 않은 카메라 응용 프로그램 또는 사진 라이브러리를 관리하는 타사 응용 프로그램에 대한 솔루션을 제공합니다. 사용자는 몇 가지 간단한 단계만 거치면 됩니다.

HTML이 데이터베이스를 읽는 방법에 대한 심층 분석 HTML이 데이터베이스를 읽는 방법에 대한 심층 분석 Apr 09, 2024 pm 12:36 PM

HTML은 데이터베이스를 직접 읽을 수 없지만 JavaScript 및 AJAX를 통해 읽을 수 있습니다. 단계에는 데이터베이스 연결 설정, 쿼리 보내기, 응답 처리 및 페이지 업데이트가 포함됩니다. 이 기사에서는 JavaScript, AJAX 및 PHP를 사용하여 MySQL 데이터베이스에서 데이터를 읽는 실제 예제를 제공하고 쿼리 결과를 HTML 페이지에 동적으로 표시하는 방법을 보여줍니다. 이 예제에서는 XMLHttpRequest를 사용하여 데이터베이스 연결을 설정하고 쿼리를 보내고 응답을 처리함으로써 페이지 요소에 데이터를 채우고 데이터베이스를 읽는 HTML 기능을 실현합니다.

PHP에서 MySQLi를 사용하여 데이터베이스 연결을 설정하는 방법에 대한 자세한 튜토리얼 PHP에서 MySQLi를 사용하여 데이터베이스 연결을 설정하는 방법에 대한 자세한 튜토리얼 Jun 04, 2024 pm 01:42 PM

MySQLi를 사용하여 PHP에서 데이터베이스 연결을 설정하는 방법: MySQLi 확장 포함(require_once) 연결 함수 생성(functionconnect_to_db) 연결 함수 호출($conn=connect_to_db()) 쿼리 실행($result=$conn->query()) 닫기 연결( $conn->close())

PHP에서 데이터베이스 연결 오류를 처리하는 방법 PHP에서 데이터베이스 연결 오류를 처리하는 방법 Jun 05, 2024 pm 02:16 PM

PHP에서 데이터베이스 연결 오류를 처리하려면 다음 단계를 사용할 수 있습니다. mysqli_connect_errno()를 사용하여 오류 코드를 얻습니다. 오류 메시지를 얻으려면 mysqli_connect_error()를 사용하십시오. 이러한 오류 메시지를 캡처하고 기록하면 데이터베이스 연결 문제를 쉽게 식별하고 해결할 수 있어 애플리케이션이 원활하게 실행될 수 있습니다.

MySQL 데이터베이스 관리 시스템의 기본 원리 분석 MySQL 데이터베이스 관리 시스템의 기본 원리 분석 Mar 25, 2024 pm 12:42 PM

MySQL 데이터베이스 관리 시스템의 기본 원리 분석 MySQL은 데이터 저장 및 관리를 위해 구조화된 쿼리 언어(SQL)를 사용하는 일반적으로 사용되는 관계형 데이터베이스 관리 시스템입니다. 이 글에서는 데이터베이스 생성, 데이터 테이블 설계, 데이터 추가, 삭제, 수정 및 쿼리 등을 포함한 MySQL 데이터베이스 관리 시스템의 기본 원리를 소개하고 구체적인 코드 예제를 제공합니다. 1. 데이터베이스 생성 MySQL에서는 먼저 데이터를 저장할 데이터베이스 인스턴스를 생성해야 합니다. 다음 코드는 "my

See all articles