您的位置:首页 > 数据库

12 可插入数据库

2015-12-21 20:22 429 查看
一个CDB数据库容器包组件:

ROOT组件:ROOT又叫CDB$ROOT, 存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。

SEED组件 : Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed. 这个感念,个人感觉非常类似SQL SERVER中的model数据库。

PDBS: CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。

这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称

关于多租户环境:

1、 多个PDB可以可以插入一个CDB中去

2、需要有足够的资源支撑CDB

3 Configuration options that apply to the entire CDB and configuration options that apply to each PDB

可以用以下方法创建一个CDB:

可以用 DBCA to Create a CDB

也可以用 CREATE DATABASE Statement to Create a CDB

1 配置新的可插入数据

一个数据库在存在期间,只能是一个CDB或者一个非CDB,不能将非CDB转换为CDB,反之亦然。必须在创建时指定为CDB,然后在其中创建PDB

SQL语句CREATE DATABASE ... ENABLE PLUGGABLE DATABASE可以创建一个新的CDB。如果没有指定ENABLE PLUGGABLE DATABASE从句,那么新建的数据库为非CDB,并且不能包含PDB。

查看当前数据库是否为多租户数据库,v$database的cdb字段显示yes,表明当前数据库为一个CDB数据库

SQL> select name,cdb from v$database;

NAME CDB

--------- ---

ORCL YES

查看当前CDB数据库中的pdb的状态

SQL> select con_id,dbid,name,open_mode from v$pdbs;

CON_ID DBID NAME OPEN_MODE

---------- ---------- ------------------------------ ----------

2 2972678483 PDB$SEED READ ONLY

3 1145215341 PDBORCL READ WRITE

SQL> select pdb_id,pdb_name,dbid,status,creation_scn from dba_pdbs;

PDB_ID PDB_NAME DBID STATUS CREATION_SCN

---------- ------------------------------ ---------- --------- ------------

3 PDBORCL
1145215341 NORMAL 1740054

2 PDB$SEED
2972678483 NORMAL 1594415

三种方式,创建PDB

1、 从种子PDB创建新的PDB

create pluggable database pdb2

admin user boswll identified by oracle roles=(connect)

file_name_convert=('ORCL','PDB2');

2、将非CDB插入或者克隆到CDB中

克隆

将本地的PDB克隆到同一个CDB中

讲远程的PDB克隆岛CDB中

3、 将 移走的PDB插入到另外一个CDB中

alter pluggable database pdborcl open;

下面举例:

1、 从种子PDB创建新的PDB

create pluggable database pdb2

admin user boswll identified by oracle roles=(connect)

file_name_convert=('ORCL','PDB2');

从 pdb$seed 数据库复制数据文件,创建system和sysaux表空间

创建完整目录,包括向ORACLE提供的对象元数据

创建临时表空间TEMP,创建公共用户(超级用户sys system)

创建授予本地 pdb_dbs 角色的本地用户

创建新的默认服务

创建PDB用户

多租户环境下的数据库状态查看,启停,打开,关闭等,操作如下

SQL> select name from v$datafile;

NAME

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_c6pmswtl_.dbf

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_c6pmq6xf_.dbf

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_c6pmxkfs_.dbf

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_c6pmzfpf_.dbf

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_users_c6pmxj8s_.dbf

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_c6pmzfpb_.dbf

/u01/app/oracle/oradata/ORCL/26A8333E18924AF2E0530210A8C01D68/datafile/o1_mf_system_c6po12ls_.dbf

/u01/app/oracle/oradata/ORCL/26A8333E18924AF2E0530210A8C01D68/datafile/o1_mf_sysaux_c6po12o8_.dbf

/u01/app/oracle/oradata/ORCL/26A8333E18924AF2E0530210A8C01D68/datafile/o1_mf_users_c6po76sc_.dbf

1、 从种子PDB创建新的PDB

create pluggable database pdb2

admin user boswll identified by oracle roles=(connect)

file_name_convert=('ORCL','PDB2');

SQL> create pluggable database pdb1

