トランザクション 北村泰彦 データベース論(第 8dbms,os の障害 . 停 電...
TRANSCRIPT
データベース論
(第
8回
):
トランザ
クションと障
害時
回復
北村泰彦
関西学院大学理工学部情報科学科
トランザクション
トランザ
クション
(transaction)データベースに対
する応
用プログラムレベル
での
一つ
の原子的作用
原子的
(atomic)
それ以上分解できないこと
作用
(action)データの
読み
(read),書き
(write)
応用
プログラムレベル
論理
的に意
味の
ある操
作レベル
SQLレベル
とは
異なる
トランザクションの例振替送金トランザクション
A氏
(依
頼人
)が
自分
の口
座か
らC
円(金
額)を
B氏
(受
取人
)の
口座
に振
替送金する.もし
A氏
の口
座残
高が
C円
未満
なら,残
高不
足で
あることを
A氏
に伝
えて終
了.残
高が
C円
以上
であれ
ば送
金する.
トランザクション内の二つのデータ
ベース更新
A氏
の残
高か
らC円を引
き,それを
新たな残
高とする.
B氏
の残
高に
C円
を加
え,それ
を新
たな残
高とする.
一貫
性(integrity)
データベース全
体でデータの
整合
性が
とれ
ていること.
例:残
額の
総和
は一
定.
一貫
性が
保証
され
るように,トラン
ザクションの
原子
性を定
義する.
トランザクションの実行
トランザ
クション実
行の
三つの
パターン
COM
MIT:完
遂
RO
LLBACK:未遂
DBM
Sによる
RO
LLBACK:異常終了
トランザクションの状態遷移
ACID特性
原子性
(Atomicity)
トランザクションは,それが全て行われるか,まったく行われない
かのいずれかである.
一貫性
(Consistency)トランザクションは結果データベースの一貫性を保証する.
隔離性
(Isolation)各々のトランザクションは他のトランザクションの影響を受けない.
耐久性
(Durability)
コミットしたトランザクションが行ったデータベースの変化は,その
後どのような障害が発生しても失われることはない.
障害時回復
目的
:データベースの
一貫
性を保
つ.
分類トランザ
クション障
害(transaction failure):
論理の誤
りによる異
常終
了.トランザ
クションの
アボート.応
用プログラムの
強制終了.デッドロックによる強
制終
了.
システム障
害(system
failure):DBM
S,OSの障害.停
電.ディスクからデータを読
み出
すことは
できる.シス
テムは
再起
動され
る.
メディア障
害(m
edia failure):二次記憶装置の障害.
ディスクか
らデータの
読み
出しは
不可
能.
障害時回復
方法ト
ランザクション
UN
DO:トランザクション障害時,異常終了したト
ランザクションを
UN
DOする(データベースに対して行ったすべて
の作
用を取り消
す).
RO
LLBACK処理.
全局的
UN
DO:システム障害時,未完の全てのトランザクションを
UN
DOする.
局所的
RED
O:システム障害時,
COM
MITしていたが
,一
時的(二
次記憶に転送されていない)状態にあるトランザクションは再起
動時に
RED
Oする.
全局的
RED
O:メディア障害時,データベースの
保存用ダンプをも
とに,障
害発生
まで
COM
MITされた全てのトランザクションを
RED
Oする.
UN
DOおよび
RED
Oはべき等である(何度繰り返しても同
じ結
果になる).
障害時回復の分類
障害の例
振替
送金
トランザ
クション
beginread(A,x)read(B,y)x:=
x-Cif x <
0 then rollbacky:=
y+C
write(A,x)
write(B,y)
comm
it
ケース
1:w
rite(A,x)の直
後にシステム障
害が
発生
Aの
値の
みが変
更されてい
るので,再
起動
のときに
beginの状態に戻っている
必要がある.
(UN
DO
)
ケース
2:com
mitの
直後
にシステム障
害が
発生
再起動のとき,
A,Bの値が
ともに変更されているとい
うcom
mitの
状態
を保
証す
る必要がある.
(RED
O)
階層型記憶アーキテクチャ
データベースの
更新
は,更
新した
いデータの入っているページを主
記憶の一部であるデータベース
バッファに呼
び出
し,更
新し,二
次記
憶に書
き出
す.主
記憶
は揮
発性
,二
次記
憶は
不揮
発性
である.
プログラムにおける読み書き
(read/write)と
,二
次記
憶上
の読
み書
き(read-page/w
rite-page)とは一致していない.
write
が実行されてバッファ上では
書き込
みが
行わ
れているもの
の,
まだその
書き込
みが
ディスクに反
映されていないページのことを
ダーティページ
(dirty page)という.
ダーティページをディスク上に強制
的に書
き込
むことをフラッシュ
(flush)という.
ログ法
ログ
(log):トランザクション実行の記録.
ジャーナル
(journal)と呼ぶこともある.
ログ法
(logging):ログを用いる障害回復の
方法
.
ログは(ディスクの二重化などの)安定記
憶(stable storage)に
格納されることが望
ましい.
ロギング法
ログレコード
トランザ
クション
Tの開始
(begin):[B:T]トランザ
クション
Tによる書
き込
み(w
rite(A,x)):[W
:T,A,Old,N
ew]
ただし
Oldは更新前の値
(before image),
New
は更
新後の値
(after image)
トランザ
クション
Tによる読
み出
し(read(A,x)):[R
:T,A]トランザ
クション
Tのコミット
(comm
it):[C:T]トランザ
クション
Tのアボート
(abort):[A:T]
各ログレコードには
LSN(Log Sequence
Num
ber)と呼
ばれ
る作
成順
の識
別子
が付
けられ
ることが
多い.
WALプ
ロトコル
ロギングの
操作
:以
下の
同期
をとる必
要が
ある.
データベースバ
ッファを介
するデータベース更
新作
業
ログバ
ッファを介
するログ更
新作
業
ログレコードなしには
ディスク中
の項
目を元
の値
に戻
すことは不可能である.
WALプ
ロトコル
(Write Ahead Log protocol)
データベースの
更新
はそれ
をまずログファイルに書
き出してから行う.
トランザ
クションを
COM
MITする前に,全ての
データ
ベース更新
をログファイルに書き出す.
COM
MITによるトランザ
クションの
終了
は,それ
がログ
ファイルに記録された時点である.
No-undo/redo
方式
write
操作
はログにの
み記
録し,コミットするまで二
次記
憶中のデータ更新は行わない.
before image
が二次記
憶に保
持され
ているの
で,ログレコードに記
録する必
要はない.
トランザクションの開始:[B:T]を
ログ用バッファに書き込む.
トランザクションによる書き込み:[W
:T,A,New
]をログ用バッファ
に書き込む.
トランザクションのコミット:[C:T]を
書いた後
,ログ用バッファをフ
ラッシュする.さらにトランザクション中の
write
操作
を二次
記憶
に反
映させ
る.
トランザクションのアボート:[A:T]を
ログ用バッファに書き込む.
リスタート処理
(RED
O):[C:T]の
あるコミット済みトランザクション
を検出する.
[W:T,A,N
ew]と
して記録されている
write
操作を
データベースに反映させる.
Undo/no-redo
方式
コミットするまでに
write
操作
に関
する二
次記
憶中
のデー
タ更新を行う.
after image
が二次記憶に保持されている
ので,ログレコードに記
録する必
要は
ない.
トランザクションの開始:[B:T]を
ログ用バッファに書き込む.
トランザクションによる書き込み:[W
:T,A,Old]を
ログ用バッファに
書き込む.
WALプ
ロトコルに従う限り,
write
操作を二次記憶に反
映させてもよい.
トランザクションのコミット:トランザクション中の
write
操作
を二
次記憶に反映させる.
[C:T]を書いた後,ログ用バッファをフラッシュ
する.
トランザクションのアボート:[A:T]を
ログ用バッファに書き込む.ト
ランザクション中で
write
操作に関
して
before image
に書き戻す.
リスタート処理
(UN
DO
):[C:T]のないアボート済みあるいはア
ボートすべきトランザクションを検出する.
[W:T,A,O
ld]として記録
されている
write
操作に関して
before image
に二次記憶を書き戻
す
Undo/redo
方式
二次記憶中のデータ更新とコミット処理を独立させる.フラッシングに
関する制約が少なく,ディスクアクセスが減少する.
トランザクションの開始:[B:T]を
ログ用
バッファに書
き込
む.
トランザクションによる書き込
み:[W
:T,A,O
ld,New
]をログ用バ
ッファに
書き込
む.
WAL
プロトコルに従
う限り,
write
操作
を二次記憶に反映させ
てもよい.
トランザクションのコミット:
[C:T]を書
いた後
,ログ用
バッファをフラッシュ
する.
トランザクションのアボート:[A:T]を
ログ用バッファに書き込む.トランザ
クション中で
write
操作に関して
UN
DO処理をする.
リスタート処理
(UN
DO
/RED
O):[C:T]の
あるコミット済みトランザクション
と,それがないアボート済みあるいはアボートすべきトランザクションを
検出する.
[W:T,A,O
ld,New
]として記録されている
write
操作
に関して前
者に関しては
RED
O処理,後者に対しては
UN
DO処理を行う.
例(U
ndo/Redo
方式)
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T1 ], [B:T
3 ], [W
:T3 ,B,b
1 ,b2 ], [W
:T2 ,C,c
1 ,c2 ],
[W:T
3 ,D,d
1 ,d2 ], [C
:T2 ]}
例
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T1 ], [B:T
3 ], [W
:T3 ,B,b
1 ,b2 ], [W
:T2 ,C,c
1 ,c2 ],
[W:T
3 ,D,d
1 ,d2 ], [C
:T2 ]}
逆方
向にスキャンする.
[C:T
2 ]によりトランザ
クション
T2 が
コミット済
みであることを認
識する.
例
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T1 ], [B:T
3 ], [W
:T3 ,B,b
1 ,b2 ], [W
:T2 ,C,c
1 ,c2 ],
[W:T
3 ,D,d
1 ,d2 ], [C
:T2 ]}
[W:T
3 ,D,d
1 ,d2 ]が
あるトランザ
クション
T3 は
コミット済
みでないの
でこの
write
操作の
UN
DO
処理
を行
う.
例
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T1 ], [B:T
3 ], [W
:T3 ,B,b
1 ,b2 ], [W
:T2 ,C,c
1 ,c2 ],
[W:T
3 ,D,d
1 ,d2 ], [C:T
2 ]}[W
:T2 ,C,c
1 ,c2 ]は
コミット済
みの
トランザ
クショ
ンによるもの
なの
でひとまず読
み飛
ばす.
例
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T1 ], [B:T
3 ], [W
:T3 ,B,b
1 ,b2 ], [W
:T2 ,C,c
1 ,c2 ],
[W:T
3 ,D,d
1 ,d2 ], [C:T
2 ]}[W
:T3 ,B,b
1 ,b2 ]が
あるトランザ
クション
T3 は
コミット済
みでないの
でこの
write
操作の
UN
DO
処理
を行
う.
例
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T
1 ], [B:T3 ],
[W:T
3 ,B,b1 ,b
2 ], [W:T
2 ,C,c1 ,c
2 ], [W
:T3 ,D
,d1 ,d
2 ], [C:T
2 ]}[C:T
1 ]より
T1 を
コミット済
みの
トランザ
クション
に加
える.
例
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T1 ], [B:T
3 ], [W
:T3 ,B,b
1 ,b2 ], [W
:T2 ,C,c
1 ,c2 ],
[W:T
3 ,D,d
1 ,d2 ], [C
:T2 ]}
[W:T
1 ,A,a1 ,a
2 ]はコミット済
みの
トランザ
クショ
ンT
1 によるもの
なの
でひとまず読
み飛
ばす.
例
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T1 ], [B:T
3 ], [W
:T3 ,B,b
1 ,b2 ], [W
:T2 ,C,c
1 ,c2 ],
[W:T
3 ,D,d
1 ,d2 ], [C
:T2 ]}
今度
はログを先
頭か
ら順
方向
にスキャンする.
コミット済
みの
トランザ
クション
T1 に
よる
[W:T
1 ,A,a1 ,a
2 ]に対
する
RED
O操
作を行
う.
例
ログ
{[B:T1 ], [W
:T1 ,A,a
1 ,a2 ], [B:T
2 ], [C:T1 ], [B:T
3 ], [W
:T3 ,B,b
1 ,b2 ], [W
:T2 ,C,c
1 ,c2 ],
[W:T
3 ,D,d
1 ,d2 ], [C
:T2 ]}
コミット済
みの
トランザ
クション
T2 に
よる
[W:T
2 ,C,c1 ,c
2 ]に対
する
RED
O操
作を行
う.
チェックポイント法
チェックポイント法
(checkpointing):障害時回復を能率良
く行
うための
手法
.一
定の
周期
でバ
ッファの
内容
をフラッ
シュする.
チェックポイントでの
作業
実行中のトランザクションの全てを一時停止
(suspend)する.
データベースバッファの内容をデータベースに書き出す.
チェックポイントレコード(実行中トランザクションリスト)をログファ
イルに書き出す.
中断されていたトランザクションを再開
(resume)す
る.
チェックポイントを導
入すると,チェックポイント以
前に終
了しているトランザクションはシステム再スタート時に回
復作
業をする必
要が
ないという利
点が
ある.
チェックポイント法
チェックポイントレコードか
らU
ND
O/
RED
Oをするトランザクションを
見つけるアルゴリズム
1.UN
DOトランザ
クションの
リストを
チェックポイント時
に実
行中
であっ
たトランザ
クションの
リストとする.
RED
Oトランザ
クションの
リストを
NILと
する.
2.ログファイル
をその
チェックポイント
レコードか
ら障
害発
生時
まで順
に検
査する.
2-1.もし
BEGIN
TRAN
SACTIONレ
コードを見
つければ,その
トラン
ザクションを
UN
DOリストに追
加す
る.
2-2.もし
COM
MITレコードを見
つけれ
ば,その
トランザ
クションを
UN
DO
リストから
RED
Oリストに移動する.
2-3.ログファイル
の終わりにきたら終
了する.
コミットコンシステントチェックポイント法
(comm
it consistent checkpointing)
手順
1.新
たなトランザ
クションの
開始
を禁
止する.
2.アクティブなトランザ
クションが
すべてコミット
かアボートするまで処
理を続
ける.
3.ログ用
バッファとデータ用
バッファをこの
順に
フラッシュする.
4.ログ用
バッファにログレコード
[CHEC
KPOIN
T]を書
き込
んだ後
フラッシュす
る.
コミットコンシステントチェックポイント法
(comm
it consistent checkpointing)
特徴チェックポイントをとるためには
アクティブなト
ランザ
クションが
ない状
態に入
らなけれ
ばな
らない.
長時
間続
くトランザ
クションが
存在
する場
合には
多くの
処理
要求
を長
時間
にわ
たって待
たせ
ることになる.
フラッシュ時
のデータ書
き込
みに多
くの
時間
を必
要とする.
キャッシュコンシステントチェックポイント
法(cache consistent checkpointing)
手順
1.新
たな基
本操
作の
開始
を禁
止する.
2.処
理中
の基
本操
作の
終了
を待
つ.
3.ログ用
バッファとデータ用
バッファをこの
順に
フラッシュする.
4.ログ用
バッファにログレコード
[CHECKPO
INT:TL]を
書き込
んだ後フラッ
シュする.ただし,
TLは
現在
アクティブなトラ
ンザクションの集合である.
キャッシュコンシステントチェックポイント
法(cache consistent checkpointing)
特徴リスタート処
理では
新の
ログレコード
[CHECKPO
INT:TL]ま
での
範囲
では
なく,
TLの
中にアボート済
みあるいは
アボートすべ
きトランザ
クションが
あった場
合には
,そのトラ
ンザ
クションの
開始
時点
までログをさか
のぼ
る必
要が
ある.
例
ログ{[B:T
1 ], [W:T
1 ,A,a1 ,a
2 ], [B:T2 ], [C:T
1 ], [B:T3 ], [W
:T3 ,B,b
1 ,b2 ],
[CHECKPO
INT,{T
2 ,T3 }], [W
:T2 ,C,c
1 ,c2 ], [W
:T3 ,D
,d1 ,d
2 ], [C:T
2 ]}ログを逆方向にスキャンする.
[C:T2 ]よ
りT
2 をコミット済みトラン
ザクションに加える.
[W:T
3 ,D,d
1 ,d2 ]に
対する
UN
DO処
理を行
う.
[W:T
2 ,C,c1 ,c
2 ]を読み飛ばす.
[CHECKPO
INT,{T
2 ,T3 }]に
達しても
T3 は
アボートすべきなのでさ
らにスキャンを続ける.
[W:T
3 ,B,b1 ,b
2 ]に対する
UN
DO処
理を行
う.
[B:T3 ]で
スキャンを終了する.
[CHECKPO
INT,{T
2 ,T3 }]か
ら順方向にスキャンする.
コミット済
みT
2 による
[W:T
2 ,C,c1 ,c
2 ]に対する
RED
O処理を行い終
了する.
シャドーページ法
ディスク中
のページをページテーブル
という
アドレス変換テーブルを介して間接
的にアク
セスする.
トランザクションの開始:カレントページテーブ
ルというトランザ
クション用
のページテーブル
領域
を確
保する.元
のページテーブル
はシャ
ドーページテーブル
と呼
ぶ.その
位置
を示
すポインタをシャドーページテーブルポインタと
いう.カレントページテーブル読み書きの
ため
のバ
ッファをページテーブル
用バ
ッファという.
トランザクションによる書
き込み:ページテー
ブル中の
i番目
のページ
P(i)の更
新を行
うとす
る.それが
P(i)に対する
初の更新であれば,
ディスク中の空ページ
P'を確
保して
P(i)の内
容をコピーし,カレントページテーブル
i番目
のエントリが
指すページを
P'に変更する.その後
,データ用バッファ上の
P'を更新する.
トランザクションのコミット:データ用バッファを
フラッシュした後
,ページテーブル用バッファ
をフラッシュする.さらにディスク中のシャドー
ページテーブルポインタをカレントページテー
ブルを指
すようにする.
トランザ
クションの
アボート:カレントページを
廃棄する.
シャドーページ法
問題点
更新
を行
う度
にディスク中
のデータを格
納するページ
が変
化するため,ファイルを構
成するページ相
互の
位置
関係
がバ
ラバ
ラになる.データ読
み出
しが
ディスク
への
ランダムアクセスば
かりになり,アクセス時
間が
増加
する.
シャドーページテーブル
ポインタを書
き換
える直
前に
システム障
害が
生じたとする.その
場合
,カレントテー
ブル
や更
新後
のデータを格
納していたページが
ディス
ク中
のゴミとなる.
ページアクセスの
際にページテーブル
によるアドレス
変換
のオーバ
ヘッドが
ある.
メディア障害回復
トランザクション障害やシステム障害に比
べてメディア障害が発生する確率ははるか
に小さいが,その対処を行わなかった場合
の損失は甚大である.
メディア障害に対する基本的な対応はダン
プ(dum
p)処理の実行である.
ログは別々の装置に二重に書き込みを行
う必要がある.