39336


MySQLのtableデータを保存するにあたり、一番簡単な方法はmysqldumpだと思います。  
しかし、今回自分に起こった問題は、serverをrebootしたときに、MySQLの一部のファイルで問題が起こり、mysql自体が起動しなくなってしまいました。（それに伴ってmysqldumpも使用できませんでした。）

最終的には自己解決しましたが、かなりはまってしまった困っておりました。  
この状況で、データを保存して、新しくMySQLを入れなおし、その保存したデータを新規のMySQLに入れなおした過程を残しておきます。この方法がすべてとは思いませんが、自分の場合ではデータがリカバリーできました。

以下に移動させました。


CC BY-SA 3.0
2017-11-05T17:00:14.197
39314
2019-02-03T06:00:11.243
2017-11-06T09:41:13.157
11048
11048
question
mysql
mysqldumpを使用せず、MySQLのデータをリカバリーする方法


今回使用した環境は、  
OS: Ubuntu 16.04  
MySQL version: 5.7.20 (現時点でubuntuのapt-getで得られる最新のversionです。)

１・ データの保存！  
これは一番重要です。mysqlのデータをすべて保存します。自分のサーバーでは、/var/lib/mysqlがそれにあたります。まずはこれのback-
upを作成します。

[code]

    sudo cp -r /var/lib/mysql /var/lib/mysql.bak
    
[/code]

(mysql directoryはmysqlが管理者になっていると思いますので、"sudo"をコマンドの頭に付けます。)

２．壊れた（古い）versionのMySQLをすべて取り除く  
これは以下のコマンドでできます。

[code]

    sudo apt-get remove mysql-server
    sudo apt-get autoremove
    sudo apt-get autoclean
    
[/code]

また、古いデータが残っていると邪魔しますので、データが保存されているdirectoryを消去します。

[code]

    sudo rm -rf /var/lib/mysql
    
[/code]

3．MySQLの再インストール  
これは以下のcommandで大丈夫です。

[code]

    sudo apt-get install mysql-server
    
[/code]

なぜかわかりませんが、今回行った時には、同じcommandでも2パターンの結果が出てきました。  
パターン１（正解）：上記のcommandを動かすと、自動的に、root passwordが訊かれます。このroot
passwordを設定すれば、以後問題は起こりませんでした。ですので、こちら方を今回の問題に関して「正解」と記させていただきます。  
パターン２（問題が残る）：上記で記したroot
passwordが訊かれませんが、なぜかinstallが完了します。これは後々データを移動させるときに問題になってきます。もし訊かれなかった場合、２からやり直してください。（再度mysqlを消して、再インストールです。）

インストールが終了すると、さっき消した/var/lib/mysqlが復活しているはずです。

[code]

    sudo ls /var/lib/mysql
    
[/code]

で確かめれます。  
念のため、この時点でmysqlにlog-inできるかを確かめておいてください。

[code]

    mysql -u root -p
    
[/code]

  4. データの移動  
back-upを取ったdirectoryからデータを移動させます。  
この時に重要になるファイル・directoryが３種類あります。

    * ib* (ibdata1, ib_logfile0, ib_logfile1)
    * performance_schema(これも標準でついているdirectoryです。)
    * リカバリーさせたいデータ(databaseの名前ごとに、directoryで整理されていると思います。)

以下のcommandをタイプすると大丈夫です。

[code]

    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名>
    
[/code]

(もし[リカバリーさせたいdatabase]が複数ある場合は、最後の行を繰り返してください。)  
directoryの管理が違っているかもしれませんので、以下のもので管理をしてください。

[code]

    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名>
    
[/code]

  5. (オプション) 一度MySQLにログインする  
先にもやりました、

mysql -u root -p

でログインした後、

[code]

    show database
    
[/code]

でリカバリーさせたいdatabase名が表示されることを確認してください。  
さらに

[code]

    use <リカバリーさせたいdatabase名>
    show table
    
[/code]

で、テーブル名が見えることもお忘れずに。  
しかし、この時点では、

[code]

    select * from table_name;
    
[/code]

を行ったとしても、エラーが出ると思います。（例えば、ERROR 1146 (42S02): Table 'v3_zone_date_cpm7k'
doesn't exist）  
この状態では、テーブル名が表示されれば十分ですので、気にせず、ログアウトしてください。

  6. mysqlを再起動する  
以下のcommandでmysqlが再起動できます。

sudo service mysql restart

もしくは

[code]

    sudo /etc/init.d/mysql restart
    
[/code]

確認のために、上記の後に、

[code]

    sudo service mysql status
    
[/code]

もしくは

[code]

    sudo /etc/init.d/mysql status
    
[/code]

で「Active: active (running) 」が見えるか確認してください。

  7. MySQLに再度ログインする  
再度mysqlにログインすると、すべてのデータはリカバリーされていると思います。  
これで終了です。:)

最後に、少し注意点は、  
例えば、保存されているdirectory(/var/lib/mysql.bak)のなかに以前に作成したdatabaseが３つあると仮定してください。(PROJECT_ONE,
PROJECT_TWO, PROJECT_THREE)  
たとえ、この中のPROJECT_ONEだけをリカバリーしたい場合でも、３つともすべてデータを移動させてください。もしこれを行わないと、#6のmysqlの再起動の時に問題が発生します。（基本再起動できませんでした。）

ただ、上記のように行ったところ、うまくいきましたので、もしお困りの方がおられましたら、参考程度に試していただけると幸いです。


CC BY-SA 3.0
2017-11-06T09:38:57.303
39336
2017-11-06T09:38:57.303
11048
39314
answer