開発やらlinuxについてやったこと、ひっかかったことのメモ
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
やってしまったけどいい経験になった.
WEB家計簿の保守作業してたら間違って詳細項目を40行くらい一気に消してしまった.バックアップとってないし絶望的だと思っていたが,PostgreSQLが追記型なのでVacuumをかけていなければ消してしまった行を復元することが可能.救われた.マジで. 以下手順. 1.念のため今のデータのバックアップをとっておく 2.PostgreSQL停止 3.pg_controldataで出力されるデータのうち以下をメモ 「Latest checkpoint's NextXID: 0/102657」 ↑ これが次のトランザクションID 4.pg_resetxlog -x 102656 $PGDATA←データディレクトリを指定 =>NextXIDが102656にセットされる(つまり消す前にタイムスリップ!) [注意]:PostgreSQLを停止せずにこのコマンドを実行するとデータが破壊 されるおそれがあるので注意.(実際は-fつけないと実行できないが) 5.PostgreSQL起動 該当テーブルをSELECTすると戻った.しかしあくまでタイムスリップなので,「消した」事実は 戻らないので注意. 6.復元されていることを確認したらすぐさまバックアップ 7.リストア これで完全に復元完了. ちなみに・・・ DELETEしたときはxmaxという(隠された)列にDELETEしたトランザクションのIDが付加される. このトランザクションIDよりも小さなトランザクションからはDELETE前の行が見えるという仕組み. xminという列もあり.それはそのタプルが作成されたときのトランザクションIDが付加される. xminが自トランザクションIDよりも大きい場合に見えないというのは理解できるのだけれど, xmaxが謎.1時間くらい考えたけど,謎. 例えば,トランザクションIDが10のAとトランザクションIDが20のBがいたとして, xmin xmax id 1 0 1 2 0 2 10 0 3 15 0 4 20 0 5 というテーブルがあったとすると,id<=3の行は,A,Bどちらの行にも見えるが, id=15,id=20は,Aにとって"未来"の行であるため見えない. xmin xmax id 1 9 1 2 15 2 10 25 3 15 0 4 20 0 5 今度はこのようなテーブルがあったとすると,id=2,3の行がB以降のトランザクションによって削除されているわけだけれど,Aにとっては見えて良いはずなのに,それらがコミットされた途端Aからは見えなくなってしまう(もちろんBからも).これが謎. READ COMMITTED/SERIALIZABLEについて復習せねば... http://miwa.offside.ne.jp/blog/2007/04/postgresql-delete.html PR |
カレンダー
カテゴリー
フリーエリア
最新記事
(07/25)
(04/22)
(04/21)
(02/22)
(02/08)
(02/04)
(01/16)
(11/26)
(11/24)
(11/12)
最新TB
プロフィール
HN:
poti
性別:
非公開
ブログ内検索
最古記事
(11/16)
(11/16)
(11/17)
(11/17)
(11/17)
(11/18)
(11/18)
(11/19)
(11/21)
(11/21)
P R
|