Database Support Blog

  • Oracle Cloud
  • AWS
  • Oracle Database
2022.07.08

ダンプファイルのエクスポート不要!NETWORK_LINKを使用したOracle DBへのデータのインポート手順

ダンプファイルのエクスポート不要!NETWORK_LINKを使用したOracle DBへのデータのインポート手順

Oracle DBをご利用中の皆さまは、データをエクスポートして他のOracle DBにインポートしたいときに、ディスク容量不足でダンプファイルが出力できず、困った経験はありませんか?

IMPDP(インポート・ユーティリティ)のNETWORK_LINKパラメータを使用すると、データがネットワークを介して直接転送されるため、ダンプファイルなしでソースDBからターゲットDBにデータを直接インポートできます。

前述のように、ダンプファイルを保存するのに十分なディスク容量が無い場合に役立ちます。

また、今回紹介するNETWORL_LINKを使用した方法はダンプファイルの出力や転送が不要で、直接データを転送・インポートしますので、所要時間も短縮できます。

このブログでは、NETWORK_LINKパラメータを使用し、以下の2種類のターゲットDBにデータを移行するテストケースを用意しました。ターゲットDBに選択したのは、Oracle DBをクラウドで利用する一般的な方法の中の2種類です。


  • テストケース1:ターゲットDBがOCI DatabaseのPDB(新名称:Oracle Base Database Service)
  • テストケース2:ターゲットDBがAmazon RDS for Oracle
  • ソース・サーバとターゲット・サーバとの間に、適切なネットワーク接続が存在する前提でご説明します。
    ネットワークの設定手順は、本記事では省略します。
  • ソース・サーバはオンプレミスを模擬し、OCIの仮想マシン上にOracle DBをインストールして利用しています。



なお、どちらのテストケースでも、ソースDBには以下のオブジェクトを持つ「TESTUSER」スキーマがあり、このスキーマ単位でデータをインポートします。

 
 SQL> select object_name, object_type from dba_objects where owner ='TESTUSER';
 
 OBJECT_NAME          OBJECT_TYPE 
 -------------------- -----------------------
 DATAID               SEQUENCE 
 SAMPLEDATA           TABLE
 

以下は、テーブルTESTUSER.SAMPLEDATAの構造です。

 
 SQL> DESC TESTUSER.SAMPLEDATA
  Name                                         Null? Type
  ----------------------------------------- -------- ----------------------------
  ID                                                 NUMBER
  NAME                                               VARCHAR2(20)
  CITY                                               VARCHAR2(30)
 

今回は、TESTUSER.SAMPLEDATAテーブルに26,101,010行のデータを格納して検証してみます。


テストケース1:NETWORK_LINKパラメータを使用したOCI Databaseへのデータの移行

以下の手順に従って、ソースDBからターゲットのOCI Databaseにデータを移行しましょう。


1-1. ターゲット・サーバの/etc/hostsファイル設定

ターゲット・サーバの/etc/hostsファイルにソース・サーバのホスト情報(testinstance1)を追加します。

 
 xxx.x.xxx.xxx  testinstance1.xxxx.xxxx.oraclevcn.com testinstance1
 

1-2. ターゲット・サーバのtnsnames.oraファイル設定

ソースDBのTNSエントリをターゲット・サーバのtnsnames.oraファイルに追加します。

 
 ORCLPDB1 =
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = testinstance1.xxxx.xxxx.oraclevcn.com)(PORT = 1521))
     (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = orclpdb1)
     )
   )
 
※tnsnames.oraを使用せず、CREATE DATABASE LINK文内でTNSエントリを指定して実行も可能です。ステップ2-2の手順で紹介しています。

1-3. ターゲットDBからソースDBへの接続確認

設定したTNSエントリを使用して、ターゲットDBからソースDBへの接続を確認します。

 
 [oracle@dbtest2 admin]$ sqlplus testuser@orclpdb1
 
 SQL*Plus: Release 19.0.0.0.0 - Production on Mon Apr 25 04:21:21 2022
 Version 19.13.0.0.0
 
 Copyright (c) 1982, 2021, Oracle.  All rights reserved.
 
 Enter password:
 Last Successful login time: Mon Apr 25 2022 02:56:12 +00:00
 
 Connected to:
 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 Version 19.3.0.0.0
 
 SQL> select name from v$database;
 
 NAME
 ---------
 ORCLCDB
 
 SQL> show con_name;
 
 CON_NAME
 ------------------------------
 ORCLPDB1
 

1-4. GLOBAL_NAMESパラメータの設定

