DBデータベーススペシャリスト試験 午後Ⅱ

令和6年度秋期 データベーススペシャリスト 午後Ⅱ 問1

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問1 オートリース会社の車両保守業務におけるデータベースの実装・運用に関する次の記述を読んで,設問に答えよ。 A社は,法人向けに車両のリース及び保守業務を行っており,業務に車両保守システムを使用している。A社では,夜間に実施しているバッチ処理の昼間帯への移行を検討している。 〔車両保守システムの概要〕 1. 業務の概要 (1) 車両のリース提供先の法人を顧客という。顧客との間でリース契約を結び,契約に基づいて車両を定額制で貸し出す。 (2) リース契約に基づいて新しい車両を購入することもあれば,リース契約終了後の車両を再リースすることもある。 (3) 契約のオプションとして車両保守を受託する。車両保守には,車検,法定点検(以下,点検という),整備などの保守区分がある。複数の保守区分を受託することもある。 (4) 外部の自動車整備工場などの委託先に保守区分の実施を依頼する。 (5) 受託ごとに一定期間内の保守区分を洗い出し,保守区分ごとに着手予定日を決めて予定表を作成する。予定表に従って手配を開始し,進捗を確認する。手配は,顧客への事前案内,入庫日の調整,委託先への実施依頼などから成る。手配は,定められた順に実施し,各手配の完了時に進捗を記録する。車検と整備を同時期に実施するなど,同じ車両の異なる保守区分を同時に実施することもある。この場合,保守区分ごとに同じ予定を立てる。 (6) 各車両の一つの保守区分は一つの委託先で実施する。委託先に複数の保守区分の実施を同時に依頼することもある。委託先から保守区分の実施結果を受け取り,進捗を記録する。実施完了の報告を受けると車両の出庫手続に移る。 (7) 車両ごとに,全ての車検,点検,整備の結果及び内容を記録簿に記録する。 2. テーブル構造 車両保守システムのテーブル構造を図1に,主な列の意味・制約を表1に示す。 図1 車両保守システムのテーブル構造(一部省略) 表1 主な列の意味・制約 3. 主な処理 オンライン時間帯は平日の9:00~19:00で,オンライン時間帯終了後の夜間にバッチ処理を行っている。オンライン処理及びバッチ処理は,それぞれ複数のアプリケーションプログラム(以下,APという)から成る。オンライン処理,バッチ処理の概要及び1日の処理行数を表2,3に,バッチ処理の実行スケジュールを図2に示す。表2,3中の二重引用符で囲んだ名前は図1中のテーブル名である。 表2 オンライン処理の概要及び1日の処理行数 表3 バッチ処理の概要及び1日の処理行数 図2 バッチ処理の実行スケジュール 4. 主なAPとテーブルの関係 車両保守システムの主なAPのCRUDを表4に示す。 表4 主なAPのCRUD 5. 障害の考え方 車両保守システムでは,障害を,AP障害,サーバ障害,メディア障害の3種類に分けて,それぞれの対策を立てている。 (1) AP障害は,APのバグ,メモリリークなどによってトランザクションの途中でAPが異常終了する障害である。 (2) サーバ障害は,RDBMSが稼働するサーバが,ハードウェア異常,電源遮断などによって機能停止する障害である。 (3) メディア障害は,RDBMSが使用する制御ファイル,表領域を物理的に格納するストレージの故障,破損によって入出力ができなくなる障害である。 〔RDBMSの主な仕様〕 1. 表領域 (1) テーブル及び索引のストレージ上の物理的な格納場所を表領域という。 (2) RDBMSとストレージとの間の入出力単位をページという。同じページに異なるテーブルの行が格納されることはない。 2. 参照時の専有ロック データ参照時にFOR UPDATE句を指定すると,ISOLATIONレベルにかかわらず,対象行に専有ロックを掛け,トランザクション終了時に解放する。 3. ログ ログは,データより先にログバッファからストレージに出力される。これをログ出力処理と呼ぶ。このとき,トランザクションのコミットはログ出力処理の完了まで待たされる。ログ出力処理は,次のいずれかの事象を契機に行われる。 (1) ログバッファが一杯になった。 (2) トランザクションがコミット又はロールバックされた。 (3) あるテーブルのデータバッファが変更ページによって一杯になった。 4. チェックポイント (1) チェックポイントは,指定されたログの出力量になった時点,又は指定された経過時間に従ってRDBMSが自動で取得する。 (2) チェックポイントは,コマンドを使用して任意に手動で取得することもできる。 5. 異常終了後のRDBMS再開始 RDBMSがサーバ障害によって異常終了した後のRDBMS再開始において,RDBMSは直前のチェックポイントから異常終了時までに完了していたトランザクションの更新データ及び異常終了時に未完了のトランザクションの更新データを自動で回復する。 具体的には,RDBMSはログを用いて,直前のチェックポイントから異常終了時までロールフォワードを行い,異常終了時点と同じデータベースの状態に回復する。その後,異常終了時に未完了だったトランザクションをロールバックする。その際,同じ行の更新順序を担保するために,ロールフォワードは,全てのトランザクションのログに対して,ログが出力されている順に逐次に実行される。トランザクション間の排他制御によって同じ行の同時更新がないことは担保されているので,ロールバックはトランザクションごとに並行して実行される。 6. ログなしモード ログなしモードとは,ログなしモードを指定されたテーブルの更新に対してログを出力しないモードである。テーブルごとにログなしモードを指定することができる。ログなしモードのテーブルを更新するAPで実行されるトランザクションは,ログを取得しないので,その分だけトランザクションの実行時間を短縮できる。ログなしモードのテーブルを更新するトランザクションには次の制約がある。 (1) ログなしモードのテーブルについて,トランザクション内で最初の更新時にテーブル全体に専有ロックを掛け,トランザクションがコミットされたときに専有ロックを解放する。 (2) ログなしモードのテーブルに専有ロックが掛けられている間は,チェックポイントを取得しない。手動でも取得できない。 (3) トランザクションがロールバックされたとき,ログなしモードのテーブルは使用不可になる。使用不可になったテーブルは,バックアップから復元するか,テーブルを削除して再度定義(以下,再定義という)する必要がある。 7. オンラインバックアップ・回復 データベースの稼働中に更新中のデータを含めて全表領域,全ログをRDBMSの稼働環境とは異なるストレージに複写してバックアップを取得する機能を備えている。 (1) 専用のコマンドを実行して,全表領域,全ログのバックアップを一定の多重度で別系のストレージに格納する。 (2) オンラインバックアップ取得開始後に発生したログは,ストレージに書き込まれると同時にそのログのバックアップが別系のストレージに格納される。 (3) メディア障害発生時には,ストレージ交換後,全表領域,全ログ,オンラインバックアップ取得後に発生したログのバックアップをストレージに復元し,異常終了後のRDBMS再開始と同様にロールフォワード及びロールバックによってデータを回復する。 8. ロックメモリ RDBMSがロックを掛けるときに排他制御のために使用するメモリ領域をロックメモリという。1行又は1テーブルにロックを掛けるごとにロックメモリにロック情報を登録し,そのロックを解放したらロック情報を削除する。ロックメモリは,同時にロックを掛ける行数,テーブル数から見積もって指定されたサイズで確保する。必要以上に大きなサイズで確保しようとするとメモリ領域が不足してRDBMSを開始できない。逆に,必要なサイズを確保していなければ,SQLの実行時にロックメモリの未使用領域がなくなり,ロックを掛けることができずにSQLがエラーとなる。 〔現行バッチ処理のバックアップ・リカバリ〕 1. バッチ処理のバックアップの取得スケジュール 車両保守システムでは,オンライン時間帯の終了後に次の要件でバックアップを取得している。バックアップの取得スケジュールを表5にまとめた。表5では,図2中の各契機でテーブル単位のバックアップを取得するテーブルに“○”印をつけている。 (1) 当日のオンライン処理のAPの実行結果を全て反映した状態に回復できること (2) 全てのバッチ処理のAP(以下,バッチAPという)の実行結果を反映した状態に回復できること (3) それぞれのバッチAPの実行中にメディア障害が発生した場合,速やかに対象テーブルを回復した後,バッチAPを再実行できること (4) 必要最小限のバックアップを取得すること (5) “点検抽出”,“車検抽出1”,“車検抽出2”の各APで更新する,“WK1”,“WK2”の各テーブルには,ログなしモードを指定すること (6) “WK1”,“WK2”の各テーブルは,ワークテーブルであり,バックアップの対象外とすること。これらのワークテーブルは,オンライン時間帯の終了後,バッチ処理を開始する前に再定義して使用する。 表5 バックアップの取得スケジュール(未完成) 2. サーバ障害時のRDBMS再開始 RDBMS再開始に備えて,バッチ処理中のチェックポイントに関する検証を行った。なお,T1~T6は図2中の各契機を示す。 (1) RDBMS再開始後の運用 “実施登録”APと“車検抽出2”APの実行中に,サーバ障害が発生した場合に,RDBMS再開始後にどのような対処が必要になるか,チェックポイントの取得状況に応じた対処を整理した。 契機T2でチェックポイントを取得している場合,“[a]”テーブルを[b]した後,“[c]”AP,“[d]”APを再実行する。また,“[e]”APも再実行する。その後,契機T3以降のバッチ処理を継続する。 契機T2でチェックポイントを取得していない場合,チェックポイントを取得している場合の対処を行う前に,“[f]”テーブルを[b]した後,“[g]”APを再実行しておく必要がある。 (2) RDBMS再開始に要する時間 契機T3でチェックポイントを取得後,契機T5からT6の間でサーバ障害が発生して再開始する状況を想定する。契機T3の後,サーバ障害が発生するまでの間にチェックポイントは取得していないものとする。追加・更新1行当たりロールフォワードに2ミリ秒,ロールバックに1ミリ秒を要するものと仮定して,RDBMS再開始のときにデータベースの回復に要する時間を見積もった。 最も時間が掛からないケースは,バッチAPでの更新が発生する直前にサーバ障害が発生した場合で,トランザクションのロールフォワードが必要なAPは[h],ロールバックが必要なAPは[i],回復に要する時間は[j]秒となる。最も時間が掛かる,理論上の最悪のケースは,更新処理のある全てのバッチAPがコミットする直前にサーバ障害が発生した場合で,トランザクションのロールフォワードが必要なAPは[k],ロールバックが必要なAPは[l],回復に要する時間は[m]秒となる。 〔バッチ処理のオンライン時間帯への移行〕 図2中のバッチ処理の実行順序(先行・後続の関係)を変更せずに,表3の全APをオンライン時間帯に移行するに当たって,APに必要な変更を検討した。 1. 移行後に発生する問題 表2,3中のAPを変更せずに,表3中の全処理をオンライン時間帯に移行すると仮定した場合,発生し得る問題を表6にまとめ,その対処を検討した。表6では,どのAPもISOLATIONレベルをREAD COMMITTEDとしてトランザクションを実行することを前提としている。 表6 発生し得る問題 2. 問題への対処 表6の問題に対処して,表2,3中のいずれかのAPを変更する。 (1) 問題1 この問題は,“報告作成”APが“【ア】”テーブルの更新対象行に対する【イ】を処理終了まで保持し,“契約登録”APがその解放を待つことで発生する。問題への対処として“報告作成”APを変更する。 (2) 問題2 “予約登録”AP,“進捗更新”APの処理内容を図3,4に示す。図3,4では特に断りのない限り,行の読込みには共有ロックが掛かるものとする。 この問題は,“予約登録”APが点検の出庫予約の受付中に,“進捗更新”APで同じ受託の“予定表”テーブルの現手配#を5(実施完了予定確認)から【ウ】に変更し,その後で“予約登録”APが同じ現手配#を【エ】に変更することで発生する。手配#の順序の制約及びISOLATIONレベルを変えずに問題に対処するために,一つのAPを変更することにした。 受け付けた1回の入庫又は出庫の予約について,契約#,受託#を指定して,次を行う。 ① “受託”テーブルの行を,専有ロックを掛けて読み込む。 ② “予定表”テーブルから対象行を読み込む。 ③ “進捗”テーブルに行を追加する。 ④ “予定表”テーブルの行の現手配#が“進捗”テーブルの手配#よりも小さい番号であれば,⑤に進み,それ以外の場合は⑥に進む。 ⑤ “予定表”テーブルの行の現手配#に手配#と同じ値を設定して更新する。 ⑥ コミットを発行する。 図3 “予約登録”APの処理内容 “実施結果”テーブルから報告YMDが当日に等しい行を読み込み,行ごとに次を行う。 ① “進捗”テーブルに,完了確認の手配#に対応する行を追加する。 ② “予定表”テーブルの該当行の現手配#に完了確認の手配#を設定して更新する。 ③ 保守区分が車検で,“進捗”テーブルの手配#が完了確認の場合は,“車両”テーブルの車検満了YMDを次回の車検満了日に更新する。 ④ “記録簿”テーブルに行を追加する。 ⑤ コミットを発行する。 図4 “進捗更新”APの処理内容 (3) 問題3 処理時間の短縮を図るため,“点検率更新”APを同じ報告YMDの中で重複していないソート連番の範囲を指定することで,ジョブを多重処理できるように変更した。“点検率更新”APの処理内容を図5に示す。 ① 報告YMD,開始連番,終了連番を引数で受け取る。 ② “実施結果”テーブルから指定された引数に報告YMDが一致し,開始連番から終了連番までの間の行をソート連番順に読み込む。 ③ 読み込んだ行ごとに,契約#が一致する“点検率”テーブルの行を読み込み,実績点数に点数を加えて更新する。 ④ ②,③を繰り返し,結果行を全て処理したら,最後に一度だけコミットを発行する。 図5 “点検率更新”APの処理内容 図5の処理内容変更案をレビューしたところ,APの多重処理によって,デッドロックが発生するおそれがあるとの指摘を受けた。デッドロックの発生を防ぐために,次の二つの案を検討した。 案1 図5中の処理内容を修正する。 案2 表3中の“点検率更新”AP以外のAPを一つ変更する。 〔移行後の運用設計〕 1. メディア障害への対策 メディア障害への対策として,オンライン時間帯に何回かのオンラインバックアップを取得し,オンライン時間帯終了後にRDBMSを停止してデータベース全体のオフラインバックアップを取得することにした。オンライン時間帯にメディア障害が発生した場合のリカバリでは,ログを用いて回復に要する時間がリカバリ時間の多くを占めるので,回復に要する時間を見積もり,オンラインバックアップの取得頻度を求めた。 (1) 見積りの前提 ① 表2,3の1日の処理行数の合計がログ量に等しいと仮定する。1日のログ量は,処理行数を合計して,追加に190、000行,更新に100、000行になる。 ② 全テーブルの1ページ当たりの平均行数を20行,1ページ当たりのストレージへのI/O時間を10ミリ秒とし,ストレージへのI/O以外のCPU処理,索引探索,ネットワーク通信などに掛かる時間を考慮しないものとする。 ③ ログによる回復では,追加については,ページ中の行数が平均行数を超えるまではバッファ内で処理し,更新については,バッファヒット率を0%として試算する。 (2) 見積りの結果 1日の全てのログによる回復時間は,追加では,【オ】ページのI/Oが発生するので【カ】秒,更新では,【キ】ページのI/Oが発生するので【ク】秒を要する。ログ量が均等になるタイミングでオンラインバックアップを取得し,ログによる回復時間を5分以内にするためには,1日に【ケ】回のオンラインバックアップを取得すればよい。 2. バッチAPの運用変更 ログなしモードのテーブルを対象に実行していた“点検抽出”,“車検抽出1”,“車検抽出2”の各APをオンライン時間帯に移行する影響について検証した。ログなしモードのテーブルを更新するAPをオンラインで実行すると,開始から完了までの間,チェックポイントが取得されない。この間にサーバ障害が発生すると,RDBMS再開始のとき,【コ】が大量に行われるおそれがあり,回復に要する時間が長期化するという問題がある。 そのため,ログなしモードの指定を取りやめることにした。ただし,APの処理内容は変更しない。また,“WK1”,“WK2”の各テーブルは,バックアップ対象外のままとする。この場合,運用の変更に当たって,次の2点のリソースの見直しが必要となる。 (1) “WK1”テーブルと“WK2”テーブルのログが新たに出力されるので,ログの格納領域が不足しないよう見直す。 (2) “WK1”テーブルと“WK2”テーブルの【サ】ので【シ】が不足しないよう見直す。 設問1 〔現行バッチ処理のバックアップ・リカバリ〕について答えよ。 (1) 表5中の太枠部分内に,“○”を記入して表を完成させよ。ただし,太枠部分以外のバックアップを取得する契機には全て“○”を記入済みである。なお,バックアップを取得しないテーブルとその契機は,空欄のままとすること。 (2) “2. サーバ障害時のRDBMS再開始”について答えよ。 (a) 本文中の[a]~[g]に入れる適切な字句を答えよ。 (b) 本文中の[h],[i]に入れる適切なAP名を全て答えよ。ここで,対象となるAPがない場合,“なし”とすること。また,[j]に入れる適切な秒数を答えよ。 (c) 本文中の[k],[l]に入れる適切なAP名を全て答えよ。ここで,対象となるAPがない場合,“なし”とすること。また,[m]に入れる適切な秒数を答えよ。 設問2 〔バッチ処理のオンライン時間帯への移行〕について答えよ。 (1) 問題1への対処について答えよ。 (a) 本文中の【ア】,【イ】に入れる適切な字句を答えよ。 (b) “報告作成”APの変更内容を40字以内で具体的に答えよ。 (c) (b)の変更を行った場合,AP障害の発生後に行う再処理において,“報告”テーブルに,追加済みの行と報告内容が同一の行の追加は発生するか。発生の有無を判断し,答案用紙の“有”又は“無”のどちらかを○で囲み,判断の根拠を40字以内で具体的に答えよ。 (2) 問題2への対処について答えよ。 (a) 本文中の【ウ】,【エ】に入れる適切な手配#を答えよ。 (b) 変更するAP名を答えよ。 (c) (b)で解答したAPの変更内容を35字以内で具体的に答えよ。 (3) 問題3への対処について答えよ。 (a) レビューで指摘を受けたデッドロックは,どのような状況で発生するか。30字以内で具体的に答えよ。 (b) 案1について,図5の処理内容の修正内容を20字以内で具体的に答えよ。ただし,コミットの発行頻度は変更しないものとする。 (c) 案2について,変更するAP名を答えよ。また,変更内容を30字以内で具体的に答えよ。 設問3 〔移行後の運用設計〕について答えよ。 (1) 本文中の【オ】~【ケ】に入れる適切な数値を答えよ。 (2) 本文中の【コ】,【シ】に入れる適切な字句を答えよ。また,【サ】に入れる適切な文を20字以内で答えよ。
図1 車両保守システムのテーブル構造(一部省略)。顧客,委託先,契約,受託,車両,予定表,進捗,実施結果,点検率,報告,記録簿のテーブルと属性を示す。属性の下線と,番号・コード・年月日・タイムスタンプの略記に関する注記がある。
図1 車両保守システムのテーブル構造(一部省略)。顧客,委託先,契約,受託,車両,予定表,進捗,実施結果,点検率,報告,記録簿のテーブルと属性を示す。属性の下線と,番号・コード・年月日・タイムスタンプの略記に関する注記がある。
表1 主な列の意味・制約。列名と意味・制約を対応させた表。契約と受託の識別,保守区分,手配番号と現手配番号,実施結果のソート連番と実施項目番号,車両ごとの記録番号の付与方法を説明する。
表1 主な列の意味・制約。列名と意味・制約を対応させた表。契約と受託の識別,保守区分,手配番号と現手配番号,実施結果のソート連番と実施項目番号,車両ごとの記録番号の付与方法を説明する。
表2 オンライン処理の概要及び1日の処理行数。契約登録,車両登録,車両照会,書類発行,予約登録の五つのオンラインAPについて,処理内容と1日の追加・更新行数を示す。処理行数は追加と更新の二列に分かれている。
表2 オンライン処理の概要及び1日の処理行数。契約登録,車両登録,車両照会,書類発行,予約登録の五つのオンラインAPについて,処理内容と1日の追加・更新行数を示す。処理行数は追加と更新の二列に分かれている。
表3 バッチ処理の概要及び1日の処理行数。実施登録から点検率更新まで九つのバッチAPについて,処理内容と1日の追加・更新行数を示す。各APは特に断りがなければ最後に一度だけコミットするとの注記がある。
表3 バッチ処理の概要及び1日の処理行数。実施登録から点検率更新まで九つのバッチAPについて,処理内容と1日の追加・更新行数を示す。各APは特に断りがなければ最後に一度だけコミットするとの注記がある。
図2 バッチ処理の実行スケジュール。当日のオンライン時間帯終了から翌日の開始までに,T1~T6の契機と各バッチAPを配置した図。実施登録,抽出処理,予定表作成,進捗更新などの先行・後続関係を矢線で示す。
図2 バッチ処理の実行スケジュール。当日のオンライン時間帯終了から翌日の開始までに,T1~T6の契機と各バッチAPを配置した図。実施登録,抽出処理,予定表作成,進捗更新などの先行・後続関係を矢線で示す。
表4 主なAPのCRUD。オンライン処理とバッチ処理の各APを行,業務テーブル及びWK1・WK2を列として,追加・参照・更新の関係を示すCRUD表。Cは追加,Rは参照,Uは更新との注記がある。
表4 主なAPのCRUD。オンライン処理とバッチ処理の各APを行,業務テーブル及びWK1・WK2を列として,追加・参照・更新の関係を示すCRUD表。Cは追加,Rは参照,Uは更新との注記がある。
表5 バックアップの取得スケジュール(未完成)。T1~T6を行,顧客から記録簿まで十一のテーブルを列とするバックアップ取得表。T3~T5の一部に○が記入され,T1とT6の回答対象部分は太枠で囲まれている。
表5 バックアップの取得スケジュール(未完成)。T1~T6を行,顧客から記録簿まで十一のテーブルを列とするバックアップ取得表。T3~T5の一部に○が記入され,T1とT6の回答対象部分は太枠で囲まれている。
表6 発生し得る問題。バッチ処理をオンライン時間帯へ移行した場合の三つの問題を示す。契約登録の応答遅延,予定表の現手配番号の不正,点検率更新がオンライン終了時刻までに完了しない問題がある。
表6 発生し得る問題。バッチ処理をオンライン時間帯へ移行した場合の三つの問題を示す。契約登録の応答遅延,予定表の現手配番号の不正,点検率更新がオンライン終了時刻までに完了しない問題がある。
図3 “予約登録”APの処理内容。入庫又は出庫の予約1回に対する六つの処理を示す。受託行の専有ロック,予定表の読込み,進捗の追加,手配番号の比較,現手配番号の更新,コミットの順で構成される。
図3 “予約登録”APの処理内容。入庫又は出庫の予約1回に対する六つの処理を示す。受託行の専有ロック,予定表の読込み,進捗の追加,手配番号の比較,現手配番号の更新,コミットの順で構成される。
図4 “進捗更新”APの処理内容。当日の実施結果を行ごとに処理する五つの手順を示す。完了確認の進捗追加,予定表の現手配番号更新,車検満了日の更新,記録簿への追加,コミットを実行する。
図4 “進捗更新”APの処理内容。当日の実施結果を行ごとに処理する五つの手順を示す。完了確認の進捗追加,予定表の現手配番号更新,車検満了日の更新,記録簿への追加,コミットを実行する。
図5 “点検率更新”APの処理内容。報告年月日と開始・終了連番を受け取り,指定範囲の実施結果をソート連番順に読み込み,契約番号が一致する点検率の実績点数を加算し,全結果行の処理後に一度だけコミットする。
図5 “点検率更新”APの処理内容。報告年月日と開始・終了連番を受け取り,指定範囲の実施結果をソート連番順に読み込み,契約番号が一致する点検率の実績点数を加算し,全結果行の処理後に一度だけコミットする。
解き方のヒントを見る

検討する対象範囲をそろえて考える

この分野を学ぶ際は、検討の対象がどこまで含まれているかという一点に注目しましょう。異なる範囲の話を混ぜず、与えられた情報から対象の境界を整理すると、理解の前提をそろえやすくなります。

この問題で問われていること

扱っている内容の対象範囲を、与えられた情報に沿って確かめてみましょう。全体について述べていることと、その一部に限って述べていることを区別し、同じ範囲を前提に考えているかを確認するのが手掛かりです。

視点

対象範囲とは、いま考えている内容が及ぶ範囲のことです。ある範囲についての記述を、根拠なく別の範囲へ広げて受け取っていないかを意識しましょう。

確認ポイント

  • 検討の対象として示されている範囲を押さえたか
  • 対象の全体と一部を混同していないか
  • 読み取った内容を、示された範囲を超えて広げていないか
正解と解説を見る

解説

夜間バッチをオンライン時間帯へ移す際には、処理順序を維持するだけでなく、ロックによる待ち、更新の上書き、デッドロック、障害回復時間への対処が必要です。本問では、指定された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による補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針