Oracleのマテリアライズド ビュー(MATERIALIZED VIEW)、通称「マテビュー」。
いちいちバッチを作らずともselect文だけでデータ連携ができる、とても便利なしくみですよね。
完全リフレッシュや高速リフレッシュなど、それぞれの用途によって使い方も様々です。
おそらく、業務システムなどで活用している場合も結構あるのではないでしょうか。
ですが、扱いづらい面も多々ありますね。
例えば、インポート。マテビューはマテビューオブジェクトでありながら、テーブルでもあるので、
普通にインポートを実行したらマテビューオブジェクトではなく、
テーブルオブジェクトとしてインポートされてしまいます。
テーブルじゃぁねぇんだよ。。。
となるわけです。
今回は、そんなちょっと扱いづらいマテビューのインポートについて、
テーブルオブジェクトとしてだけでなく、
マテビューオブジェクトも含めて完全にインポートする方法について共有したいと思います。
Oralceを扱う方々に少しでも参考になれば幸いです。
特に大規模なシステムを大量のデータ移行などを行う場合、時間がかかってしまうので、
ピンポイントで一部のオブジェクトデータだけをエクスポート・インポートしたい、
という人には参考になると思います。
OracleのMATERIALIZED VIEWをimpdp
結論から先に云いますと、
オプションでテーブルとマテビューを両方指定
すればインポートできます。
仕事で業務システムのOracle環境をスキーマ単位で構築したり、別スキーマからのインポート作業を頻繁に行ってます。
その際、テーブルやPLSQL、トリガーなど、いろんなDBオブジェクトの中に多くのマテビューが含まれている環境を取り扱っています。
そんな中、部分的にマテビューオブジェクトのテーブルデータをdmpファイルからインポートしたい、という場面が結構ありました。
正直、最近までマテビューオブジェクトだけをピンポイントでインポートするのはあきらめかけていました。(スキーマ単位で丸ごとでなければ不可能だと思っていた)
ですが、いろいろ検証してみた結果、マテビューオブジェクトのみをインポートすることができたので、ご紹介したいと思います。
検証した内容をそのまま記載したいと思います。エラーになってしまう例も含め、このコマンドだとこうなってしまうのか、と理解するのも意味があるので。
バージョン | Oracle11g |
---|---|
OS | UNIX |
インポート方法 | impdp ※従来のimpではない |
マテビュー移行イメージ
以下イメージのように、サーバからサーバ、例えば本番機から開発機にデータを移行したい場面って結構ありますよね。
検証コマンドNG例
まずは、NG例です。要はマテビューだけをエクスポート・インポートしようとしてエラーとなるケースです。
TABLEは含めず、MATERIALIZED_VIEWのみをincludeしてexpdp
/* 「TEST」スキーマの「TEST」で始まるマテビューのみをエクスポート */
expdp TEST/test directory=DATA_PUMP_DIR dumpfile=TEST.dmp schemas=TEST include=MATERIALIZED_VIEW:\"LIKE \'TEST%\'\"
;;;
Export: Release 11.2.0.4.0 - Production on 木 5月 23 13:40:08 2019
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
;;;
接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning option
TEST."SYS_EXPORT_SCHEMA_01"を起動しています: TEST/******** directory=DATA_PUMP_DIR dumpfile=TEST.dmp schemas=TEST include=MATERIALIZED_VIEW:"LIKE 'TEST%'"
BLOCKSメソッドを使用して見積り中です...
BLOCKSメソッドを使用した見積り合計: 0 KB
オブジェクト型SCHEMA_EXPORT/MATERIALIZED_VIEWの処理中です
マスター表"TEST"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
TEST.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
/TEST_DIR/TEST.dmp
ジョブ"TEST"."SYS_EXPORT_SCHEMA_01"が木 5月 23 13:44:52 2019 elapsed 0 00:03:44で正常に完了しました
MATERIALIZED_VIEWのみをincludeしてexpdpしたdmpファイルをimpdp
/* 「TEST」スキーマの「TEST_MV」マテビューのみをピンポイントでインポート */
impdp TEST/test directory=DATA_PUMP_DIR_TMP dumpfile=TEST.dmp schemas=TEST include=MATERIALIZED_VIEW:\"= \'TEST_MV\'\"
;;;
Import: Release 11.2.0.4.0 - Production on 木 5月 23 13:49:47 2019
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
;;;
接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning option
マスター表"TEST"."SYS_IMPORT_SCHEMA_01"は正常にロード/アンロードされました
TEST."SYS_IMPORT_SCHEMA_01"を起動しています: TEST/******** directory=DATA_PUMP_DIR dumpfile=TEST.dmp schemas=TEST include=MATERIALIZED_VIEW:"= 'TEST_MV'"
オブジェクト型SCHEMA_EXPORT/MATERIALIZED_VIEWの処理中です
ORA-39083: オブジェクト型MATERIALIZED_VIEWの作成が次のエラーで失敗しました:
ORA-00942: 表またはビューが存在しません。
エラー文は次のとおりです:
CREATE MATERIALIZED VIEW "TEST"."TEST_MV" ( ~~~ 省略 ~~~
TEST1_V
ジョブ"TEST"."SYS_IMPORT_SCHEMA_01"が完了しましたが、1エラーが木 5月 23 13:50:58 2019 elapsed 0 00:01:05で発生しています
テーブルを指定していないので、、、テーブルも指定しなきゃダメっすよ。。。という意味で「ORA-00942: 表またはビューが存在しません。」が発生してるんだと思います。
検証コマンドOK例
次は、OK例です。マテビューだけでなくテーブルを指定して完璧にマテビューオブジェクトとしてインポートが成功する例です。
TABLEとMATERIALIZED_VIEW両方をincludeしてexpdp
/* 「TEST」スキーマの「TEST」で始まるテーブルと「TEST」で始まるマテビューをエクスポート */
expdp TEST/test directory=DATA_PUMP_DIR_TMP dumpfile=TEST.dmp schemas=TEST include=TABLE:\"LIKE \'TEST%\'\",MATERIALIZED_VIEW:\"LIKE \'TEST%\'\"
;;;
Export: Release 11.2.0.4.0 - Production on 木 5月 23 14:33:52 2019
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
;;;
接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning option
TEST."SYS_EXPORT_SCHEMA_01"を起動しています: TEST/******** directory=DATA_PUMP_DIR_TMP dumpfile=TEST.dmp schemas=TEST include=TABLE:"LIKE 'TEST%'",MATERIALIZED_VIEW:"LIKE 'TEST%'"
BLOCKSメソッドを使用して見積り中です...
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
BLOCKSメソッドを使用した見積り合計: 448 KB
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/MATERIALIZED_VIEWの処理中です
. . "TEST"."TEST_MV" 5.820 KB 1行がエクスポートされました
. . "TEST"."TEST2_MV" 5.820 KB 1行がエクスポートされました
. . "TEST"."TEST3_MV" 5.820 KB 1行がエクスポートされました
マスター表"TEST"."SYS_EXPORT_SCHEMA_01"は正常にロード/アンロードされました
******************************************************************************
TEST.SYS_EXPORT_SCHEMA_01に設定されたダンプ・ファイルは次のとおりです:
/TEST_DIR/TEST.dmp
ジョブ"TEST"."SYS_EXPORT_SCHEMA_01"が木 5月 23 14:38:47 2019 elapsed 0 00:04:38で正常に完了しました
TABLEとMATERIALIZED_VIEW両方をincludeしてexpdpしたdmpファイルをimpdp
/* 「TEST」スキーマの「TEST_MV」テーブルと「TEST_MV」マテビューの両方をピンポイントでインポート */
impdp TEST/test directory=DATA_PUMP_DIR_TMP dumpfile=TEST.dmp schemas=TEST include=TABLE:\"= \'TEST_MV\'\",MATERIALIZED_VIEW:\"= \'TEST_MV\'\"
;;;
Import: Release 11.2.0.4.0 - Production on 木 5月 23 14:40:52 2019
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
;;;
接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning option
マスター表"TEST"."SYS_IMPORT_SCHEMA_01"は正常にロード/アンロードされました
TEST."SYS_IMPORT_SCHEMA_01"を起動しています: TEST/******** directory=DATA_PUMP_DIR_TMP dumpfile=TEST.dmp schemas=TEST include=TABLE:"='TEST_MV'",MATERIALIZED_VIEW:"='TEST_MV'"
オブジェクト型SCHEMA_EXPORT/TABLE/TABLEの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/TABLE_DATAの処理中です
. . "TEST"."TEST_MV" 5.820 KB 1行がインポートされました
オブジェクト型SCHEMA_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型SCHEMA_EXPORT/MATERIALIZED_VIEWの処理中です
ジョブ"TEST"."SYS_IMPORT_SCHEMA_01"が木 5月 23 14:43:06 2019 elapsed 0 00:02:08で正常に完了しました
無事、テーブルとマテビューが正常にインポート完了しました。
最後に
Oracleのマテビューインポートについて、ご紹介させていただきました。
10gでも試しましたが、問題ないです。おそらく12c以降も同様でしょう。
マテビューを扱っている人にとっては、知っておいて損はないと思いますので、ぜひ参考にしてみてください。
コメント