1.简介
Oracle数据库新的版本增加新特性,即称为容器数据库,又称可插入数据库或多租户容器数据库;根数据库容器称为CDB;指的是可以容纳一个或者多个可插拔数据库的数据库,这个特性允许在CDB容器数据库中创建并且维护多个数据库,在CDB中创建的数据库被称为PDB,每个PDB在CDB中是相互独立存在的,单独使用PDB时,与普通数据库无任何区别;
CDB根容器数据库的主要作用就是容纳所有相关的PDB元数据,以及对所有的PDB进行管理,容器被称为CDB,容器的子数据库为PDB,每一个PDB也可以当成一个新的容器,在其里面创建子数据库。
2.操作步骤
2.1 信息检查
以下将被克隆的数据库,称为源数据库,新建的数据库称为目标数据库;
//查看数据库是否为CDB
select name,cdb,open_mode,con_id from v
d
a
t
a
b
a
s
e
;
/
/
查看
C
D
B
中的
p
d
b
s
及状态
s
h
o
w
p
d
b
s
;
/
/
查看当前容器名称
s
h
o
w
c
o
n
n
a
m
e
;
/
/
切换实例链接,切换为
C
D
B
时,数据库名称为
C
D
B
database; //查看CDB中的pdbs及状态 show pdbs; //查看当前容器名称 show con_name; //切换实例链接,切换为CDB时,数据库名称为CDB
database;//查看CDB中的pdbs及状态showpdbs;//查看当前容器名称showconname;//切换实例链接,切换为CDB时,数据库名称为CDBROOT
alter session set container = upsrdb(数据库名字)
//查看当前登录用户名
show user;
//链接指定的用户
conn 用户名/密码
2.2 克隆条件检查
克隆PDB就是用已经存在的数据库作为模板创建一个结构和数据(可以不复制数据)相同的PDB。复制期间如果想要保持源数据库正常运行,则源数据库必须处于归档模式且本地UNDO模式。
若CDB没有启动local UNDO模式,则源PDB必须以只读模式打开。
若CDB是本地UNDO模式,则可以以读写模式打开。
检查本地undo
select property_name, property_value
from database_properties
where property_name = ‘LOCAL_UNDO_ENABLED’;
//结果为true
PROPERTY_NAME PROPERTY_VALUE
LOCAL_UNDO_ENABLED TRUE
检查归档模式
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /opt/oracle/product/19c/dbhome_1/dbs/arch
Oldest online log sequence 1360
Current log sequence 1362
//未自动归档
源与目标端兼容
//查看字符集
select * from nls_database_parameters where parameter=‘NLS_CHARACTERSET’
or parameter=‘NLS_LANGUAGE’ or parameter=‘NLS_NCHAR_CHARACTERSET’;
//查看字节顺序
SELECT d.inst_id, t.platform_id, t.platform_name, t.endian_format, d.name FROM v
t
r
a
n
s
p
o
r
t
a
b
l
e
p
l
a
t
f
o
r
m
t
,
g
v
transportable_platform t, gv
transportableplatformt,gvdatabase
d WHERE t.platform_name = d.platform_name;
2.3更改PDB状态的方法
以下操作,如果CDB没有启动本地UNDO,需要执行。都是在CDB服务下,SYS用户下操作
//先关闭PDB数据库,使其状态为MOUNTED
alter pluggable database upsrdb(PDB名字) close immediate;
//设置为只读
alter pluggable database upsrdb(PDB名字) open read only;
//设置为读写
alter pluggable database upsrdb(PDB名字) open read write;
2.4 在源数据库CDB下创建公共的用户,并且赋予其相应的权限
该操作:应该在CDB服务下,SYS用户下执行
//创建公共用户
create user c##xb(用户名) identified by xb(密码) container=all;
//赋予权限
grant CREATE PLUGGABLE DATABASE to c##xb container=all;
grant create session,connect,resource,cdb_dba,sysoper to c##xb container=all;
grant create any table,unlimited tablespace to c##xb container=all
2.5在目标数据库CDB下创建dblink(数据链)
//创建链接
create public database link to_remote(数据库链接名) connect to c##xb(源数据库用户名) identified by xb(用户密码) using ‘(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 服务器IP地址)(PORT = 端口))
)
(CONNECT_DATA =
(SERVICE_NAME = 服务名,因为克隆数据库,这里写源CDB名称)
)
)’;
//删除链接
drop public database link to_remote(链接名字);
2.6 在目标数据库CDB下克隆远程PDB数据库
在CDB下创建PDB的条件:
CDB必须存在,且处于读写模式
当前用户必须是公告用户,并且当前的容器必须是CDB root或应用程序容器
当前用户必须有CREATE PLUGGABLED DATABASE权限
PDB名称不能与已存在PDB名称重复等
若有OMF文件托管则执行
create pluggable database upsrdb(目标PDB名称) from upsrdb(源PDB)@to_remote(创建的dblink链接)
若没有启用OMF文件托管,则需要指定FILE_NAME_CONVERT参数
查看源PDB的tempfile文件
select name from v
t
e
m
p
f
i
l
e
;
查看源
P
D
B
的
d
a
t
a
f
i
l
e
文件
s
e
l
e
c
t
n
a
m
e
f
r
o
m
v
tempfile; 查看源PDB的datafile文件 select name from v
tempfile;查看源PDB的datafile文件selectnamefromvdatafile;
则执行的克隆语句为:
其中的文件名称包括tempfile与datafile两个部分文件
create pluggable database upsrdb(目标PDB名称) from upsrdb(源PDB)@to_remote(创建的dblink链接)
FILE_NAME_CONVERT=(‘源数据库文件名称’,‘目标数据库文名称’,‘源数据库文件名称’,‘目标数据库文名称’…);