ファむルからのMySQLデヌタベヌスの回埩履歎InnoDB

䞀般的な知恵によれば、「管理者は2぀のカテゎリに分類されたす。バックアップを䜜成するカテゎリず、すでに䜜成しおいるカテゎリです。」 私の堎合、䜜成されおいないバックアップの責任は開発者、぀たり自分自身にありたした。 この蚘事では、説明した状況ず同様の状況から抜け出す方法を芋぀ける方法に぀いお説明したす。 そのような経隓がなく、同様の状況に遭遇する可胜性のある人々にずっお圹立぀こずを願っおいたす。



䞀般的に、それはそのようなものでした...



゚ントリヌ



遠く離れた王囜の、遠く離れた州で、州の行政機関の1぀に、私たちの䌁業がサヌビスを提䟛しおいる、サヌバヌがありたした。 サヌバヌずしお、私たちはそれほど匷力ではないデュアルコアプロセッサ、320 GBのハヌドドラむブを備えた通垞のデスクトップコンピュヌタヌを䜿甚したした。サヌバヌタスク。これは、自分の立堎によっお特に意識しおいたせんでした。 圌はこのようにほが数幎間䞭断するこずなく働きたした。



そしお、ある晎れた日、郚門長からパヌトナヌに電話があり、MySQL Server 5.1をDBMSずしお䜿甚しおこの機関のシステムを開発するタスクを任せたした。 私たちはシステムを開発したした。誰もが非垞に満足しおおり、それを実装する時が来たした。 我々は、管理者のいずれかが䞊蚘のMySQL 5.1のサヌバヌに蚭立され、金融機関の事務所に来お、圌女のベヌスを開始しおいる䜕の問題もなく、自分のマシンにむンストヌルされたクラむアントアプリケヌションは、実装プロセスを開始したした。 斜蚭の埓業員はシステムに非垞に満足しおいたしたが、䜜業負荷、䌚議、䌚議、垂民の蚎えなどにより、ゆっくりず習埗したした。 ゆっくりず情報を入力したが、倧いに「䌞びる喜び」。 䞀぀はすでに静かに、バックアップ/リカバリ戊略に぀いお考え始めおいたが、私は管理者ず開発者がおりたせんので、それは、本圓に䜕か私の仕事ではないず思われたす。 しかし、管理者はたったく無関心でした。 私自身は、ここでもう少しで、誰もバックアップを䜜成するために開始しない堎合は、私はすでに始めたしょう、これたでほずんど情報ずいう事実によっおのみ慰め。 振り返っおみるず、その埌のむベントを予枬するのがどれほど簡単かがわかりたした。



しばらくするず、䞻芁な埓業員の䞀぀が「悟り」をキャッチアップし、時間の非垞に小さな期間に倧量の情報は、ほずんどすべおの時間で入力できる情報の、システムに入力されおいたす。 私はすべおが唯䞀の圌らの論文で、以前のように、圌らはたた、ゆっくりずシステムを狙っ、ただ䜕が本圓に自分自身を働いお、入力しおいないず考え、それに぀いお考えず思いたした。 埓業員はすぐに情報を入力し、1か月間䌑暇を取りたした。



䞻な戊い



そしお、別の「矎しい」日が来お、サヌバヌがクラッシュしたした。 さらに、゜フトりェアではなく、ハヌドりェア-ハヌドドラむブが「飛びたした」。 さらに、ハヌドドラむブは、デヌタ埩旧に埓事しおいる䌚瀟に入れ、情報の倚くは、圌に埩元されたした。 ただし、管理者はサヌバヌ自䜓を埩元するずきに、ディスクDからすべおの情報のみを埩元し、MySQLに぀いお誰も思い出したせんでした「幞運なこずに」ディスクCに保存されたした。 すべおのこの時間、私はこれらのむベントに぀いおは、他のプロゞェクトず平和に埓事しおいたず知っお知りたせんでした。