ターゲットDBとソースDBの両方でGLOBAL_NAMESパラメータをFALSEに設定します。
今回は、ターゲットDBのOCI DatabaseでのみGLOBAL_NAMESパラメータがデフォルトでTRUEでしたので、以下の手順でFALSEに設定します。

 
 [oracle@dbtest2 ~]$ sqlplus / as sysdba
 
 SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 22 07:46:25 2022
 Version 19.13.0.0.0
 
 Copyright (c) 1982, 2021, Oracle.  All rights reserved.
 
 
 Connected to:
 Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
 Version 19.13.0.0.0
 
 SQL> show parameter global_names;
 
 NAME                              TYPE        VALUE
 --------------------------------- ----------- ------------------------------
 global_names                      boolean     TRUE
 
 SQL> alter session set container=pdb1;
 
 Session altered.
 
 SQL> show parameter global_names;
 
 NAME                              TYPE        VALUE
 --------------------------------- ----------- ------------------------------
 global_names                      boolean     TRUE
 
 SQL> alter system set global_names = false scope=both;
 
 System altered.
 

今回の環境ではソースDBは既にFALSEの設定だったため、ここでの説明は割愛します。


1-5. データベースリンクの作成

ターゲットDBに、ソースDBを指すデータベースリンクを作成します。構文は以下のとおりです。

構文:

CREATE DATABASE LINK CONNECT TO <ユーザー名> IDENTIFIED BY <パスワード文字列>
USING <ステップ1-2で作成したTNSエントリ名>;
 
 [oracle@dbtest2 ~]$ sqlplus system@pdb1
 
 SQL*Plus: Release 19.0.0.0.0 - Production on Mon Apr 25 04:23:12 2022
 Version 19.13.0.0.0
 
 Copyright (c) 1982, 2021, Oracle.  All rights reserved.
 
 Enter password:
 Last Successful login time: Mon Apr 25 2022 04:07:42 +00:00
 
 Connected to:
 Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
 Version 19.13.0.0.0
 
 SQL> create database link ORCLPDB1 connect to testuser identified by xxxxxx using 'ORCLPDB1';
 
 Database link created.
 
 SQL> select sysdate from dual@ORCLPDB1;
 
 SYSDATE
 --------------
 25-Apr-22
 

ORCLPDB1というデータベースリンクを使用して、ソースDBのDUAL表にアクセスできました。


1-6. ダンプディレクトリの作成

DataPumpのログファイルを保存するためのダンプディレクトリを、ターゲットDBに作成します。

 
 [oracle@dbtest2 ~]$ mkdir dumplogs
 
 [oracle@dbtest2 ~]$ sqlplus system@pdb1
 
 SQL*Plus: Release 19.0.0.0.0 - Production on Mon Apr 25 04:29:09 2022
 Version 19.13.0.0.0
 
 Copyright (c) 1982, 2021, Oracle.  All rights reserved.
 
 Enter password:
 Last Successful login time: Mon Apr 25 2022 04:23:16 +00:00
 
 Connected to:
 Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
 Version 19.13.0.0.0
 
 SQL> create directory dump_dir as '/home/oracle/dumplogs';
 
 Directory created.
 

/home/oracleの中に、dumplogsディレクトリが作成できました。


1-7. ターゲットDBでの事前確認

前提で述べたようにスキーマ単位でデータをインポートするので、現時点でターゲットDBにはTESTUSERが存在しないことを確認します。

 
 SQL> select object_name, object_type from dba_objects where owner ='TESTUSER';
 
 no rows selected
 

1-8. ソースDBからTESTUSERスキーマをインポート

ステップ5で作成したデータベースリンクを指すNETWORK_LINKパラメータを使用して、ソースDBからTESTUSERスキーマをインポートします。
インポートの構文は以下のとおりです。

構文:

