MySQL のデータを生ファイルから復元


背景

EC2 のステータスチェックが「インスタンスの接続性チェックに失敗しました」となり、サーバーに接続できなくなっていた。

システムログに OSError: [Errno 28] No space left on device というエラーが出ていた。
ボリュームの容量を増やしたり、インスタンスタイプを上げてみたがだめだった。

ほとんど使っていないサーバーだったので MySQL のデータだけ取り出して廃棄することに。

手順

https://dev.classmethod.jp/articles/tsnote-can-not-boot-instance-survey/
この記事を参考にボリュームをデタッチし、新しく作った調査用インスタンスにアタッチ。

以下をローカル環境にダウンロード:

  • /var/lib/mysql/some_database/ 復元対象のデータベース
  • /var/lib/mysql/ibdata1
  • /var/lib/mysql/ib_logfile0
  • /var/lib/mysql/ib_logfile1

廃棄サーバと同バージョンの MySQL 5.7.17 を docker で立てる:

version: "3"
services:
  mysql:
    image: mysql:5.7.17
    container_name: mysql5717
    ports:
      - 3306:3306
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_ROOT_PASSWORD: ''
      TZ: 'Asia/Tokyo'
    volumes:
      - ./data:/var/lib/mysql

docker-compose up -d で起動。
docker exec -it mysql5717 bash でコンテナに入り、mysql -u root -p でログイン出来ることを確認。一旦 docker を終了。

ダウンロードしていたファイル群を ./data にコピーし、データが select 出来ることを確認。

最後に mysqldump -u root some_database > /var/lib/mysql/some_database.sql でデータをダンプ。