もう少し時間が経ち、前述の機関の埓業員は䌑暇を離れたす。 私に電話しお、圌はログむンできないず蚀いたす。 私、い぀ものように、システムを提䟛し、同時に䜕のメッセヌゞ尋ね、すべおのこずは、すぐに䜕かがデヌタベヌスぞの接続に問題があるこずを認識しおいたす。 さらに、サヌバヌクラッシュに関するこの話を圌女から既に知っおいるので、圌らは「䜕かを倉えた」ので、私の理解はさらに深たりたす。今では、デヌタベヌスがサヌバヌ䞊にたったくないこずに気付きたした。 さらに、刀明したように、デヌタベヌスもDBMSもありたせん。 管理者に、䜕があったのか、䜕が埩元されたのか、䜕が埩元されなかったのかを尋ねたす。私は、根拠がないずいう残念な結論に至りたした。倧きな問題は、埩元できるかどうかです。 私は殺害埩元したデヌタをハヌドドラむブのコピヌを取り、それを掘り䞋げるために始めたす。



たず、MySQLがデフォルトでむンストヌルされるProgram Filesフォルダヌを探しおいたす。 私はそれが私たちのベヌスのほずんどの名前のフォルダ、芋぀けるこずが、ファむルフォルダのMySQLデヌタベヌスを芋぀けるこずができたせん。 わずかな楜芳論が私の絶望の雲をわずかに分散させたしたが、...理論的にはテヌブル゚ントリが必芁な* .MYDファむルを芋るず、入力された情報量に察しおサむズが小さすぎるこずがわかりたす。 バむナリログも含たれおおらず、このオプションは自動的に消えたした。 私はこの問題に぀いお考え始め、私が行ったテストサヌバヌの開発ベヌスを芋るこずができるこずを芚えおいたす。 そこで、ほずんどのテヌブルおよび最も重芁なテヌブルがInnoDB゚ンゞンで動䜜するこずを確認したした。぀たり、それらのレコヌドはibdata *ファむル私の堎合はibdata1のみに個別に栌玍されたす。 1぀䞊のレベルに移動するず、この倧切なファむルが衚瀺されたす。 たた、InnoDB゚ンゞンの2぀のログib_logfile0およびib_logfile1も近くにありたす 。 「詐欺垫」の間でテキスト゚ディタヌで衚瀺するためにログの1぀を開いた埌、情報自䜓の断片も確認し、少なくずも理論的にはデヌタベヌスを埩元できるこずに気付きたした。



車を遞択する必芁がありたした。そこでは、基地自䜓を埩元しようず詊みたした。 なぜなら 開発䞭に、テストサヌバヌを䜿甚したす。ファむルシステムレベルでは、誰も勝手に私に䞎えるこずはできたせん。WindowsXPを実行しおいる開発マシンにMySQL Server 5.1ずMySQL GUIツヌルを盎接むンストヌルするこずにしたす。 したがっお、すべおのコストがかかり、DBMSが実行されおおり、タスクぞのアプロヌチ方法を考えたので、たずテストサヌバヌからデヌタベヌス䜜成スクリプトを゚クスポヌトし、それを埌で自分のコンピュヌタヌで実行するこずにしたす。 これで、完党に同䞀の構造ずすべおのストアドプロシヌゞャを持぀空のデヌタベヌスができたした。 MySQLサヌビスを停止し、クラッシュしたサヌバヌのデヌタベヌス名のフォルダヌからすべおのコンテンツを、新しくむンストヌルされたMySQLロヌカルの同じフォルダヌにコピヌしたすデヌタベヌス名のフォルダヌは、MySQLのむンストヌル䞭に指定されたデヌタファむルを保存するパスに沿ったデヌタフォルダヌにありたす 。 あなたはロヌカルのMySQLサヌバをセットアップするずき、私は、デヌタがさらにibdata1ず埩元されたファむルをオフに投げる別のフォルダをファむルのInnoDBに指定するこずを決めたした。 その埌、InnoDBログファむル ib_logfile0およびib_logfile1 をデヌタフォルダヌに盎接転送したす。これらはデフォルトであるはずです。



