データベーススペシャリスト 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°バイト、1Mバイトは10バイトとする。
(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) は
商品コード
となります。
- 【問題文】図2
-
変更判定ロジックを確認
- WHERE 句には
があり、業務説明に( A.モデル名 <> C.モデル名 (b) A.定価 <> C.定価 )
「モデル名又は定価のいずれかが変更されたことが分かる」
とあるため、2条件の論理結合は “または” を表すOR
となります。 - したがって (b) は
OR
です。
- WHERE 句には
-
まとめ
- (a)
商品コード
- (b)
OR
- (a)
誤りやすいポイント
- モデル名や定価をキーに選んでしまい多重一致エラーになる。
- AND を使うと「モデル名も定価も両方変わった場合のみ検出」になり要件を満たさない。
- OR に括弧がない場合の優先順位を誤解して意図しない絞り込みになる。
FAQ
Q: AND と OR の優先順位は?
A: SQL では
A: SQL では
ANDが
ORより高いので、本問のように括弧でまとめていれば確実に意図どおり評価されます。
Q: “モデル名” だけ変わったケースも正しく検出できますか?
A: はい。
A: はい。
ORで結合しているため、
モデル名が異なるか
定価が異なるか、どちらかが合致すれば抽出されます。
Q: “商品コード” に NULL が入る可能性は?
A: 主キー列なので NULL は入りません。NULL があり得る列を結合条件にすると行が欠落する恐れがあります。
A: 主キー列なので NULL は入りません。NULL があり得る列を結合条件にすると行が欠落する恐れがあります。
関連キーワード: 内部結合、論理演算子、履歴管理、WHERE句、プライマリキー
設問1:〔“商品” テーブルの履歴管理〕 について答えよ。
(2)“商品”テーブルの設計変更について、表1中の案1 を採用した場合、ほかのどのテーブルの、どの制約を変更する必要があるか。 テーブル名と制約を全て答えよ。
模範解答
テーブル名:見積依頼明細、見積回答明細
制約:外部キー制約
解説
解答の論理構成
- 表1の案1では、
“商品”
テーブルが
(商品コード、…、適用開始日、適用終了日)
という複合主キーになる。【問題文】に
“適用開始日、適用終了日” を列に追加と明記。 - 主キーが変わると、他テーブルが持つ「
商品コード
だけを参照する外部キー」は整合性を保てません。 - 図1で
商品コード
を保持しているのは“見積依頼明細”
と“見積回答明細”
の2テーブルのみ。両テーブルには商品
を参照する外部キー制約が存在する。 - よって、案1を採用した場合に変更が必要になるのは、これら2テーブルの外部キー制約である。
誤りやすいポイント
- 案2と混同して「制約変更は不要」と判断してしまう。
- 参照している列を誤って
見積依頼
や見積回答
テーブルにまで広げてしまう。 - 「インデックスを追加すれば済む」と考え、外部キー制約の再定義が必要なことを見落とす。
FAQ
Q: 複合主キーに変えても、外部キー側が一部列だけ参照する形で残せませんか?
A: 一般に外部キーは参照先主キーと同じ列集合またはそのスーパーキーを取る必要があります。主キーに列が追加された時点で、一部列だけでは参照要件を満たせなくなるため再定義が不可欠です。
A: 一般に外部キーは参照先主キーと同じ列集合またはそのスーパーキーを取る必要があります。主キーに列が追加された時点で、一部列だけでは参照要件を満たせなくなるため再定義が不可欠です。
Q: 案1で外部キー制約を変更しないと、どんな不具合が起こりますか?
A:
A:
INSERT/
UPDATE時に「参照整合性違反」のエラーが発生し、アプリケーションから見積明細を登録できなくなります。
Q: テーブル追加の案2ではなぜ制約変更が不要なのですか?
A:
A:
商品コード単独の主キー構成が維持されるため、既存の外部キーがそのまま有効だからです。
関連キーワード: 外部キー、主キー、複合キー、参照整合性、スキーマ変更
設問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 の該当部分
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:
A: 【問題文】注記1にあるとおり「引数1 が NULL の場合は NULL を返す」ため、(k) には “NULL” が入ります。
ADD_DAYSに NULL が渡るとどうなるのですか?
A: 【問題文】注記1にあるとおり「引数1 が NULL の場合は NULL を返す」ため、(k) には “NULL” が入ります。
Q: 行番号は解答に影響しますか?
A: いいえ。
A: いいえ。
ROW_NUMBER()は結果を一意に並べるためだけの列で、(i)〜(k) の値には影響しません。
Q:
A: 「商品コード」単位で履歴を追跡するためです。
LAG/
LEADのウィンドウ区画はなぜ必要ですか?
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


