技術ブログ
プラガブルデータベースではない、通常のデータベースをPDBとしてCDBにplugしてみます。
基本的には以下のマニュアルに記載の手順を実行するだけです。
plugしようとしている通常のデータベースにSYSユーザーで接続し、テスト用のユーザーとデータを作成します。
[oracle@l63x64a ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.1.0 Production on 金 8月 2 04:25:57 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. アイドル・インスタンスに接続しました。 SQL> startup ORACLEインスタンスが起動しました。 Total System Global Area 417546240 bytes Fixed Size 2289064 bytes Variable Size 268436056 bytes Database Buffers 142606336 bytes Redo Buffers 4214784 bytes データベースがマウントされました。 データベースがオープンされました。 SQL> CREATE USER rywatabe IDENTIFIED BY rywatabe; ユーザーが作成されました。 SQL> GRANT DBA TO rywatabe; 権限付与が成功しました。 SQL> create table rywatabe.test (n number); 表が作成されました。 SQL> insert into rywatabe.test values(1); 1行が作成されました。 SQL> commit; コミットが完了しました。
インスタンスをshutdownして、読み取り専用でOPENし、DBMS_PDB.DESCRIBEを実行して メタデータを作成します。
SQL> SHUTDOWN IMMEDIATE データベースがクローズされました。 データベースがディスマウントされました。 ORACLEインスタンスがシャットダウンされました。 SQL> startup mount ORACLEインスタンスが起動しました。 Total System Global Area 417546240 bytes Fixed Size 2289064 bytes Variable Size 268436056 bytes Database Buffers 142606336 bytes Redo Buffers 4214784 bytes データベースがマウントされました。 SQL> ALTER DATABASE OPEN READ ONLY; データベースが変更されました。 SQL> SELECT name, value FROM V$PARAMETER WHERE NAME = 'compatible'; NAME -------------------------------------------------------------------------------- VALUE -------------------------------------------------------------------------------- compatible 12.1.0.0.0 SQL> exec DBMS_PDB.DESCRIBE(pdb_descr_file => '/var/tmp/c101.xml'); PL/SQLプロシージャが正常に完了しました。 SQL> SHUTDOWN IMMEDIATE データベースがクローズされました。 データベースがディスマウントされました。 ORACLEインスタンスがシャットダウンされました。 SQL>
次にコンテナデータベースに接続し、CREATE PLUGGABLE DATABASE USING ... でデータベースをplugします。
SYS@c101cdb##CDB$ROOT> SELECT PDB_NAME, STATUS FROM CDB_PDBS; PDB_NAME STATUS ------------------------ ------------- PDB$SEED NORMAL PDB1 NEW SYS@c101cdb##CDB$ROOT> CREATE PLUGGABLE DATABASE pdb2 USING '/var/tmp/c101.xml' 2 COPY 3 FILE_NAME_CONVERT = ('/u02/app/oracle/oradata/c101/', '/u02/app/oracle/oradata/c101cdb/pdb2/'); プラガブル・データベースが作成されました。 SYS@c101cdb##CDB$ROOT> SELECT PDB_NAME, STATUS FROM CDB_PDBS; PDB_NAME STATUS ------------------------ ------------- PDB2 NEW PDB$SEED NORMAL PDB1 NEW
この後、PDBで @?/rdbms/admin/noncdb_to_pdb.sql を実行します。
SYS@c101cdb##PDB2> @?/rdbms/admin/noncdb_to_pdb.sql SYS@c101cdb##PDB2> SET SERVEROUTPUT ON SYS@c101cdb##PDB2> SET FEEDBACK 1 SYS@c101cdb##PDB2> SET NUMWIDTH 10 SYS@c101cdb##PDB2> SET LINESIZE 80 SYS@c101cdb##PDB2> SET TRIMSPOOL ON : : 様々な処理が実行されます : SYS@c101cdb##PDB2> -- leave the PDB in the same state it was when we started SYS@c101cdb##PDB2> BEGIN 2 execute immediate '&open_sql &restricted_state'; 3 EXCEPTION 4 WHEN OTHERS THEN 5 BEGIN 6 IF (sqlcode <> -900) THEN 7 RAISE; 8 END IF; 9 END; 10 END; 11 / PL/SQLプロシージャが正常に完了しました。 SYS@c101cdb##PDB2> SYS@c101cdb##PDB2> WHENEVER SQLERROR CONTINUE;
引き続きDBMS_PDB.SYNC_PDB();を実行します。
SYS@c101cdb##PDB2> ALTER PLUGGABLE DATABASE pdb2 OPEN READ WRITE RESTRICTED; プラガブル・データベースが変更されました。 SYS@c101cdb##PDB2> ALTER SESSION SET CONTAINER = pdb2; セッションが変更されました。 SYS@c101cdb##PDB2> exec DBMS_PDB.SYNC_PDB(); PL/SQLプロシージャが正常に完了しました。 SYS@c101cdb##PDB2> SHUTDOWN IMMEDIATE プラガブル・データベースがクローズされました。
PDBにplug前のデータがあることを確認します。
SYS@c101cdb##PDB2> STARTUP プラガブル・データベースがオープンされました。SYS@c101cdb##PDB2> SYS@c101cdb##PDB2> col name format a16 SYS@c101cdb##PDB2> col network_name format a24 SYS@c101cdb##PDB2> col pdb format a8 SYS@c101cdb##PDB2> SELECT name, network_name, pdb, con_id FROM V$SERVICES; NAME NETWORK_NAME PDB CON_ID ---------------- ------------------------ -------- ---------- pdb2.world pdb2.world PDB2 4 1行が選択されました。 SYS@c101cdb##PDB2> conn rywatabe/rywatabe@localhost:12101/pdb2.world 接続されました。 1行が選択されました。 RYWATABE@localhost:12101/pdb2.world##PDB2> SELECT * FROM test; N ---------- 1 1行が選択されました。 RYWATABE@localhost:12101/pdb2.world##PDB2>