マテリアライズドビューを使用したOracleデータベースの移行

はじめに

Oracleデータベース間の移行方法はいくつか考えられますが、そのうちの一つに、マテリアライズドビューを利用する方法があります。マテリアライズドビューは継続的な同期が可能で、移行によるサービスのダウンタイムを短くすることができます。

移行先のデータベースから移行元へのデータベースに対して後述するDBリンクを通じてアクセスができれば、オンプレ・クラウド問わず移行が可能です。

※ ただし、テーブル間の依存関係が複雑になると、マテリアライズドビューによる移行手順は複雑になるので、その点はご注意ください。

構成

移行元サーバora11g に Oracle11g をインストールし、インスタンスorcl11g を構築します。
移行先サーバora19c に Oracle19c をインストールし、インスタンスorcl19c を構築します。

移行テストのために移行元にはサンプルスキーマを作成します。
今回の手順では HR ユーザーに以下のテーブルが存在します。

REGIONS
LOCATIONS
EMPLOYEES
JOB_HISTORY
JOBS
COUNTRIES
DEPARTMENTS

データベースオブジェクトの移行

マテリアライズドビューで移行できるのはデータのみです。そのため、インデックス、プロシージャなどの定義は Datapump で移行する必要があります。
移行元でメタデータのみエクスポートします。

expdp system schema=hr content=metadata_only dumpfile=hr.dmp

移行先で取得したメタデータをインポートします。

impdp system dumpfile=hr.dmp

データベースリンクの構成

移行先データベースから移行元データベースへアクセスするためのDBリンクを作成します。

create database link dblinkora11g connect to hr identified by hrのパスワード
using 'ora11g:1521/orcl11g';

接続確認

select * from regions@dblinkora11g;

マテリアライズドビューログの作成

この作業は移行元データベースで行います。
移行元データベースにマテリアライズドビューログを作成します。
マテリアライズドビューログは移行元テーブルの変更履歴を格納し、マテリアライズドビューの高速リフレッシュに必要です。

create materialized view log on テーブル名;

対象のテーブルに主キーが無い場合、rowid で更新を管理するため with rowid 句をつけます。

create materialized view log on テーブル名 with rowid;

マテリアライズドビューログはリフレッシュが行われるまでログをため続けるため、容量の枯渇には注意してください。

マテリアライズドビューの作成

テーブル定義はエクスポート済なので on prebuilt table 句で既存テーブルを利用してマテリアライズドビューを作成します。
リフレッシュ方式は force を指定し、高速リフレッシュが可能であれば高速リフレッシュを実行し可能でなければ完全リフレッシュを行います。
リフレッシュタイミングは on demand を指定し、手動によるリフレッシュを実行します。

create materialized view テーブル名 on prebuilt table refresh force on demand
as select * from テーブル名@dblinkora11g;

対象のテーブルに主キーが無い場合、rowid で更新を管理するため with rowid 句をつけます。
on prebuilt table 句は使用できないのでいったんテーブルを削除する必要があります。

drop table テーブル名;
create materialized view テーブル名 refresh force on demand with rowid
as select * from テーブル名@dblinkora11g;

移行

マテリアライズドビューの同期を行います。
テーブルはカンマ区切りで複数指定することできます。

exec dbms_mview.refresh('テーブル名,テーブル名,・・・');

マテリアライズドビュー作成時にリフレッシュ方式に force を指定しているので、通常高速リフレッシュが行われますが、明示的に完全リフレッシュを指定することができます。

exec dbms_mview.refresh('テーブル名,テーブル名,・・・','c');

マテリアライズドビューの同期状況を確認します。
LAST_REFRESH_TYPE 列が FAST であれば高速リフレッシュ、COMPLETE であれば完全リフレッシュが行われています。

set pages 1000
col mview_name for a30
alter session set NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS';
select MVIEW_NAME,FAST_REFRESHABLE,LAST_REFRESH_TYPE,LAST_REFRESH_DATE
from user_mviews order by mview_name;

同期解除

マテリアライズドビューを削除して同期を解除します。

drop materialized view テーブル名 preserve table;

移行元データベースでマテリアライズドビューログを削除します。

drop materialized view log on テーブル名;

preserve table 句をつけることで通常のテーブルとして利用することができます。
再同期するには、マテリアライズドビューログ、マテリアライズドビューを再作成して同期を行います。

さいごに

Oracleデータベースの移行については、移行データ量、テーブル間の依存関係、同期のタイミング、ダウンタイムの許容度によってマテリアライズドビュー以外にも移行方法があります。

  • Oracle の標準機能であるDatapumpはデータ移行ツールとして一般的で、移行データ量が小さくダウンタイムが許容される場合に利用できます。
  • 双方向レプリケーションが可能なGoldengateは並行運用が必要な場合に利用できますが、OracleDatabaseとは別ライセンスが必要になります。
執筆担当者プロフィール
三条 光暢

三条 光暢(日本ビジネスシステムズ株式会社)

Oracle、PostgreSQLを中心に各種データベースの設計・構築・運用を携わっています。

担当記事一覧