[MySQL] データファイルから DB を復元する
2018/11/25 12:44
  • 前回の記事 で起動できなくなった MySQL を起動できるようにしたのですが、
    どうやらそれだけでは不足だったみたいで、サイトにアクセスすると 500 エラーがでるという状態が続いていました。

    いろいろ対応をしたので正直どれが正しい解決方法だったのかはわかりませんが、
    実際に行ったことを覚えている限り書き出してみます↓

    データファイルの確認

    まずはデータベースの大元のデータファイルがあるかどうかを確認しました。

    /var/lib/mysql/ 以下にデータベース名のディレクトリがあるはずなので、そこに .ibd, .frm ファイルが有ることを確認します。
    以下一部隠蔽しています。


    $ sudo ls -l /var/lib/mysql/your_database_name
    合計 52932
    -rw-r----- 1 mysql mysql 8586 11月 20 20:24 2018 auth_group.frm
    -rw-r----- 1 mysql mysql 114688 11月 20 20:34 2018 auth_group.ibd
    -rw-r----- 1 mysql mysql 8642 11月 20 20:24 2018 auth_group_permissions.frm
    -rw-r----- 1 mysql mysql 131072 11月 20 20:45 2018 auth_group_permissions.ibd
    -rw-r----- 1 mysql mysql 8676 11月 20 20:24 2018 auth_permission.frm
    -rw-r----- 1 mysql mysql 114688 11月 20 20:34 2018 auth_permission.ibd
    -rw-r----- 1 mysql mysql 8956 11月 20 20:24 2018 auth_user.frm
    -rw-r----- 1 mysql mysql 114688 11月 23 15:14 2018 auth_user.ibd
    -rw-r----- 1 mysql mysql 8630 11月 20 20:24 2018 auth_user_groups.frm
    -rw-r----- 1 mysql mysql 131072 11月 20 20:45 2018 auth_user_groups.ibd
    -rw-r----- 1 mysql mysql 8640 11月 20 20:24 2018 auth_user_user_permissions.frm
    -rw-r----- 1 mysql mysql 131072 11月 20 20:45 2018 auth_user_user_permissions.ibd
    -rw-r----- 1 mysql mysql 61 11月 20 20:24 2018 db.opt
    -rw-r----- 1 mysql mysql 8866 11月 23 16:49 2018 django_admin_log.frm
    -rw-r----- 1 mysql mysql 278528 11月 23 16:49 2018 django_admin_log.ibd
    -rw-r----- 1 mysql mysql 8628 11月 23 13:20 2018 django_content_type.frm
    -rw-r----- 1 mysql mysql 114688 11月 23 13:20 2018 django_content_type.ibd
    -rw-r----- 1 mysql mysql 8650 11月 20 20:24 2018 django_migrations.frm
    -rw-r----- 1 mysql mysql 98304 11月 20 20:45 2018 django_migrations.ibd
    -rw-r----- 1 mysql mysql 8664 11月 20 20:24 2018 django_session.frm
    -rw-r----- 1 mysql mysql 147456 11月 23 15:14 2018 django_session.ibd
    -rw-r----- 1 mysql mysql 8620 11月 20 20:24 2018 django_site.frm
    -rw-r----- 1 mysql mysql 98304 11月 20 20:45 2018 django_site.ibd

    データ自体はありそうで、ちゃんとファイルサイズもそれっぽいので一安心。ε-(´∀`*)ホッ


    DB の再作成

    データが有ることは確認できましたが、サイトは依然として 500 エラーのままでデータベースがおかしいことは明らかだったので
    原因を追求するべく上記のデータファイル群をまるっとバックアップしてから作り直します。

    バックアップ

    $ sudo cp -r /var/lib/mysql/your_database_name ~/
    


    データベースの削除

    $ sudo rm -rf /var/lib/mysql/your_database_name
    

    データベースの再作成

    $ mysql -uroot -p
    mysql> create database your_database_name;
    

    データのリストア

    $ sudo cp ~/your_database_name/* /var/lib/mysql/your_database_name/
    

    参考サイト:


    1812 Tablespace is missing for table XXXX

    実際に MySQL にログインして Select 文を発行すると、 1812 Tablespace is missing for table XXXX と表示されます…/(^o^)\

    参考サイト:


    Discard してから Import

    データファイルはあるはずなのに、 Table xxxx doesn't exist とか言われる。drop tableselect もできないので困り果てる…
    データファイルから直接データを復元しようとすると、壊れたデータが混ざり込んでいたりすることがあるらしく
    明示的に再生成が必要っぽい。

    例えば以下のような感じで、全テーブルに適用します。

    alter table auth_group DISCARD TABLESPACE;
    alter table auth_group_permissions DISCARD TABLESPACE;
    


    ここでもう一度退避させていたデータからコピーします。

    $ sudo cp ~/your_database_name/* /var/lib/mysql/your_database_name/
    

    alter table auth_group IMPORT TABLESPACE;
    alter table auth_group_permissions IMPORT TABLESPACE;
    

    これがうまくいくと、 select できるようになります。
    参考サイト:


    ERROR 2013 (HY000): Lost connection to MySQL server during query


    select count(*) from table ができるようになったので安心していたら、 select * from table で上記のエラーが出るようになりました。これは原因が全然わからない…


    すごく重いクエリを投げると接続が切られることはあるけど、レコード数も少ないしクエリ実行後即座にコネクションを切られてる感じ。
    困り果てたので、ローカルで同じ環境を作ってこれまでの対応をやってみることにしましたが、ローカルでは再現せず、無事に
    select * from table することができました。腑に落ちないけど、データ復旧が先なので考えるのは後回し…w

    dump ファイルからの復元

    上記で問題ない状態になったので(たぶん)、ローカルのテーブルを dump します。

    $ mysql -uuser_name -p your_database_name table_name > ~/`date "+%Y%m%d"`_table_name.dump
    

    これを rsync などでサーバーにアップロードして、インポートします。


    $ mysql -uuser_name -p your_database_name < ~/20181125_table_name.dump

    これで復元できました。


    人気ブログランキングへ ブログランキング・にほんブログ村へ
    ↑応援よろしくお願いします!m(_ _)m

  • 2018/11/25 12:44
  • サーバー
  • MySQLバックアップibdfrmインポート復元データファイル
  • 新しい記事へ
    CentOS6 系でのプロセスの自動起動の設定

    古い記事へ
    [MySQL] 正常に稼働していたのにメンテナンス時に一度停止すると再起動できなくなった

profile picture

自己紹介的な何か

@wkmettyでついったーやってます。時々。 6年間勤めたゲーム会社を2018年2月に退職しフリーランスのプログラマに。 WordPress Core, WP-CLI コントリビューター。 お仕事募集中です。