如果是非生产环境,容器数据库CDB 这功能还可以。
但是,如果生产使用CDB,也可以,但是感觉很鸡肋,一般上生产的,最好为非CDB 数据库。
1, CDB 容器数据
2, PDB 可插拔式数据库
3,根容器 CDB$ROOT
4, 种子可插拔数据库 PDB$SEED
5, 克隆,通过 种子库(pdb$seed 不能修改,只读),pdb库,非CDB库,创建可插拔数据库。
6,非CDB,ORACLE12C 没有创建可插拔数据库功能的数据库(类似oracle11g库)
7,CDB字典 以cdb_* 前缀开头。
8,CON_ID , CDB种所有容器数据库唯一的标识(<=255,CDB库为1,种子库为2 ,可插拔式数据库依次叠加)。
CDB$ROOT 为1, PDB$SEED 为2.
9,开启了可插拔数据库,CDB 下不能使用 create user 语句,在pdb 下可使用。
10,CDB 模式下,只有sys,system 权限用户。
11, sqlplus / as sysdba --连接的是CDB库
sqlplus pdb_user/pdb_password@pdb_service ; --连接对应的pdb 库
12, CDB 创建与(oracle11g建库一样,DBCA,RMAN RESTORE 等等一样)
13, select name,cdb from v$databvase 查看是否开启了 CDB容器特性。
14, select name,con_id from v$containers ; 查看对应的跟容器,种子容器以及 可插拔式数据库。
15, select con_id,file_name from cdb_data_files order by 1; 查看容器数据库所有数据文件。con_id可以确定那些文件对应那些库。
连接:
1, sqlplus / as sysdba ; 不管在那一层,直接回到CDB根容器。
2, show user con_id con_name user 查看根容器状态。
select sys_context('USERENV','CON_ID') AS CON_ID,SYS_CONTEXT('USERENV','CON_NAME') AS CUR_CONTAINER,SYS_CONTEXT('USERENV','SESSION_USER') AS CUR_USER FROM DUAL;
3, sqlplus user/pass@services as sysdba ;
4, 启动停止根容器: sqlplus / as sysdba
SQL > STARTUP ;
SQL > ALTER PLUGGABLE DATABASE ALL OPEN; --启动所有pdb 数据库
SQL > ALTER PLUGGABLE DATABASE PDB_NAME OPEN; --启动某一个pdb数据库。
SQL > ALTER PLUGGABLE DATABASE PDB_NAME OPEN READ ONLY;
SQL > ALTER PLUGGABLE DATABASE PDB_NAME CLOSE IMMEDIATE;
SQL > SHUTDOWN IMMEDIATE;
5,创建公用用户: 以c## & C## 开头。 针对pdb 所有可用(如果在pdb 下创建用户,为私有)
创建共有角色: 以c## & C## 开头。
SQL > CREATE ROLE C##DBSPRIS CONTAINER = ALL;
SQL > GRANT DBA TO C##DBSPRIS CONTAINER = ALL;
SQL > GRANT C##ROLE TO C##USER CONTAINER = ALL;
CDB容器数据:
SYS@oradb12c+12c >>! echo $ORACLE_SID
oradb12c
SYS@oradb12c+12c >>select con_id,name from v$containers;
CON_ID NAME
---------- ------------------------
1 CDB$ROOT
2 PDB$SEED
3 ORADB12CPDB
5 CPDB01
SYS@oradb12c+12c >>create user cdbuser identified by cdbuser account unlock;
create user cdbuser identified by cdbuser account unlock
*
ERROR at line 1:
ORA-65096: invalid common user or role name
SYS@oradb12c+12c >>create user c##martin identified by martin account unlock;
User created.
SYS@oradb12c+12c >>select username,account_status from DBA_USERS where username='C##MARTIN';
USERNAME ACCOUNT_STATUS
------------ --------------------------------
C##MARTIN OPEN
非CDB 容器数据:
SYS@db12c+12c >>! echo $ORACLE_SID
db12c
SYS@db12c+12c >>select con_id,name from v$containers;
CON_ID NAME
---------- ----------------------------------
0 db12c
SYS@db12c+12c >>create user martinli identified by martinli account unlock;
User created.
SYS@db12c+12c >>select username,account_status from dba_users where username='MARTINLI';
USERNAME ACCOUNT_STATUS
----------------------- --------------------------------
MARTINLI OPEN
ORACLE_SID=oradb12c --> 容器数据库
ORACLE_SID=db12c --> 非容器数据库
重命名可插拔式数据库
SQL > shutdown immediate;
SQL > startup restrict;
SQL > ALTER PLUGGABLE DATABASE INVPDB RENAME GLOBAL_NAME TO INVPDB_OLD;
删除PLUGGABLE DATABASE;
SQL > DROP PLUGGABLE DATABASE PDB_NAME INCLUDING DATAFILES;
6, 查看cdb 容器 表空间大小:
col con_id format 9999999999999999999999999
with x as
(select c1.con_id, cf1.tablespace_name, sum(cf1.bytes) / 1024 / 1024 fsm
from cdb_free_space cf1, v$containers c1
where cf1.con_id = c1.con_id
group by c1.con_id, cf1.tablespace_name),
y as
(select c2.con_id, cd.tablespace_name, sum(cd.bytes) / 1024 / 1024 apm
from cdb_data_files cd, v$containers c2
where cd.con_id = c2.con_id
group by c2.con_id, cd.tablespace_name)
select x.con_id,v.name con_name, x.tablespace_name, x.fsm, y.apm
from x, y, v$containers V
where x.con_id = y.con_id
and x.tablespace_name = y.tablespace_name
and v.con_id = y.con_id
union
select vc2.con_id,
vc2.name,
tf.tablespace_name,
null,
sum(tf.bytes) / 1024 / 1024
from v$containers vc2, cdb_temp_files tf
where vc2.con_id = tf.con_id
group by vc2.con_id, vc2.name, tf.tablespace_name
order by 1, 2;
CON_ID CON_NAME TABLESPACE_NAME FSM APM
-------------------------- ------------ ------------------------------ ---------- ----------
1 CDB$ROOT SYSAUX 80.625 1320
1 CDB$ROOT SYSTEM 1.0625 830
1 CDB$ROOT TEMP 131
1 CDB$ROOT UNDOTBS1 47.5625 70
1 CDB$ROOT USERS 8 10
3 MARTIN01PDB SYSAUX 27.9375 530
3 MARTIN01PDB SYSTEM 4.375 260
3 MARTIN01PDB TEMP 129
3 MARTIN01PDB UNDOTBS1 82.4375 100
3 MARTIN01PDB USERS 4 5
4 PDB02 SYSAUX 20.0625 350
4 PDB02 SYSTEM 5.5 250
4 PDB02 TEMP 131
4 PDB02 UNDOTBS1 53.25 100
14 rows selected.
--种子库是不现实出来的。
7, 切换容器 SQL > ALTER SESSION SET CONTAINER = PDB02;
设置CDB$ROOT 可以切换根容器: SQL > ALTER SESSION SET CONTAINER = CDB$ROOT;
创建可插拔式数据库:
--创建可插拔数据库,可以有三种方式:
1, 通过 SQL 命令创建: create pluggable database .
2, DBCA 创建CDB时,随带创建pdb.
3, 通过 OEM
4, 通过种子数据库。
5, 通过非CDB 数据库。
6, 通过RMAN 备份。
7, 已经存在插拔式数据库。
8, 拔下的可插拔式数据库。
1, 通过种子容器克隆:
sqlplus / as sysdba
SQL > CREATE PLUGGABLE DATABASE PDB_NAME ADMIN USER USER_NAME IDENTIFIED BY PASSWORD
FILE_NAME_CONVERT=('/data/种子库数据路径','/data1/当前需要创建的可插拔数据库路径');
--如果使用的OMF ,可以省略file_name_convert 参数。
注释:
admin user 创建用于执行管理任务的本地用户,该用户会被分配PDB_DBA角色。
maxsize 可插拔式数据库使用空间的最大值,如果没有设置该子句,既无限制。
max_shared_temp_size 可插拔式数据库会话公用的临时表空间最大尺寸。
default tablespace 设置分配给可插拔式数据库种的新建用户默认永久的表空间。
datafile 默认表空间数据文件路径和名称。
path_prefix 设置可插拔式数据库新增的数据库文件必须存储在该目录或其子目录。
file_name_convert 设置种子容器数据文件及其副本的存储位置。
--如果报错: ORA-65005 错误, 1, 没有填写正确的pdb$seed 种子库的路径。
2, 开启了OMF格式,所以需要确定db_create_file_dest 参数。
3, 个人建议没有必要开启omf 模式。
eg:
SYS@oradb12c+12c >>create pluggable database cpdb01 admin user cpdb01 identified by cpdb01 file_name_convert=('/u01/app/oracle/oradata/oradb12c/pdbseed','/data/oracle12c/pdbfile');
Pluggable database created.
SYS@oradb12c+12c >>alter pluggable database cpdb01 open;
Pluggable database altered.
SYS@oradb12c+12c >>select con_id,name from v$datafile order by 1;
CON_ID NAME
------ -------------------------------------------------------------------
1 /u01/app/oracle/oradata/oradb12c/users01.dbf
1 /u01/app/oracle/oradata/oradb12c/sysaux01.dbf
1 /u01/app/oracle/oradata/oradb12c/undotbs01.dbf
1 /u01/app/oracle/oradata/oradb12c/system01.dbf
2 /u01/app/oracle/oradata/oradb12c/pdbseed/sysaux01.dbf
2 /u01/app/oracle/oradata/oradb12c/pdbseed/system01.dbf
2 /u01/app/oracle/oradata/oradb12c/pdbseed/undotbs01.dbf
3 /u01/app/oracle/oradata/oradb12c/oradb12cpdb/system01.dbf
3 /u01/app/oracle/oradata/oradb12c/oradb12cpdb/sysaux01.dbf
3 /u01/app/oracle/oradata/oradb12c/oradb12cpdb/undotbs01.dbf
3 /u01/app/oracle/oradata/oradb12c/oradb12cpdb/users01.dbf
5 /data/oracle12c/pdbfile/system01.dbf
5 /data/oracle12c/pdbfile/sysaux01.dbf
5 /data/oracle12c/pdbfile/undotbs01.dbf
14 rows selected.
SYS@oradb12c+12c >>select con_id,name,open_mode,pdb_count,max_size from v$containers;
CON_ID NAME OPEN_MODE PDB_COUNT MAX_SIZE
----- ------------- ---------- ---------- ----------
1 CDB$ROOT READ WRITE 3 0 ##容器
2 PDB$SEED READ ONLY 0 0 ##种子库
3 ORADB12CPDB READ WRITE 0 0 ##插拔数据库1
5 CPDB01 READ WRITE 0 0 ##插拔数据库2
SYS@oradb12c+12c >>alter session set container=cpdb01 ;
Session altered.
SYS@oradb12c+12c >>select con_id,name from v$datafile;
CON_ID NAME
----- -------------------------------------------------------------------
5 /data/oracle12c/pdbfile/system01.dbf
5 /data/oracle12c/pdbfile/sysaux01.dbf
5 /data/oracle12c/pdbfile/undotbs01.dbf
SYS@oradb12c+12c >>create tablespace pdb_dat_ts1 datafile '/data/oracle12c/pdbfile/pdb_dat_tst_01.dbf' size 10m autoextend on maxsize 2g;
Tablespace created.
SYS@oradb12c+12c >>select con_id,name from v$datafile;
CON_ID NAME
------ -------------------------------------------------------------------
5 /data/oracle12c/pdbfile/system01.dbf
5 /data/oracle12c/pdbfile/sysaux01.dbf
5 /data/oracle12c/pdbfile/undotbs01.dbf
5 /data/oracle12c/pdbfile/pdb_dat_tst_01.dbf
2, 克隆非CDB 数据库:
可以移动Non-CDB来变为一个PDB。可以使用以下方式来完成这个任务:
.通过克隆Non-CDB来创建PDB。从Oracle 12.1.0.2开始,可以通过克隆Non-CDB来创建PDB。这种方法是创建PDB最简单的一种方法,但它需要从Non-CDB中把文件复制到新目录中。
.使用dbms_pdb包来生成XML元数据文件,XML元数据文件用来描述Non-CDB的数据文件可以用来将其附加到CDB中。这种方法比克隆Non-CDB要执行更多的步骤,但它能让你不用移动Non-CDB的文件来创建PDB。为了使用这种技术 ,Non-CDB必须是Oracle 12C的Non-CDB。如果当前的Non-CDB使用Oracle 12C之前的版本,那么你必须将Non-CDB升级到Oracle 12C。
.使用Oracle Data Pump导出/导入
可以使用Data Pump从Non-CDB中导出数据然后导入到PDB中。当你执行导入时,在用户名后要指定PDB的连接标识符。例如,如果PDB的连接标识符为hrpdb,那么在执行导入进执行以下命令:
imdp username@hrpdb ….如果Non-CDB的版本为11.2.0.3或之后的版本,那么可以使用完全传输导出/导入来移动数据。当将版本为11.2.0.3或之后的11g版本的Non-CDB迁移到Oracle 12C,那么在导出时需要将version参数设置为12.0.0.0.0或更高版本。如果Non-CDB的版本为11.2.0.3之前的版本,那么可以使用传输表空间来移动数据或者执行完全数据库导出\导入。
.使用goldengate复制
可以使用goldengate从Non-CDB中复制数据到PDB中。
对Non-CDB执行dbms_pdb包
可以使用dbms_pdb包来为Non-CDB生成XML元数据文件来将其附加到CDB中。使用dbms_pdb包移动Non-CDB为PDB的操作如下:
1.如果CDB不存在先创建CDB
2.确保Non-CDB处于事务一致状态并将它置于只读状态
ORACLE_SID=oradb12c --> 容器数据库
ORACLE_SID=db12c --> 非容器数据库
通过 dbms_pdb.describe
SYS@db12c+12c >>create tablespace nocdb_dat_ts2 datafile '/data/oracle12c/db12c/nocdb_dat_ts2.dbf' size 10m autoextend on maxsize 1g;
Tablespace created.
SYS@db12c+12c >>SELECT NAME FROM V$DATAFILE;
NAME
---------------------------------------------
/u01/app/oracle/oradata/db12c/system01.dbf
/u01/app/oracle/oradata/db12c/sysaux01.dbf
/u01/app/oracle/oradata/db12c/undotbs01.dbf
/data/oracle12c/db12c/nocdb_dat_ts2.dbf
/u01/app/oracle/oradata/db12c/users01.dbf
SYS@db12c+12c >>exec dbms_pdb.describe(pdb_descr_file=>'/home/oracle/db12c.xml');
PL/SQL procedure successfully completed.
SYS@db12c+12c >>shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@db12c+12c >>startup mount
ORACLE instance started.
SYS@db12c+12c >>alter database open read only;
Database altered.
SYS@db12c+12c >>! echo $ORACLE_SID
db12c
SYS@db12c+12c >>select open_mode from v$database;
OPEN_MODE
--------------------
READ ONLY
SYS@db12c+12c >>exec dbms_pdb.describe(pdb_descr_file=>'/home/oracle/db12c.xml');
PL/SQL procedure successfully completed.
SYS@db12c+12c >>! ls -l /home/oracle/db12c.xml
-rw-r--r-- 1 oracle oinstall 7514 Jun 1 16:51 /home/oracle/db12c.xml
SYS@db12c+12c >>! cat db12c.xml
1
0
1
203424000
12.2.0.1.0
12.2.0.0.0
0.0.0.0.24
24
8.0.0.0.0
1431699455
1
1431699455
6D913B8A70CA6D5CE053DD29A8C04D12
1423396
0
7
4194824
SYSTEM
0
0
1
0
0
0
0
8
/u01/app/oracle/oradata/db12c/system01.dbf
1
7
0
1
102400
8192
203423744
1431699455
1423395
0
1408558
0
977674690
4194302
1280
SYSAUX
0
1
1
0
0
0
0
8
/u01/app/oracle/oradata/db12c/sysaux01.dbf
3
4665
0
1
58880
8192
203423744
1431699455
1423395
0
1408558
0
977674690
4194302
1280
UNDOTBS1
2
2
1
0
0
0
0
8
/u01/app/oracle/oradata/db12c/undotbs01.dbf
4
1406609
0
1
8320
8192
203423744
1431699455
1423395
0
1408558
0
977674690
4194302
640
TEMP
1
3
1
0
0
0
0
128
/u01/app/oracle/oradata/db12c/temp01.dbf
1
1408633
0
1
4096
8192
203423744
4194302
80
USERS
0
4
1
0
0
0
0
8
/u01/app/oracle/oradata/db12c/users01.dbf
7
29999
0
1
640
8192
203423744
1431699455
1423395
0
1408558
0
977674690
4194302
160
NOCDB_DAT_TS2
0
6
1
0
0
0
0
8
/data/oracle12c/db12c/nocdb_dat_ts2.dbf
5
1423271
0
1
1280
8192
203423744
1431699455
1423395
0
1408558
0
977674690
131072
1
0
1
873
2000
APS=12.2.0.1.0
CATALOG=12.2.0.1.0
CATJAVA=12.2.0.1.0
CATPROC=12.2.0.1.0
CONTEXT=12.2.0.1.0
DV=12.2.0.1.0
JAVAVM=12.2.0.1.0
OLS=12.2.0.1.0
ORDIM=12.2.0.1.0
OWM=12.2.0.1.0
SDO=12.2.0.1.0
XDB=12.2.0.1.0
XML=12.2.0.1.0
XOQ=12.2.0.1.0
0
pga_aggregate_target=450887680
primary version:26
secondary version:0
0
SYS$BACKGROUND,
SYS$USERS,
db12cXDB,db12cXDB
db12c,db12c
1
0
1
8
1
在cdb 容器中检测 db12c.xml 的兼容性:
SYS@oradb12c+12c >>! echo $ORACLE_SID
oradb12c
SYS@oradb12c+12c >>set serveroutput on
SYS@oradb12c+12c >>declare
2 hold_var boolean;
3 begin
4 hold_var :=DBMS_PDB.CHECK_PLUG_COMPATIBILITY(pdb_descr_file=>'/home/oracle/db12c.xml');
5 if hold_var then
6 dbms_output.put_line('YES');
7 else
8 dbms_output.put_line('NO');
9 end if;
10 end;
11 /
YES
PL/SQL procedure successfully completed.
-----
SYS@oradb12c+12c >>create pluggable database cpdb02 using '/home/oracle/db12c.xml' copy file_name_convert=('/u01/app/oracle/oradata/db12c/','/data/oracle12c/cpdb02/','/data/oracle12c/db12c/','/data/oracle12c/cpdb02/');
create pluggable database cpdb02 using '/home/oracle/db12c.xml' copy file_name_convert=('/u01/app/oracle/oradata/db12c/','/data/oracle12c/cpdb02/','/data/oracle12c/db12c/','/data/oracle12c/cpdb02/')
*
ERROR at line 1:
ORA-65139: Mismatch between XML metadata file and data file /u01/app/oracle/oradata/db12c/system01.dbf for value of fcpsb (1423395 in the
plug XML file, 1423398 in the data file)
-- 这里是因为 db12c 我开启了来了,到时数据文件和xml 对应不上导致。
-- 解决,重做xml 文件, 非cdb 不开启到write read 模式。
SYS@oradb12c+12c >>create pluggable database cpdb02 using '/home/oracle/db12c.xml' copy file_name_convert=('/u01/app/oracle/oradata/db12c/','/data/oracle12c/cpdb02/','/data/oracle12c/db12c/','/data/oracle12c/cpdb02/');
Pluggable database created.
SYS@oradb12c+12c >>alter pluggable database cpdb02 open;
Warning: PDB altered with errors.
SYS@oradb12c+12c >>select con_id,name from v$containers;
CON_ID NAME
---------- ------------------------
1 CDB$ROOT
2 PDB$SEED
3 ORADB12CPDB
4 CPDB02
5 CPDB01
SYS@oradb12c+12c >>select con_id,file#,status,name from v$datafile order by 1;
CON_ID FILE# STATUS NAME
---------- ---------- ------- --------------------------------------------------------------------
1 3 ONLINE /u01/app/oracle/oradata/oradb12c/sysaux01.dbf
1 1 SYSTEM /u01/app/oracle/oradata/oradb12c/system01.dbf
1 4 ONLINE /u01/app/oracle/oradata/oradb12c/undotbs01.dbf
1 7 ONLINE /u01/app/oracle/oradata/oradb12c/users01.dbf
2 5 SYSTEM /u01/app/oracle/oradata/oradb12c/pdbseed/system01.dbf
2 6 ONLINE /u01/app/oracle/oradata/oradb12c/pdbseed/sysaux01.dbf
2 8 ONLINE /u01/app/oracle/oradata/oradb12c/pdbseed/undotbs01.dbf
3 10 ONLINE /u01/app/oracle/oradata/oradb12c/oradb12cpdb/sysaux01.dbf
3 9 SYSTEM /u01/app/oracle/oradata/oradb12c/oradb12cpdb/system01.dbf
3 11 ONLINE /u01/app/oracle/oradata/oradb12c/oradb12cpdb/undotbs01.dbf
3 12 ONLINE /u01/app/oracle/oradata/oradb12c/oradb12cpdb/users01.dbf
4 17 SYSTEM /data/oracle12c/cpdb02/system01.dbf
4 20 ONLINE /data/oracle12c/cpdb02/users01.dbf
4 19 ONLINE /data/oracle12c/cpdb02/undotbs01.dbf
4 18 ONLINE /data/oracle12c/cpdb02/sysaux01.dbf
4 21 ONLINE /data/oracle12c/cpdb02/nocdb_dat_ts2.dbf
5 16 ONLINE /data/oracle12c/pdbfile/pdb_dat_tst_01.dbf
5 15 ONLINE /data/oracle12c/pdbfile/undotbs01.dbf
5 14 ONLINE /data/oracle12c/pdbfile/sysaux01.dbf
5 13 SYSTEM /data/oracle12c/pdbfile/system01.dbf
20 rows selected.
alter session set container=cpdb02;
@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
--执行完,可以使用可插拔式数据库了。
从CDB 拔出可插拔式数据库
alter pluggable database cpdb02 close immediate;
alter pluggable database cpdb02 unplug into '/home/oracle/cpdb02.xml';
插入 CDB
CREATE PLUGGABLE DATABASE CPDB03 USING '/home/oracle/cpdb02.xml' copy
file_name_convert=('/xxx/cpdb02/','/xxx/cpdb03/');