destroy した ZFS datasetを取り返す

目次

概要

destroy した ZFS dataset も、zpool の T オプションを使用することで復旧できる可能性がある。

目的

うかつにも ZFS dataset を次のコマンドで削除してしまった。これをなんとか取り返したい。

$ sudo zfs destroy DATASET_NAME

方法

ZFS の pool であれば、

$ sudo zpool import -D POOL_NAME

で取り返すことができるが、zfs コマンドで destory してしまった場合は、どうしたら良いのか?

Reverting “zfs destroy” - accidentally created dataset with existing nameくらいしか、解決方法が見つからない上に cannot import 'tank': one or more devices is currently unavailableというエラーになってしまうということで終わっていた。

とりあえず自分でも試してみたが、

$ sudo zpool import -T 25123457 -R /mnt -o readonly=on tank
cannot import 'tank': one or more devices is currently unavailable

と同じエラーメッセージが表示されて import することができない。なお、pool 名が参考にした記事と同じなのは、偶然です。

このときに指定する txg の値は、pool を作成したときにまで遡れます。しかし、どう考えても一番最初まで遡れるとは思えません。そこで、このエラーメッセージは「遡れる限界を超えているからでは」と推測しました。

実際だんだんと諦める量を増やしてより最近の値を指定したところ、エラーなく import できました。

$ sudo zpool import -T 25123564 -R /mnt -o readonly=on tank

ただし、import が完了するまでにかなり時間がかかりました。

また、man zpool-importになるように、

WARNING: This option can be extremely hazardous to the health of your pool and should only be used as a last resort.

とのことですので、 destroy した data set は取り戻せたらラッキー程度 に思っておいたほうが良さそうです。

参考サイトと脚注

zpool import -Tに指定する txg は、次のコマンドで取得できます。そして、無かったことにしたい txg の一つ小さい値を-Tに与えます。

$ sudo zpool history -i tank|grep txg
2024-11-05.11:05:58 [txg:25123458] destroy tank/ubuntu@daily_20241015_0000 (107446)
2024-11-05.11:05:58 [txg:25123458] destroy tank/ubuntu@daily_20241016_0000 (110236)
2024-11-05.11:05:58 [txg:25123458] destroy tank/ubuntu@hourly_20241016_0900 (111111)
2024-11-05.11:05:58 [txg:25123458] destroy tank/ubuntu@hourly_20241016_1000 (111008)
2024-11-05.11:05:58 [txg:25123459] set tank/ubuntu (69311) refreservation=0
2024-11-05.11:05:58 [txg:25123459] destroy tank/ubuntu (69311) (bptree, mintxg=1)

Reverting “zfs destroy” - accidentally created dataset with existing name