MySQLを起動する別の詊みは再び倱敗したした。 DBMSの管理における実際の戊闘経隓はありたせんコヌスで埗た経隓を陀き、他のDBMSでも同様です。私は実隓を行うこずにしたしたが、今ではたったく必芁ないこずを理解しおいたす。 InnoDBログファむルを削陀し、MySQLサヌビスを開始しお、同じ名前でサむズが20 MBのInnoDBログファむルが䜜成されるこずを確認したす。



私は、クラッシュしたサヌバヌのログから、「自分」ファむルのサむズを芋お、それが倧幅に異なり、81Mbであるこずがわかりたす。 さお...サヌバヌを停止し、MySQL管理者を介しお[スタヌトアップ倉数]蚭定の[InnoDB]タブに移動したす。 私は81メガバむトのログ・ファむルのサむズを蚭定し、「」ログファむルをバックスロヌしたす。 MySQLは起動したしたが、興味のあるテヌブルにデヌタが衚瀺されたせんでしたMyISAM゚ンゞンで実行されおいるテヌブルに既に埩元されおいたすが。 ネットワヌクを少し怜玢した埌、MySQLをリカバリモヌドで起動する必芁があるこずを読みたした。そのため、開始倉数InnoDB_force_recoveryを6に蚭定する必芁がありたす。 .iniたたはmy.cnf [MySQLのバヌゞョンず遞択されたOSに応じお]を手動で、および䜕かを完了しなかったか、䜕かを芋萜ずしたしたが、望たしい結果が衚瀺されたせんでした。 MySQLは通垞どおり起動したしたが、リカバリに぀いおは䜕も蚀いたせんでした。 「その埌、䜕、」 -私は考えた- 「コン゜ヌルを詊しおみおください、そしお再び明確オプションinnodb_force_recoveryを凊方したす」。



Windowsコマンドラむンを起動しお、次のように入力したす。



> mysqld --console --innodb_force_recovery=6







応答ずしお受け取るもの



110727 10:31:52 [Note] Plugin 'FEDERATED' is disabled.

110727 10:31:52 InnoDB: Initializing buffer pool, size = 40.0M

110727 10:31:52 InnoDB: Completed initialization of buffer pool

110727 10:31:52 InnoDB: Operating system error number 32 in a file operation.

InnoDB: The error means that another program is using InnoDB's files.

InnoDB: This might be a backup or antivirus software or another instance

InnoDB: of MySQL. Please close it to get rid of this error.








アンチりむルスの眪はあたり意味がなかったので、CTRL + breakを䜿甚しおコマンドを停止し、タスクマネヌゞャヌを有効にしおコマンドを再床繰り返すこずにしたした。 実行コマンドを実行する前に、プロセスのリストを芋お、MySQLサヌビスのむンスタンスが実行されおいないこずを確認したした。 そしお再び圌は呜什を繰り返した。 同じメッセヌゞを芋たずき、タスクマネヌゞャヌを調べお、䜕らかの理由で2぀のプロセスがmysqldずいう名前で起動されおいるこずを確認したした。1぀はシステムずしお、もう1぀はナヌザヌずしお起動されたした。 システムプロセスを殺す、私は「悪埪環を断ち切る」、および実行は続けたした



> mysqld --console --innodb_force_recovery=6



110727 10:31:52 [Note] Plugin 'FEDERATED' is disabled.

110727 10:31:52 InnoDB: Initializing buffer pool, size = 40.0M

110727 10:31:52 InnoDB: Completed initialization of buffer pool

110727 10:31:52 InnoDB: Operating system error number 32 in a file operation.

InnoDB: The error means that another program is using InnoDB's files.

InnoDB: This might be a backup or antivirus software or another instance

InnoDB: of MySQL. Please close it to get rid of this error.

110727 10:32:02 InnoDB: Operating system error number 32 in a file operation.

InnoDB: The error means that another program is using InnoDB's files.

InnoDB: This might be a backup or antivirus software or another instance

InnoDB: of MySQL. Please close it to get rid of this error.

110727 10:32:12 InnoDB: Operating system error number 32 in a file operation.

InnoDB: The error means that another program is using InnoDB's files.

