忍者ブログ
開発やらlinuxについてやったこと、ひっかかったことのメモ
[43] [42] [6] [41] [40] [39] [38]
×

[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

コメント


コメントフォーム
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字


トラックバック
この記事にトラックバックする:


忍者ブログ [PR]
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
フリーエリア
最新CM
[06/12 ziggy]
最新TB
プロフィール
HN:
poti
性別:
非公開
バーコード
ブログ内検索
P R
FX NEWS

-外国為替-