データベーススペシャリスト 2022年 午後1 問02
データベースの実装に関する次の記述を読んで、設問に答えよ。
専門商社のB社では、見積業務で利用するシステム (以下、見積システムという)の、マスター保守に伴う調査業務を改善中である。 また、見積システムのパブリッククラウドへの移行を計画している。
〔パブリッククラウドが提供するサービスの主な仕様〕
1.オブジェクトストレージ
オブジェクトストレージには、任意のファイルを保存することができる。 RDBMSとは独立して稼働し、RDBMSの障害時にも影響を受けずに、ファイルにアクセスすることができる。
2.RDBMS
PaaSとして提供されるRDBMSは、インスタンスごとに割り当てられた仮想マシンで稼働する。
(1) ログ
ログはログファイルに記録する。 ログファイルの切替え時に、切替え前に使用していたログファイル(以下、アーカイブログという)を、オブジェクトストレージに保存する。 ログ切替えの時間間隔は、任意に設定することができる。
(2) バックアップ
① データベース全体のフルバックアップを、オブジェクトストレージに保存する。 バックアップは、データベースを停止して、オフラインで取得する。バックアップを取るタイミングは、任意に設定することができる。
② オブジェクトストレージに保存したフルバックアップとアーカイブログを使って、データベースを回復することができる。
(3) レプリケーション
ログを使って、RDBMSのデータをほかのRDBMSに複製する。 複製元のテーブルに対する変更操作 (挿入・更新・削除)を複製先のテーブルに自動的に反映する。
レプリケーションには、同期型と非同期型がある。
① 同期型では、複製先でログをディスクに出力した後、複製元のトランザクションがコミットされる。
② 非同期型では、複製先へのログの到達を待たずに、複製元のトランザクションがコミットされる。
(4) トリガー
テーブルに対する変更操作 (挿入・更新・削除)を契機に、あらかじめ定義した処理を実行する。
① 実行タイミングを定義することができる。 BEFOREトリガーは、テーブルに対する変更操作の前に実行され、更新中又は挿入中の値を実際の反映前に修正することができる。 AFTERトリガーは、変更操作の後に実行され、ほかのテーブルに対する変更操作を行うことができる。
② トリガーを実行する契機となった変更操作を行う前と後の行を参照することができる。 参照するには、操作前と操作後の行に対する相関名をそれぞれ定義し、相関名で列名を修飾する。
〔見積システムの概要〕
1.テーブル
主なテーブルのテーブル構造を図1に示す。

2.仕入先への見積依頼業務
(1) B社の社員は、顧客からの引き合いを受けて、仕入先への見積依頼を入力する。
見積依頼番号を採番し、“見積依頼”、“見積依頼明細” テーブルに見積依頼の内容を登録する。
(2) 仕入先に見積りを依頼し、回答を受け取る。
(3) 仕入先からの回答を入力する。 対応する見積依頼の見積依頼番号を参照し、“見積回答”、“見積回答明細” テーブルに見積回答の内容を登録する。 商品のモデル名、定価が変更されたことが分かることがある。 この場合、当該商品は、“見積回答明細” テーブルに変更後の内容を登録する。 ただし、“商品” テーブルへの反映は後日行う。
〔“商品”テーブルの履歴管理〕
モデル名又は定価のいずれかが変更されたが、変更が “商品” テーブルへ反映されていない商品を調べるため、図2に示すSQL文を定期的に実行している。
1.“商品” テーブルの設計変更
“商品” テーブルを更新すると、過去の属性情報は失われてしまう。そこで、商品属性情報の変更を履歴として保存するために、“商品” テーブルの設計変更を行うことにした。 ただし、既存のアプリケーションプログラムには、極力影響を与えないようにする必要がある。 表1に示す2案を検討した結果、案2を採用した。
案2の実装に当たり、“商品” テーブルへの列の追加、“商品履歴” テーブルの作成、及び主キーの追加を表2のSQL1に示すSQL文で行った。
また、同一の適用開始日に同一の商品を複数回更新することはない前提で、“商品”テーブルの更新時に行う追加の処理を、表2のSQL2に示すトリガーで実装した。
2.データ移行
“見積回答”、“見積回答明細” テーブルから “商品”、“商品履歴” テーブルへデータを移行するため、商品のモデル名又は定価のいずれかが変更されたことの履歴を図3のSQL文で調べた。 “見積回答”、“見積回答明細” テーブルの内容を表3, 表4に示す。 SQL文の結果を表5に示す。
表5の内容を基に、“商品” テーブルを更新、又は “商品履歴” テーブルへ挿入することでデータを移行した。移行前の“商品” テーブルの状態によらず、変更があった全商品を更新した。 また、表2のSQL2に示すトリガーは未定義の状態で行った。



