expdpで指定するディレクトリの権限でちょっとはまった話(初心者向け)

こんにちは。hrkii123と申します。

このエントリはJPOUGアドベントカレンダー2019の18日目の記事です。

Qiita初投稿がJPOUGアドベントカレンダー2019となりました。


>JPOUGアドベントカレンダー2019
>https://adventar.org/calendars/4154

### はじめに
今回はdatapumpのexpdpユーティリティではまったお話です。

とある日のこと。開発チームごとにOSユーザ、DBユーザ、OSディレクトリ等を分け、チーム間で互いにデータを参照できないようにするという要件のなかDB周りの設計を行っていました。
その中で、datapumpでエクスポートするOSディレクトリもチームごとに用意し、お互いのダンプファイルを参照できないようにしてほしいと注文が入りました。

私はそんなのOSディレクトリのパーミッションで簡単に制御できるじゃーんって思ってました。
（そう簡単にはいかなかった。）

で、いろいろ試した検証内容をまとめました。


### 概要図

datapumpでuser_Aスキーマを/var/work/Adirへエクスポートします。
エクスポート後、Aadminユーザのみ/var/work/Adir配下のダンプファイルへアクセス可能で、Badminユーザはアクセスできないようにします。
アクセスの可否はOSディレクトリのパーミッション設定で行います。また、図では記載していませんが、DBは12.1のRAC環境を使いました。(たまたま仮想マシンがあったので..)

