データベーススペシャリスト 2010年 午後1 問03
データベースの保守・運用に関する次の記述を読んで、設問1〜3に答えよ。
E社は、登録している会員向けに健康食品を通信販売する会社である。 情報システム部のFさんは、請求情報照会処理と請求情報更新処理から構成される請求情報処理で使用するテーブルの保守とバックアップ計画の作成を任されている。
〔テーブルのバックアップ、回復及びロード〕
請求情報処理で使用するテーブルのバックアップ、回復及びロードは、関係データベース管理システム (RDBMS) が備える機能を使用して行われている。 その概要は、次のとおりである。
1.テーブルのバックアップ
バックアップコマンドによって、テーブルごとにバックアップファイルを作成する。 そのファイルを、イメージコピー(以下、ICという)と呼ぶ。
① ICは、取得するページの範囲によって、全体IC, 増分IC及び差分ICの3種類に分けられる。
・全体ICには、テーブルの全ページが含まれる。
・増分ICには、前回の全体IC取得後に変更されたすべてのページが含まれる。
・差分ICには、前回の全体IC取得後に変更されたページが含まれる。 ただし、前回の全体IC取得以降に差分ICを取得していた場合は、前回の差分IC取得後に変更されたページだけが含まれる。
② ICは、取得する時期によって、オフラインICとオンラインICの2種類に分けられる。
・オフラインICの取得中は、ほかの利用者からのアクセスは参照だけが可能である。
・オンラインICの取得中は、ほかの利用者からのアクセスはすべての操作 (追加、参照、更新、削除)が可能であり、ICには未コミット状態のデータが含まれることがある。
2.テーブルの回復
ICとRDBMSが回復用に取得するログを入力すれば、回復コマンドによって、テーブルを直近の状態まで回復可能である。 可能な入力の組合せは、次のとおりである。
・全体ICと全体IC取得後のすべてのログ
・全体ICとすべての差分 IC, 最後の差分IC取得後のすべてのログ
・全体ICと最後の増分IC, その増分IC取得後のすべてのログ
3.テーブルのロード
ロードコマンドによって、大量のデータを INSERT文よりも効率よくテーブルに追加できる。ログを出力しないオプションを使った場合、ロード後のテーブルへのアクセスは、参照だけが可能であり、全体 IC を取得すれば、すべての操作が可能になる。
〔テーブルの構造〕
請求情報処理で使用するテーブルの構造を、図1に示す。

〔請求情報照会処理の概要〕
請求情報照会処理では、図2のSQL文を使用する。 照会1と照会2のアクセス経路は主索引(主キーに定義された索引)である。 トランザクションのISOLATIONレベルはREPEATABLE READであり、排他は行単位に行われる。

〔請求情報更新処理の概要〕
請求情報更新処理は、請求登録処理、入金登録処理、請求一括削除処理及び請求取消処理から構成される。
1.請求登録処理は、会員を四つのグループに均等に分け、グループ単位に日を分けて、
それぞれ毎月1回、バッチ処理で行う。当処理は、“請求” テーブルと“請求明細”
テーブルに行を追加し、請求番号ごとに同期点を取る。“請求” テーブルの請求日と“会員” テーブルの最新請求日には処理日を設定し、“商品別請求”テーブルの請求額合計に請求明細行の請求額を加算する。 請求登録処理の後、1か月以内に入金される。
2.入金登録処理は、請求登録処理日に合わせて、バッチ処理で行い、“請求”テーブルの入金日と “会員” テーブルの最新入金日に実際の入金日を設定する。 入金登録処理も、毎回、全会員数の25%を対象にするが、同じ日の請求登録処理対象の会員とは限らないので、二つの処理を合わせて、最大で全会員数の50%が対象になる。
3.請求一括削除処理はバッチ処理で行い、月末日に入金日を調べて、請求日が前月の行のうち、入金済の行を削除する。
4.請求取消処理は、納品後に返品されたとき、“請求” テーブルの請求取消日に返品日を設定し、“請求明細” テーブルの返品フラグを 'N' から ‘Y'に更新する。また、“商品別請求” テーブルの請求額合計から返品対象の請求額を減算する。
テーブルのデータに関する主な特徴は、次のとおりである。
1.年間を通じて扱う全体の商品の種類の数は変わらない。売れる商品は、月平均で全種類の25%である。
2.請求番号には、一意な連番を付与する。 請求明細番号には、請求番号ごとに1からの連番を付与する。
3.“請求明細”テーブルは、一つの請求番号に対して請求明細が平均2行存在する。
4.“請求”テーブル及び “請求明細” テーブルは、最大2か月間保存する。両テーブルの行数は、最も多い月で平均的な月の1.2倍となる。 また、今後、年率20%以上の増加が見込まれる。
5.“商品別請求” テーブルの請求額合計には、年度決算後に0を設定する。
請求一括削除処理は、図3に示す 2 個の DELETE 文を使って一括削除をする。図3中の削除1と削除2の間で同期点を取るものとする。 ページ中の削除された行の領域は、新たな行の追加のときに再利用可能である。