admin user boswll identified by oracle roles=(connect)

file_name_convert=('pdbseed','PDB1');

2 3

create pluggable database pdb1

*

ERROR at line 1:

ORA-65005: missing or invalid file name pattern for file - /u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_c6pmzfpf_.dbf

SQL> create pluggable database pdb2

admin user boswll identified by oracle roles=(connect)

file_name_convert=('ORCL','PDB2'); 2 3

create pluggable database pdb2

*

ERROR at line 1:

ORA-01276: Cannot add file /u01/app/oracle/oradata/PDB2/datafile/o1_mf_system_c6pmzfpf_.dbf. File has an Oracle Managed Files file name.

原因是之前创建种子数据库时用的omf创建的,需要用路径转换file_name_convert

查看种子用数据库文件

alter session set container=pdb$seed;

SQL> show con_name

CON_NAME

------------------------------

PDB$SEED

SQL> select name from v$datafile;

NAME

------------------------------------------------------------------------------------------------------------------------------------------------------

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_undotbs1_c6pmxkfs_.dbf

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_c6pmzfpf_.dbf

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_c6pmzfpb_.dbf

SQL> select FILE_NAME,TABLESPACE_NAME,STATUS from dba_data_files;

FILE_NAME TABLESPACE_NAMESTATUS

-------------------------------------------------------------------------------- ------------------------------ ---------

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_c6pmzfpf_.dbfSYSTEM
AVAILABLE

/u01/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_c6pmzfpb_.dbfSYSAUX
AVAILABLE

show parameter SOURCE_FILE_NAME_CONVERT

show parameter FILE_NAME_CONVERT

NAME TYPE
VALUE

------------------------------------ ----------- ------------------------------

db_file_name_convert string

log_file_name_convert string

pdb_file_name_convert string

SQL> show parameter SOURCE_FILE_NAME_CONVERT

SQL> create pluggable database pdb2

admin user boswll identified by oracle roles=(connect)

DEFAULT TABLESPACE pdb2 DATAFILE '/u01/app/oracle/oradata/ORCL/datafile/pdb2/pdb201.dbf' SIZE 50M

file_name_convert=('/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_c6pmzfpf_.dbf','/u01/app/oracle/oradata/ORCL/datafile/pdb2/pdb2_mf_system_c6pmzfpf_.dbf','/u01/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_c6pmzfpb_.dbf','/u01/app/oracle/oradata/ORCL/datafile/pdb2/pdb2_o1_mf_sysaux_c6pmzfpb_.dbf');

2 3 4 create pluggable database pdb2

*

ERROR at line 1:

ORA-65040: operation not allowed from within a pluggable database

必须用cdb$root下创建

SQL> show con_name

CON_NAME

------------------------------

PDB1

SQL> alter session set container=cdb$root;

Session altered.

create pluggable database pdb2

admin user boswll identified by oracle roles=(connect)

DEFAULT TABLESPACE pdb2 DATAFILE '/u01/app/oracle/oradata/ORCL/datafile/pdb2/pdb201.dbf' SIZE 50M

file_name_convert=('/u01/app/oracle/oradata/ORCL/datafile/o1_mf_system_c6pmzfpf_.dbf','/u01/app/oracle/oradata/ORCL/datafile/pdb2/system.dbf',

'/u01/app/oracle/oradata/ORCL/datafile/o1_mf_sysaux_c6pmzfpb_.dbf','/u01/app/oracle/oradata/ORCL/datafile/pdb2/sysaux.dbf',

'/u01/app/oracle/oradata/ORCL/datafile/pdbseed_temp012015-12-12_06-37-39-AM.dbf','/u01/app/oracle/oradata/ORCL/datafile/pdb2/temp.dbf'

);

create pluggable database pdb3

admin user boswll identified by oracle roles=(connect)

file_name_convert=('/o1_mf_system_c6pmzfpf_.dbf','/pdb3/system.dbf',

'/o1_mf_sysaux_c6pmzfpb_.dbf','/pdb3/sysaux.dbf',

'/pdbseed_temp012015-12-12_06-37-39-AM.dbf','/pdb3/temp.dbf'

);