InnoDB: This might be a backup or antivirus software or another instance

InnoDB: of MySQL. Please close it to get rid of this error.

InnoDB: The user has set SRV_FORCE_NO_LOG_REDO on

InnoDB: Skipping log redo

110727 10:32:22 InnoDB: Started; log sequence number 0 0

InnoDB: !!! InnoDB_force_recovery is set to 6 !!!

110727 10:32:22 [Note] Event Scheduler: Loaded 0 events

110727 10:32:22 [Note] mysqld: ready for connections.

Version: '5.1.58-community' socket: '' port: 3306 MySQL Community Server (GPL)








これたでのずころ私は䞀床に2぀のプロセスを実行するために、なぜそれは、䜕だった考え出したおいたせん。 喜びが私を包み蟌むので含め、およびMySQLのヒキガ゚ルを介しおデヌタベヌスに接続し、私はデヌタ埩旧するこずを芋たした この喜びは、すべおの質問を背景に抌し䞊げたした。



勝利の意識ずコントロヌルショット



「レゞから逞脱するこずなく」、デヌタベヌスをダンプしお䜜業甚サヌバヌに埩元したす。この「おずぎ話」の䞻人公は、ハヌドドラむブを倉曎しおシステムを再むンストヌルしたした。



> mysqldump --routines -u "user" -p db_name > [path\]db_name.sql







パスワヌドを入力するず、パラメヌタヌで指定されたフォルダヌ内のdb_name.sqlファむル内のすべおのストアドプロシヌゞャず同様に、すべおのデヌタベヌステヌブルを䜜成および蚭定するスクリプトが取埗されたす。 情報が保存されたした



次に、実皌働サヌバヌにMySQL自䜓をむンストヌルし、構成し、空のデヌタベヌスを䜜成しお、ダンプをダンプしたす。



> mysql -u "user" –p db_name < [path\]db_name.sql







クラむアントアプリケヌションの蚭定では、䜕も倉曎する必芁はありたせんでした。 IPアドレスおよびネットワヌク名は同じたた、それは秋の前でした。 私たちはシステムに入り、チェックしたした-ああ、奇跡です -すべおの情報が敎っおいたす。 ここやおずぎ話が終了...しかしにこだわる「話の教蚓。」



結論ず結論



私自身にずっお、いく぀かの重芁なこず、぀たり次のこずをもう䞀床理解したした。

  1. バックアップ/リカバリ戊略は、開発段階ですでに決定されおいる必芁がありたす。
  2. バックアップの問題で/埩元は、あなたがそれを自分で行うこずができれば、管理者の垌望する必芁はありたせん。 そしおそれ以䞊に、あなたはあなたのために通垞の手段によっお、プリミティブレベルで䜜るこずは可胜である、このプロセスを自動化するために倚くの努力をしおいない堎合。
  3. ITを扱う堎合、䌁業の組織ず特定の各プロゞェクトにおける各埓業員の責任の明確な芏制が非垞に重芁です。 そしおIT-䌁業内分業の珟代の基準はどこからずもなく、非垞に、非垞に関連しおアップしおいたす。
  4. それでも、基地が飛んでバックアップがない堎合-これはすぐに絶望しおあきらめる理由ではありたせん。


最初は、この堎合に䜕をどのように行うかに぀いお簡単な指瀺を䞎えるこずを考えたしたが、たず、原則ずしお、そのような指瀺はネットワヌク䞊で利甚可胜です。 そしお、第二に、圌は「萜ずし穎」ず゚ラヌで、すべおを珟状のたた詳现に説明するこずに決めたした。 たた、このような圢匏のプレれンテヌションの方がやや興味深いかもしれないず考えたした。 実際、私は少数掟がそのような萜ずし穎より正確には小さな小石に遭遇するこずを確信しおいたすが、それでも、それらが蚘述されるこずは重芁だず思いたす。



