[OCI]Database Clientを利用したADBのAWRダンプ取得/ロード

# 1.はじめに
ADBはBaseDBと異なり、運用管理が自動化される反面、OSへの接続ができません。
LinuxOS上からSQL*Plus等でDB接続を行いたい場合、別途Computeインスタンスを構築し、
そこにClientを導入して接続するなどの方法でADBへの接続が可能です。

Oracle接続のClientには「Oracle Database Client」と「Oracle Instant Client」の2種類のClientがあります。
単純にSQL*Plus等で接続できればよい場合、Instant Clientの利用がシンプルで簡単です。
以下記事にInstant ClientでのADB接続方法について記載していますのでご参照ください。
[[OCI]ComputeインスタンスからADBへの接続設定(OL8)](https://qiita.com/twakimura/items/576d569bf195ef81280e)

今回、ADBのAWR情報のダンプ取得やロードをする要件があり、$ORACLE_HOME/rdbms/admin/awrextr.sqlやawrload.sqlの利用を行いたいため、
Instant ClientではなくDatabase Clientを導入してADB接続を行う手順を記載します。

OCI上のVCN、Compute、ADB作成までは前回の記事と同様なので、必要であれば上記リンクの記事を参考に構築します。
5.Computeインスタンスの設定部分からは設定内容が異なりますので本記事を参考にしていただければと思います。

:::note warn
警告
Oracle Linux 8環境上で、23aiのDatabase Clientで構築を進めたところ、以下のエラーが発生し解消できなかったため、ここでは21cのDatabase Clientを利用します。

ORA-28884: invalid cipher suite
:::

### 参考リンク
- [Database Clientインストレーション・ガイド (23ai for Linux)](https://docs.oracle.com/cd/G11854_01/lacli/index.html)

- Oracle Database 23ai ソフトウェアダウンロードページ
https://www.oracle.com/database/technologies/oracle23ai-linux-downloads.html

- [Database Clientインストレーション・ガイド (21c for Linux)](https://docs.oracle.com/cd/F39414_01/lacli/index.html)

- Oracle Database 21c ソフトウェアダウンロードページ
https://www.oracle.com/database/technologies/oracle21c-linux-downloads.html

# 2.Database Client のインストール
## 2-1.Oracleユーザーの作成
    [opc@<host名> ~]$ sudo su - 
    [root@<host名> ~]# /usr/sbin/groupadd -g 54321 oinstall
    [root@<host名> ~]# /usr/sbin/useradd -u 54321 -g oinstall oracle
    [root@<host名> ~]# exit
    [opc@<host名> ~]$ sudo su - oracle
    [oracle@<host名> ~]$ pwd
    /home/oracle
    [oracle@<host名> ~]$ vi .bashrc

/home/oracleの.bashrcに以下を記載しておきます。

    ORACLE_HOME=/u01/app/oracle/product/21.0.0/client_1; export ORACLE_HOME
    PATH=$PATH:/u01/app/oracle/product/21.0.0/client_1/bin; export PATH
    LD_LIBRARY_PATH=/u01/app/oracle/product/21.0.0/client_1/lib; export LD_LIBRARY_PATH
    TNS_ADMIN=/home/oracle/wallet; export TNS_ADMIN

その後、もう一度suを実行するか、.bashrcを読み込みなおしておきます。

    [oracle@<host名> ~]$ . .bashrc

## 2-2.Database Client ソフトウェアのダウンロード
以下のOracle Database 21c ソフトウェアダウンロードページより、Oracle Database 21c Clientをダウンロードします。
本記事では ～client_home.zip の方を利用した手順を記載します。

- Oracle Database 21c ソフトウェアダウンロードページ
https://www.oracle.com/database/technologies/oracle21c-linux-downloads.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514221/34bebf3a-a3c5-4f4f-972f-f49693e0129f.png)

上記のダウンロードページからzipをローカルにダウンロードし、Compute環境にアップロードする方法でもいいのですが、
ここではComputeインスタンス上からダウンロードする方法を紹介します。

1. まず、ダウンロードページからライセンスに同意し、ダウンロードを開始します。
2. ダウンロードが開始されたらダウンロードを一時停止します。
3. ダウンロードリンクのURLを確認します。
Chromeの場合は「すべてのダウンロード履歴」「ダウンロードリンクをコピー」でURLをコピーできます。
4. Computeインスタンス上でダウンロードディレクトリに移動し、curlコマンドにコピーしたURLを指定することでCompute上に直接ダウンロードが可能です。
###

    [oracle@<host名> ~]$ cd /tmp
    [oracle@<host名> tmp]$ curl -0 curl -0 https://download.oracle.com/otn/linux/oracle21c/LINUX.X64_213000_client_home.zip?AuthParam=xxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > LINUX.X64_213000_client_home.zip

## 2-3.Database Client ソフトウェアの展開
    [oracle@<host名> ~]$ mkdir -p /u01/app/oracle/product/21.0.0/client_1
    [oracle@<host名> ~]$ cd $ORACLE_HOME
    [oracle@<host名> client_1]$ unzip /tmp/LINUX.X64_213000_client_home.zip


## 2-4.X転送設定
今回はGUIでDatabase Clientをインストールしようと思うので、Xクライアントをインストールします。
サイレントインストールをする場合は、この手順は不要です。

    [root@<host名> ~]# yum install xauth libXtst libXrender -y

また、動作確認用のアプリケーションもインストールします。
OL7とOL8でコマンドが異なるため読み分けてください。

    - OL7の場合
    [root@<host名> ~]# yum install xorg-x11-apps -y

    - OL8の場合
    [root@<host名> ~]# yum --enablerepo=ol8_codeready_builder install xorg-x11-apps -y

sshd設定を行います。
ここでは X11Forwarding が yes であることと、 AddressFamily が inet であることを確認します。

| パラメータ           | 設定値 |
|:--------------------|:------|
| X11Forwarding       | yes   |
| AddressFamily       | inet  |

    [root@<host名> ~]# grep -e X11UseLocalhost -e X11Forwarding -e AddressFamily /etc/ssh/sshd_config    
    #AddressFamily any
    X11Forwarding yes
    #X11UseLocalhost yes
    #       X11Forwarding no
    
    [root@<host名> ~]# vi /etc/ssh/sshd_config
    - AddressFamily inetとなるように修正する。
    
    [root@<host名> ~]# grep -e X11UseLocalhost -e X11Forwarding -e AddressFamily /etc/ssh/sshd_config    
    AddressFamily inet
    X11Forwarding yes
    #X11UseLocalhost yes
    #       X11Forwarding no
    
    [root@<host名> ~]# systemctl restart sshd
    
puttyでComputeに接続する際、以下の設定が有効になっていることを確認します。
Connection - SSH - X11 - Enable X11 forwarding
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514221/0c7c2e4e-0d79-4ea8-a132-222ac8c752b9.png)

X11 forwarding を有効にした putty でサーバーに接続すると、そのログインユーザーにXウィンドウの設定が設定されます。
ですが、OCIにはopcユーザーで接続し、Database Clientのインストールはoracleユーザーで実施するため、
Xウィンドウの各設定をopcユーザーからoracleユーザーに引き継ぎます。

| パラメータ           | 設定値                  |
|:--------------------|:-----------------------|
| DISPLAY             | opcユーザーで確認した値  |
| xauth               | opcユーザーで確認した値  |

    [opc@<host名> ~]$ echo $DISPLAY
    localhost:10.0
    [opc@<host名> ~]$ xauth list
    <host名>/unix:10  MIT-MAGIC-COOKIE-1  753126dab3a536d91df303d1b7bb9fc7
    [opc@<host名> ~]$ sudo -i su - oracle
    Last login: Thu Apr 24 00:25:14 GMT 2025 on pts/0
    [oracle@<host名> ~]$ export DISPLAY=localhost:10.0
    [oracle@<host名> ~]$ xauth add <host名>/unix:10  MIT-MAGIC-COOKIE-1  753126dab3a536d91df303d1b7bb9fc7
    [oracle@<host名> ~]$ xeyes &

最後に xeyes でGUI画面が確認できれば成功です。

## 2-5.インストーラ起動

    [oracle@<host名> ~]$ cd $ORACLE_HOME
    [oracle@<host名> client_1]$ ./runInstaller

## 2-6.インストールの事前チェック結果（推奨設定）の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514221/4ae66c93-0c13-45a1-a126-795503f85028.png)

## 2-7.warningの解消
チェック結果warningとなった個所を解消します。
まず、推奨されているライブラリをインストールします。

    [root@<host名> ~]# yum install compat-openssl10 -y
    [root@<host名> ~]# yum install ksh -y

kernelパラメータは現在の設定を確認して推奨された値を/etc/sysctl.confに反映します。
warningが出たパラメータの現在値を確認します。

    [root@<host名> ~]# sysctl -a | grep file-max
    fs.file-max = 1597539
    [root@<host名> ~]# sysctl -a | grep rmem_default
    net.core.rmem_default = 212992
    [root@<host名> ~]# sysctl -a | grep rmem_max
    net.core.rmem_max = 212992
    [root@<host名> ~]# sysctl -a | grep wmem_default
    net.core.wmem_default = 212992
    [root@<host名> ~]# sysctl -a | grep wmem_max
    net.core.wmem_max = 212992
    [root@<host名> ~]# sysctl -a | grep aio-max-nr
    fs.aio-max-nr = 65536

/etc/sysctl.confの編集

    [root@<host名> ~]# vi /etc/sysctl.conf
    - 以下の内容を反映
    fs.file-max = 6815744
    net.core.rmem_default = 262144
    net.core.rmem_max = 4194304
    net.core.wmem_default = 262144
    net.core.wmem_max = 1048576
    fs.aio-max-nr = 1048576 

設定のロード

    [root@<host名> ~]# sysctl -a | grep file-max
    fs.file-max = 1597539
    [root@<host名> ~]# sysctl -p
    kernel.unknown_nmi_panic = 1
    fs.file-max = 6815744
    net.core.rmem_default = 262144
    net.core.rmem_max = 4194304
    net.core.wmem_default = 262144
    net.core.wmem_max = 1048576
    fs.aio-max-nr = 1048576
    [root@<host名> ~]# sysctl -a | grep file-max
    fs.file-max = 6815744

## 2-8.インストールの再開
再度チェックを実施し、warningが解消されたことを確認し、インストールを進めます。
（または解消しなくてもいいもののみになった場合はIgnore Allにチェックを入れて進めます）
途中でrootユーザーでscriptを流す指示が出てきたら指示通りにscriptを実行します。


# 3.ADBへの接続設定
## 3-1.walletのダウンロード
ADBのデータベース接続メニューからインスタンス・ウォレットをダウンロードし、Computeインスタンスに配置します。
ウォレットディレクトリは /home/oracle/wallet としています。

    [oracle@<host名> ~]$ mkdir wallet
    [oracle@<host名> ~]$ cd wallet
    [oracle@<host名> wallet]$ unzip /tmp/Wallet_<ADB名>.zip
    [oracle@<host名> wallet]$ ls
    cwallet.sso  ewallet.p12  ewallet.pem  keystore.jks  ojdbc.properties  README  sqlnet.ora  tnsnames.ora  truststore.jks
    [oracle@<host名> wallet]$ cat tnsnames.ora
    - 接続文字列を確認
    [oracle@<host名> wallet]$ vi sqlnet.ora
    - DIRECTORYの値を$TNS_ADMINに変更
    DIRECTORY=$TNS_ADMIN

## 3-2.接続確認

    [oracle@<host名> ~]$ sqlplus admin/<password>@<tnsnames.oraで確認した接続文字列>
    
    SQL*Plus: Release 21.0.0.0.0 - Production on Thu Apr 24 10:01:04 2025
    Version 21.3.0.0.0
    
    Copyright (c) 1982, 2021, Oracle.  All rights reserved.
    
    Last Successful login time: Thu Apr 24 2025 09:05:28 +00:00
    
    Connected to:
    Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud and Engineered Systems
    Version 23.8.0.25.05
    
    SQL>

# 4.ADBからAWRダンプ取得
## 4-1.AWRダンプ取得
dbidとsnapの範囲を確認します。

    SQL> select dbid,min(snap_id),max(snap_id) from awr_pdb_snapshot group by dbid;

DATA_PUMP_DIR の設定を確認します。

    SQL> select * from all_directories where directory_name='DATA_PUMP_DIR';

以下のシェルを準備します。

```sh:awrdump.sh
#!/bin/bash

##### var setting
v_dbuser='admin'
v_dbpw='<password>'
v_constr='<接続詞>'

v_dmpfilename='<dumpファイル名>'
v_directory_name='DATA_PUMP_DIR'

v_dbid=<dbid>
v_begin_snap=<begin_snap>
v_end_snap=<end_snap>

################################
######### main process #########
################################

echo "START AWREXPORT TIME : $(date '+%Y/%m/%d %H:%M:%S')" 

sqlplus -s ${v_dbuser}/${v_dbpw}@${v_constr} <<SQLEND
    DEFINE dbid=${v_dbid}
    DEFINE num_days=1
    DEFINE begin_snap=${v_begin_snap}
    DEFINE end_snap=${v_end_snap}
    DEFINE file_name=${v_dmpfilename}
    DEFINE directory_name=${v_directory_name}
    DEFINE include_sqlmon='no' 
    @?/rdbms/admin/awrextr.sql
    --select sysdate from dual;
SQLEND

echo "END AWREXPORT TIME : $(date '+%Y/%m/%d %H:%M:%S')"
exit
```

実行します。

    [oracle@<host名> awrdump]$ ./awrdump.sh

ADB上のディレクトリオブジェクトにAWRダンプが取得されます。
ですが、ADBのローカル上に配置されているため、そのままではダンプをダウンロードすることができません。

    SQL> select * from DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');

そのため、ADB上のディレクトリからオブジェクトストレージに以下の手順でファイルをコピーする必要があります。

## 4-2.認証トークンの作成
https://docs.oracle.com/ja-jp/iaas/Content/Registry/Tasks/registrygettingauthtoken.htm

上記を参考に、OCIのプロファイルから認証トークンを作成します。
認証トークンは後から確認できないため、作成後、トークンをコピーしておきます。

## 4-3.クレデンシャルの作成
ADB上で以下のコマンドを実行し、クレデンシャルを作成します。
クレデンシャル名は任意の名称にし、usernameとpasswordは認証トークンを作成したユーザーと作成した認証トークンを指定します。

```plsql
BEGIN
    DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name =>  '<credential名>',
        username        =>  '<OCIのユーザー名>',
        password        =>  '<発行した認証トークン文字列>'
    );
END;
/
```

## 4-4.ADB上からオブジェクトストレージの確認
上記でクレデンシャルが作成できたら、ADB上からオブジェクトストレージが見えるか確認します。
接続用にオブジェクトストレージの情報もOCIコンソール上で確認しておきます。


| パラメータ             | 設定値                      |
|:----------------------|:----------------------------|
| credential            | 上記で作成したcredential名   |
| region                | ap-tokyo-1 など。           |
| ObjectStorageNameSpace| バケットの詳細のネームスペース|
| BucketName            | バケット名                  |


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2514221/63f30ed9-f488-439d-b9b9-94eee7060f7d.png)

    SQL> select * from dbms_cloud.list_objects('<credential>','https://objectstorage.<region>.oraclecloud.com/n/<ObjectStorageNameSpace>/b/<BucketName>/o/');

## 4-5.ダンプファイルをオブジェクトストレージに配置
再度ダンプファイルを確認します。
DATA_PUMP_DIRにはダンプファイルとログファイルが出力されていると思います。

    SQL> select * from DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');

DBMS_CLOUD.PUT_OBJECTを使用してダンプファイルをオブジェクトストレージに配置します。

```plsql
BEGIN
    DBMS_CLOUD.PUT_OBJECT(
      credential_name =>  '<credential名>',
      object_uri      =>  'https://objectstorage.<region>.oraclecloud.com/n/<ObjectStorageNameSpace>/b/<BucketName>/o/',
      directory_name  =>  'DATA_PUMP_DIR',
      file_name       =>  '<dumpファイル名>'
    );
END;
/
```

オブジェクトストレージに配置できたことが確認できたら、ADBのDATA_PUBP_DIR上のファイルは不要となるので削除しておきます。

```plsql
BEGIN
    DBMS_CLOUD.DELETE_FILE(
        directory_name  =>  'DATA_PUMP_DIR',
        file_name       =>  '<dumpファイル名>'
    );
END;
/
```

# 5.ADBへのAWRダンプデータロード
## 5-1.ロードしたいAWRダンプの配置
別の環境で取得したAWRダンプをオブジェクトストレージにアップロードします。
オブジェクトストレージへのアップロードはGUIのドラッグ＆ドロップで行います。

DBMS_CLOUD.GET_OBJECTを使用し、オブジェクトストレージにアップロードしたダンプファイルをDATA_PUMP_DIRに配置します。
その際、PUT_OBJECTと異なり、ファイル名はfile_nameパラメータではなく、object_uriに含めます。

```plsql
BEGIN
    DBMS_CLOUD.GET_OBJECT(
      credential_name =>  '<credential名>',
      object_uri      =>  'https://objectstorage.<region>.oraclecloud.com/n/<ObjectStorageNameSpace>/b/<BucketName>/o/<dumpファイル名>',
      directory_name  =>  'DATA_PUMP_DIR'
    );
END;
/
```
DATA_PUMP_DIRに配置できたことを確認します。

    SQL> select * from DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');

## 5-2.AWRダンプロード
以下のシェルを準備します。

```sh:awrload.sh
#!/bin/bash

##### var setting
v_dbuser='admin'
v_dbpw='<password>'
v_constr='<接続詞>'

v_dmpfilename='<dumpファイル名　※.dmpは付けない>'
v_directory_name='DATA_PUMP_DIR'

################################
######### main process #########
################################

echo "START AWRIMPORT TIME : $(date '+%Y/%m/%d %H:%M:%S')" 

sqlplus -s ${v_dbuser}/${v_dbpw}@${v_constr} <<SQLEND
    DEFINE file_name=${v_dmpfilename}
    DEFINE directory_name=${v_directory_name}
    @?/rdbms/admin/awrload.sql
    --select sysdate from dual;
SQLEND

echo "END AWRIMPORT TIME : $(date '+%Y/%m/%d %H:%M:%S')"
exit
```

シェルに実行権限を付け、実行します。

    [oracle@<host名> awrload]$ ./awrload.sh

ロードできたことを確認します。

    SQL> select dbid,min(snap_id),max(snap_id) from awr_pdb_snapshot group by dbid;

## 5-3.ダンプファイルの削除
ADBのDATA_PUMP_DIR上のファイルを削除します。

    SQL> select * from DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');

上記で見つかった不要なファイルをDBMS_CLOUD.DELETE_FILEで削除します。
dmpファイルとlogファイルがあるはずです。

```plsql
BEGIN
    DBMS_CLOUD.DELETE_FILE(
        directory_name  =>  'DATA_PUMP_DIR',
        file_name       =>  '<dumpファイル名>'
    );
END;
/
```

オブジェクトストレージのファイル削除はGUI上で削除できます。

以上で、ADB上のAWRダンプの取得、ADBへのAWRダンプのロードができました。