alter pluggable database pdb2 open;

alter pluggable database pdb3 open;

SQL> select NAME,CON_ID,OPEN_MODE from v$pdbs;

NAME CON_ID OPEN_MODE

------------------------------------------------------------------------------------------------------------------------------------------------------ ---------- ----------

PDB$SEED 2 READ ONLY

PDBORCL 3 READ WRITE

PDB1 4 READ WRITE

PDB2 5 READ WRITE

PDB3 6 READ WRITE

如果PDB$SEED 不是omf 自动管理的,那么可以用下面的方式直接建库

[oracle@test12c orcl]$ ls

control01.ctl pdborcl pdbseed redo01.log redo02.log redo03.log sysaux01.dbf system01.dbf temp01.dbf undotbs01.dbf users01.dbf

create pluggable database pdb4

admin user boswll identified by oracle roles=(connect)

file_name_convert=('pdbseed','PDB4');

CONN / AS SYSDBA

CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdb_adm IDENTIFIED BY Password1

FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdbseed/','/u01/app/oracle/oradata/cdb1/pdb2/');

CONN / AS SYSDBA

ALTER SESSION SET PDB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/cdb1/pdbseed/','/u01/app/oracle/oradata/cdb1/pdb3/';

CREATE PLUGGABLE DATABASE pdb3 ADMIN USER pdb_adm IDENTIFIED BY Password1;

---删除

DROP PLUGGABLE DATABASE pdb2 KEEP DATAFILES;

[oracle@test12c PDB4]$ ls -lrt

总用量 839760

-rw-r----- 1 oracle oinstall 20979712 12月 15 22:01 PDB4_temp012015-12-15_07-45-14-PM.dbf

-rw-r----- 1 oracle oinstall 262152192 12月 15 22:08 system01.dbf

-rw-r----- 1 oracle oinstall 597696512 12月 15 22:08 sysaux01.dbf

2、将非CDB插入或者克隆到CDB中

克隆

将本地的PDB克隆到同一个CDB中

将远程的PDB克隆到CDB中

---设置 db_create_file_dest 或者配置使用 db_file_name_convert

---停顿要复制的PDB数据库

alter session set container=cdb$root

alter pluggable database pdb4 close immediate;

alter pluggable database pdb4 open read only;

----从pdb4 克隆pdb5

----此方式创建的omf管理

create pluggable database pdb5 from pdb4 create_file_dest='/u01/app/oracle/oradata/orcl/PDB5';

---此方式创建

create pluggable database pdb6 from pdb4 FILE_NAME_CONVERT=('PDB4','PDB6');

---在读写模式下打开pdb5

alter pluggable database pdb5 open;

---重新以读写模式打开pdb4

alter pluggable database pdb4 close immediate;

alter pluggable database pdb4 open;

---建好PDB5,查看数据文件

alter session set container=pdb5

select FILE_NAME,TABLESPACE_NAME,STATUS from dba_data_files;

FILE_NAME TABLESPACE_NAMESTATUS

-------------------------------------------------------------------------------- ------------------------------ ---------

/u01/app/oracle/oradata/orcl/PDB5/ORCL/270349FEACBF115BE0530210A8C0B69A/datafile/o1_mf_system_c72mqpfl_.dbf SYSTEMAVAILABLE

/u01/app/oracle/oradata/orcl/PDB5/ORCL/270349FEACBF115BE0530210A8C0B69A/datafile/o1_mf_sysaux_c72mqpft_.dbf SYSAUXAVAILABLE

alter session set container=pdb6

SQL> select FILE_NAME,TABLESPACE_NAME,STATUS from dba_data_files;

FILE_NAME TABLESPACE_NAMESTATUS

-------------------------------------------------------------------------------- ------------------------------ ---------

/u01/app/oracle/oradata/orcl/PDB6/system01.dbf
SYSTEM AVAILABLE

/u01/app/oracle/oradata/orcl/PDB6/sysaux01.dbf
SYSAUX AVAILABLE