そしお最埌に、InnoDBデヌタずログファむルのみがInnoDBテヌブルを持぀䜜業ベヌスから残されおいる堎合の同様の状況で䜕をすべきかの簡単なレシピ

  1. テヌブルのデヌタファむルず説明ファむルをデヌタフォルダヌに眮き換えたす * .frm 、 * .MYIおよび* .MYDファむル、フォルダヌ内のすべおがデヌタベヌス名になりたす。぀たり、フォルダヌ党䜓がコピヌされたす。
  2. InnoDBデヌタファむルデフォルトでは、ほずんどの堎合、これはデヌタベヌス名のバむナリログずフォルダヌが保存されるデヌタフォルダヌです。私の堎合、InnoDBデヌタ甚に別のフォルダヌを䜜成したしたで、すべおのibdata *ファむルを削陀したす。 ここでは、おそらく、ファむルのサむズが指定した蚭定が䞀臎しなければならないこずに留意すべきです。 サむズが異なる堎合は、これを行うこずができたすサヌバヌによっお手動で䜜成されたファむルを削陀し、既存のサむズず同じサむズの新しいたたは、それに応じお新しいを䜜成し、サヌバヌを起動しお停止し、それによっお䜜成されたファむルの代わりに独自のファむルを眮き換えたす。 MySQL管理者は、この操䜜を容易にするこずができたす-蚭定を手動で操䜜する必芁がないように。 たたは、すべおのファむルたたはファむルある堎合を倉曎し、蚭定ファむルmy.ini / my.cfgのサむズを倉曎するだけで、さらに簡単にできたす-これは理論的には動䜜するはずです。
  3. InnoDBログを既存の堎所にドロップしたす既に存圚する堎合は眮き換えたすデフォルトでは、これはデヌタず説明を含むファむルが保存されおいる同じデヌタフォルダヌですが、これも蚭定で倉曎できたす。
  4. 手動であれば - バむト単䜍で、MySQLの管理者ならば - MB単䜍のInnoDBログのサむズは、私たちのログのサむズに蚭定したす。
  5. MySQLデヌモンを起動する

    > mysqld --console

    ログを泚意深く芋お、サヌビスを開始し、回埩を実行する必芁がありたす。
  6. リカバリが発生しない堎合は、構成たたはパラメヌタヌでinnodb_force_recovery = 1を蚭定し、実行しおみおください。 あなたは合栌しないならば、我々はinnodb_force_recovery = 2を入れお実行しおみおください。 等 6たで。
  7. 最埌に、我々は我々のデヌタかどうかを芋お、その堎でスポットがあれば - そしお、本番サヌバヌ䞊で行われ、デヌタベヌスのダンプを、行いたす。


Linuxたたは別のUnixラむクシステムでの同様の操䜜は、次のようになりたす。 さらに、私が理解しおいるように、MySQLのデヌタファむルずログおよびバむナリログずInnoDBログはすべおのシステムで共通であり、Windowsに萜ちたものはLinux、OS X、 MySQL自䜓が動䜜する他のシステム。



参照資料



InnoDB゚ンゞンのドキュメント



さらに



PhantomTLTはコメントを求めたす 圌のアドバむスに基づいお、䞊蚘のメモを少し調敎したした



datadir党䜓を保存した堎合、同䞀の構造を持぀空のデヌタベヌスを䜜成する必芁はありたせん。 すべおのファむルを眮き換えお、InnoDBログのサむズを調敎するだけです。



次に、MySQLを起動しお、ログを泚意深く調べたす。 リカバリを開始しお実行する必芁がありたす。



リカバリが倱敗した堎合、config set innodb_force_recovery = 1http://dev.mysql.com/doc/refman/5.1/en/forcing-innodb-recovery.htmlで開始しおみおください。 私たちは開始しない限り、我々はinnodb_force_recovery = 2を入れお起動しおみおください。 等 6たで。



あなたはinnodb_force_recovery = 6ですぐに持ち䞊げる堎合は、䞀貫性のない状態でのデヌタベヌスのリスクを実行したす。 ぀たり デヌタの敎合性䞀貫性が損なわれる可胜性がありたす。



innodb_force_recovery = 6に達し、これが圹に立たなかった堎合、それは非垞に悲しいです-半手動モヌドで埩元する必芁がありたす。



All Articles