![無題のプレゼンテーション (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551586/28ac680e-59b5-4ad7-c2e5-227db605496f.png)


検証用にDBユーザ”user_A”とディレクトリオブジェクト”dirA”を作成しておきます。
DBユーザ”user_A”には必要な権限を付与しておきます。

    create user user_A identified by welcome1;
    CREATE DIRECTORY dirA AS '/var/work/Adir';
    grant create session,resource,unlimited tablespace to user_A;
    grant read, write on directory dirA to user_A;

さて、この状態でexpdpを実行できるでしょうか。

    /u01/app/oracle/product/12.1.0/dbhome_1/bin/expdp user_A/welcome1@testdb directory=dirA dumpfile=expdp_A.log schemas=user_A


下記出力の通り、エラーとなりました。

    ORA-39002: invalid operation
    ORA-39070: Unable to open the log file.
    ORA-29283: invalid file operation
    ORA-06512: at "SYS.UTL_FILE", line 536
    ORA-29283: invalid file operation

上記のエラーはOSディレクトリのパーミッションが適切ではないときに出力されます。

ディレクトリオブジェクトで指定しているOSディレクトリは所有者Aadmin、所有グループAadminとなっております。datapumpの仕様でエクスポートされるダンプファイルは所有者oracle、所有グループasmadminとなります。つまりdatapumpの実行ではoracleユーザとasmadminグループからのアクセスが許可できている必要があります。OSディレクトリのパーミッションが777であれば何も気にする必要はないですが、今回の場合ではoracleユーザはAadminグループに属していないため、OSディレクトリへのアクセスができません。

対処として、今回はoracleユーザとgridユーザのセカンダリグループにAadminを追加することにします。

    id oracle
    uid=54321(oracle) gid=54321(oinstall)groups=54321(oinstall),54322(dba),1101(oper),1102(backupdba),1103(dgdba),1104(kmdba),1201(asmdba),54323(Aadmin)

    id grid
    uid=1100(grid) gid=54321(oinstall)groups=54321(oinstall),1200(asmadmin),1201(asmdba),1202(asmoper),54323(Aadmin)


今度は成功するでしょうか。

    ORA-39002: invalid operation
    ORA-39070: Unable to open the log file.
    ORA-29283: invalid file operation
    ORA-06512: at "SYS.UTL_FILE", line 536
    ORA-29283: invalid file operation

また出ました。このエラー！！
OSディレクトリへのアクセスはできるはずなのに、、

ちなみにOSディレクトリのパーミッションを777に変更すると、正常に動作します。

    $ /u01/app/oracle/product/12.1.0/dbhome_1/bin/expdp user_A/welcome1@testdb directory=dirA 
    dumpfile=expdp_A.log schemas=user_A

	Export: Release 12.1.0.2.0 - Production on Sun Dec 15 03:53:01 2019

	Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

	Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
	With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
	Advanced Analytics and Real Application Testing options
	Starting "USER_A"."SYS_EXPORT_SCHEMA_01":  user_A/********@testdb directory=dirA dumpfile=expdp_A.log schemas=user_A
	Estimate in progress using BLOCKS method...
	Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
	Total estimation using BLOCKS method: 0 KB
	Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
	Processing object type SCHEMA_EXPORT/TABLE/TABLE
	Processing object type SCHEMA_EXPORT/TABLE/COMMENT
	Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
	Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
	Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
	Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
	Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
	Master table "USER_A"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
	******************************************************************************
	Dump file set for USER_A.SYS_EXPORT_SCHEMA_01 is:
	  /var/work/Adir/expdp_A.log
	Job "USER_A"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Dec 15 03:53:42 2019 elapsed 0 00:00:38

	[oracle@node1 ~]$

### 結局どうやったか

RAC環境でoracle,gridユーザのセカンダリグループを追加する際にはクラスタウェアへ認識させる必要があります！グループ追加後にクラスタウェアを再起動することで認識されます。
pmonのプロセスを確認することでユーザのグループが追加されたことをクラスタウェアが認識しているかを確認することができます。

### CRS再起動後
    ps -ef | grep pmon
        grid     14417     1  0 05:37 ?        00:00:00 asm_pmon_+ASM1
        oracle   15136     1  0 05:37 ?        00:00:00 ora_pmon_ctestdb1
        grid     15143     1  0 05:37 ?        00:00:00 mdb_pmon_-MGMTDB
        oracle   30528 27106  0 06:06 pts/1    00:00:00 grep pmon

    cat /proc/14417/status |grep Groups

        Groups:	1200 1201 1202 54321 54323 ★54323(Aadmin)が認識されている

    cat /proc/15136/status |grep Groups

      Groups: 1101 1102 1103 1104 1201 54321 54322 54323 ★54323(Aadmin)が認識されている
 


これでようやくexpdpが可能となりました。


    $ /u01/app/oracle/product/12.1.0/dbhome_1/bin/expdp user_A/welcome1@testdb directory=dirA dumpfile=expdp_A.log schemas=user_A

	Export: Release 12.1.0.2.0 - Production on Sun Dec 15 05:58:12 2019

	Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

	Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
	With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
	Advanced Analytics and Real Application Testing options
	Starting "USER_A"."SYS_EXPORT_SCHEMA_01":  user_A/********@testdb directory=dirA dumpfile=expdp_A.log schemas=user_A
	Estimate in progress using BLOCKS method...
	Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
	Total estimation using BLOCKS method: 0 KB
	Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
	Processing object type SCHEMA_EXPORT/TABLE/TABLE
	Processing object type SCHEMA_EXPORT/TABLE/COMMENT
	Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
	Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
	Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
	Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
	Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
	Master table "USER_A"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
	******************************************************************************
	Dump file set for USER_A.SYS_EXPORT_SCHEMA_01 is:
	  /var/work/Adir/expdp_A.log
	Job "USER_A"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Dec 15 05:58:36 2019 elapsed 0 00:00:23

実現したかったアクセス制御もできております。

    $ id
    uid=54323(Badmin) gid=54324(Badmin) groups=54324(Badmin)
    $ cd /var/work/Adir/
    -bash: cd: /var/work/Adir/: Permission denied
    $ ls -l /var/work/Adir/
    ls: cannot open directory /var/work/Adir/: Permission denied

以上になります。


JPOUGアドベントカレンダー2019の19日目の記事もお楽しみに～