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