Oracle PDB

CDB数据库:DB0

  P0:DBCA创建

  P1:从PDB$SEED创建

  P2:从P1创建

  P3:从DB1(非CDB)创建

  P4:从DB2的Pn创建

CDB数据库:DB1

CDB数据库:DB2

  Pn:从DB0的P0创建

dbca创建PDB

 

dbca方式创建pdb速度非常慢,而且隐藏了很多细节,不适合进一步学习了解。 

 命令行方式创建PDB

用命令行方式创建pdb,速度非常快,可以“秒”创建。

这里演示一下几种基本的创建方式。更多详细用法参考官方文档

1.从PDB$SEED创建PDB

create pluggable database P1 admin user pdbadmin identified by 0 file_name_convert=('pdbseed','P1');

创建完成后,P1处于挂载状态,并未开启。 


2.从现有PDB创建PDB

比如:从P1创建一个PDB叫P2, 先打开P1.

create pluggable database P2 from P1 file_name_convert=('P1','P2');

 这两个例子里,file_name_convert参数都是相对路径的写法,下一个例子里看看绝对路径写法。


3.从一个非CDB创建PDB

我先创建了一个非CDB的数据库DB1

还要给system用户授予create pluggable database 权限。

这一步不需要做,只是为了验证才做的。

DB1里创建了一个用户user1,创建了一个表空间tbs1,再授权。


换到user1,创建了一张表t1,插入了两条数据。

DB1,关闭数据库,再开启到只读状态。

 再到CDB数据库DB0,创建一个数据库链接(database link)。

note:

这里创建dblink时遇到一个报错——如果密码是数字开头的话会提示无效密码,而不是密码错误。

密码有特殊字符的话可以用转义字符或引号来避开这个错误。

图个方便,把DB1数据库的system的密码改成abc123,创建成功了。

create pluggable database P3 from NON$CDB@DB1_LINK file_name_convert=('/u01/app/oracle/oradata/DB1','/u01/app/oracle/oradata/DB0/P3');

这里用了绝对路径。

还差最后一步,到P3里执行noncdb_to_pdb.sql。 

这个脚本会执行几分钟。

执行完:这里是在新建好的P3里查看的,所以只能看到P3自己。

 这里是在CDB$ROOT(根容器)下查看的。

打开P3 

 

切换到P3,查看:

  

之前创建的tbs1,user1,t1也能在这里查到了。

我这里主要是为了验证,在DB1里创建了表空间tbs1,用户user1,表t1.

步骤:

  1. 到目标库授予system用户(也可以是其它用户)create pluggable database权限。
  2. 再把目标库开启到read only状态。
  3. 到容器库创建一个数据库链接。
  4. 执行create pluggable database语句。
  5. 到新建的PDB执行noncdb_to_pdb.sql脚本。

就这五个步骤,非常简单。

4.Refreshable PDB 

这一节算是方式2的一个扩展。也是比较有趣的一种创建方式。

虽然没有像DataGuard和 GoldenGate那样强,但还是有应用场景的。

我就从DB0的P0在DB2里创建一个叫Pn的PDB吧,有点拗口……

创建可刷新PDB的前提:

源PDB(P0)得是local undo;

要启用归档模式。

DB0的system用户授予create pluggable database权限。

grant create pluggable database to system container=all;

注意:这里要加一句container=all,否则会报错,因为DB0是container database。

或者进到指定的PDB里授予权限,并加一句container=current,默认就是container=current。

 先看看DB2

DB2创建一个dblink,指向DB0

create public database link DB0_link connect to system identified by pwd using 'DB0';

 manual

DB0的P0创建一个PDB叫Pn,加一个参数refresh mode manual(手动刷新):

create pluggable database Pn from P0@DB0_link

create_file_dest='/u01/app/oracle/oradata/DB2/Pn'

refresh mode manual;

看一看:

当我尝试开启新创建的Pn时居然报错了,说不能开启到read write。

 那就开启到read only看看:

接下来看看这个refresh mode manual参数的作用。

我到DB0的P0里创建了一张表叫t1:

再到DB2里的Pn看看:

现在还查不到。

 执行一句:alter pluggable database Pn refresh;

 报错了,需要先关闭Pn。

关闭再执行:

可以查到了!

note: 在同步前需要关闭Pn,这一点有点鸡肋。

 auto

我们就把刚才创建的Pn改成自动刷新:

每分钟刷新一次。

DB0的P0里的t1表里插入一条数据:

DB2里的Pn看看有没有刷新:

没有刷新。

看看日志:

一直在报错。

关闭Pn再重启:

没用,还是没查到,难道关闭完再等它刷新吗?

关闭Pn,再等等看日志会有什么变化:

等了一会儿,刷新了。

到Pn里看看:

终于查到了。

note:自动刷新,目标PDB同样需要处于mount状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值