ORACLE数据库 19C 远程PDB克隆

简介:

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的条件:

  1. CDB必须存在,且处于读写模式

  1. 当前用户必须是公告用户,并且当前的容器必须是CDB root或应用程序容器

  1. 当前用户必须有CREATE PLUGGABLED DATABASE权限

  1. 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=('源数据库文件名称','目标数据库文名称','源数据库文件名称','目标数据库文名称'...);

报错

原因:在源数据库创建的公共用户权限不足,按照本文档的赋权语句执行没有问题,可以解决该问题;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值