将non-CDB插入到CDB中

可用三种方法: tts (transportable tablespace)或者tdb (Transportable Database) 或完全导出/导入

使用 dbms_pdb 构造XML文件定义

复制

新的PDB 中会创建以下实体: 表空间:system sysaux,temp

完整目录

公共用户 :sys system

本地管理员 pdba

新的默认服务

--- 使用dbms_pdb包进行迁移

Basically it is very straight forward:

(1) Upgrade your stand-alone database to 12c

(2) Put it into Read-Only mode

(3) DBMS_PDB.DESCRIBE will create an XML manifest file

(4) Shut your database down IMMEDIATE

(5) Connect into the CDB$ROOT

(6) CREATE PLUGGABLE DATABASE pdb1 USING (pdb.xml) NOCOPY TEMPFILE REUSE;

(7) Start @noncdb_to_pdb.sql

--导出非cdb中的数据

select name ,cdb from v$database;

NAME CDB

--------- ---

dog NO

shut immediate;

conn /as sysdba

startup mount;

alter database open read only;

exec dbms_pdb.describe(PDB_DESCR_FILE=>'/home/oracle/dog.xml');

---导入到cdb中去作为pdb5

export ORACLE_SID=orcl

sqlplus sys/oracle as sysdba

create pluggable database pdb5 using '/home/oracle/dog.xml'

file_name_convert=('DOG','ORCL/PDB6');

ALTER SESSION SET CONTAINER=pdb5;

@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb;

select name,open_mode from v$pdbs;

alter session set container=pdb5;

select FILE_NAME,TABLESPACE_NAME,STATUS from dba_data_files;

----dblink此方式可以是把cdb中的pdb插入到其他cdb中去,也可以是non-cdb,插入到其他cdb中去,如果是non-cdb,必须要执行一个脚本noncdb_to_pdb

Source database must be at least Oracle 12.1.0.1

Source database must be on the same OS platform

Source database must be at the same (equal) version as the container database

Script noncdb_to_pdb.sql needs to be run

--连接到非CDB上

sqlplus sys/oracle as sysdba

shut immediate;

alter database open read only;

---连接到CDB数据库,创建dblink, 在监听文件中要配置non-cdb

non-cdb =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = your_instance.your_host)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = non-cdb)

)

)

create database link orcl connect to system identified by oracle using 'non-cdb';

mkdir -p /u01/app/oracle/oradata/test/pdb6

create pluggable database pdb6 from non$cdb@orcl create_file_dest='/u01/app/oracle/oradata/test/pdb6' TEMPFILE REUSE;;

--执行脚本,如果是non-cdb,如果不是non-cdb,可以跳过脚本,直接打开库

---But when you check the status of the new PDB you will realize it is OPEN but only in RESTRICTED mode. Therefore noncdb_to_pdb,sql needs to be run. Connect to the new PDB and start the script:

ALTER SESSION SET CONTAINER=pdb6;

@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb;

---或者通过下列方式执行脚本,总之要在pdb6上执行脚本

SQL> select name from v$services where pdb='PDB6';

NAME

----------------------------------------------------------------------------------------------------

pdb6

pdb6 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = your_instance.your_host)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = PDB6)

)

)

sqlplus sys/pdb6 as sysdba

@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb;

alter pluggable database pdb6 open;

---验证

SELECT message, action FROM pdb_plug_in_violations WHERE name = 'PDB6';

3、 将 移走的PDB插入到另外一个CDB中

a 、将根容器orcl中的pdb5移走

以公共用户的身份链接到pdb5上

验证pdb5是否已经关闭

alter pluggable database pdb5 unplug into‘pdb5.xml’

以公共用户的身份链接到test 根容器上

使用dbms_pdb 程序包检查pdb5 与test 根容器的兼容性

create pluggable database pdb1 using 'pdb5.xml' nocopy;

在读写模式下打开pdb2

---拔出pdb

ALTER PLUGGABLE DATABASE pdb4 CLOSE;

