トランザクション 北村泰彦 データベース論(第 8dbms,os の障害 . 停 電...

10
データベース論(第8回): トランザクションと障害時回復 北村泰彦 関西学院大学理工学部情報科学科 トランザクション トランザクション(transaction) データベースに対する応用プログラムレベルでの一つ 原子的作用 原子的(atomic) それ以上分解できないこと 作用(action) データの読み(read)書き(write) 応用プログラムレベル 論理的に意味のある操作レベル SQLレベルとは異なる トランザクションの例 振替送金トランザクション A氏(依頼人)が自分の口座からC 円(金額)をB氏(受取人)の口座 に振替送金する.もしA氏の口座 残高がC円未満なら,残高不足で あることをA氏に伝えて終了.残 高がC円以上であれば送金する. トランザクション内の二つのデータ ベース更新 A氏の残高からC円を引き,それを 新たな残高とする. B氏の残高にC円を加え,それを 新たな残高とする. 一貫性(integrity) データベース全体でデータの整合 性がとれていること. 例:残額の総和は一定. 一貫性が保証されるように,トラン ザクションの原子性を定義する. トランザクションの実行 トランザクション実行の三つのパターン COMMIT:完遂 ROLLBACK:未遂 DBMSによるROLLBACK:異常終了

Upload: others

Post on 30-May-2020

4 views

Category:

Documents


0 download

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)処理の実行である.

ログは別々の装置に二重に書き込みを行

う必要がある.

ダンプ処理

アクティブなトランザクションがない状態で,

ディスク中のデータの内容を他のディスク

あるいは磁気テープなどにコピーする.

障害回復時には,まずバックアップ用の

ディスクに

新のダンプ内容を復旧する.

次に,ログを用いてダンプごにコミットした

全てのトランザクションの

write

操作

をRED

Oする.