Oracle Cloud Infrastructureのデータベースにサンプルスキーマをインストール

**この記事は [Oracle Cloud その2 Advent Calendar 2018](https://adventar.org/calendars/3522) の 12/4 の記事として書かれています**

**Oracle Autonomous Data Warehouse Cloud Service環境（ADW）の場合は、この手順は当てはまらないので[文末](https://qiita.com/mikika/items/8ec1af54a6264e0109ee#autonomous-data-warehouseadw%E7%92%B0%E5%A2%83%E3%81%AE%E5%A0%B4%E5%90%88)ご参照ください**

**新たにCOスキーマ（Customer Orders）が発表されていました。同じくgithubダウンロード可能ですが、本手順ではCOはインストールされません。詳しくは[Announcing a New Sample Schema: Customer Orders](https://blogs.oracle.com/sql/announcing-a-new-sample-schema-customer-orders)や、[COのREADME](https://github.com/oracle/db-sample-schemas/tree/master/customer_orders)に記載があるようです。**

Oracle Database 12cリリース2以降では、最新バージョンのサンプル・スキーマのスクリプトをGitHubから入手できます。

**最新情報や、手順の詳細は下記をご参照ください。**

- [製品ドキュメント：サンプル・スキーマのインストール](https://docs.oracle.com/cd/E96517_01/comsc/installing-sample-schemas.html#GUID-1E645D09-F91F-4BA6-A286-57C5EC66321D)
- [github：Oracle Database Sample Schemas](https://github.com/oracle/db-sample-schemas/releases/latest)

サンプルスキーマは、各機能でのデモ用データとして使用している場合があり、必要に応じてインストールします。作成されるサンプルスキーマは以下です。

- HR: Human Resources
- OE: Order Entry
- PM: Product Media
- IX: Information Exchange
- SH: Sales History
- BI: Business Intelligence

以下の手順でサンプル・スキーマをインストールすると、スクリプト内でユーザー名HR、OE、PM、SH、IX、BIを**最初にdrop userします。これらのユーザが既に存在する場合はご注意ください（これらのユーザのデータが失われます）**。

# 使用した環境
- Oracle Cloud Infrastructure環境の、Database - Virtual Machines（PaaS）
- Database Version: 18.2.0

### 必要な情報

※DBaaSインスタンス作成時に指定した以下の情報が必要です

- DATABASE NAME（①ORACLE_SID）
- PDB NAME（②PDB名）
- DATABASE ADMIN PASSWORD（③DB管理者パスワード）
- ④接続文字列 ※②を使って後で確認します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/a9db79ab-3bf9-b37d-3ad4-509d204342f3.png)

# 準備 (rootユーザで実施)

※gitをインストールしてgit cloneする代わりに、GitHubのサイトからZIPバンドルをダウンロードすることも可能。この場合はダウンロードした *.zip を oracleユーザの$HOME配下に配置し展開する。

## gitのインストール

```
$ sudo su - 
# yum install -y git
```

### gitが見つからないエラーがでる場合
下記コマンドでリポジトリを追加してから yum install
(使用中のOSに合わせたリポジトリURLを指定する。以下はOracle Linux 6.xの場合)

*Setting up Install Process*
*No package git available.*
*Error: Nothing to do*

```
# yum-config-manager --add-repo https://yum.oracle.com/repo/OracleLinux/OL6/latest/x86_64/
```

### GPG公開鍵のインポートが行われておらずWarningがでる場合
下記コマンドでインポートしてからyum install
(使用中のOSに合わせて指定する。以下はOracle Linux 6.xの場合)

*warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY*

```
# wget http://yum.oracle.com/RPM-GPG-KEY-oracle-ol6
# gpg --quiet --with-fingerprint ./RPM-GPG-KEY-oracle-ol6 (Key fingerprintを確認)
# rpm --import ./RPM-GPG-KEY-oracle-ol6
```

参考：[GPGキーのダウンロードとインポート](https://docs.oracle.com/cd/E39368_01/b72803/ol_import_gpg.html)

# サンプルスキーマのインストール (oracleユーザで実施)
## rootユーザからoracleユーザになる

```
# su - oracle
```

## 環境変数を設定
ORACLE_SIDを聞かれるので①を入力する

```
$ . oraenv
ORACLE_SID = [oracle] ? orcl ← ①を入力 
```

## gitリポジトリをclone (またはダウンロードした *.zipを展開)

```
$ cd $HOME
$ git clone https://github.com/oracle/db-sample-schemas.git
```

※gitをインストールしてgit cloneする代わりに、GitHubのサイトからZIPバンドルをダウンロードした場合は、ダウンロードした *.zip を $HOME配下に配置し展開する。


## ファイル内のPATHを作業ディレクトリに合わせて変更

```
$ cd $HOME/db-sample-schemas
$ perl -p -i.bak -e 's#__SUB__CWD__#'$(pwd)'#g' *.sql */*.sql */*.dat
```

## DBへの接続文字列を確認

Private IPアドレスと、PDBのサービス名を確認して接続文字列を準備する。
lsnrctlコマンドで確認するのが簡単。

- 1521を含む行を探す
- Service "..." has 1 instance(s) の行のうち、DB作成時に指定した ②PDB名 を含む行を探す

この場合、④接続文字列は 10.0.0.5:1521/pdb1.sub11120757390.mkworksvcn.oraclevcn.com となる。

（接続文字列を host:port/service_name で指定するのは、tnsの簡易接続ネーミング・メソッド。tnsnames.oraファイルに設定を書かなくても接続できる。）

```
$ lsnrctl status

LSNRCTL for Linux: Version 18.0.0.0.0 - Production on 22-NOV-2018 10:19:36
...(中略)...
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.0.0.5)(PORT=1521))) ★★Private IPアドレス
...(中略)...
Service "orcl_iad1x5.sub11120757390.mkworksvcn.oraclevcn.com" has 1 instance(s).
  Instance "orcl", status READY, has 2 handler(s) for this service...
Service "pdb1.sub11120757390.mkworksvcn.oraclevcn.com" has 1 instance(s). ★★サービス名
  Instance "orcl", status READY, has 2 handler(s) for this service...
The command completed successfully
$
```


## SQL実行(サンプルスキーマのインストール)


mksample.sql をこういう感じで実行する。

$ sqlplus system/systempw@<接続文字列> @mksample systempw syspw hrpw oepw pmpw ixpw shpw bipw users temp <ログディレクトリ名> <接続文字列>

### 実行例

```
$ sqlplus system/systempw@接続文字列 @mksample systempw syspw hrPW##1234 oePW##1234 pmPW##1234 ixPW##1234 shPW##1234 biPW##1234 users temp /tmp/sampleinstall/ 接続文字列
```

- /tmp/sampleinstall/
    - ログファイルの出力先ディレクトリを指定(任意の場所)
    - **新規ディレクトリ推奨** (この例では /tmp はあるが その下に sampleinstall は存在しない。スクリプト内でmkdirする。)
    - **PATHの最後の / は必須**
- 接続文字列
    - ④接続文字列 を指定    
    - 例) 10.0.0.5:1521/pdb1.sub11120757390.mkworksvcn.oraclevcn.com
- systempw syspw
    - 両方とも ③DB管理者パスワード を指定
    - **実行例の中で、合計3ヶ所 登場してます**
- hrpw oepw pmpw ixpw shpw bipw
    - HR, OE, PM, IX, SH, BIユーザのパスワードがそれぞれここで指定した値になる
    - 事前にパスワードポリシーを確認し(補足2)、ポリシーに合ったパスワードを指定
    - 簡単のため各スキーマのパスワードを記載していますが、適宜変更ください
- users temp
    - 各サンプルスキーマのユーザ表領域、一時表領域の名前を指定する。このままでOK。


# 補足1：サンプルスキーマの削除

削除するには、drop_sch.sqlを実行する。

```
$ . oraenv
$ cd $HOME/db-sample-schemas
$ sqlplus system/systempw@connect_string
@drop_sch.sql
```

実行中に、SYSTEMのパスワード、接続文字列、この実行のログファイル名を聞かれるので指定する。

# 補足2：パスワードの複雑性ルールの確認方法

下の例では、DEFAULTプロファイルのユーザの、パスワードの複雑性ルールを検証するファンクションとして、ORA12C_STRONG_VERIFY_FUNCTION が指定されていることが分かります。
（少なくとも2つの大文字、2つの小文字、2つの数値、2つの特殊文字(_, #, -)を含む必要がある）

```
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> ALTER SESSION SET CONTAINER=pdb1; <-- PDB1に接続
SQL> show con_name

CON_NAME
------------------------------
PDB1 <-- PDB1に繋がっていることを確認

SQL> select profile, resource_name, limit from dba_profiles where RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION'
  2  and profile='DEFAULT';

PROFILE        RESOURCE_NAME                    LIMIT
-------------- -------------------------------- ------------------------------
DEFAULT        PASSWORD_VERIFY_FUNCTION         ORA12C_STRONG_VERIFY_FUNCTION
```

**参考**
- [製品ドキュメント：Oracle Database - Security Guide - ORA12C_STRONG_VERIFY_FUNCTION](https://docs.oracle.com/cd/E96517_01/dbseg/configuring-authentication.html#GUID-1168CD4D-659E-432D-9CB7-F5733129657D)


# Autonomous Data Warehouse（ADW）環境の場合

ADW環境ではあらかじめSHスキーマとSSBスキーマが存在し、参照できる。上のSHとこのSHが同じがどうかは未確認。

[Autonomous Data Warehouseでサンプル・データ・セットを使用](https://docs.oracle.com/cd/E83857_01/paas/autonomous-data-warehouse-cloud/user/getting-started.html#GUID-4BB2B49B-0C20-4E38-BCC7-A61D3F45390B)

>独自の表を作成せずにサービスの使用を開始したいユーザーの場合、Autonomous Data Warehouseは読み取り専用のSales HistoryおよびStar Schema Benchmarkデータ・セットを提供します。

>これらのデータセットは、それぞれOracle DatabaseスキーマSHおよびSSBとして提供されます。 どのユーザーも、手動構成なしでこれらのデータ・セットを問合せできます。