LoginSignup
3
1

More than 5 years have passed since last update.

DBMS_FILE_TRANSFERパッケージでDB(11gR2) -> DBLINK -> PDB(12cR2)のデータファイルの転送(コピー)を実行する。(Oracle Database)

Last updated at Posted at 2018-06-27

DBMS_FILE_TRANSFERパッケージで中間ファイルを介さずに、
DB(11gR2) to PDB(12cR2) の直接のファイル転送(コピー)を
実行してみますやで彡(゚)(゚)

Oracle Database PL/SQL Packages and Types Reference 12c Release 2 (12.2)
67 DBMS_FILE_TRANSFER
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_FILE_TRANSFER.html#GUID-9E206058-78CB-4028-8883-7C28B845F86C

今回試すのは以下のような接続トポロジです。

11gR2(データファイルのコピー元) ⇒ DBLINK ⇒ 12cR2(コピー先、DBMS_FILE_TRANSFERを実行)

1. データファイルのコピー元にディレクトリ・オブジェクトを作成

データファイルのパスを参照可能なディレクトリ・オブジェクトを作成して、
READ権限を付与します。下記例では専用ユーザーを作成していますが、必須ではありません。

-- 11gR2(ユーザー作成)
CREATE USER FILETRANS IDENTIFIED BY xxxxxxxx
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;
GRANT CREATE SESSION TO FILETRANS;

-- 11gR2(ディレクトリ・オブジェクト作成)
CREATE DIRECTORY DIR_DATAFILE as '+DATA/ORCL/DATAFILE';
GRANT READ ON DIRECTORY DIR_DATAFILE TO FILETRANS;

User created.

Grant succeeded.

Directory created.

Grant succeeded.

2. データファイルのコピー先(PDB)にディレクトリ・オブジェクトを作成

データファイルのコピー先(PDB)のパスにアクセス可能なディレクトリ・オブジェクトを
PDB上に作成して、DBMS_FILE_TRANSFERパッケージを実行するユーザーに
ディレクトリ・オブジェクトのWRITE権限を付与します。

-- 12cR2
CONNECT /AS SYSDBA
ALTER SESSION SET CONTAINER = PDB01;
SHOW CON_NAME;
CREATE DIRECTORY DIR_DATAFILE_PDB01 as '/u01/app/oracle/oradata/AYUCDB/6C4B2D3386C20FB8E055000000000001/datafile/';
GRANT WRITE ON DIRECTORY DIR_DATAFILE_PDB01 TO AYSHIBAT;

Connected.

Session altered.

CON_NAME
------------------------------
PDB01

Directory created.

Grant succeeded.

3. データファイルのコピー先(PDB)に、コピー元へ接続するDBLINKを作成

データファイルのコピー先(PDB)に、コピー元(今回は11gR2)へ接続する
DBLINK(DATABASE LINK)を作成します。コピー元の接続ユーザーは、
コピーするデータファイルのディレクトリ・オブジェクトのREAD権限が必要です。

-- 12cR2
CONNECT AYSHIBAT/xxxxxxxx@PDB01
SHOW CON_NAME;
CREATE DATABASE LINK DBL_ORCL_11GR2
CONNECT TO FILETRANS IDENTIFIED BY xxxxxxxx
USING 'ORCL_11GR2';

-- DBLINKの動作確認
SET LINESIZE 170;
SELECT * FROM V$VERSION@DBL_ORCL_11GR2;
SELECT * FROM V$VERSION;

Connected.

CON_NAME
------------------------------
PDB01

Database link created.

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0
PL/SQL Release 12.2.0.1.0 - Production                                                    0
CORE    12.2.0.1.0      Production                                                        0
TNS for Linux: Version 12.2.0.1.0 - Production                                            0
NLSRTL Version 12.2.0.1.0 - Production                                                    0

4. DBMS_FILE_TRANSFERパッケージのGET_FILEプロシージャを実行して、データファイルをコピー

コピー先(今回は12cR2側)でDBMS_FILE_TRANSFERパッケージの
GET_FILEプロシージャを実行して、データファイルをコピーします。

-- 12cR2
BEGIN
  DBMS_FILE_TRANSFER.GET_FILE(
      'DIR_DATAFILE'            -- 11gR2側のディレクトリ・オブジェクト
    , 'tbs_tts1.266.979841605'  -- 11gR2側のデータファイル名
    , 'DBL_ORCL_11GR2'          -- 12cR2 ⇒ 11gR2 の DBLINK名
    , 'DIR_DATAFILE_PDB01'      -- 12cR2側のディレクトリ・オブジェクト
    , 'tbs_tts1.266.979841605'  -- 12cR2側のデータファイル名
  );
END;
/

BEGIN
  DBMS_FILE_TRANSFER.GET_FILE(
      'DIR_DATAFILE'            -- 11gR2側のディレクトリ・オブジェクト
    , 'tbs_tts2.267.979841605'  -- 11gR2側のデータファイル名
    , 'DBL_ORCL_11GR2'          -- 12cR2 ⇒ 11gR2 の DBLINK名
    , 'DIR_DATAFILE_PDB01'      -- 12cR2側のディレクトリ・オブジェクト
    , 'tbs_tts2.267.979841605'  -- 12cR2側のデータファイル名
  );
