Oracle Enterprise Managerをコマンドで操作する際のTips

# はじめに
## Oracle Enterprise Manager とは
[Oracle Enterprise Manager(以下OEM)](https://docs.oracle.com/en/enterprise-manager/) とは Oracle の各製品を管理することができるプラットフォームです。ダッシュボード的な使い方だけではなくメトリック監視や Database メンテナンスなど各種操作が可能になっています。

# 本記事の目的
OEM は WebUI からの操作ができますが `emcli` という OS コマンドでの操作が一部可能です。

OEM でやることは基本的に WebUI で完結するのですが、自動化などを考えると `emcli` を利用する場面も出てきます(WebUIが重いこともありますし)。

本記事では今まで行った `emcli` での便利だなと思った操作について紹介したいと思います。まだそんなに数があるわけではないので今後も都度加筆していきます。

# 前提
- 本記事で利用している OEM は 13.5.0.0.0
- 全てのサブコマンドは[こちらのリファレンス](https://docs.oracle.com/cd/F45244_01/emcli/em-cli-verbs.html)を確認してください

# Tips
## 1. ログインとログアウトの仕様について
まずログイン・ログアウトは以下のコマンドで可能です。

```bash
## ログイン
emcli login -username=<username>

## ログアウト
emcli logout
```

ただ、emcliでログインできるのは OS ユーザを跨いでいても1人までとなっています。

そのため以下のような場合、問題が発生します。

```
1. Aさんがログイン
2. Bさんがログイン ← エラー
```

実際には以下のようなエラー文になります。

```bash
Error: Already logged in as user "sysman". Use "emcli logout" to logout the current user.
```

そのため排他制御を導入する必要があるのでご注意ください。

## 2. RAC Database と Database Instance の登録
RAC Database と Database Instance を OEM に追加することがあると思います。

この時 WebUI からやると時間がかかることがあるので、以下のように `emcli` からの実行が可能です。

ただしその RAC Database が所属する RAC Cluster や Host は登録されている前提です。

```bash
## まずは Database Instance 登録( Instance 数分繰り返す)
### <インスタンスのターゲット名>はOEM上で識別される名前なので、任意のものを入力してください
### <ホストのターゲット名>はあらかじめOEM上に登録されているホスト名です(OEM上の名前)
### -credentialsの<username>は接続に用いるDBユーザ名を入力してください
### -propertiesにはDBに接続するための情報を入れてください(接続先ホスト名とPORTとORACLE_SIDとORACLE_HOME)
emcli add_target -name="<インスタンスのターゲット名>"
  -type="oracle_database"
  -host="<ホストのターゲット名>" \
  -credentials="UserName:<username>;password:PWD_FILE;Role:Normal" \
  -properties="SID:<sid>;Port:<local_listener_port>;OracleHome:<ORACLE_HOME>;MachineName:<接続先ホスト名>" \
  -input_file="PWD_FILE:<path_to_password_file>"

## RAC Databaseの登録
### <RAC Databaseのターゲット名>はOEM上で識別される名前なので、任意のものを入力してください
### <1ノード目のホストのターゲット名>はインスタンス番号1が稼働するホストのターゲット名です
### -propertiesには接続先を記載してください(クラスタのターゲット名はOEM上でのクラスタ名)
### -instancesにはRAC Databaseに登録するインスタンスのターゲット名を入力してください
emcli add_target -name="<RAC Databaseのターゲット名>" 
  -type="rac_database"
  -host="<1ノード目のホストのターゲット名>" \
  -monitor_mode="1"
  -properties="ServiceName:<接続先Service名>;ClusterName:<クラスタのターゲット名>" \
  -instances="<先に登録したインスタンスのターゲット名1>:oracle_database;<先に登録したインスタンスのターゲット名2>:oracle_database;..."
```

そもそも RAC Cluster や Host の登録も `emcli` でできるはずなので、試したら追記します。

## 3. OEM ユーザの作成
OEM にログインするためのユーザを作成します。

今回は外部ユーザではなく OEM 上のユーザを作成します。

以下では特定の DB の ASH や SQLワークスペースに接続できる権限を付与していますが `emcli get_supported_privileges` で付与できる権限の一覧を確認できます。

```bash
emcli create_user \
  -name=<username> \
  -type=EM_USER \
  -password=<password> \
  -expired=<true | false> \
  -desc="<description>" \
  -privilege="DB_PERFORMANCE_HOME_VIEW;<インスタンスのターゲット名>:oracle_database" \
  -privilege="DB_PERFORMANCE_HOME_VIEW;<RAC Databaseのターゲット名>:rac_database" \
  -privilege="DB_PERFORMANCE_HOME_VIEW;<PDBのターゲット名>:oracle_pdb" \
  -privilege="DB_RUN_SQL;<インスタンスのターゲット名>:oracle_database" \
  -privilege="DB_RUN_SQL;<RAC Databaseのターゲット名>:rac_database" \
  -privilege="DB_RUN_SQL;<PDBのターゲット名>:oracle_pdb"
```

## 4. ターゲットの検索
`emcli list`での検索が柔軟です良いかと考えています。

なお `-resource` の値一覧は `emcli -help` で確認可能です。また `-resource` 毎の詳細は `emcli list -help -resource="<resource>"` で確認できます。

以下は OEM Target を検索する例です。
```bash
## OEM Targetの検索
### <target_name>は検索したいターゲット名、演算子を = から like にして SQL でのワイルドカードを用いることもできます
emcli list -resource="Targets" -search="TARGET_TYPE ='rac_database'" -search="TARGET_NAME ='<target_name>'"
```

また`columns`や`format`で表示側を調整することも可能です。

# まとめ
本記事では `emcli` コマンドを用いた作業をいくつか紹介しました。

ログインの仕様とか少しトリッキーなところもありますが、利用できると OEM の操作を自動化でき作業時間の短縮が見込めます。

今後も新しい知見が貯まり次第追記していきますので、参考になれば嬉しいです！