〔問題の発生・検討〕
Fさんが請求情報更新処理のテストを行ったところ、次の問題A〜Cが発生した。
問題 A 障害テストを行うために、請求登録処理を意図的に異常終了させた後、そのまま最初から再実行したところ、請求番号を除き、同じ内容の請求データ行が追加された。
問題 B 請求一括削除処理では、図3中の削除1を実行したとき、データ量によって失敗することがあった。
問題 C 請求一括削除処理中は、図2のSQL文を発行するオンライントランザクションが長時間にわたって排他待ちになることがあった。
Fさんは、発生した問題A〜Cについて、それぞれ次の検討A〜Cを行った。
検討 A 問題Aの原因は、RDBMSが請求番号に常に一意な番号を自動採番しているからであった。 Fさんは、“請求” テーブルに制約を追加することによって解決しようとした。
検討 B 問題Bの原因は、回復用に取得するログの量が1作業単位の許容上限値を超えたからであった。 Fさんは、対策として次の二つの方法を比較し、方法2を選択した。
方法1:1作業単位の許容上限値を20%増加させる。
方法2:一定行数を削除するたびに同期点を取るように、削除1を変更する。
検討 C 問題Cに対する対策として、請求情報照会処理のトランザクションのISOLATIONレベルをREPEATABLE READからREAD UNCOMMITTEDに変更したところ、長時間の排他待ちは解消したが、照会2では、実行のタイミングによって、請求額合計が少ないという不整合が発生した。 そこで、“請求”テーブルの明細数と “請求明細” テーブルの明細行の数が不一致の場合は、照会結果に含まれないように、図2中の照会2を図4のように修正した。
↩設問1(3)
↩設問1(3)〔請求一括削除処理の内容 ・手順の変更〕
Fさんは、検討Cで述べた対策とは別に、問題Cに対する対策として、請求一括削除処理の手順を表1のように変更した。 このとき、ある手順からある手順の間、オンライントランザクションからの“請求” テーブルと “請求明細” テーブルへのアクセスを停止することにした。 また、手順5の終了後、次の請求一括削除処理を行うまで、差分IC又は増分ICを定期的に取得することにした。
〔テーブルの定期バックアップ計画〕
Fさんはまず、請求情報処理の各処理とテーブルのCRUD及び各処理の稼働情報(処理形態、稼働時間帯及び処理頻度)を調査し、表2のように整理した。
次に、月末日の請求一括削除処理の終了後に全体ICを取得し、請求登録処理と入金登録処理の終了後に、差分IC又は増分ICを取得することにした。 バックアップ時間は、その時点のICの容量にほぼ比例することが分かったので、各テーブルの1か月分の全体ICの容量に対する差分IC及び増分ICの容量の割合を見積もった。その結果を表3に示す。 ここで、請求取消処理による影響は無視するものとする。
設問1:〔問題の発生・検討〕中の検討A〜Cについて、(1)〜(3)に答えよ。
問題文を見る(1)
検討Aにおいて、“請求” テーブルに追加すべき制約の適切な列名又は列名の組合せを答えよ。 また、その制約の追加目的を、15字以内で述べよ。
模範解答
列名:会員番号、請求日
目的:一意性を保証するため
解説
解答の論理構成
- 事象の確認
- 【問題文】「問題 A … 請求番号を除き、同じ内容の請求データ行が追加された」
- 自動採番の「請求番号」は常に新値なので重複検知に役立たない。
- 重複判定に使う業務項目の抽出
- 請求登録処理は「毎月1回、バッチ処理で行う」
- 同一会員に対して同一請求日で2行以上存在するのは業務上不正。
- よって重複判定列は「会員番号」「請求日」。
- 制約の種類と目的
- 複数列の UNIQUE 制約 を追加し「一意性を保証するため」。
- これにより再実行時は一意性違反エラーでロールバックできる。
誤りやすいポイント
- 「請求番号」は既に主キーなので追加制約対象ではない。
- 「明細数」や「入金日」を含める必要はない。請求発生タイミングの一意性は「会員番号+請求日」で十分。
- NOT NULLなど列制約と混同しがちだが、本設問は複合 UNIQUE 制約を問うもの。
FAQ
Q: PRIMARY KEY を「会員番号、請求日」に変更してはいけませんか?
A: 既存の主キー「請求番号」は業務・外部参照で広く使用されているため変更は影響大です。複合 UNIQUE を追加するのが現実的です。
A: 既存の主キー「請求番号」は業務・外部参照で広く使用されているため変更は影響大です。複合 UNIQUE を追加するのが現実的です。
Q: 請求登録を再実行する前にDELETEしては?
A: 処理途中で障害が起きた際に自動復旧を図るには、整合性をデータベース制約で担保する方が安全です。手動DELETEは漏れ・誤削除リスクが残ります。
A: 処理途中で障害が起きた際に自動復旧を図るには、整合性をデータベース制約で担保する方が安全です。手動DELETEは漏れ・誤削除リスクが残ります。
関連キーワード: UNIQUE制約、複合キー、自動採番、再実行制御、データ整合性
設問1:〔問題の発生・検討〕中の検討A〜Cについて、(1)〜(3)に答えよ。
問題文を見る(2)
検討Bにおいて、Fさんは方法2を選択した。 方法2が方法1よりも優れている理由を、20字以内で述べよ。
模範解答
データ量の増加に影響されないから
解説
解答の論理構成
- 原因の確認
〈問題B〉で失敗理由は「回復用に取得するログの量が1作業単位の許容上限値を超えた」と明示されています。 - 方法1の特徴
〈検討B〉「方法1:1作業単位の許容上限値を20%増加させる」。閾値を広げるだけなので、データ量が再度増えれば同じ問題が再発します。 - 方法2の特徴
同じく〈検討B〉「方法2:一定行数を削除するたびに同期点を取る」。同期点ごとにログ量が確定・クリアされるため、削除対象が増えても“1作業単位”あたりのログ量は固定化されます。 - 比較結果
データ量が将来増加しても方法2なら「許容上限値を超えない」=データ量の増加に影響されないため、Fさんは方法2を選択しました。
誤りやすいポイント
- 「20%増加させる」と聞くと十分だと誤解しやすいが、年率20%以上のデータ増加とピーク1.2倍を考慮すると追いつかない。
- 同期点の目的を「途中経過保存」だけと捉え、ログ量リセット効果を見落としやすい。
- 回復ログとアーカイブログを混同し、容量問題の本質を捉え損なうケース。
FAQ
Q: 同期点を増やすと処理時間が長くなりませんか?
A: 同期点取得にはオーバーヘッドがありますが、障害発生リスク低減と再実行回数削減により総合的な処理時間・運用コストは抑えられます。
A: 同期点取得にはオーバーヘッドがありますが、障害発生リスク低減と再実行回数削減により総合的な処理時間・運用コストは抑えられます。
Q: 許容上限値をもっと大幅に上げれば方法1でも良いのでは?
A: 一時的には解決しますが、データ量の増加が続けば再発します。ストレージ制限やパフォーマンス低下も無視できません。
A: 一時的には解決しますが、データ量の増加が続けば再発します。ストレージ制限やパフォーマンス低下も無視できません。
Q: 同期点は何を基準に入れればよいですか?
A: 一度のDELETEで生成されるログ量を見積もり、上限値の70〜80%を超えない行数を目安に設定するのが一般的です。
A: 一度のDELETEで生成されるログ量を見積もり、上限値の70〜80%を超えない行数を目安に設定するのが一般的です。
関連キーワード: 同期点、回復ログ、DELETE処理、バッチ運用、ボリューム管理
設問1:〔問題の発生・検討〕中の検討A〜Cについて、(1)〜(3)に答えよ。
問題文を見る(3)
検討Cに関する、図4中の(a)〜(c)に入れる適切な字句を答えよ。
模範解答
a:・COUNT(*)
・MAX(請求明細番号)
b:請求明細
c:・X.請求番号=Z.請求番号
・Y.請求番号=Z.請求番号
・Z.請求番号=:請求番号
解説
解答の導き方
-
図4 の該当箇所は「AND X.明細数 = ( SELECT (a) FROM (b) Z WHERE (c) )」です。X.明細数は、その請求に含まれる請求明細の数です。返品された明細も請求明細として残っているので、明細数は返品を含む明細の数になります。この副問い合わせは、請求明細の行が明細数どおりにそろっているか(請求一括削除処理などで明細が一部だけ削除されていないか)を確認するためのものです。したがって、副問い合わせは返品の有無に関係なく、その請求の請求明細の行数を返す必要があります。
-
(b) は、明細の行をもつ「請求明細」です。
-
(c) は、対象の請求の明細だけに絞る条件です。外側では「X.請求番号 = :請求番号」「X.請求番号 = Y.請求番号」と指定しているので、副問い合わせでは次のいずれかで請求を特定できます。
- X.請求番号=Z.請求番号
- Y.請求番号=Z.請求番号
- Z.請求番号=:請求番号
返品フラグの条件は入れません。外側の「Y.返品フラグ <> 'Y'」は合計金額を計算する明細を絞る条件であり、明細数と比較する行数を絞る条件ではないからです。副問い合わせに返品フラグの条件を入れると、返品がある請求では行数が明細数より少なくなり、常に不一致になってしまいます。
-
(a) は行数を返す集約です。COUNT(*) のほか、請求明細番号が請求ごとに1から連番で付けられているので、MAX(請求明細番号) でも明細数と比較できます(解答例も両方を挙げています)。
-
以上から空欄に入る字句は次のとおりです。
(a):COUNT(*) 又は MAX(請求明細番号)
(b):請求明細
(c):X.請求番号=Z.請求番号、Y.請求番号=Z.請求番号、Z.請求番号=:請求番号 のいずれか
(b):請求明細
(c):X.請求番号=Z.請求番号、Y.請求番号=Z.請求番号、Z.請求番号=:請求番号 のいずれか
誤りやすいポイント
- 外側の「Y.返品フラグ <> 'Y'」につられて、副問い合わせにも返品フラグの条件を入れてしまう。明細数は返品を含む明細の数なので、返品があると一致しなくなります。
- (b) に「請求」を入れてしまう。数えるのは明細の行です。
- 問題文にあるトランザクション分離レベルの変更(READ UNCOMMITTED)による不整合発生の理由は「ダーティリード(未コミットデータの読取)」であり、図のオンラインICの説明等とは別概念です。オンラインICの記述を根拠にしないよう注意してください。
FAQ
Q: 副問い合わせで COUNT() と COUNT(請求明細番号) はどちらが良いですか?
A: 一般には COUNT() を推奨します。COUNT(列) はその列がNULLの行を除外しますが、請求明細番号が NOT NULLである保証があれば COUNT(請求明細番号) でも同等です。明確さと確実性から COUNT(*) が無難です。
A: 一般には COUNT() を推奨します。COUNT(列) はその列がNULLの行を除外しますが、請求明細番号が NOT NULLである保証があれば COUNT(請求明細番号) でも同等です。明確さと確実性から COUNT(*) が無難です。
Q: 返品フラグで絞らなくてよいのはなぜですか?
A: X.明細数 は返品を含む明細の数です。副問い合わせは「請求明細の行が明細数どおりにそろっているか」を確かめるためのもので、合計に使う明細を数えるものではありません。返品フラグで絞ると、返品がある請求で行数が合わなくなります。
A: X.明細数 は返品を含む明細の数です。副問い合わせは「請求明細の行が明細数どおりにそろっているか」を確かめるためのもので、合計に使う明細を数えるものではありません。返品フラグで絞ると、返品がある請求で行数が合わなくなります。
Q: 副問い合わせをパラメータ(:請求番号)で書くのとX.請求番号 と相関させるのはどちらが良いですか?
A: 実務的にはどちらも可能です。:請求番号 が外部から確実に渡るなら非相関で書けますが、クエリを一つの文で表現するなら相関副問い合わせ(Z.請求番号 = X.請求番号)が読みやすく安全です。
A: 実務的にはどちらも可能です。:請求番号 が外部から確実に渡るなら非相関で書けますが、クエリを一つの文で表現するなら相関副問い合わせ(Z.請求番号 = X.請求番号)が読みやすく安全です。
関連キーワード: 相関副問い合わせ、集約関数、COUNT(*)、ダーティリード、トランザクション分離レベル
(1)
表1の手順1の全体オンラインICは、どのような障害の発生に備えて必要か、例を一つ答えよ。
模範解答
・手順2の最中にディスク障害が発生した場合
・手順2の出力ファイルが破損し読み込み不可能だった場合
・手順2で残すべき行を選択しなかった場合
解説
解答の論理構成
- 【問題文】で、手順1は「全体オンラインICを取得する。」と明示。
- 手順2〜手順4では
- 「残すべき行を選択して抽出したファイルを作成」
- 「テーブルと索引を格納した全ページを空にする」
- 「ログを出力しないオプションによってロード」
と、既存ページの物理削除とノーログロードを実施。
- これらの最中に
- 「ディスク障害」が発生
- 抽出「ファイルが破損」
- 抽出条件ミスで「残すべき行を選択しなかった」
などが起きると、テーブルを正常状態へ戻す術がなくなる。
- そこで処理着手前に「全体IC」を取得し、障害時は
- 「全体ICと全体IC取得後のすべてのログ」を使い
- 【問題文】2.テーブルの回復 に従ってリカバリ可能。
- 以上より、手順1の全体オンラインICは「手順2の最中にディスク障害が発生した場合」などの障害に備えるために必要であると結論付く。
誤りやすいポイント
- 手順5の「全体オフラインIC」があるから十分と考え、手順1を軽視する。→手順5は処理完了後のバックアップであり進行中障害には使えない。
- 「ログを出力しないロードでもログが回復に使える」と誤解。→ノーログオプション使用時はロード自体のログが残らないため、直前ICが不可欠。
- オンラインICには「未コミットデータが含まれることがある」点を忘れて、ロールフォワードの必要性を見落とす。
FAQ
Q: オンラインICとオフラインIC、障害復旧能力に差はありますか?
A: IC単体の格納内容は同じですが、オンラインICには【問題文】「未コミット状態のデータが含まれることがある」ため、必ず取得後のログと組み合わせてロールフォワードしてから利用します。
A: IC単体の格納内容は同じですが、オンラインICには【問題文】「未コミット状態のデータが含まれることがある」ため、必ず取得後のログと組み合わせてロールフォワードしてから利用します。
Q: 手順2で抽出したファイルが壊れた場合はロードし直すだけでは?
A: 手順3で既にテーブルページを空にしてしまうため、抽出ファイルが不良だと投入元データが失われます。手順1の全体ICがないと原状態へ戻せません。
A: 手順3で既にテーブルページを空にしてしまうため、抽出ファイルが不良だと投入元データが失われます。手順1の全体ICがないと原状態へ戻せません。
Q: 手順5のオフラインICだけ取得しておけば十分では?
A: 手順5は「空にする」「ロードする」が正常終了した後のバックアップです。途中で障害が起きた場合には到達できないため、手順1が必須です。
A: 手順5は「空にする」「ロードする」が正常終了した後のバックアップです。途中で障害が起きた場合には到達できないため、手順1が必須です。
関連キーワード: イメージコピー、オンラインバックアップ、ディスク障害、論理障害、ロールフォワード
(2)
オンライントランザクションからのアクセス(参照だけの場合とすべての操作の場合)を停止すべき対象範囲(手順)に関する次の記述中の(ア)〜(エ)に入れる適切な手順番号を答えよ。
参照だけの場合 : 手順(ア)の開始から手順(イ)の終了まで
すべての操作の場合 : 手順(ウ)の開始から手順(エ)の終了まで
模範解答
ア:3
イ:4
ウ:2
エ:5
解説
解答の論理構成
- 手順ごとの性質を整理
- 手順「2」:残す行を抽出するため整合性が必須。途中で更新が走ると抽出結果と実データが食い違う。
- 手順「3」:ページを空にし「削除された行と索引のログは出力されず、空になったページは再利用される」。ここでデータは一時的に消える。
- 手順「4」:ログを出力しないロードを行い、「ロード後のテーブルへのアクセスは、参照だけが可能であり、全体ICを取得すれば、すべての操作が可能になる」。
- 手順「5」:全体オフラインICを取得し終えると更新系も許可できる。
- 更新禁止(=すべての操作禁止)の範囲決定
抽出結果と実データの乖離を防ぐため、更新は手順「2」の開始から手順「5」の終了まで止める。 - 参照も禁止する範囲決定
ページが空になるタイミング以降はSELECT でもエラーになるため、参照停止は手順「3」開始から手順「4」終了までとする。 - 以上より
- (ア)=3, (イ)=4
- (ウ)=2, (エ)=5
誤りやすいポイント
- ロード直後に「参照だけ」は許可される点を見落とし、参照停止範囲を手順「5」まで延ばしてしまう。
- 手順「2」はSELECT だけだから更新許可と早合点し、更新停止範囲を手順「3」からにしてしまう。
- オンライン/オフラインICの違いを取り違え、手順「1」のオンラインIC中も更新禁止と誤解する。
FAQ
Q: 手順「1」のオンラインIC取得中はアクセスを止めなくてよいのですか?
A: 【問題文】で「オンラインICの取得中は、…すべての操作 (追加、参照、更新、削除)が可能」と示されているため停止不要です。
A: 【問題文】で「オンラインICの取得中は、…すべての操作 (追加、参照、更新、削除)が可能」と示されているため停止不要です。
Q: ロードをログなしで行うメリットは何でしょうか?
A: INSERT 文より高速に大量データを取り込めるうえ、ログ出力量が抑えられます。ただしロード後は全体 IC を取得するまで更新できないという制約が生じます。
A: INSERT 文より高速に大量データを取り込めるうえ、ログ出力量が抑えられます。ただしロード後は全体 IC を取得するまで更新できないという制約が生じます。
Q: 差分ICと増分ICを定期的に取得する理由は?
A: 手順「5」後から次回月末までの更新を回復できるようにするためです。全体ICに加えて差分または増分ICとログを組み合わせれば、障害時に最新状態へ戻せます。
A: 手順「5」後から次回月末までの更新を回復できるようにするためです。全体ICに加えて差分または増分ICとログを組み合わせれば、障害時に最新状態へ戻せます。
関連キーワード: オンラインバックアップ、差分イメージコピー、ログなしロード、トランザクション分離、整合性維持
(3)
手順5の処理終了後に障害が発生し、手順5のICを利用した回復が必要になったにもかかわらず、そのICが利用不可能だった。 しかし、できるだけ障害直前の整合性のある状態に戻したい。 回復可能な整合性のある状態のうち、障害直前に最も近い状態は、どの手順番号の後の状態か、その手順番号を答えよ。また、その回復方法を表1や本文中の用語を用いて、25字以内で述べよ。なお、整合性のある状態とは、未コミット状態のデータが含まれず、かつ、オンライントランザクションを開始できる状態であるものとする。 また、回復方法にはバックアップファイルを作成する手順を含めなくてよい。
模範解答
手順番号:4の後
回復方法:手順2のファイルをテーブルにロードする。
解説
解答の導き方
設問は「手順5のICが使えないとき、障害直前に最も近い回復可能な整合性ある状態はどの手順の後か。回復方法は何か」です。利用可能な情報と要点を順を追って示します。
- 利用できるバックアップ等の一覧(本文から)
- 手順1で「全体オンラインIC」を取得しているが、本文にある通り「オンラインICの取得中は、ほかの利用者からのアクセスはすべての操作 (追加、参照、更新、削除)が可能であり、ICには未コミット状態のデータが含まれることがある」。つまり手順1のICは未コミットデータを含む可能性があり、それだけでは整合性(未コミットを含まない状態)を保証しないことに注意します。
- 手順2で「残すべき行を選択して抽出したファイルを作成する(作成したファイルは、1か月間保存する)」。さらに本文で「オンライントランザクションからの“請求” テーブルと “請求明細” テーブルへのアクセスを停止することにした。」とあるので、手順2の抽出はオンライントランザクションが停止された状態で行われ、抽出ファイルには未コミットデータが含まれないと考えられます。
- 手順3は「テーブルと索引を格納した全ページを空にする(削除された行と索引のログは出力されず)」であり、ログが出力されないためこの操作自体はログで復元できません。
- 手順4は「ログを出力しないオプションによって手順2のファイルをテーブルにロードする。」本文の説明では「ログを出力しないオプションを使った場合、ロード後のテーブルへのアクセスは、参照だけが可能であり、全体ICを取得すれば、すべての操作が可能になる。」とあります。したがって手順4の直後の状態は、手順2で作ったコミット済みデータがテーブルに反映され、参照は可能だが書き込みは不可、という特徴を持ちます。
- 手順5は「全体オフラインICを取得する」。オフラインICは整合性のある(未コミットを含まない)バックアップになりますが、今回は手順5のICが利用できないという条件です。
- 各候補状態の評価(「整合性のある状態」の定義:未コミットが含まれないこと、かつオンライントランザクションを開始できること)
- 手順5の後:本来は最も新しい整合状態だが、手順5のICが利用不可なので選べない。
- 手順4の後:手順2で抽出されたコミット済みデータがテーブルにロードされているため未コミットデータは含まれない。また本文の説明どおりロード直後は参照が可能であるため、少なくとも参照を行うオンライントランザクションは開始できる(設問が求める「オンライントランザクションを開始できる状態」は参照トランザクションの開始を含むと解すれば条件を満たす)。手順5が取れれば書き込みも可能になるが、今回は手順5が使えないため書き込みはできない点に注意します。
- 手順3の後:ページが空になっており未コミットデータは含まれないしオンライントランザクションは開始できるが、手順4の後より時点としては古く、障害直前により近い状態ではない。
- 手順2の後(抽出ファイルのみ存在する状態):抽出ファイル自体は整合だが、抽出を適用した実際のテーブル状態(手順4相当)よりは古い。
- 手順1の後(全体オンラインIC):オンラインICは未コミットを含む可能性があるため整合性の条件を満たすとは限らない。
以上より、手順5のICが使えない場合に「障害直前に最も近い回復可能な整合性のある状態」は手順4の後です。手順4の状態は手順2の抽出ファイルをテーブルにロードした直後の状態であり、その再現は「手順2のファイルをテーブルにロードする」ことで可能です(本文用語を用いると回復方法は「手順2のファイルをテーブルにロードする」)。
誤りやすいポイント
- 手順1の全体オンラインICは「全体」だから安全だと誤認する。本文にあるように「オンラインIC」には未コミットデータが含まれることがあるため、整合性を保証しない点を見落としやすいです。
- 手順2の抽出ファイルが自動的に未コミットを含まないと考える誤り。抽出が整合であることは「オンライントランザクションへのアクセスを停止する」という運用措置があるためであり、単に抽出を行った事実だけでは保証できません。
- 手順4の「ログを出力しないオプション」によるロード後を完全に通常の読み書き可能状態と混同する誤り。ロード直後は「参照だけが可能」であり、書き込み可能とするには全体ICの取得が必要です。
- 手順3の「ログが出力されない」操作はログで取り消したり再現したりできないため、ログのみで回復しようとする誤り。
FAQ
Q: 手順4の後は「オンライントランザクションを開始できる状態」といえるのですか?
A: 本文は「ロード後のテーブルへのアクセスは、参照だけが可能」と明記しています。設問の条件(オンライントランザクションを開始できる状態)は参照トランザクションの開始を含むと解せます。従って手順4直後は参照系のオンライントランザクションを開始でき、未コミットデータも含まれないため「整合性のある状態」に該当します。書き込みを可能にするには全体IC(手順5相当)が必要ですが、今回はそのICが利用できません。
A: 本文は「ロード後のテーブルへのアクセスは、参照だけが可能」と明記しています。設問の条件(オンライントランザクションを開始できる状態)は参照トランザクションの開始を含むと解せます。従って手順4直後は参照系のオンライントランザクションを開始でき、未コミットデータも含まれないため「整合性のある状態」に該当します。書き込みを可能にするには全体IC(手順5相当)が必要ですが、今回はそのICが利用できません。
Q: 手順1の全体オンラインICとログを使って手順5相当まで回復できませんか?
A: オンラインICは未コミットデータを含む可能性がある点の他、手順3・4のように「ログを出力しない」操作はログに記録されないため、ログ適用だけで手順4相当の状態を再現できません。したがって手順2の抽出ファイルを利用する方が確実です。
A: オンラインICは未コミットデータを含む可能性がある点の他、手順3・4のように「ログを出力しない」操作はログに記録されないため、ログ適用だけで手順4相当の状態を再現できません。したがって手順2の抽出ファイルを利用する方が確実です。
Q: 回復手順として具体的に何をすれば良いですか?
A: 回復方法の要旨は「手順2のファイルをテーブルにロードする」です。問題指定のためバックアップ取得手順は省略して良いとあるので、実務ではまずベースのリストア(必要なら)を行い、続けて保存中の手順2の抽出ファイルをログ非出力ロードで適用して手順4の状態を復元します。
A: 回復方法の要旨は「手順2のファイルをテーブルにロードする」です。問題指定のためバックアップ取得手順は省略して良いとあるので、実務ではまずベースのリストア(必要なら)を行い、続けて保存中の手順2の抽出ファイルをログ非出力ロードで適用して手順4の状態を復元します。
関連キーワード: イメージコピー、差分バックアップ、増分バックアップ、ログ未出力ロード、同期点
設問3:〔テーブルの定期バックアップ計画〕について、(1)、(2)に答えよ。
問題文を見る(1)
表2中の(d)〜(g)に入れるCRUDの中で、最も適切で欠かせないものを一つ答えよ。
模範解答
d:C
e:C
f:U
g:U
解説
解答の導き方
設問は表2中の (d)〜(g) に、それぞれ「最も適切で欠かせない」CRUDを入れることを求めています。問題文の各処理概要から当該テーブルに対して必ず行われる操作を抜き出し、CRUDに対応づけます。
(d) 請求(請求登録処理)
- 根拠(問題文):「“請求” テーブルと“請求明細”テーブルに行を追加し」
- 考え方:ここで明示されている操作は「行を追加」つまり INSERT(新規行作成)です。CRUD のうち Create を表す「C」が対応します。
- 他の選択肢の除外:参照(R)ではなく書き込み、更新(U)は既存行の変更を意味するため該当せず、削除(D)でもありません。
- 結論:(d) = C
(e) 請求明細(請求登録処理)
- 根拠(問題文):「“請求” テーブルと“請求明細”テーブルに行を追加し」
- 考え方:請求明細にも新しい明細行を追加する処理であるためCreate(C)が必須です。
- 結論:(e) = C
(f) 会員(請求登録処理)
- 根拠(問題文):「“請求” テーブルの請求日と“会員” テーブルの最新請求日には処理日を設定し」
- 考え方:「設定する」は既存の会員レコードの列を更新する操作を指します。新規会員の作成を記述していないためCreateではなくUpdate(U)が適切です。さらに別処理の入金登録でも「“会員” テーブルの最新入金日を設定する」とある点も更新操作であることを裏付けます。
- 結論:(f) = U
(g) 請求(請求取消処理)
- 根拠(問題文):「“請求” テーブルの請求取消日に返品日を設定し、“請求明細” テーブルの返品フラグを 'N' から ‘Y'に更新する」
- 考え方:請求取消は行を削除するのではなく、請求取消日や返品フラグを変更する「更新」処理です。よってUpdate(U)が適切です。
- 結論:(g) = U
まとめとして、表2の空欄には (d)=C、(e)=C、(f)=U、(g)=Uが最も適切で欠かせない値になります。
誤りやすいポイント
- 「追加(行を追加)」と「更新(既存行の列を設定・変更)」の区別を見落とすと誤答しやすい。本文の「行を追加し」「〜を設定し/更新する」の語に注目すること。
- 「取消」や「返品」といった語に惑わされて即座に削除(D)と判断しがちだが、実際はフラグ設定や日付設定の更新(U)の場合がある。
- 複数テーブルが登場する処理では、どのテーブルにどの操作が行われるかを正確に紐づけないと誤答する。処理文の主語(どのテーブルに対して)を必ず確認する。
- 「必須かつ欠かせないもの」を問う設問であるため、副次的に行われうる操作(たとえばログ出力や索引の再作成など)に引きずられて主要操作を見落とさないこと。
FAQ
Q: 請求登録で請求明細がCなのはなぜですか?
A: 問題文に「“請求” テーブルと“請求明細”テーブルに行を追加し」とあるため、明細は新規行の挿入(Create)でありCが必須です。
A: 問題文に「“請求” テーブルと“請求明細”テーブルに行を追加し」とあるため、明細は新規行の挿入(Create)でありCが必須です。
Q: 請求取消は名前から削除(D)に見えますが、なぜUなのですか?
A: 文中で「請求取消日に返品日を設定し」「返品フラグを 'N' から ‘Y'に更新する」と記述されており、行を消す操作ではなく既存行の列値変更(Update)だからです。
A: 文中で「請求取消日に返品日を設定し」「返品フラグを 'N' から ‘Y'に更新する」と記述されており、行を消す操作ではなく既存行の列値変更(Update)だからです。
Q: 会員に対してC(新規作成)も考えられませんか?
A: 記述は「最新請求日には処理日を設定し」と既存会員レコードの列を更新する内容であり、新規会員作成を示す記述はありません。したがって必須の主要操作はUです。
A: 記述は「最新請求日には処理日を設定し」と既存会員レコードの列を更新する内容であり、新規会員作成を示す記述はありません。したがって必須の主要操作はUです。
関連キーワード: CRUD、トランザクション、バッチ処理、差分バックアップ、増分バックアップ
設問3:〔テーブルの定期バックアップ計画〕について、(1)、(2)に答えよ。
問題文を見る(2)
表3中の(h)〜(o)に入れる最も近い値を25, 50, 75, 100, 125, 150, 175, 200の中から選んで、表を完成させよ。
模範解答
h:50
i:100
j:200
k:50
l:100
m:25
n:25
o:25
解説
解答の論理構成
-
テーブルごとの1回当たりの変更率
- “請求明細”
「請求登録処理…行を追加」だけで更新や削除はなし。25%×1=25%。 - “請求”
「行を追加」25% と「入金登録処理…入金日を設定」25% が同日に発生し最大50%。 - “会員”
最新請求日と最新入金日を更新するだけ。1回当たり25%+25%=50%。 - “商品別請求”
売れる商品は月平均25% ⇒ 更新対象25%。
- “請求明細”
-
差分IC(前回差分以降の変更ページ)
各回とも上記の変更率がそのまま容量比になる。- 1回目:請求50 → h=50
- 2回目:会員50 → k=50、商品別請求25 → m=25
(“請求”と“請求明細”は既に値が与えられているため空欄) - 3・4回目も同様の比率なので設問対象外。
-
増分IC(全体IC以降の累積変更ページ)
変更率を回数分累積し、選択肢に合わせて四捨五入する。- “請求”
1回目50%、2回目100% → i=100、4回目200% → j=200 - “会員”
1回目50%、2回目以降は同一行の再更新で累積が伸びず100% → l=100 - “商品別請求”
毎回同じ25% の商品コードが更新される想定なので累積は25% のまま → n=25、o=25
- “請求”
-
選択肢との照合
求めた各値はいずれも25の倍数で、提示された8つの選択肢の中に唯一一致する。
誤りやすいポイント
- 増分ICと差分ICの定義を逆に覚えてしまい、累積/非累積を取り違える。
- “請求”テーブルの 50% を「25% だけ」と数え、INSERT と UPDATE を合算し忘れる。
- “会員”テーブルの累積率を4回で200% と誤算し、行の再更新による重複を考慮しない。
- “商品別請求”は毎回同じ商品を更新する可能性が高い点を見落とし、累積が増えると誤判断する。
FAQ
Q: 差分ICが毎回ほぼ同じ容量になるのはなぜですか?
A: 差分ICは「前回の差分IC取得後に変更されたページだけ」を収めるため、各バッチで変更範囲が一定なら容量もほぼ一定になります。
A: 差分ICは「前回の差分IC取得後に変更されたページだけ」を収めるため、各バッチで変更範囲が一定なら容量もほぼ一定になります。
Q: “会員”テーブルの増分ICが100% で頭打ちになる理由は?
A: 各会員行は月内で最大2回(請求日と入金日)しか更新されません。2回目以降の UPDATE は既に変更済みのページを書き換えるだけなので、累積率は 100% を超えません。
A: 各会員行は月内で最大2回(請求日と入金日)しか更新されません。2回目以降の UPDATE は既に変更済みのページを書き換えるだけなので、累積率は 100% を超えません。
Q: “請求明細”テーブルの増分ICが25 → 50 → 75 → 100と増えるのは?
A: INSERT のみで行が増えるため、同じページが再利用されず毎回新規ページが増え、累積変更ページが単純に加算されるからです。
A: INSERT のみで行が増えるため、同じページが再利用されず毎回新規ページが増え、累積変更ページが単純に加算されるからです。
関連キーワード: 差分バックアップ、増分バックアップ、更新割合、トランザクション更新、ページ単位容量






