Corredor

ウェブ、プログラミングの勉強メモ。

Windows7 で Oracle 12c を使う (環境構築)

前回の記事で Windows7 に Oracle12c をインストールした。

neos21.hatenablog.com

neos21.hatenablog.com

今回はプラガブル・データベースにユーザを作り、テーブルを1つ作るところまでやってみる。

プラガブル・データベースって何?

インストール時に「グローバル・データベース名」に「orcl」、「プラガブル・データベース名」に「pdborcl」というデフォルト名をそのまま設定していたもの。この「プラガブル・データベース」って何?というところから分かっていないと、次の作業が進められない。

プラガブルデータベースの概念は以下のサイトが分かりやすかったので引用する。

Oracle 12cでは、まず「マルチテナントコンテナデータベース」(CDB)と呼ばれる親DBが存在し、その下に「プラガブルデータベース」(PDB)と呼ばれる子DBが存在します。
PDBは仮想DBのようなもので、1つのインスタンス上で複数作成・起動することができます。

そしてCDBとPDBには下記のルールがあります。

  • 通常のローカル接続(11gR2までと同じように接続)した場合、CDBに接続される。
  • CDBにはユーザスキーマを作成することはできない。(ORA-65096となる)
  • ユーザスキーマはPDBに接続して作成する必要がある。
  • CDBからはユーザスキーマが見えない。

Oracle 11g までは、データベースごとにプロセスが分かれており、制御ファイルやログファイルもデータベースごとにそれぞれ作成するつくりになっていた。

これが Oracle 12c では、コンテナデータベース (CDB) 1つがプロセスとして起動しており、その下に仮想的な DB といえるプラガブルデータベース (PDB) が複数接続できる、ということ。「プラガブル」というだけあって、それぞれのプラガブルデータベースは、他のコンテナデータベースに繋ぎ直したりもできるみたい。

で、上記引用の中にもあるとおり、ユーザスキーマを作る先はプラガブルデータベースであって、コンテナデータベースには作れないようだ。

ということで、冒頭に「プラガブル・データベースにユーザを作り」と書いた次第。

詳細な動作は以下のページも参考になる。

でわでわさっそく。

では、さっそく環境構築を進めていく。

大部分は以下のサイトに沿って作業を進めた。

そのため、手順も引用。

  1. Oracle起動状態の確認
  2. tnsnames.oraの修正
  3. PDBのオープン
  4. ユーザーの作成
  5. PDBORCLに接続
  6. テーブル作成、データの登録、データの取得

1. Oracle 起動状態の確認

「管理ツール」→「サービス」より、以下を「起動」しておく。名称はデフォルト設定でインストールしたときの名称なので、各自読み替える。

  • OracleServiceORCL (OracleService)
  • OracleOraDB12Home1TNSListener (TNSListener)

2. tnsnames.ora の修正

自分はインストール先フォルダを変更したので多少ルート部分が違うが、C:\Oracle\product\12.1.0\dbhome_1\NETWORK\ADMIN\ にある tnsnames.ora を開いて以下を追記する。これもデフォルト設定でインストールした前提なので、変更している場合は適宜変更する。

PDBORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PDBORCL)
    )
  )

3. PDB のオープン

コマンドプロンプトより以下のとおり入力し、SQL*Plus に接続する。

Sqlplus system/password as sysdba

よく分かってないんだけど、system ユーザの後ろの password 部分は、何に変えても接続できた。デフォルトのパスワードが「password」ってワケではない様子?あとで調べる。

この時点では、CDB (コンテナ) に接続している。Show con_name; で確認すると CDB$ROOT と返ってくるので、コンテナに接続していると分かる。

SQL*Plus に接続したら、以下の SELECT 文で PDB のオープン状態を確認する。

SELECT NAME, OPEN_MODE FROM V$PDBS;

「PDBORCL」は「MOUNTED」になっているはず。この状態ではオープンしていないので、以下の SQL でオープンする。

ALTER PLUGGABLE DATABASE PDBORCL OPEN;

(この部分だけ、上述の参考サイトでは記載の SQL が誤っていたので、「Oracle12cでプラガブル・データベース(PDB)に接続しなおす方法 - 大人になったら肺呼吸」を参考にした)

もう一度さきほどの SELECT NAME, OPEN_MODE FROM V$PDBS; を入力すると、今度は「PDBORCL」が「READ WRITE」になっているはず。これで PDB がオープンされ接続できるようになる。

なお、PDB がオープンしていない状態で PDB へ接続しようとすると、ORA-01033 というエラーが出る。このエラー内容では分かりづらいので、まずは PDB がオープンされているかを確認する習慣を付けたい。

4. ユーザーの作成

次に、CDB から接続先を PDB の方に変えて、ユーザを作る。

ALTER SESSION SET CONTAINER = PDBORCL;

この状態で Show con_name; を確認すると PDBORCL が返ってくるので、プラガブルデータベースに接続していることが分かる。

以下のようにユーザを作る。

-- testUserの作成
CREATE  USER testUser
  IDENTIFIED BY "password"
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp;

-- testUserに権限を付与
GRANT CONNECT TO testUser;
GRANT CREATE TABLE TO testUser;

-- testUserの表領域usersに対する使用用容量の制限値 (QUOTA) を変更
ALTER USER testUser QUOTA UNLIMITED ON users;

これでユーザの作成と設定は完了。

5. PDBORCL に接続

一旦 quit (exit) で接続を切り、作成したユーザを使って PDB の方に直接接続してみる。ココで書いたネットサービス名 @PDBORCL が、tnsnames.ora に追記した接続記述子に変換されるワケである。

Sqlplus testUser/password@PDBORCL

無事接続できたら OK。

6. テーブル作成、データの登録、データの取得

以降はこれまでの Oracle と同様、テーブルを作ってデータを入れたり取得したり、ができるはずだ。

-- テーブルの作成
CREATE TABLE test_tbl (
  id      NUMBER,
  name    VARCHAR2(10)
);
 
-- データの登録
INSERT INTO test_tbl VALUES (1, 'abc');
 
-- データの取得
SELECT * FROM test_tbl;

ということで、Oracle 12c からは DB の概念が少し変わっているが、一度理解すればなんてことないし、より合理的で使いやすくなっていると感じる。