データベーススペシャリスト

データベーススペシャリスト ロールフォワードとチェックポイントとは

今回はデータベースのACID特性の「D」

Durability(持続性)に注目し

障害回復制御を詳しく見ていきます。

ログファイルの必要性や

「ロールフォワード,チェックポイントってなに?」って

方にとっては非常にわかりやすい内容になっています。

障害の種類

トランザクションの異常終了

トランザクションを再実行する
ことで対応する

システム障害

OSごと巻き込んで停止するケース。

この場合は仕方がないので

システムをリセットすることで対応する。

 

メモリ中にだけあって,

ディスクに書いていないデータ

は消失する。

 

このケースでデータを復旧するために

DBMSの世界ではログファイルというものが

存在し,すべての変更された記録は

ログファイルに書かれているため,

まだデータベースのディスクに書き込まれていなくても

復旧できる。

 

この場合変更後ログを使用し

ロールフォワードを行い

最新の状態にまで復旧する

媒体障害

ディスク装置の故障した場合は

前回のバックアップした時点に戻す必要がある。

 

バックアップを取っていない場合は

復旧不可能となる。

定期的なバックアップを通常は取る必要がある。

 

バックアップから復元しても

最新の状態にはならない。

前回のバックアップ取得時から

媒体障害が発生した時までの期間の

データを復旧するためには

変更後ログファイルを用いて

ロールフォワードする必要がある。

 

障害復旧の観点からもデータベースファイルと

ログファイルは別のドライブに格納するほうがよい。

 

そもそもログファイルは物理設計的に

データベースとは別ドライブに保存するのがセオリーで

パフォーマンス性は格段にあがる。

 

ログに関して

「ログ情報には誰がいつどの値をどう変更したか」という事が書かれている。

 

データベースに対してUpdate文やInsert文などで

データ更新を行っても実はすぐにはディスクに書かれていません。

 

例えば顧客を登録しても,顧客テーブルを格納している

ディスクはSQLServerでは8KBの小さなファイルに

ブロックごとに分かれて格納されており,

どこにどの値をいれて,どの値を更新するかを

物理ディスクレベルで行うと

非常に時間がかかる。

 

メモリレベルで2ミリ秒で終わることが

1秒とか2秒かかったりする。

 

データをどんどん登録していきたいのに

そんなことをしていては間に合わないので

物理ディスクには時々まとめて書き込んでいます。

 

しかし,時々まとめてかきこんでいたら

停電などでPCの電源が落ちたら

メモリ上のデータは消えてしまいます。

 

その状態でも復旧できるように

ログファイルというものに

「何をどうしたか」ってことを

ガンガン書き込んでいっています。

 

これはどこに書くかとか,何に書くかなんて考えずに

ログファイルの最後にどんどん追記するだけなので

高速に処理できます。

 

だからいったんログファイルにかいて

処理がたまったら物理ディスクに書いています。

 

トランザクションのコミット前に障害が起きたら?

ロールバックすることで問題を解決します

トランザクションのコミット後に,まだディスクに書かれる前に障害が起きたら?

ロールフォワードで復旧します。

ロールフォワードとは,データベースにたいして

ログファイルの情報で最新の状態にすることです。

 

例えばデータベースを更新時に

ログは書いたけど実際のテーブルのファイルには

記録していない場合,その時点で停電でPCの電源が落ちると

テーブルにはデータが更新されていないことになります。

 

しかし,停電前に処理したものは

当然データとして反映されていると思いますよね?

 

ATM銀行で振り込みをして,

「ありがとうございました。」っていわれて

その5分後に銀行が停電したからって

振り込み処理は成功したって誰でも思ってますよね?

 

だからこの場合,停電前のデータベースと

最後のログファイルの2つを突き合わせることで,

最新の状態というのは見えてくることになります。

 

この復旧方法をロールフォワードといいます。

 

だからログファイルに先行して

ガンガン書き込んでいるのは

非常に意味があるんです。

ログにさえ書いておけば安心ってことです。

ログの種類

論理ログ

SQL文レベルで変更履歴を管理をします。

何をしたかっていう記録を

SQL文で記録するので記録量は少なくなります。

 

しかしいざ復旧となると

SQL文を再実行するので

時間はかかります。

物理ログ

データのブロックをバイナリイメージで保管する

 

記録量は多くなりますが,

復旧時間は短くて済みます。

チェックポイント

チェックポイントとは先ほどほとんど話してしまいましたが,

データベースの更新順序はログを書いてから

時々たまっている分を物理的なテーブルファイルに

書き込みます。

 

そのたまってきたから書き込もう!って言うタイミングを

チェックポイントといいます。

 

これはSQLServerやOracleで使用は異なりますが

定期的にチェックポイントを発動したり,

ファイル要領の閾値などで発動したり,

PCのシャットダウン時などに発動したりと

時々発動しています。

 

DBMSを使う側は普段は気にしませんが

内部的にはこんな感じになっています。

 

トラブル発生時などは

こういった内部構造を知っていることで

解決問題などもあります。

 

障害タイミングによる対処の違い

チェックポイント発動まえか後で,

障害時の対応は異なってきます。

 

データ更新後,チェックポイントが発動してから

障害が発生した場合は,何も対処の必要はありません。

 

チェックポイントが発動すればすべてのデータは

物理テーブルファイルに書かれたことになり,

もう大丈夫です。

 

データ更新後,チェックポイント前に障害が発生したら,

これは次回起動時にログファイルを使って

ロールフォワードします。

 

データ更新後,コミット前に障害が発生したら,

これはロールバックします。

トランザクションとは

すべて成功かすべて失敗の原子性を

保つ必要があるので

コミット前に失敗したら当然ロールバックします。

SQLやデータベースについてもっと学びたい方は次の記事でおすすめの書籍を紹介しています↓

SQLServerやデータベースに関する書籍のおすすめランキング!SQLをこれからはじめようと思っている人や,普段SQLを使った仕事をしているけどもっと詳しくなりたい!という方向けに,どんな本を読めばい...

<<   1   2   3   4   5   6   7   8   9    10   11   12   >>

トップページへ戻る

C#とSQLServerを繋いでデータを操作する4つの方法

#01_はじめに
#02_VisualStudio2022のインストール
#03_SQLServerのインストール
#04_データベースとテーブルの作成
#05_プロジェクトの作成
#06_接続先文字列の作成
#07_データテーブルでのデータの取得
#08_Sqlアクセスクラスの作成
#09_SqlDataReaderでのデータ取得
#10_SqlDataReaderの結果をカスタムクラスに入れる方法
#11_SqlCommandでInsert文を発行する方法
#12_SqlCommandでUpdate文を発行する方法
#13_Update対象がなかったらInsertする方法
#14_SqlCommandでDelete文を発行する方法
#15_Dapperでデータを取得する方法
#16_DapperでInsert文を発行する方法
#17_EntityFrameworkをインストールしてDbContextを作成する方法
#18_EntityFrameworkでデータを取得する方法
#19_EntityFrameworkでInsert文を発行する方法
#20_EntityFrameworkでUpdate文を発行する方法
#21_EntityFrameworkでDelete文を発行する方法
#22_Helperクラスを作ってSqlCommand操作を共通化する方法
#23_パフォーマンスチェックの方法
#24_4つのデータのとり方のパフォーマンスチェック
#25_4つの結果を踏まえて講評
#26_さいごに

下記URLは、ベネッセが提供する教育用プラットフォームにて
私が公開しているプログラミング学習コースです。
無料コースもあるので、よかったらご覧になってみてください。
【無料動画】「C#を勉強する順番」