简介:
Oracle数据库新的版本增加新特性,即称为容器数据库,又称可插入数据库或多租户容器数据库;根数据库容器称为CDB;指的是可以容纳一个或者多个可插拔数据库的数据库,这个特性允许在CDB容器数据库中创建并且维护多个数据库,在CDB中创建的数据库被称为PDB,每个PDB在CDB中是相互独立存在的,单独使用PDB时,与普通数据库无任何区别;
CDB根容器数据库的主要作用就是容纳所有相关的PDB元数据,以及对所有的PDB进行管理,容器被称为CDB,容器的子数据库为PDB,每一个PDB也可以当成一个新的容器,在其里面创建子数据库。
远程克隆oracle PDB数据库
以下将被克隆的数据库,称为源数据库,新建的数据库称为目标数据库;
确定当前服务链接实例、用户
//查看数据库是否为CDB
select name,cdb,open_mode,con_id from v$database;
//查看CDB中的pdbs及状态
show pdbs;
//查看当前容器名称
show con_name;
//切换实例链接,切换为CDB时,数据库名称为CDB$ROOT
alter session set container = upsrdb(数据库名字)
//查看当前登录用户名
show user;
//链接指定的用户
conn 用户名/密码
1.克隆条件检查
克隆PDB就是用已经存在的数据库作为模板创建一个结构和数据(可以不复制数据)相同的PDB。复制期间如果想要保持源数据库正常运行,则源数据库必须处于归档模式且本地UNDO模式。
若CDB没有启动local UNDO模式,则源PDB必须以只读模式打开。
若CDB是本地UNDO模式,则可以以读写模式打开。
1.1检查本地undo
select property_name, property_value
from database_properties
where property_name = 'LOCAL_UNDO_ENABLED';
//结果为true
PROPERTY_NAME PROPERTY_VALUE
-------------------- --------------------
LOCAL_UNDO_ENABLED TRUE
1.2检查归档模式
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
//未自动归档
1.3源与目标端兼容
1.3.1字符集兼容
//查看字符集
select * from nls_database_parameters where parameter='NLS_CHARACTERSET'
or parameter='NLS_LANGUAGE' or parameter='NLS_NCHAR_CHARACTERSET';
1.3.2字节顺序相同
//查看字节顺序
SELECT d.inst_id, t.platform_id, t.platform_name, t.endian_format, d.name FROM v$transportable_platform t, gv$database
d WHERE t.platform_name = d.platform_name;
1.4更改PDB状态的方法
以下操作,都是在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.在源数据库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
3.在目标数据库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(链接名字);
4.在目标数据库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$tempfile;
查看源PDB的datafile文件
select name from v$datafile;
则执行的克隆语句为:
其中的文件名称包括tempfile与datafile两个部分文件
create pluggable database upsrdb(目标PDB名称) from upsrdb(源PDB)@to_remote(创建的dblink链接)
FILE_NAME_CONVERT=('源数据库文件名称','目标数据库文名称','源数据库文件名称','目标数据库文名称'...);
报错
原因:在源数据库创建的公共用户权限不足,按照本文档的赋权语句执行没有问题,可以解决该问题;