鉴于12c 那么好玩,打算玩一下12c 的PDB各种克隆,完全按照官方文档操作。
创建PDB 有几种不同的方式,
1,使用种子
2,从其他PDB中以及一般数据库中(也就是非容器数据库)克隆
3,从其他容器中重分配
4,加载或者卸载pdb
5,创建代理PDB
6,从非容器数据库中创建。
注:图为官方文档介绍。
注:实际上创建程序容器(application container)只需要在创建pdb 的语句中加一句as application container。for example:create pluggable database sales as application container from seed;
语法很长,我尽量一一介绍。
总语法:
CREATE PLUGGABLE DATABASE 支持的参数:
1,storage limits : 使用 storage 限定pdb的能使用多少存储。
file location of the new pdbs: 为新pdb指定文件存储位置。
restrictions on pdb file locations: 使用 path_prefix 限定该pdb 所有文件都在该路径,包括oracle xml 目录,pfile 路径。已经导出oracle wallet 的路径。
source file location when plugging an unplugged pdb: 使用 create pluggable database ....using 以加载或者卸载pdb。
renaming a service: 使用service_name_convert 为新pdb 修改服务名。
temp file reuse: 使用tempfile reuse 当临时文件存在在目录的时候,重用临时文件。
default tablespace:使用default tablespace 为pdb 指定默认使用表空间。
pdb tablespace logging: logging 表示打开日志记录,nologging 表示不记录(一般意义上的不记录),filesystem_like_logging 只对securefiles lob segments有效。
pdb inclusion in standby cdbs: 使用standbys指定新的pdb 是否在备用cdb也创建中。
excluding data when cloning a pdb:使用 no data 选项表示只克隆数据模型定义不复制数据。
parallelize pdb creation: 使用parallel 选项表示在pdb 创建过程中使用多少个并行。
pdb refresh: 使用 refresh mode 选项表示pdb 从克隆中创建后可以进行刷新,每次刷新都会从源pdb中传播更改到新pdb。
application container and application seed :使用as application container 可以创建新的应用容器和应用容器种子。
pdb listener host name and port number:只用在代理pdb(proxy pdb)将引用pdb时使用port 选项指定端口,host 选择指定pdbs 的名字才重要。
OK! here we go!
1,从种子中创建pdb
如果从种子中创建pdb,则会拷贝种子pdb的数据文件到pdb中,从root CDB或者application container中。也就是说在application container 下使用种子pdb 创建pdb 则会复制application下的种子pdb数据文件。
1) 首先确认是在cdb 中
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
或者
你是在application container 中。
如果不加任何其他参数,那么最简单的创建语句为:
create pluggable database pdb_f_seed admin user flyme identified by oracle role=(pdb_dba);
注:从种子数据库中创建pdb时候,必须有admin user user_name identified by password 语句。此处同时建议授权pdb_role。也就是 admin user flyme identified by oracle role=(pdb_dba)。
创建pdb后,pdb的状态应该为mount 状态。可通过v$pdbs 查看open_mode,通过cdb_pdbs和dba_pdbs 视图查看status。
SQL> select CON_ID,NAME,OPEN_MODE from v$pdbs;
CON_ID NAME OPEN_MODE
---------- ---------------------------------------- ----------
5 PDB_F_SEED READ WRITE
pdb 支持以下几种open_mode
open read write
>alter pluggable database open read write [restricted] [force] --read write 为默认选项,restricted 为限制模式,只有授予了restriceted session 权限的用户才能连接。force 则会强制关闭然后启动,或者从read only 模式切换为read write.(实际操作,感觉在read write 模式下 force 很快,都怀疑他有没有force)
open read only
>alter pluggable database open read only [restricted] [force] --以只读模式打开pdb
open migrate
>alter pluggable database open upgrade [restricted] --以迁移模式打开pdb,
mounted
>alter pluggable database close [immediate|abort] --如果没有immediate或者abort 则以normal 模式关闭数据库。对于abort 的介质恢复,有点晕。需要shutdown abort 集群则需要最后一个实例shutdown abort
注:当使用alter pluggable database 支持列出pdb 名字,以进行批量操作,也支持 all, all except,同时支持services =,instances= 选项按需操作。在RAC中还支持norelocate,relocate to ,relocate 选项,可使pdb在其他实例打开。
pdb的备份
> 用公用账号以sysbackup 或者sysdba 身份连接到root,使用backup pluggable database pdb_name; 其实这里一般rman target /
>用拥有sysdba的本地用户连接到pdb,使用backup database;进行备份。此处略坑爹,需要解析tnsnames.ora 以及必须授予pdb 本地用户sysdba 权限。rman target user_name/password@pdb_f_seed
2,从pdb或者非pdb 中克隆pdb
>可从本地pdb 中克隆
当cdb 为archivelog模式 以及local undo 模式,本地源pdb可以在操作期间以read/write模式打开,也就是支持热克隆。如果cdb 不是local undo 模式或者archivelog模式,那么源pdb需要以open read only模式打开。源pdb不能在mount 模式下。
如果创建为application container,那么在application container中的pdb必须和application container保持一样的字符集和国家字符集。application container 可以和CDB不一样的字符集和国家字符集。
example:
SQL> alter pluggable database PDB_F_SEED open;
插接式数据库已变更。
SQL> create pluggable database pdb_f_pdb_1 from pdb_f_seed;
插接式数据库已创建。
SQL> create pluggable database app_con_f_pdb as application container from pdb_f_seed;
插接式数据库已创建。
>从远程pdb以及非cdb中克隆。
当源pdb的cdb在远程端时,必须使用dblink 克隆pdb,dblink必须创建在新pdb的cdb中,dblink必须连接到远程cdb 的root下,或者远程源pdb中。主机平台需要有相同的字节顺序,目标数据库安装选项大于等于源pdb数据库。如果目标CDB 的字符集不是AL32UTF8 ,那么目标和源CDB必须具有兼容的字符集和国家字符集。如果目标为AL32UTF8,那么随便哪个字符集都可以。源pdb或者non-cdb数据库版本必须大于12.1.0.2。
当源为非CDB时,使用dblink 连接到该数据库即可。
example 1 cloning by remote pdb:
SQL> create database link pdb_link connect to c##pdb identified by oracle using '(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=pdb_f_seed))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.124)(PORT=1521)))';
数据库链接已创建。
SQL> create pluggable database pdb_f_rmpdb from pdb_f_seed@pdb_link;
插接式数据库已创建。
example 2 cloning by non-cdb:
SQL> create database link nonpdb_link connect to flyme identified by oracle using '(DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=single))(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.101)(PORT=1521)))';
数据库链接已创建。
use
SQL> create pluggable database pdb_f_rmnoncdb from single@nonpdb_link;
插接式数据库已创建。
注:当为non-cdb时,可以用non$cdb代替数据库名。
SQL> create pluggable database pdb_f_rmnoncdb2 from non$cdb@nonpdb_link;
插接式数据库已创建。
>克隆可刷新pdb
可以使用refresh mode 选项配置可刷新pdb, 但是源pdb和克隆pdb 必须在非同一个CDB下。源pdb 必须archivelog mode 和local undo mode。可刷新克隆pdb必须运行在readonly 模式下或者关闭。可以使用alter pluggable database xx refresh mode none 使可刷新pdb 转为普通pdb。该过程不可逆。另外,可刷新pdb 在open read only 模式下打开时,并不应用来自源pdb的更改,如果在刷新时间内,pdb 处于open read only模式,则刷新推迟到下个刷新时间点。刷新可在手动和自动刷新之间切换。手动刷新需要在当前pdb 下,关闭pdb,执行刷新:
alter pluggable database close;
alter pluggable database refresh;
example:
SQL> CREATE PLUGGABLE DATABASE repdb_f_pdb FROM pdb_f_seed@pdb_link REFRESH MODE EVERY 1 MINUTES;
插接式数据库已创建。
>快照pdb
当您使用SNAPSHOT COPY子句时,源PDB的所有数据文件都必须存储在相同的存储类型中。
当您使用SNAPSHOT COPY子句创建源PDB的克隆和CLONEDB初始化参数设置为FALSE,为底层文件系统源PDB的文件必须支持存储快照。 这些文件系统包括Oracle自动存储管理群集文件系统(Oracle ACFS)和直接NFS客户端存储。 Exadata支持配置了ASM的ASM上的快照复制功能稀疏的ASM网格磁盘。这个略复杂,暂时不研究。
就这样吧,不搞数据库了。近期打算搞一下语音识别。以后再说吧。
领取专属 10元无门槛券
私享最新 技术干货