END;
/
# DBMS_FILE_TRANSFER実行前
$ pwd
/u01/app/oracle/oradata/AYUCDB/6C4B2D3386C20FB8E055000000000001/datafile
$ ls -la
total 1133172
drwxr-x---. 2 oracle oinstall      4096 Jun 27 14:26 .
drwxr-x---. 3 oracle oinstall      4096 May 16 12:19 ..
-rw-r-----. 1 oracle oinstall 398467072 Jun 27 14:25 o1_mf_sysaux_fhq8s86l_.dbf
-rw-r-----. 1 oracle oinstall 272637952 Jun 27 14:37 o1_mf_system_fhq8s865_.dbf
-rw-r-----. 1 oracle oinstall 135274496 Jun 26 19:11 o1_mf_temp_fhq8s86n_.dbf
-rw-r-----. 1 oracle oinstall 104865792 Jun 27 14:37 o1_mf_undotbs1_fhq8s86m_.dbf
-rw-r-----. 1 oracle oinstall 259530752 Jun 27 13:47 o1_mf_users_fhq8s86o_.dbf
SQL> BEGIN
  2    DBMS_FILE_TRANSFER.GET_FILE(
  3        'DIR_DATAFILE'            -- 11gR2側のディレクトリ・オブジェクト
  4      , 'tbs_tts1.266.979841605'  -- 11gR2側のデータファイル名
  5      , 'DBL_ORCL_11GR2'          -- 12cR2 ⇒ 11gR2 の DBLINK名
  6      , 'DIR_DATAFILE_PDB01'      -- 12cR2側のディレクトリ・オブジェクト
  7      , 'tbs_tts1.266.979841605'  -- 12cR2側のデータファイル名
  8    );
  9  END;
 10  /

PL/SQL procedure successfully completed.

SQL> BEGIN
  2    DBMS_FILE_TRANSFER.GET_FILE(
  3        'DIR_DATAFILE'            -- 11gR2側のディレクトリ・オブジェクト
  4      , 'tbs_tts2.267.979841605'  -- 11gR2側のデータファイル名
  5      , 'DBL_ORCL_11GR2'          -- 12cR2 ⇒ 11gR2 の DBLINK名
  6      , 'DIR_DATAFILE_PDB01'      -- 12cR2側のディレクトリ・オブジェクト
  7      , 'tbs_tts2.267.979841605'  -- 12cR2側のデータファイル名
  8    );
  9  END;
 10  /

PL/SQL procedure successfully completed.
# DBMS_FILE_TRANSFER実行後
$ pwd
/u01/app/oracle/oradata/AYUCDB/6C4B2D3386C20FB8E055000000000001/datafile
$ ls -la
total 1153668
drwxr-x---. 2 oracle oinstall      4096 Jun 27 14:40 .
drwxr-x---. 3 oracle oinstall      4096 May 16 12:19 ..
-rw-r-----. 1 oracle oinstall 398467072 Jun 27 14:25 o1_mf_sysaux_fhq8s86l_.dbf
-rw-r-----. 1 oracle oinstall 272637952 Jun 27 14:37 o1_mf_system_fhq8s865_.dbf
-rw-r-----. 1 oracle oinstall 135274496 Jun 26 19:11 o1_mf_temp_fhq8s86n_.dbf
-rw-r-----. 1 oracle oinstall 104865792 Jun 27 14:37 o1_mf_undotbs1_fhq8s86m_.dbf
-rw-r-----. 1 oracle oinstall 259530752 Jun 27 13:47 o1_mf_users_fhq8s86o_.dbf
-rw-r-----. 1 oracle oinstall  10493952 Jun 27 14:40 tbs_tts1.266.979841605 ★コピーされたデータファイル
-rw-r-----. 1 oracle oinstall  10493952 Jun 27 14:40 tbs_tts2.267.979841605 ★コピーされたデータファイル
$

見事にデータファイルがコピーされましたやで!彡(^)(^)

5. まとめ

cpやscp等によるファイルシステム(中間ファイル)を介した転送と異なって、
DBMS_FILE_TRANSFERパッケージは DB to DB による直接のファイル転送(コピー)が
実現できるんやで彡(^)(^) #中間ファイルを介さないので理論上は速い。

転送中(転送経路上)の圧縮ができるとより理想的なんやけど、
下記パラメータ(SQLNET.COMPRESSION)を使ったら実現可能なんやろうか……? 彡(゚)(゚)

Oracle Database Net Servicesリファレンス 12cリリース2 (12.2)
5.2.20 SQLNET.COMPRESSION
https://docs.oracle.com/cd/E82638_01/netrf/parameters-for-the-sqlnet-ora-file.html#GUID-61CE4FA9-3ABB-4E9B-B788-FB57E6B56F47
データ圧縮を有効または無効にします。サーバー、クライアントの両方ともこのパラメータをONに設定している場合、接続に圧縮が使用されます。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1