impdp username @<ターゲットDB名> directory= <ステップ1-6で作成したディレクトリ名>
logfile=<ログファイル名> schemas=<ターゲットDBにインポートされるスキーマ名>
network_link=<ステップ1-5で作成したDBリンク名>;
 
 [oracle@dbtest2 dumplogs]$ impdp system@pdb1 directory=dump_dir  logfile=testexp.log schemas=testuser network_link=ORCLPDB1;
 
 Import: Release 19.0.0.0.0 - Production on Mon Apr 25 07:29:59 2022
 Version 19.13.0.0.0
 
 Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
 Password:
 
 Connected to: Oracle Database 19c EE High Perf Release 19.0.0.0.0 - Production
 Starting "SYSTEM"."SYS_IMPORT_SCHEMA_01":  system/********@pdb1 directory=dump_dir logfile=testexp.log schemas=testuser network_link=ORCLPDB1
 Estimate in progress using BLOCKS method...
 Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
 Total estimation using BLOCKS method: 1.126 GB
 Processing object type SCHEMA_EXPORT/USER
 Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
 Processing object type SCHEMA_EXPORT/ROLE_GRANT
 Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
 Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
 Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
 Processing object type SCHEMA_EXPORT/TABLE/TABLE
 . . imported "TESTUSER"."SAMPLEDATA"                    26101010 rows
 Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
 Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
 Job "SYSTEM"."SYS_IMPORT_SCHEMA_01" successfully completed at Mon Apr 25 07:31:02 2022 elapsed 0 00:00:58
 

1-9. ターゲットDBでTESTUSERスキーマを確認

スキーマがターゲットDBに適切にインポートされたことを確認します。

 
 SQL> col object_name for a20
 SQL> select object_name, object_type from dba_objects where owner ='TESTUSER';
 
 OBJECT_NAME          OBJECT_TYPE
 -------------------- -----------------------
 DATAID               SEQUENCE
 SAMPLEDATA           TABLE
 
 
 SQL> select count(1) from testuser.sampledata;
 
 COUNT(1)
 ----------------
 26101010
 

検証結果の通り、すべてのデータが適切にインポートできたことが確認できました。


テストケース2:NETWORK_LINKパラメータを使用したAmazon RDSへのデータ移行

次のテストケースでは、ソースDB(仮想マシン上のOracle DB)からターゲットDB(Amazon RDS for Oracle)にデータを移行します。

Amazon RDSはOS層の操作ができないため、テストケース1で行ったtnsnames.oraへのTNSエントリの追加(ステップ1-2を参照)ができません。そのため、データベースリンクを作成する構文のUSING句でTNSエントリを指定します。

これにより、テストケース1に比べると手順が少ないです。

2-1. GLOBAL_NAMESパラメータの設定

ターゲットおよびソースDBの両方で、GLOBAL_NAMESパラメータをFALSEに設定します。
今回の検証では、ターゲットDBのAmazon RDS(非コンテナDB)でもGLOBAL_NAMESパラメーターがデフォルトでFALSEのため設定はしていません。
設定を変更する場合は、テストケース1のステップ1-4と同様の手順になります。

2-2. データベースリンクの作成

ターゲットDBにソースDBを指すデータベースリンクを作成します。構文は以下のとおりで、USING句でTNSエントリを指定します。

CREATE DATABASE LINK CONNECT TO <ユーザー名> IDENTIFIED BY <パスワード文字列>
USING '(DESCRIPTION =
    (ADDRESS_LIST = (ADDRESS =
    (PROTOCOL = TCP)(HOST = <ソースDBのホスト名>)(PORT = <ソースDBのポート番号>)))
    (CONNECT_DATA = (SERVICE_NAME = <ソースDBのサービス名>)))';

 
 [ec2-user@ip-xxx-xx-xx-xx ~]$ sqlplus admin@testrds
 
 SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 27 07:37:18 2022
 Version 19.15.0.0.0
 
 Copyright (c) 1982, 2022, Oracle.  All rights reserved.
 
 Enter password:
 Last Successful login time: Wed Apr 27 2022 07:17:44 +00:00
 
 Connected to:
 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 Version 19.13.0.0.0
 
 SQL> CREATE DATABASE LINK ORCLPDB1 CONNECT TO testuser IDENTIFIED BY xxxxx USING '(DESCRIPTION = (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.x.xxx.xxx)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orclpdb1)))';
 
 Database link created.
 
 SQL> select sysdate from dual@ORCLPDB1;
 
 SYSDATE
 -------------
 27-Apr-22
 

2-3. ターゲットDBでの事前確認

テストケース1と同様にスキーマ単位でインポートするため、TESTUSERが存在しないことを確認します。

 
 SQL> select object_name, object_type from dba_objects where owner ='TESTUSER';
 
 no rows selected
 

2-4. ソースDBからTESTUSERスキーマをインポート

ステップ2-2で作成したデータベースリンクを指すNETWORK_LINKパラメータを使用して、ソースDBからTESTUSERスキーマをインポートします。

構文:

impdp username @<ターゲットDB名> directory = data_pump_dir
logfile = <ログファイル名> schemas=<ターゲットDBにインポートされるスキーマ名>
network_link=<ステップ2で作成したDBリンク名>;
 
 [ec2-user@ip-xxx-xx-xx-xx ~]$ impdp admin@testrds directory=data_pump_dir logfile=imp_test_tables_using_nw_link.log schemas=testuser network_link=ORCLPDB1;
 
 Import: Release 19.0.0.0.0 - Production on Wed Apr 27 07:39:14 2022
 Version 19.15.0.0.0
 
 Copyright (c) 1982, 2022, Oracle and/or its affiliates.  All rights reserved.
 Password:
 
 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 Starting "ADMIN"."SYS_IMPORT_SCHEMA_01":  admin/********@testrds directory=data_pump_dir logfile=imp_test_tables_using_nw_link.log schemas=testuser network_link=ORCLPDB1
 Estimate in progress using BLOCKS method...
 Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
 Total estimation using BLOCKS method: 1.126 GB
 Processing object type SCHEMA_EXPORT/USER
 Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
 Processing object type SCHEMA_EXPORT/ROLE_GRANT
 Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
 Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
 Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
 Processing object type SCHEMA_EXPORT/TABLE/TABLE
 . . imported "TESTUSER"."SAMPLEDATA"                    26101010 rows
 Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
 Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
 Job "ADMIN"."SYS_IMPORT_SCHEMA_01" successfully completed at Wed Apr 27 07:40:08 2022 elapsed 0 00:00:47
 

エラーがなく実行できていることを確認しましょう。


2-5. ターゲットDBでTESTUSERスキーマを確認

最後に、スキーマがターゲットDBに正しくインポートされたかどうかを確認します。

 
 [ec2-user@ip-xxx-xx-xx-xx ~]$ sqlplus admin@testrds
 
 SQL*Plus: Release 19.0.0.0.0 - Production on Wed Apr 27 07:40:43 2022
 Version 19.15.0.0.0
 
 Copyright (c) 1982, 2022, Oracle.  All rights reserved.
 
 Enter password:
 Last Successful login time: Wed Apr 27 2022 07:39:17 +00:00
 
 Connected to:
 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 Version 19.13.0.0.0
 
 SQL> select count(1) from testuser.sampledata;
 
 COUNT(1)
 ----------------
 26101010
 
 SQL> select object_name, object_type from dba_objects where owner ='TESTUSER';
 
 OBJECT_NAME          OBJECT_TYPE
 -------------------- ---------------------
 DATAID               SEQUENCE
 SAMPLEDATA           TABLE
 

テストケース2の場合も、適切にデータがインポートできていることが確認できました。


注意事項

NETWORK_LINKパラメータの使用には制限があり、使用するOracle DBのバージョンによって異なります。そのため、NETWORK_LINKを使用する前に、Oracle DBのマニュアルをご参照ください。

また、暗号化されていないネットワーク・リンクでインポート操作を実行すると、データベースで暗号化されている場合でも、全てのデータがクリア・テキストとしてインポートされることにご注意ください。


まとめ

今回はNETWORK_LINKを利用したデータのインポート手順をご紹介しました。注意事項もあるので本番環境での利用にはご注意いただきたいですが、検証環境などでディスク容量に余裕がないときに活用できるのではないでしょうか。
ぜひお試しください。

執筆者情報

Aarthi Mudhalvan プロフィール画像

2019年5月よりアシストでデータベースエンジニア、コンサルタントとして勤務

所有資格:
・Oracl Cloud Infrastructure 2018 Architect Associate
・AWS Certified Solution Architect Associate
・AWS Certified Database – Specialty


■本記事の内容について
 本記事に示した定義及び条件は変更される場合があります。あらかじめご了承ください。

■商標に関して
 OracleとJavaは、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における登録商標です。
 文中の社名、商品名等は各社の商標または登録商標である場合があります。


Oracle Databaseライセンスのご相談ならアシスト

関連している記事

  • Oracle Database
  • Oracle Cloud
  • AWS
2022.08.10

Oracle Databaseライセンスの定義とルールを正しく理解する ~第4回:クラウド編~

今回はOracle Databaseライセンス「仮想化環境編」です。これまでエディション、ライセンスの種類、カウントの方法、という基本的な内容を説明してきましたが、より構成に踏み込み、「ハードウェア分割の基本的な考え方」や「仮想化環境の考慮点」=Soft Partitioning理解のポイントを説明しします。

  • Oracle Database
  • Exadata
2022.06.28

こんなのあったんだ!Exadataの便利ツール ExaWatchar・Exachkをご紹介

Exadataは大規模なデータベースマシンのため、運用や監視に労力がかかります。EMCCを始め統合管理ツールも多く存在しますが、Exadataにデフォルトで実装されている便利なツールを用いることで、より効果的な運用につなげられます。便利なツールExaWatchar・Exachkを詳しくご紹介します。

  • Oracle Database
2022.06.21

マルチテナントのPDB数はどう見積もる?最適なエディション選択と検討のヒント

マルチテナント構成Oracle Databaseに採用され早数年が経過。21c以降の従来構成廃止に伴い、19cが従来構成もテナント構成の両方を選べる最終バージョンに。従来構成維持とテナント構成変更を思案する方に向け、「PDBの最適数」に焦点を当てバージョンアップ後の構成を考えてみます。

ページの先頭へ戻る