スタンドアロンの Proxmox ノードに LVM シンと VM 130 ボリューム /dev/pve/vm-130-disk-0 があります。VM 130 は誤って削除されました。Mysql データベースは VM とともに失われました。1 日で発見した後、このノードのすべての VM は /dev/pve への書き込みを阻止するために停止されました。新しいバックアップも削除され、回復の可能性はありませんでした。削除後、新しい VM は作成されませんでした。
失われたボリューム (以前は /dev/pve/vm-130-disk-0 と呼ばれていました) からデータベース テーブルを回復するにはどうすればよいですか?
私が試したこと(運がなかった):
vm130 の LVM メタデータを削除時点にロールバックします。コマンド「lvs」の出力の結果として、ボリューム /dev/pve/vm-130-disk-0 が表示されますが、エラー: device-mapper: reload ioctl on (253:7) failed: No data available のため非アクティブでありアクティブ化できません。復元中に、「lvconvert --repair」を使用する必要があり、ここでのように LVM が破損しました。バグ: リンクからの回避策は pve/data のアクティブ化に役立ちますが、/dev/pve/vm-130-disk-0 のアクティブ化には役立ちません。
testdisk は物理ディスク /dev/sda3 上の VM パーティションを検索します。18 個のパーティションが見つかりましたが、VM 103 からの既知のテスト文字列はありません。bgrep でテストしました。これらのパーティションは物理ディスク全体をカバーしているわけではないことに注意してください。
VM 130 からの /dev/sda3 テキスト文字列を bgrep で検索しています。testdisk によって発見された VM パーティション外のディスク上の 2 つの異なる場所に文字列が見つかりました。
'undrop-for-innodb' を使用してディスク /dev/sda3 全体を検索し、mysql テーブルをリカバリします。探している DB を含むさまざまなデータベースに対して 12 GB ページを取得しました。ただし、dictionary/SYS_TABLES.sql は、5643947289462206311 のような巨大なテーブル ID と、テーブル名に奇妙な記号 \0! を生成します。
2020203D2020 4E414D455F434F SYS_TABLES "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0std\n\0\0!\0!\0!\0database_name\0INSERT INTO tbl_log_\n SET log_id " 5643947289462206311 NULL NULL NULL 1600742439 "" 741488441
また、dictionary/SYS_INDEXES.sql は、これらの巨大なテーブル ID を使用しても何も見つけることができません。最初の回答に良いハウツーがここにあります:https://dba.stackexchange.com/questions/23251/mysql データベースの削除を回復する方法はありますか?
/dev/pve/vm-130-disk-0 内:
# fdisk -l
Disk /dev/sda: 32 GiB, 34359738368 bytes, 67108864 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x65ab60ca
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 64286719 64284672 30.7G 83 Linux
/dev/sda2 64288766 67106815 2818050 1.4G 5 Extended
/dev/sda5 64288768 67106815 2818048 1.4G 82 Linux swap / Solaris
Above /dev/sda1 is ext4 with mysql database files.
mysql
- mysql-server-5.5 5.5.47-0+deb8u1 amd64
- tables stored in innoDB format.
- tables stored in separate files (my.cnf):
innodb_file_per_table = 1
- binary log forced enabled, but it rotated very othen:
expire_logs_days = 7
Proxmoxの詳細:
# uname -a
Linux wz020 4.15.18-12-pve #1 SMP PVE 4.15.18-35 (Wed, 13 Mar 2019 08:24:42 +0100) x86_64 GNU/Linux
# pveversion
pve-manager/5.4-3/0a6eaa62 (running kernel: 4.15.18-12-pve)
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 pve lvm2 a-- 1.64t 6.00g
# vgs
VG #PV #LV #SN Attr VSize VFree
pve 1 26 0 wz--n- 1.64t 6.00g
アドバイスやアイデアがあれば、ぜひ教えてください。ありがとうございます!
答え1
'undrop-for-innodb' を使用してディスク /dev/sda3 全体を検索し、mysql テーブルをリカバリします。探している DB を含むさまざまなデータベースに対して 12 GB ページを取得しました。ただし、dictionary/SYS_TABLES.sql は、5643947289462206311 のような巨大なテーブル ID と、テーブル名に奇妙な記号 \0! を生成します。
SYS_TABLES
テーブル名でインデックスを見つけるには/ が必要ですSYS_INDEXES
。SYS_* が破損しているようです (または、stream_parser
誤って属していないページを見つけた可能性があります)。
つまり、SYS_* テーブルはありませんが、これらの 12G 相当のページのどこかにデータがあるはずです。どうすればよいでしょうか? を試してくださいgrep
。たとえば、テーブルに文字列が含まれている必要があることがわかっている場合は、その文字列を含むインデックスを見つけて、それが本当に探しているテーブルであるかどうか[email protected]
を確認します。c_parser
これは非常に手作業が多く、複雑で時間のかかるプロセスです。それ以外の場合はデータベースの回復を試み、事後検証でバックアップ プロセスを確認します。
答え2
まず LVM を復元する必要があると思います。その後で、ファイル システム内の mysql db ファイルを復元する方法を検討してください。