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. 步骤:
就这五个步骤,非常简单。 |
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状态。 |