質問: MySQLのtableデータを保存するにあたり、一番簡単な方法はmysqldumpだと思います。 しかし、今回自分に起こった問題は、serverをrebootしたときに、MySQLの一部のファイルで問題が起こり、mysql自体が起動しなくなってしまいました。(それに伴ってmysqldumpも使用できませんでした。) 最終的には自己解決しましたが、かなりはまってしまった困っておりました。 この状況で、データを保存して、新しくMySQLを入れなおし、その保存したデータを新規のMySQLに入れなおした過程を残しておきます。この方法がすべてとは思いませんが、自分の場合ではデータがリカバリーできました。 以下に移動させました。
回答: 今回使用した環境は、 OS: Ubuntu 16.04 MySQL version: 5.7.20 (現時点でubuntuのapt-getで得られる最新のversionです。) 1・ データの保存! これは一番重要です。mysqlのデータをすべて保存します。自分のサーバーでは、/var/lib/mysqlがそれにあたります。まずはこれのback-upを作成します。 ``` sudo cp -r /var/lib/mysql /var/lib/mysql.bak ``` (mysql directoryはmysqlが管理者になっていると思いますので、"sudo"をコマンドの頭に付けます。) 2.壊れた(古い)versionのMySQLをすべて取り除く これは以下のコマンドでできます。 ``` sudo apt-get remove mysql-server sudo apt-get autoremove sudo apt-get autoclean ``` また、古いデータが残っていると邪魔しますので、データが保存されているdirectoryを消去します。 ``` sudo rm -rf /var/lib/mysql ``` 3.MySQLの再インストール これは以下のcommandで大丈夫です。 ``` sudo apt-get install mysql-server ``` なぜかわかりませんが、今回行った時には、同じcommandでも2パターンの結果が出てきました。 パターン1(正解):上記のcommandを動かすと、自動的に、root passwordが訊かれます。このroot passwordを設定すれば、以後問題は起こりませんでした。ですので、こちら方を今回の問題に関して「正解」と記させていただきます。 パターン2(問題が残る):上記で記したroot passwordが訊かれませんが、なぜかinstallが完了します。これは後々データを移動させるときに問題になってきます。もし訊かれなかった場合、2からやり直してください。(再度mysqlを消して、再インストールです。) インストールが終了すると、さっき消した/var/lib/mysqlが復活しているはずです。 ``` sudo ls /var/lib/mysql ``` で確かめれます。 念のため、この時点でmysqlにlog-inできるかを確かめておいてください。 ``` mysql -u root -p ``` 4. データの移動 back-upを取ったdirectoryからデータを移動させます。 この時に重要になるファイル・directoryが3種類あります。 * ib* (ibdata1, ib_logfile0, ib_logfile1) * performance_schema(これも標準でついているdirectoryです。) * リカバリーさせたいデータ(databaseの名前ごとに、directoryで整理されていると思います。) 以下のcommandをタイプすると大丈夫です。 ``` sudo cp /var/lib/mysql.bak/ib* /var/lib/mysql/ib* sudo cp -r /var/lib/mysql.bak/performance_schema /var/lib/mysql/performance_schema sudo cp -r /var/lib/mysql.bak/<リカバリーさせたいdatabase名> /var/lib/mysql/<リカバリーさせたいdatabase名> ``` (もし[リカバリーさせたいdatabase]が複数ある場合は、最後の行を繰り返してください。) directoryの管理が違っているかもしれませんので、以下のもので管理をしてください。 ``` sudo chown -R mysql:mysql /var/lib/mysql/ib* sudo chown -R mysql:mysql /var/lib/mysql/performance_schema sudo chown -R mysql:mysql /var/lib/mysql/<リカバリーさせたいdatabase名> ``` 5. (オプション) 一度MySQLにログインする 先にもやりました、 mysql -u root -p でログインした後、 ``` show database ``` でリカバリーさせたいdatabase名が表示されることを確認してください。 さらに ``` use <リカバリーさせたいdatabase名> show table ``` で、テーブル名が見えることもお忘れずに。 しかし、この時点では、 ``` select * from table_name; ``` を行ったとしても、エラーが出ると思います。(例えば、ERROR 1146 (42S02): Table 'v3_zone_date_cpm7k' doesn't exist) この状態では、テーブル名が表示されれば十分ですので、気にせず、ログアウトしてください。 6. mysqlを再起動する 以下のcommandでmysqlが再起動できます。 sudo service mysql restart もしくは ``` sudo /etc/init.d/mysql restart ``` 確認のために、上記の後に、 ``` sudo service mysql status ``` もしくは ``` sudo /etc/init.d/mysql status ``` で「Active: active (running) 」が見えるか確認してください。 7. MySQLに再度ログインする 再度mysqlにログインすると、すべてのデータはリカバリーされていると思います。 これで終了です。:) 最後に、少し注意点は、 例えば、保存されているdirectory(/var/lib/mysql.bak)のなかに以前に作成したdatabaseが3つあると仮定してください。(PROJECT_ONE, PROJECT_TWO, PROJECT_THREE) たとえ、この中のPROJECT_ONEだけをリカバリーしたい場合でも、3つともすべてデータを移動させてください。もしこれを行わないと、#6のmysqlの再起動の時に問題が発生します。(基本再起動できませんでした。) ただ、上記のように行ったところ、うまくいきましたので、もしお困りの方がおられましたら、参考程度に試していただけると幸いです。