DBデータベーススペシャリスト試験 午後Ⅱ
令和6年度秋期 データベーススペシャリスト 午後Ⅱ 問1
事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。
問題











解き方のヒントを見る
検討する対象範囲をそろえて考える
この分野を学ぶ際は、検討の対象がどこまで含まれているかという一点に注目しましょう。異なる範囲の話を混ぜず、与えられた情報から対象の境界を整理すると、理解の前提をそろえやすくなります。
この問題で問われていること
扱っている内容の対象範囲を、与えられた情報に沿って確かめてみましょう。全体について述べていることと、その一部に限って述べていることを区別し、同じ範囲を前提に考えているかを確認するのが手掛かりです。
視点
対象範囲とは、いま考えている内容が及ぶ範囲のことです。ある範囲についての記述を、根拠なく別の範囲へ広げて受け取っていないかを意識しましょう。
確認ポイント
- 検討の対象として示されている範囲を押さえたか
- 対象の全体と一部を混同していないか
- 読み取った内容を、示された範囲を超えて広げていないか
正解と解説を見る
解説
夜間バッチをオンライン時間帯へ移す際には、処理順序を維持するだけでなく、ロックによる待ち、更新の上書き、デッドロック、障害回復時間への対処が必要です。本問では、指定されたRDBMSの仕様とAPの処理内容から、バックアップの取得契機、トランザクションの分割、更新順序の統一、必要な運用資源を導きます。
問題の全体像
A社は、車両保守の予定作成、実施結果の登録、進捗更新などの夜間バッチをオンライン時間帯へ移そうとしています。既存のオンラインAPと同時に動かすことで、応答遅延、現手配#の不正な更新、多重ジョブ間のデッドロックが問題になります。公式の出題趣旨では、バックアップ・リカバリ方式の設計、データ操作の設計、アクセス性能の見積り、排他制御方式の選択と評価を問うとされています。各設問では、一般的な知識に加え、本文で指定されたRDBMS固有の回復手順やログなしモードの制約を根拠に判断します。
設問1(1)
表4のCRUDと図2の実行順序に着目します。公式解答例では、T1に契約、受託、車両、予定表、進捗、点検率、記録簿へ○を付け、T6に受託、点検率、報告へ○を付けます。それ以外の太枠内は空欄です。T1ではオンラインAPが追加・更新したテーブルを保存し、当日のオンライン処理を反映した状態へ戻せるようにします。バッチで変更するテーブルは、そのAPを再実行するための変更前の状態と、実行結果を反映した状態が必要です。実施結果と記録簿はT3、予定表はT4、車両・予定表・進捗・記録簿はT5に既に取得するので、T6では報告作成による受託・報告と、点検率更新による点検率だけを追加します。参照だけの顧客・委託先や、バックアップ対象外のWK1・WK2は取得しません。
設問1(2)(a)(a)
公式解答例ではaは「WK1」です。車検抽出2は、ログなしモードのWK1へ行を追加します。実行途中のサーバ障害後に未完了トランザクションがロールバックされると、ログなしモードの更新対象は使用不可になります。WK1はバックアップ対象外なので、再定義してから必要な抽出処理をやり直します。
設問1(2)(a)(b)
公式解答例ではbは「再定義」です。本文のログなしモードの制約では、ロールバックにより使用不可になったテーブルは、バックアップから復元するか、削除して再度定義する必要があります。WK1・WK2にはバックアップを取得しないため、ここでは再定義を選びます。
設問1(2)(a)(c)
公式解答例ではcは「点検抽出」です。点検抽出はT2より前に完了していますが、その結果はWK1に格納されています。車検抽出2の障害への対処としてWK1全体を再定義すると、点検抽出の結果も失われるため、点検抽出を再実行して再作成します。公式解答例ではcとdのAP名は順不同とされています。
設問1(2)(a)(d)
公式解答例ではdは「車検抽出2」です。車検抽出2は障害発生時に実行中で、WK1への追加が完了していません。WK1を再定義し、点検抽出の結果とともに車検抽出2の結果を作り直す必要があります。T2でチェックポイントを取得している場合、車検抽出1が作成したWK2を利用して再実行できます。
設問1(2)(a)(e)
公式解答例ではeは「実施登録」です。図2では実施登録と車検抽出2がT2からT3の間に実行され、どちらも障害発生時に実行中です。実施登録による実施結果・記録簿への追加にはログがあるため、未完了の変更はRDBMS再開始時に回復処理の後でロールバックされます。その後、実施登録を再実行して登録を完了させます。
設問1(2)(a)(f)
公式解答例ではfは「WK2」です。T2でチェックポイントを取得していなければ、直前のチェックポイント以降には、車検抽出1によるログなしモードのWK2への追加も含まれます。WK2の内容はログによって再現できないため、T2時点の結果を利用する前提が成立しません。WK2も再定義して、車検抽出1の結果から作り直します。
設問1(2)(a)(g)
公式解答例ではgは「車検抽出1」です。WK2は車検抽出1の結果を格納し、車検抽出2が参照するワークテーブルです。T2でチェックポイントを取得していない場合には、WK2を再定義して車検抽出1を再実行し、その結果を準備してから車検抽出2を再実行します。図2の先行・後続関係を守ることがポイントです。
設問1(2)(b)(h)
公式解答例ではhは「予定表作成、進捗更新」です。T3でチェックポイントを取得した後、T5からT6の間に障害が発生するので、予定表作成と進捗更新は既に完了しています。最短ケースでは、その後の報告作成・点検率更新による変更がまだ発生していません。したがって、T3以降の完了済みの変更を再現するロールフォワードの対象は、この二つのAPです。
設問1(2)(b)(i)
公式解答例ではiは「なし」です。最短ケースでは、報告作成・点検率更新による変更が発生する直前に障害が起きています。予定表作成と進捗更新はコミット済みであり、取り消すべき未完了トランザクションの変更がないため、ロールバックが必要なAPはありません。
設問1(2)(b)(j)
公式解答例ではjは140秒です。表3から、予定表作成は追加20、000行、進捗更新は追加10、000行と更新40、000行なので、ロールフォワードは合計70、000行です。本文ではロールフォワードをログ順に逐次実行するため、70、000×2ミリ秒=140秒となります。ロールバックの対象はないので、その時間は加えません。
設問1(2)(c)(k)
公式解答例ではkは「予定表作成、進捗更新、報告作成、点検率更新」です。T3以降に変更するAPを表3と図2から拾います。本文の再開始手順では、完了済みの変更だけでなく、未完了トランザクションの変更もまずロールフォワードし、その後で取り消します。したがって、コミット直前の報告作成・点検率更新も対象です。参照だけで依頼ファイルを作成する依頼作成は含みません。
設問1(2)(c)(l)
公式解答例ではlは「報告作成、点検率更新」です。障害発生時点はT5からT6の間なので、予定表作成と進捗更新は先行処理として完了しています。最悪ケースでは、報告作成と点検率更新が全ての変更を行い、コミットする直前で未完了になっています。この二つのトランザクションの変更を、ロールフォワード後にロールバックします。
設問1(2)(c)(m)
公式解答例ではmは300秒です。ロールフォワードの行数は、予定表作成20、000行、進捗更新50、000行、報告作成40、000行、点検率更新20、000行の合計130、000行で、逐次実行の時間は130、000×0.002=260秒です。ロールバックは報告作成が40、000×0.001=40秒、点検率更新が20、000×0.001=20秒ですが、本文ではトランザクションごとに並行実行するため、長い方の40秒を加えます。合計は260+40=300秒です。採点講評では、この設問の正答率が低く、本文の具体的な回復手順に着目する必要があると指摘されています。
設問2(1)(a)(ア)
公式解答例ではアは「受託」です。表3の報告作成は、報告テーブルに行を追加するとともに、受託テーブルの次回報告YMDを更新します。表4では契約登録も受託を更新するため、同じ受託行を更新しようとすると競合します。報告作成と契約登録の更新対象が重なるテーブルを特定します。
設問2(1)(a)(イ)
公式解答例ではイは「専有ロック」です。報告作成が受託行を更新すると、その行の専有ロックをトランザクション終了まで保持します。表3の注記ではAPの最後に一度だけコミットするため、先に更新した行のロックも処理終了まで残ります。契約登録は同じ行の更新に必要なロックを取得できず、解放を待つことで応答が遅延します。
設問2(1)(b)
公式解答例では「報告の追加と受託の更新を一定回数繰り返すごとにコミットする。」としています。報告作成の全件処理を一つのトランザクションにすると、受託行の専有ロックを長時間保持します。一定回数ごとにコミットすれば、その単位でロックを解放できます。40字以内の答案では、報告の追加と受託の更新を一組として扱うこと、一定回数ごとにコミットすることを押さえます。採点講評でも、業務処理の特徴を理解し、同期の単位を見定めたトランザクション設計が求められています。
設問2(1)(c)(有無)
公式解答例では「無」です。変更後も、報告の追加と受託の次回報告YMDの更新を同じトランザクションでコミットします。コミット済みの受託は次回報告YMDが更新され、再処理では同じ報告の対象として選択されません。未コミットの報告追加はAP障害時にロールバックされるため、追加済みの同一報告が重複して残ることもありません。
設問2(1)(c)(根拠)
公式解答例の根拠は、次回報告YMDの更新をコミットした行は再処理時に選択されないことです。表3の報告作成が次回報告YMDの近い受託を対象にする点に着目します。40字以内では「次回報告YMD更新をコミットした行は再処理時に選択されないから」とまとめられます。報告追加と受託更新を同じコミット単位にすることで、処理済みかどうかを次回報告YMDから判断できます。
設問2(2)(a)(ウ)
公式解答例ではウは「7」、又は「7(完了確認)」です。図4の進捗更新は、実施結果に基づき予定表の現手配#を完了確認の手配#へ更新します。表1では完了確認が7と定義されているため、5から7へ進みます。
設問2(2)(a)(エ)
公式解答例ではエは「6」、又は「6(出庫予約受付)」です。予約登録は、出庫予約を受け付けた際に手配#6を登録します。予定表を読み込んだ時点の現手配#が5であれば、図3の比較で5<6が成立します。その後に進捗更新が現手配#を7へ変更しても、予約登録が先に読んだ5に基づいて6を書き込むと、現手配#が7から6へ戻ってしまいます。
設問2(2)(b)
公式解答例では変更するAPは「予約登録」です。問題の原因は、図3で予定表を読み込んでから、現手配#を比較して更新するまでの間に、進捗更新が同じ行を変更できることです。予約登録が受託行に掛ける専有ロックでは、進捗更新による予定表行の変更を防げません。比較と更新の対象である予定表行を、予約登録の読込み時点から保護します。
設問2(2)(c)
公式解答例では、予定表の行にFOR UPDATE句を指定して読み込む、又は専有ロックを掛けて読み込むとしています。本文の仕様ではFOR UPDATEによる専有ロックは、ISOLATIONレベルにかかわらずトランザクション終了まで保持されます。これにより、読込み後から比較・更新が終わるまで、進捗更新が同じ予定表行を変更することを防げます。35字以内の答案例は「予定表の対象行をFOR UPDATE句を指定して読み込む。」です。
設問2(3)(a)
公式解答例では「異なるジョブで同じ契約#の行を異なる順に更新するとき」としています。ソート連番の範囲が重複しなくても、別の実施結果が同じ契約#に対応することがあります。例えば、一方が契約Aを更新して契約Bを待ち、他方が契約Bを更新して契約Aを待つと、互いの専有ロックの解放待ちが循環します。30字以内では、異なるジョブ、同じ契約#の行、異なる更新順という三点を押さえます。採点講評でも、デッドロックの発生状況の理解不足が指摘されています。
設問2(3)(b)
公式解答例では「読込み順を契約#順に変更する。」としています。図5では実施結果をソート連番順に読み、その順で点検率を更新するため、ジョブごとに契約#の更新順が異なり得ます。全ジョブで契約#順に読み込めば、点検率行のロック取得順がそろい、逆順の取得による循環待ちを防げます。20字以内では、この読込み順の変更だけを明確に書きます。コミット頻度は変更しません。
設問2(3)(c)(AP名)
公式解答例では変更するAPは「実施登録」です。表3では、実施登録が受信したデータをソートし、報告YMDごとにソート連番を設定しています。点検率更新はそのソート連番順に処理するため、連番を付ける実施登録側のソート順を変えることで、後続ジョブの契約#の更新順を統一できます。
設問2(3)(c)(変更内容)
公式解答例では「ソート順を、報告YMD、契約#順に変更する。」としています。元の実施登録は報告YMD、受信TS順に並べますが、これを報告YMD、契約#順にすれば、同じ報告日のソート連番が契約#順に付けられます。後続の点検率更新が連番順に読むだけで、契約#のロック取得順もそろいます。30字以内では、ソートの第1キーが報告YMD、第2キーが契約#であることを明記します。
設問3(1)(オ)
公式解答例ではオは9、500ページです。見積りの前提では、追加のログ量は190、000行、1ページ当たりの平均行数は20行です。追加はページ内の行数が平均行数を超えるまでバッファ内で処理するので、行ごとにI/Oを数えず、190、000÷20=9、500ページと求めます。
設問3(1)(カ)
公式解答例ではカは95秒です。追加で発生する9、500ページのI/Oに、1ページ当たり10ミリ秒を掛けます。9、500×0.010=95秒です。本文の前提に従い、CPU処理、索引探索、ネットワーク通信などの時間は加えません。
設問3(1)(キ)
公式解答例ではキは100、000ページです。更新のログ量は100、000行で、バッファヒット率を0%とする前提があります。追加のように20行を一つのページアクセスにまとめず、各行の更新についてページI/Oが発生するものとして、100、000ページと数えます。採点講評では、ロールフォワード時にも追加と更新でページアクセスの仕方が異なる点の理解が不足していたと指摘されています。
設問3(1)(ク)
公式解答例ではクは1、000秒です。更新で発生する100、000ページのI/Oに、1ページ当たり10ミリ秒を掛け、100、000×0.010=1、000秒と求めます。更新でも20行で割ってしまうと、バッファヒット率0%という前提を反映できません。
設問3(1)(ケ)
公式解答例ではケは3回です。1日分のログによる回復時間は、追加95秒と更新1、000秒を合わせて1、095秒です。5分=300秒以内にするには、1、095÷300=3.65なので、ログ量を四つの区間に分ける必要があります。前日のオンライン時間帯終了後に取得するオフラインバックアップを起点に、当日の途中でオンラインバックアップを3回取得すれば四区間になります。各区間の回復時間は1、095÷4=273.75秒で、5分以内です。
設問3(2)(コ)
公式解答例ではコは「ロールフォワード」です。ログなしモードのテーブルに専有ロックが掛かっている間は、チェックポイントを取得できません。この間も他のオンラインAPはログを伴う変更を行うため、直前のチェックポイント以降のログが増えます。サーバ障害後の再開始では、そのログを順にロールフォワードする必要があり、回復時間が長期化するおそれがあります。
設問3(2)(サ)
公式解答例ではサは「行単位のロックが新たに掛かる」です。ログなしモードでは、WK1・WK2の更新時にテーブル全体へ専有ロックを掛けます。ログなしモードの指定を取りやめると、更新対象の各行に対するロック情報が必要になります。20字以内では、このロック単位の変化を端的に書き、次の空欄で問われる資源不足の原因を示します。
設問3(2)(シ)
公式解答例ではシは「ロックメモリ」です。本文では、1行又は1テーブルにロックを掛けるごとに、ロックメモリへ情報を登録するとされています。WK1・WK2で行単位のロックが新たに必要になると、同時に保持するロック情報が増えます。各APは最後に一度だけコミットするため、更新中に保持するロック数を踏まえて容量を見直します。採点講評でも、データベースの設定変更に伴うリソース不足を防ぐことが求められています。
学習のポイント
ログによる回復の順序と並行性、ロックの保持期間、再処理時の重複防止、追加と更新で異なるページI/Oの見積りを重点的に学習します。
出典:独立行政法人 情報処理推進機構(IPA)令和6年度秋期 データベーススペシャリスト試験 午後Ⅱ 問1(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針