〔基盤設計〕
1.RPO, RTOの見積り
見積システムをパブリッククラウドに移行した場合の、RDBMSのディスク障害時のRPO及びRTOを、次のように見積もった。
(1) 利用するパブリッククラウドの仕様に基づいて、データベースのフルバックアップは1日に1回取得し、ログの切替えは5分に1回行い、回復時にはオブジェクトストレージに保存したフルバックアップとアーカイブログを使って回復する、という前提で見積もる。
(2) RPOは、障害発生時に失われる(ア)に依存するので、最大(イ)分とみなせる。
(3) RTOのうち、データベースの回復に掛かる時間は、フルバックアップからのリストア時間と、ログを適用するのに掛かる時間の合計である。
(4) フルバックアップからのリストア時間は、データベース容量が180Gバイト、リストア時のディスク転送速度を100Mバイト/秒と仮定すると(ウ)秒である。ここで,1Gバイトは10^9バイト、1Mバイトは10^6バイトとする。
(5) ログを適用する期間が最大になるのは、フルバックアップ取得後の経過時間が最大になる24時間である。 ログが毎秒10ページ出力されると仮定すると、適用するログの量は最大(エ)ページである。 ログを適用するのに掛かる時間は、バッファヒット率を0%、同期入出力時間がページ当たり2ミリ秒と仮定すると最大(オ)秒である。
2.参照専用インスタンス
商品の変更履歴を調べるために実行するSQL文の負荷が大きく、見積システムへの影響が懸念された。 そこで、影響を最小化するために、参照専用インスタンスを本番インスタンスとは別に作成し、調査は参照専用インスタンスで行うことにした。 また、全テーブルについて、本番インスタンスから参照専用インスタンスへ非同期型のレプリケーションを行うことにした。
3.参照専用インスタンスへのフェイルオーバーによる業務継続
RPO及びRTOを短くするために、本番インスタンスが障害になった場合、参照専用インスタンスにフェイルオーバーして、参照専用インスタンスを使用して業務を継続できるかを検討した。 検討の結果、非同期型のレプリケーションを行う前提だと、参照専用インスタンスでは、本番インスタンスでコミット済みの変更が失われる可能性があることが分かった。
設問1:〔“商品” テーブルの履歴管理〕 について答えよ。
問題文を見る(1)図2中の(a)、(b)に入れる適切な字句を答えよ。
模範解答
a:商品コード
b:OR
解説
解答の論理構成
-
結合条件を確認
- 【問題文】図2 INNER JOIN 商品 C ON A.(a) = C.(a) は “見積回答明細” と “商品” の同一商品を結合する句です。
- 両テーブルで共通する列は 商品コード、モデル名、定価 などがありますが、商品を一意に特定できる列は 商品コード だけです。
- よって (a) は 商品コード となります。
-
変更判定ロジックを確認
-
WHERE 句には( A.モデル名 <> C.モデル名 (b) A.定価 <> C.定価 )があり、業務説明に「モデル名又は定価のいずれかが変更されたことが分かる」
とあるため、2条件の論理結合は “または” を表す OR となります。 -
したがって (b) は OR です。
-
-
まとめ
- (a) 商品コード
- (b) OR
誤りやすいポイント
- モデル名や定価をキーに選んでしまい多重一致エラーになる。
- AND を使うと「モデル名も定価も両方変わった場合のみ検出」になり要件を満たさない。
- OR に括弧がない場合の優先順位を誤解して意図しない絞り込みになる。
FAQ
Q: AND と OR の優先順位は?
A: SQLでは AND が OR より高いので、本問のように括弧でまとめていれば確実に意図どおり評価されます。
A: SQLでは AND が OR より高いので、本問のように括弧でまとめていれば確実に意図どおり評価されます。
Q: “モデル名” だけ変わったケースも正しく検出できますか?
A: はい。OR で結合しているため、モデル名 が異なるか 定価 が異なるか、どちらかが合致すれば抽出されます。
A: はい。OR で結合しているため、モデル名 が異なるか 定価 が異なるか、どちらかが合致すれば抽出されます。
Q: “商品コード” にNULLが入る可能性は?
A: 主キー列なのでNULLは入りません。NULLがあり得る列を結合条件にすると行が欠落する恐れがあります。
A: 主キー列なのでNULLは入りません。NULLがあり得る列を結合条件にすると行が欠落する恐れがあります。
関連キーワード: 内部結合、論理演算子、履歴管理、WHERE句、プライマリキー
設問1:〔“商品” テーブルの履歴管理〕 について答えよ。
問題文を見る(2)“商品”テーブルの設計変更について、表1中の案1を採用した場合、ほかのどのテーブルの、どの制約を変更する必要があるか。 テーブル名と制約を全て答えよ。
模範解答
テーブル名:見積依頼明細、見積回答明細
制約:外部キー制約
解説
解答の導き方
結論:
テーブル名:見積依頼明細、見積回答明細
制約:外部キー制約
制約:外部キー制約
導出の手順を段階的に示します。
-
案1の定義から出発します。表1の案1は「商品(商品コード、メーカー名、商品名、モデル名、定価、更新日、適用開始日、適用終了日)」としています。これは商品の履歴を同一テーブル内で「適用開始日/適用終了日」によって管理する設計であることを意味します。
-
同一テーブルで履歴を持つ設計だと、同一の「商品コード」に対して複数行(異なる適用開始日を持つ行)が存在することになります。したがって、行を一意に識別するために主キーは単独の「商品コード」では不十分で、通常は「商品コード」と「適用開始日」などを組み合わせた複合主キーにする必要があります。設問中にある「同一の適用開始日に同一の商品を複数回更新することはない前提」という記述は、適用開始日がバージョン識別に使えることを示しています。
-
リレーショナルDBの制約仕様として、外部キーは参照先テーブルの候補キー(通常は主キー)を参照する必要があります。参照先の主キーが「商品コード」単独から複合主キーへ変更されれば、既に商品を参照している外部キー定義は整合しなくなります。
-
図1を見ると、明細側のテーブルである「見積依頼明細」と「見積回答明細」に「商品コード」列が存在します(それぞれが明細テーブルで商品を参照する形になっていると解釈できます)。したがって、これらのテーブルに定義された外部キー制約が、参照先の主キー構成の変更に合わせて修正される必要があります。
-
以上より、問われている「ほかのどのテーブルの、どの制約を変更する必要があるか」は次のとおり確定できます。
テーブル名:見積依頼明細、見積回答明細
制約:外部キー制約
(補足:修正の具体例としては、見積依頼明細/見積回答明細に適用開始日列を追加して外部キーを(商品コード, 適用開始日)に合わせる方法、あるいは商品側に商品コードのみを一意に保つ代替キーを用意して明細側の外部キーを変更しないようにする方法などがあります。問題は「どの制約を変更するか」を問うているため、対象テーブルと制約種別の指定が解答になります。)
誤りやすいポイント
-
見積回答明細だけを挙げてしまう
図1では見積依頼明細にも「商品コード」列があるため、両方とも商品を参照する可能性が高く、どちらも対象になります。 -
「商品履歴」や「商品」自身の別の制約(例:索引のみ)を答えてしまう
案1は履歴を同一の「商品」テーブルで管理する案なので、別途の「商品履歴」テーブルは案1の構成には含まれません。問われているのは参照側の制約です。 -
外部キーではなく単にインデックスや主キーだけを変更すればよいと考える
参照整合性の観点からは、参照元(明細)側の外部キー定義を参照先の主キー構成に合わせて更新する必要があります。単に索引を張るだけでは参照整合性は保てません。 -
問題文に明示的に「外部キー」と書かれていないため変更不要と判断する
図1の列構成から「見積依頼明細/見積回答明細が商品コードで商品を参照する」ことは設計上の通常の解釈であり、その前提で制約変更が問われています。
FAQ
Q: 図1に外部キー制約の明記がないのに、外部キー制約の変更と断定してよいですか?
A: 図1に示されている「見積依頼明細」「見積回答明細」が「商品コード」列を持っている点と、明細テーブルが通常マスター(商品)を参照する関係であるというデータベース設計の常識に基づき、外部キー(参照整合性)を前提に考えるのが適切です。設問はその前提での影響を問うています。
A: 図1に示されている「見積依頼明細」「見積回答明細」が「商品コード」列を持っている点と、明細テーブルが通常マスター(商品)を参照する関係であるというデータベース設計の常識に基づき、外部キー(参照整合性)を前提に考えるのが適切です。設問はその前提での影響を問うています。
Q: 外部キー制約を変える以外に対応方法はありますか?
A: はい。具体例として、参照元に「適用開始日」を追加して外部キーを(商品コード, 適用開始日)にする方法、または商品側に商品コード単独で参照可能な一意キー(代替キー)を用意して既存の外部キーを変えない方法などがあります。ただし本設問は「どのテーブルのどの制約を変更するか」を問うており、対象は見積依頼明細/見積回答明細の外部キー制約です。
A: はい。具体例として、参照元に「適用開始日」を追加して外部キーを(商品コード, 適用開始日)にする方法、または商品側に商品コード単独で参照可能な一意キー(代替キー)を用意して既存の外部キーを変えない方法などがあります。ただし本設問は「どのテーブルのどの制約を変更するか」を問うており、対象は見積依頼明細/見積回答明細の外部キー制約です。
Q: 案2を採用した場合はどう違いますか?
A: 案2では「商品履歴」テーブルを別途作成するため、商品テーブル自体がバージョン化されず商品コードを主キーのまま維持できる設計にできます。その場合は明細側の外部キーを変更する必要は生じにくく、案1と比べて明細側の制約変更対象は変わります。
A: 案2では「商品履歴」テーブルを別途作成するため、商品テーブル自体がバージョン化されず商品コードを主キーのまま維持できる設計にできます。その場合は明細側の外部キーを変更する必要は生じにくく、案1と比べて明細側の制約変更対象は変わります。
関連キーワード: 複合主キー、外部キー制約、参照整合性、履歴管理、適用期間属性
設問1:〔“商品” テーブルの履歴管理〕 について答えよ。
問題文を見る(3)表2中の(c)〜(h)に入れる適切な字句を答えよ。(c, dは順不同)
模範解答
c:商品コード
d:適用開始日
e:BEFORE
f:AFTER
g:OLD2
h:NEW2
解説
解答の論理構成
-
主キー列 (c)、(d)
- 【問題文】「“商品履歴”テーブルの主キーは表示していない。」
- 履歴で同一「商品コード」が複数行持てるようにしつつ一意制約を保つには期間開始列が必須。よって
ALTER TABLE 商品履歴 ADD PRIMARY KEY( (c), (d) );
→ (c)=「商品コード」、(d)=「適用開始日」。
-
トリガー1の実行タイミング (e)
- 【問題文】「適用開始日がNULLの場合、現在日付に更新する。」は更新前にNEW行を書き換える処理。
- 【パブリッククラウド仕様】「BEFOREトリガーは、… 更新中又は挿入中の値を実際の反映前に修正することができる。」
- よって (e)=「BEFORE」。
-
トリガー2の実行タイミング (f)
- 【問題文】「対象行の更新前の行を“商品履歴”テーブルに挿入する。」は変更が確定した後に履歴表へ書き込む。
- 【パブリッククラウド仕様】「AFTERトリガーは、変更操作の後に実行され、ほかのテーブルに対する変更操作を行うことができる。」
- よって (f)=「AFTER」。
-
挿入値 (g) と期間終了日計算 (h)
- INSERT 文中
VALUES ( OLD2.商品コード, …, (g), ADD_DAYS( (h).適用開始日, -1) ) - 挿入する行は“更新前の行”なので (g)=「OLD2」。
- 適用終了日は“更新後の行”の開始日前日なので (h)=「NEW2」。
- INSERT 文中
誤りやすいポイント
- 「BEFOREはデータ修正不可」と思い込みAFTERを選ぶミス。BEFOREでもNEW行は書き換え可能。
- 主キーに「適用終了日」も含めてしまい、一意制約違反の危険を見逃す。
- (g)(h) を逆にし、履歴の期間計算が未来日にずれる。
FAQ
Q: なぜ「適用終了日」を主キーに含めないのですか?
A: 同一商品の履歴行は「適用開始日」が一意であるという前提(“同一の適用開始日に同一の商品を複数回更新することはない”)が【問題文】に明示されており、終了日はNULLになり得るため主キーには不適切です。
A: 同一商品の履歴行は「適用開始日」が一意であるという前提(“同一の適用開始日に同一の商品を複数回更新することはない”)が【問題文】に明示されており、終了日はNULLになり得るため主キーには不適切です。
Q: BEFOREトリガーでNEW行を書き換えると更新内容は反映されますか?
A: はい。BEFOREトリガー内でNEW行を変更すると、その値で本体テーブルが更新されます。
A: はい。BEFOREトリガー内でNEW行を変更すると、その値で本体テーブルが更新されます。
Q: AFTER トリガーで別テーブルへ INSERT すると更新性能に影響しますか?
A: 変更トランザクション内で追加I/Oが発生するため若干オーバーヘッドがあります。ただしBEFOREでは対象行が確定していないので履歴挿入にはAFTERが適切です。
A: 変更トランザクション内で追加I/Oが発生するため若干オーバーヘッドがあります。ただしBEFOREでは対象行が確定していないので履歴挿入にはAFTERが適切です。
関連キーワード: トリガー、主キー、履歴テーブル、BEFORE/AFTER, 相関名
設問1:〔“商品” テーブルの履歴管理〕 について答えよ。
問題文を見る(4)表5中の(i)〜(k)に入れる適切な字句を答えよ。
模範解答
i:2022-08-31
j:2022-09-01
k:NULL
解説
解答の論理構成
-
変更履歴抽出SQLの該当部分
sql ADD_DAYS( LEAD(Q2.見積回答日) OVER (PARTITION BY Q2.商品コード ORDER BY Q2.見積回答日), -1 ) AS 適用終了日ここで
• LEADは「現在行の1行後」の 見積回答日 を返す。
• PARTITION BY Q2.商品コード により商品コード単位の連続行が対象。
• ADD_DAYS(…、-1) により “次回変更日の前日” が計算される。 -
商品コード “1” の時系列
- “2019-04-01” → 旧モデル “M1”
- “2020-09-01” → 新モデル “M1-1”
- “2022-09-01” → 新モデル “M1-2”
-
適用終了日の決定
(i) 行(開始日 “2020-09-01”)のLEADは “2022-09-01”。
よって (i) = “2022-08-31”。 -
適用開始日 (j)
行番号3はQ2.見積回答日 そのままなので (j) = “2022-09-01”。 -
適用終了日 (k)
行番号3に対してLEADが返す値はないためADD_DAYS(NULL,-1) となり結果は “NULL”。よって (k) = “NULL”。
誤りやすいポイント
- 「1日前」を1日加算と勘違いして “2022-09-02” としてしまう。
- PARTITION BY を見落とし、全商品の次行を参照して不正な日付を入れてしまう。
- 最終行のLEADがNULLになる仕様を忘れ、日付を記載してしまう。
FAQ
Q: ADD_DAYSにNULLが渡るとどうなるのですか?
A: 【問題文】注記1にあるとおり「引数1がNULLの場合はNULLを返す」ため、(k) には “NULL” が入ります。
A: 【問題文】注記1にあるとおり「引数1がNULLの場合はNULLを返す」ため、(k) には “NULL” が入ります。
Q: 行番号は解答に影響しますか?
A: いいえ。ROW_NUMBER() は結果を一意に並べるためだけの列で、(i)〜(k) の値には影響しません。
A: いいえ。ROW_NUMBER() は結果を一意に並べるためだけの列で、(i)〜(k) の値には影響しません。
Q: LAG/LEADのウィンドウ区画はなぜ必要ですか?
A: 「商品コード」単位で履歴を追跡するためです。PARTITION BY Q2.商品コード がないと他商品と混在し誤った変更履歴になります。
A: 「商品コード」単位で履歴を追跡するためです。PARTITION BY Q2.商品コード がないと他商品と混在し誤った変更履歴になります。
関連キーワード: ウィンドウ関数、LEAD, LAG, ADD_DAYS, 履歴管理
設問1:〔“商品” テーブルの履歴管理〕 について答えよ。
問題文を見る(5)表5のうち、“商品” テーブルへの更新行、“商品履歴”テーブルへの挿入行に当たる行を、それぞれ行番号で全て答えよ。
模範解答
商品:3, 5, 6
商品履歴:1, 2, 4
解説
解答の論理構成
-
仕様確認
- 【問題文】「表5の内容を基に、“商品” テーブルを更新、又は “商品履歴” テーブルへ挿入することでデータを移行した。」
- 【問題文】「移行前の“商品” テーブルの状態によらず、変更があった全商品を更新した。」
したがって“商品”テーブルには各商品コードの最新版のみを反映する。
-
トリガー無効の影響
- 【問題文】「表2のSQL2に示すトリガーは未定義の状態で行った。」
よって更新前の行は自動で“商品履歴”へ入らない。手動で表5の行を振り分ける必要がある。
- 【問題文】「表2のSQL2に示すトリガーは未定義の状態で行った。」
-
表5の分析「適用開始日」が最大の行が更新対象、それ以外は履歴対象になる。
-
結論
- “商品”テーブル更新行:3,5,6
- “商品履歴”テーブル挿入行:1,2,4
誤りやすいポイント
- 「最新行は更新、残りは履歴」という原則を忘れ、全行を履歴に回してしまう。
- トリガーが未定義であることを見落とし、「自動で履歴が残る」と誤解する。
- “適用開始日”と“適用終了日”の両方を見て判定しようとし、NULLの扱いで混乱する。
FAQ
Q: “適用終了日”がNULLの行は必ず“商品”テーブルに入れるのですか?
A: いいえ。NULLは「まだ終了していない」ことを示すだけなので、同一商品の将来行があれば過去行でもNULLになり得ます。最新版かどうかは“適用開始日”の最大値で判定します。
A: いいえ。NULLは「まだ終了していない」ことを示すだけなので、同一商品の将来行があれば過去行でもNULLになり得ます。最新版かどうかは“適用開始日”の最大値で判定します。
Q: 商品コード3は変更履歴がないのに更新対象になるのはなぜ?
A: 「変更があった全商品を更新した」とあり、変更の有無にかかわらず最新状態を確実に反映するため、単独行でも“商品”テーブルに更新する必要があります。
A: 「変更があった全商品を更新した」とあり、変更の有無にかかわらず最新状態を確実に反映するため、単独行でも“商品”テーブルに更新する必要があります。
関連キーワード: スロースターチェンジ、更新履歴管理、トリガー制御、データ移行、時系列データ
設問2:〔基盤設計〕について答えよ。
問題文を見る(1)本文中の(ア)〜(オ)に入れる適切な字句又は数値を答えよ。
模範解答
ア:ログの量
イ:5
ウ:1,800
エ:864,000
オ:1,728
解説
解答の論理構成
- RPOの算定
本文では「RPOは、障害発生時に失われる(ア)に依存するので、最大(イ)分とみなせる。」とある。
回復にはフルバックアップとアーカイブログを使うので、失われるのは最後のログ切替え以降に出力され、まだアーカイブログとして保存されていないログです。だから(ア)は「ログの量」。
ログ切替えは「5分に1回行い」とあるので最大5分=(イ)「5」。 - リストア時間(ウ)
「データベース容量が180Gバイト、リストア時のディスク転送速度を100Mバイト/秒」とある。
10進表記なので
→ (ウ)「1,800」。 - 適用するログページ数(エ)
最大期間は24時間=86,400秒。毎秒10ページ出力なので
→ (エ)「864,000」。 - ログ適用時間(オ)
ページ当たり2ミリ秒で同期I/O。
→ (オ)「1,728」。
誤りやすいポイント
- 1Gバイト= バイト、1Mバイト= バイトである点を2進と混同しがち。
- ページ数計算で「24時間 = 86,400秒」を分や時間で誤換算。
- ミリ秒から秒への換算で1,000倍を忘れる。
- RPOを「ログ切替え間隔」そのものではなく「失われるログの量」と書けず減点されやすい。
FAQ
Q: RPOとログ切替え間隔は必ず一致しますか?
A: システムが想定どおり「ログ切替え時にアーカイブログをオブジェクトストレージへ保存」できている前提で最大値が一致します。切替え失敗やネットワーク遅延があればRPOは悪化します。
A: システムが想定どおり「ログ切替え時にアーカイブログをオブジェクトストレージへ保存」できている前提で最大値が一致します。切替え失敗やネットワーク遅延があればRPOは悪化します。
Q: ページ当たり2ミリ秒は読み込み・書き込みいずれの時間ですか?
A: 本文の「同期入出力時間がページ当たり2ミリ秒」とあるため、適用時の物理I/O(書き込み)時間を指します。読み込みがメモリヒットせず0% と想定しているので、すべてディスクI/Oになります。
A: 本文の「同期入出力時間がページ当たり2ミリ秒」とあるため、適用時の物理I/O(書き込み)時間を指します。読み込みがメモリヒットせず0% と想定しているので、すべてディスクI/Oになります。
Q: バッファヒット率0% の理由は?
A: 最悪ケースを想定するためです。障害復旧直後はバッファキャッシュが空で、すべてのログページをディスクから読み書きすると考えています。
A: 最悪ケースを想定するためです。障害復旧直後はバッファキャッシュが空で、すべてのログページをディスクから読み書きすると考えています。
関連キーワード: RPO, RTO, フルバックアップ、アーカイブログ、非同期レプリケーション
設問2:〔基盤設計〕について答えよ。
問題文を見る(2)“2.参照専用インスタンス”について、参照専用インスタンスへのレプリケーションを非同期型にすると、見積システムへの影響を最小化できるのはなぜか。レプリケーションの仕様に基づいて、30字以内で答えよ。
模範解答
・非同期型では複製先へのログの到達を待たないから
・同期型では複製先でのログのディスク出力を待つから
解説
解答の論理構成
- レプリケーションの処理フローを確認
- 同期型: “① 複製先でログをディスクに出力した後、複製元のトランザクションがコミットされる。”
- 非同期型: “② 非同期型では、複製先へのログの到達を待たずに、複製元のトランザクションがコミットされる。”
- 負荷発生ポイント
同期型はコミット時にネットワーク転送+複製先ディスク書込み完了を待機。これが本番インスタンスのトランザクション応答時間を延ばし、同時接続が多い業務では性能低下の主因になります。 - 非同期型の効果
到達を待たないのでコミット処理が即時終了し、追加I/O待機がなくなるため本番側CPU・I/O・ロック保持時間が短縮。結果として「見積システムへの影響を最小化」できるわけです。 - したがって解答
複製元はログ転送を待たずにコミットできるため。
誤りやすいポイント
- 「非同期=リアルタイム反映不可」と誤解して“遅延が大きいから負荷が小さい”と答えるのは不正確です。負荷軽減の直接要因は“待たない”点。
- 同期型でもネットワーク待ちだけと思い込み、ディスク書込み待ちを忘れるミス。
- フェイルオーバーの可否と混同し、「データ損失を許容するから」と書くと論点がずれます。
FAQ
Q: 非同期型でもネットワーク転送は発生しますよね?
A: はい。ただしコミット処理は転送完了を待たないので応答時間に影響せず、負荷が抑えられます。
A: はい。ただしコミット処理は転送完了を待たないので応答時間に影響せず、負荷が抑えられます。
Q: 同期型を使っても性能チューニングで影響を減らせないのですか?
A: バッファリングや高速ストレージで軽減は可能ですが、設計上「待つ」フローは変わらず、非同期型ほどの低負荷にはなりません。
A: バッファリングや高速ストレージで軽減は可能ですが、設計上「待つ」フローは変わらず、非同期型ほどの低負荷にはなりません。
Q: データロスを避けたい場合はどうしますか?
A: 参照専用インスタンスを業務継続用途に使うなら同期型に切替えるか、非同期+頻繁な差分バックアップなど多層防御を検討します。
A: 参照専用インスタンスを業務継続用途に使うなら同期型に切替えるか、非同期+頻繁な差分バックアップなど多層防御を検討します。
関連キーワード: レプリケーション、コミット処理、ネットワーク遅延、ディスクI/O, フェイルオーバー
設問2:〔基盤設計〕について答えよ。
問題文を見る(3)“3. 参照専用インスタンスへのフェイルオーバーによる業務継続” について、参照専用インスタンスでは、本番インスタンスでコミット済みの変更が失われる可能性がある。 どのような場合か。 レプリケーションの仕様に基づいて、30字以内で答えよ。
模範解答
・複製元の変更操作が複製先で未反映だった場合
・複製元と複製先の間の通信が切断されていた場合
・複製先のインスタンスが停止していた場合
解説
解答の論理構成
- 仕様確認
- 【問題文】レプリケーション
「② 非同期型では、複製先へのログの到達を待たずに、複製元のトランザクションがコミットされる。」
- 【問題文】レプリケーション
- 状態整理
- 本番インスタンスで COMMIT 完了 ⇒ ユーザには確定済み。
- しかしログはまだネットワーク越しに複製先へ送られていない。
- 障害シナリオ
- この“未到達”の瞬間に本番インスタンスが障害で停止。
- フェイルオーバーすると参照専用インスタンスには該当ログがない。
- 結論形成
- よって「コミット済みの変更が失われる可能性がある」状態は「コミット後ログ未到達で本番が障害」になる場合である。
- 30字以内に凝縮
- 例:「コミット後ログ未到達のまま本番が障害となった場合」
誤りやすいポイント
- 「非同期でも即時反映される」と誤解し、到達待ち時間を無視する。
- ネットワーク断や複製先停止よりも「本番障害が先」のケースを見落とす。
- “失われる”対象を「未コミット」だと思い込み、コミット済みを対象外にしてしまう。
FAQ
Q: 同期型なら同じ障害でもデータは失われませんか?
A: はい。同期型では「複製先でログをディスクに出力した後、複製元のトランザクションがコミットされる」ため、コミット済み=複製先反映済みとなり失われません。
A: はい。同期型では「複製先でログをディスクに出力した後、複製元のトランザクションがコミットされる」ため、コミット済み=複製先反映済みとなり失われません。
Q: 通信断だけではなく複製先停止でも失われますか?
A: 可能性があります。ログが届かない要因は通信断・複製先停止など複数あり、本番側が障害でない場合もデータ差異が生じます。
A: 可能性があります。ログが届かない要因は通信断・複製先停止など複数あり、本番側が障害でない場合もデータ差異が生じます。
Q: RPOに与える影響は?
A: 上記ケースの損失分がRPOになります。非同期型では最終ログ送信タイミング以降のコミットが失われるので、RPOは「ログ送信間隔」に依存します。
A: 上記ケースの損失分がRPOになります。非同期型では最終ログ送信タイミング以降のコミットが失われるので、RPOは「ログ送信間隔」に依存します。
関連キーワード: 非同期レプリケーション、フェイルオーバー、コミット、ログ伝送、RPO