ALTER PLUGGABLE DATABASE pdb4 UNPLUG INTO '/home/oracle/pdb4.xml';

[oracle@test12c dog]$ echo $ORACLE_SID

test

[oracle@test12c dog]$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Thu Dec 17 05:08:08 2015

Copyright (c) 1982, 2014, Oracle. All rights reserved.

SQL> conn /as sysdba

Connected.

--插入pdb

把PDB 插入到CDB 类似于新建一个PDB,首先做兼容性检测

First check the PBD is compatible with the CDB by calling the DBMS_PDB.CHECK_PLUG_COMPATIBILITY function,

passing in the XML metadata file and the name of the PDB you want to create using it.

SET SERVEROUTPUT ON

DECLARE

l_result BOOLEAN;

BEGIN

l_result := DBMS_PDB.check_plug_compatibility(

pdb_descr_file => '/home/oracle/pdb4.xml',

pdb_name => 'pdb2');

IF l_result THEN

DBMS_OUTPUT.PUT_LINE('compatible');

ELSE

DBMS_OUTPUT.PUT_LINE('incompatible');

END IF;

END;

/

compatible

---Instead, we want to plug the database back into the same container, so we don't need to copy the files or recreate the temp file, so we can do the following'

CREATE PLUGGABLE DATABASE pdb2 USING '/home/oracle/pdb4.xml' NOCOPY TEMPFILE REUSE;

ALTER PLUGGABLE DATABASE pdb2 OPEN READ WRITE;

SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED

---------- ------------------------------ ---------- ----------

2 PDB$SEED
READ ONLY NO

3 TESTPDB
MOUNTED

4 PDB2 READ WRITE NO

或者路径转换

---If the PDB is not compatible, violations are listed in the PDB_PLUG_IN_VIOLATIONS view. If the PDB is compatible, create a new PDB using it as the source.

--If we were creating it with a new name we might do something like this

CREATE PLUGGABLE DATABASE pdb5 USING '/home/oracle/pdb4.xml'

FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdb2/','/u01/app/oracle/oradata/cdb1/pdb5/');

alter pluggable database pdb5 open;

原来的数据

SQL> alter pluggable database pdb4 open read write;

alter pluggable database pdb4 open read write

*

ERROR at line 1:

ORA-65086: cannot open/close the pluggable database

SQL> SELECT pdb_id,pdb_name,status FROM dba_pdbs;

PDB_ID PDB_NAME STATUS

---------- -------------------------------------------------------------------------------------------------------------------------------- ---------

3 PDBORCL
NORMAL

2 PDB$SEED
NORMAL

4 PDB4 UNPLUGGED

5 PDB5 NORMAL

6 PDB6 NORMAL

解决方法:

SQL> DROP pluggable DATABASE pdb4;

Pluggable database dropped.

CREATE pluggable DATABASE pdb1 USING '/home/oracle/pdb4.xml' NOCOPY;

SQL> CREATE pluggable DATABASE pdb1 USING '/home/oracle/pdb4.xml' NOCOPY;

CREATE pluggable DATABASE pdb1 USING '/home/oracle/pdb4.xml' NOCOPY

*

ERROR at line 1:

ORA-65139: Mismatch between XML metadata file and data file /u01/app/oracle/oradata/orcl/PDB4/system01.dbf for value of afn (12 in the plug XML file, 11 in the data file)

原因是重新打开原来的none-cdb后,会往里面写入一些数据,导致数据文件大小和xml文件中描述不一致。否则只能重新生成xml文件了.

CREATE pluggable DATABASE pdb4 ;

ORA-65018: FILE_NAME_CONVERT or NOCOPY must be specified

CREATE pluggable DATABASE pdb4 USING '/home/oracle/pdb4.xml' FILE_NAME_CONVERT=('/home/oracle/','/u01/app/oracle/oradata/orcl/PDB4/')

CREATE pluggable DATABASE pdb4 USING '/home/oracle/pdb4.xml' NOCOPY;

ALTER pluggable DATABASE pdb4 OPEN;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: