随着12c的迅速普及,有必要了解一下12c的新特性,今天我准备在我的个人服务器上对PDB进行unplug和plug的操作。
先看看我现在的server的状态。
SQL> select name, decode(cdb, 'YES', 'Multitenant Option enabled', 'Regular 12c Database: ') "Multitenant Option" , open_mode, con_id from v$database;
NAME Multitenant Option OPEN_MODE CON_ID
--------- ------------------- --------- ----------
TESTDB Regular 12c Database: READ WRITE 0
SQL>
SQL> show con_name;
CON_NAME
------------------------------
testdb
SQL>
貌似没有CDB的database。
这有可能是因为我的数据库是从11g升级上来的,并没有CDB。
自己做一个CDB吧。
在新建一个CDB之前看看我的disk使用情况。
[root@localhost tmp]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
30376764 24991944 3816872 87% /
/dev/sda1 101086 23559 72308 25% /boot
tmpfs 1025328 492828 532500 49% /dev/shm
看来空间是不够了,清除一些文件之后好多了。
[root@localhost product]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
30376764 18828848 9979968 66% /
/dev/sda1 101086 23559 72308 25% /boot
tmpfs 1025328 492836 532492 49% /dev/shm
启动我的DBCA。
新建立一个数据库。
创建CDB testdb1和一个PDB pdb1。
之后就一直next即可。
安装完成
将/home/oracle/.bash_profile的SID重新定义成新创建的CDB testdb1后,重新登录oracle用户,重启DB。
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.
Total System Global Area 704643072 bytes
Fixed Size 2928392 bytes
Variable Size 402653432 bytes
Database Buffers 293601280 bytes
Redo Buffers 5459968 bytes
Database mounted.
Database opened.
SQL>
SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT
SQL>
SQL>
看到CDB$ROOT出现了。
再看看pdb。
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
PDB$SEED是PDB的模板,忽略。
同时我也看到了创建CDB的时候同时创建的pdb1,已经显示为mounted。
启动pdb1。
SQL> alter pluggable database PDB1 open;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
SQL>
OK,一个常态的PDB已经建成了。我要开始做Unplugging PDB的实验了。
先要关闭pdb1,然后确认一下状态。
SQL> alter pluggable database pdb1 close immediate;
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 MOUNTED
SQL>
把要unplug的PDB1备份到XML文件。
SQL> alter pluggable database pdb1 unplug into '/u01/app/oracle/oradata/pdb1.xml';
Pluggable database altered.
OK 成功了,然后可以unplug掉这个PDB了。
SQL> drop pluggable database pdb1 keep datafiles;
Pluggable database dropped.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
SQL>
SQL> select pdb_name, status from cdb_pdbs ;
PDB_NAME
--------------------------------------------------------------------------------
STATUS
---------
PDB$SEED
NORMAL
可以看到已经将PDB1给unplug掉了。
好,开始plug这个pdb。
先检查一下pdb和现在的cdb是否有兼容问题,我这里是用一台cdb,所以不存在兼容问题,但还是执行一下。
set serveroutput on
DECLARE
compatible BOOLEAN := FALSE;
BEGIN
compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/u01/app/oracle/oradata/pdb1.xml');
if compatible then
DBMS_OUTPUT.PUT_LINE('Is pluggable PDB1 compatible? YES');
else DBMS_OUTPUT.PUT_LINE('Is pluggable PDB1 compatible? NO');
end if;
END;
/
Is pluggable PDB1 compatible? YES
PL/SQL procedure successfully completed.
OK,没有问题。
然后开始plug到cdb。
plug到原cdb有三种方式。
NOCOPY Method:不拷贝数据文件,直接生成新文件。
COPY Method:拷贝数据文件到新目录。
AS CLONE MOVE Method:移动原来的数据文件到新目录。
其他方法可以看这篇文档。
因为我这里只是为了实验,用nocopy的方法。
SQL> create pluggable database pdb_plug_nocopy using '/u01/app/oracle/oradata/pdb1.xml'
2 NOCOPY
3 TEMPFILE REUSE;
Pluggable database created.
成功了,我们看看现在的状态。
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB_PLUG_NOCOPY MOUNTED
SQL>
可以看到 PDB_PLUG_NOCOPY 现在pdb是mounted
再看看其他状态。
SQL> select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_NOCOPY';
PDB_NAME
--------------------------------------------------------------------------------
STATUS
---------
PDB_PLUG_NOCOPY
NEW
SQL> select open_mode from v$pdbs where name='PDB_PLUG_NOCOPY';
OPEN_MODE
----------
MOUNTED
SQL> select name from v$datafile where con_id=3;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/TESTDB1/2DAB1DEA4CF91365E0530100007FAE22/datafile/o1_mf_
system_cg1xgnh0_.dbf
/u01/app/oracle/oradata/TESTDB1/2DAB1DEA4CF91365E0530100007FAE22/datafile/o1_mf_
sysaux_cg1xgnhm_.dbf
/u01/app/oracle/oradata/TESTDB1/2DAB1DEA4CF91365E0530100007FAE22/datafile/o1_mf_
users_cg1xhlr5_.dbf
启动这个PDB
SQL> alter pluggable database pdb_plug_nocopy open;
Pluggable database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB_PLUG_NOCOPY READ WRITE NO
SQL>
然后我们退出重新登录这个PDB
sqlplus /nolog
SQL> connect sys/oracle@localhost:1521/pdb_plug_nocopy AS SYSDBA
Connected.
SQL> show con_name
CON_NAME
------------------------------
PDB_PLUG_NOCOPY
SQL>
好了,PDB在同一台server上的unplug和plug就已经完成了。