本文将通过下面四种方式,简单的对19c中pdb的创建做演示说明 1.从种子容器中创建pdb: 使用种子容器或应用程序种子的文件在CDB中创建PDB。此技术将与种子容器关联的文件复制到新位置,并将复制的文件与新的PDB关联,这是默认的创建机制。 2.克隆现存的pdb: 通过克隆源PDB或非CDB创建PDB。源可以是本地CDB中的PDB,远程CDB中的PDB,此技术将与源关联的文件复制到新位置,并将复制的文件与新的PDB关联。 3.Relocate PDB 此技术是在最少停机时间或没有停机时间的情况下移动PDB的最快方法。否则,拔出源PDB会导致PDB中断,直到将PDB插入目标CDB为止。 该操作将与PDB关联的文件移动到新位置,将PDB添加到目标CDB,然后打开PDB。 4.插拔pdb 通过使用描述PDB的XML元数据文件和与PDB关联的文件来创建PDB,以将其插入CDB。
从种子容器中创建pdb
1 描述 使用PDB $ SEED文件在CDB根目录中创建PDB,复制PDB$SEED文件到新位置,并与新建PDB关联。 2 创建 SQL>CREATE PLUGGABLE DATABASE testpdb ADMIN USER admin123 IDENTIFIED BY admin123; // 该方法必须为CDB启用了OMF,或者PDB_FILE_NAME_CONVERT设置了初始化参数, 否则会报错: ORA-65016: FILE_NAME_CONVERT must be specified 可以使用file_name_convert参数指定. 也可以使用create_file_dest参数指定 2.1为CDB开启OMF功能 SQL> Show con _name CON NAME ------------------------- CDB$ROOT S0L> alter system set db_create_file_dest ='/oracle/app/oradata/orcl/'; System altered. SOL> CREATE PLUGGABLE DATABASE testpdb ADMIN USER admin123 IDENTIFIED By admin123; Pluggable database created. 创建出来的文件为OMF文件管理格式: SQL> alter session set container=testpdb; Session altered. SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /oracle/app/oradata/orcl/ORCL/AA2EA0F75BFC6CFBE053D8C7A8C01395/datafile/o1_mf_system_hjmx322m_.dbf /oracle/app/oradata/orcl/ORCL/AA2EA0F75BFC6CFBE053D8C7A8C01395/datafile/o1_mf_sysaux_hjmx322v_.dbf /oracle/app/oradata/orcl/ORCL/AA2EA0F75BFC6CFBE053D8C7A8C01395/datafile/o1_mf_undotbs1_hjmx322w_.dbf 2.2 在CDB设置pdb_file_name_convert参数 SOL> alter system set pdb_file_name_convert='/oracle/app/oradata/orcl/pdbseed','/oracle/app/oradata/orcl/testpdb'; (目录可以不存在,会自动创建) 2.3 创建时指定create_file_dest参数 SQL>CREATE PLUGGABLE DATABASE testpdb2 ADMIN USER admin123 IDENTIFIED BY admin123 create_file_dest='/oracle/app/oradata/orcl/testpdb2/'; Create_file_dest位置必须事先被创建好,否则会报如下错误: ERROR at line 1: ORA-65165: missing or invalid path for file creation /oracle/app/oradata/orcl/testpdb2/ ORA-01262: Stat failed on a file destination directory Linux-x86_64 Error: 2: No such file or directory 2.4 创建PDB时的子句选项 CREATE PLUGGABLE DATABASE salespdb ADMIN USER salesadm IDENTIFIED BY password STORAGE (MAXSIZE 2G) DEFAULT TABLESPACE sales DATAFILE '/disk1/oracle/dbs/salespdb/sales01.dbf' SIZE 250M AUTOEXTEND ON PATH_PREFIX = '/disk1/oracle/dbs/salespdb/' FILE_NAME_CONVERT = ('/disk1/oracle/dbs/pdbseed/', '/disk1/oracle/dbs/salespdb/'); ADMIN USER:创建用于执行管理任务的本地用户 STORAGE MAXSIZE 可插拔数据库可使用空间的最大值 DEFAULT:新建用户的默认表空间: DATAFILE:默认表空间数据文件的路径和名称 PATH_PREFIX:设置可插拔数据库新增的数据文件必须存储在该目录或其子目录中。
克隆现存的PDB
1 描述 三种方式: 克隆本地PDB 克隆远程PDB 克隆远程非CDB 2 克隆本地PDB 先连接根容器,然后将源PDB切换为只读模式: SQL> alter pluggable database salespdb close; Pluggable database altered. SQL> alter pluggable database salespdb open read only; Pluggable database altered. 如果CDB不在本地撤消模式下,则源PDB必须处于打开的只读模式。如果CDB处于本地撤消模式,则此要求不适用。 如果CDB不在ARCHIVELOG模式下,则源PDB必须处于只读模式。如果CDB处于ARCHIVELOG模式,则此要求不适用。 创建: SQL>Create pluggable database salespdb from orclpdb //from后无法接种子容器 file_name_convert = ('/oracle/app/oradata/orcl/orclpdb','/oracle/app/oradata/orcl/salespdb'); 如果启用Oracle托管文件,或设置PDB_FILE_NAME_CONVERT初始化参数。 该FILE_NAME_CONVERT子句和该CREATE_FILE_DEST子句不是必需的。 克隆时,源PDB必须处于打开状态,不可为mount模式, 要么read only 要么为read write,否则会报错 ORA-65036: pluggable database ORCLPDB not open in required mode 3 克隆远程PDB 源CDB: SQL> select con_id,name from v$containers; CON_ID NAME ---------- -------------------- 1 CDB$ROOT 2 PDB$SEED 3 ORCLPDB 4 SALESPDB 在源CDB中创建DBlink连接用户: SQL> create user c##test identified by test; SQL> grant CREATE PLUGGABLE DATABASE to c##test; SQL> grant create session,connect,resource,sysoper to c##test; //官方要求必须存在CREATE PLUGGABLE DATABASE权限 在目的CDB中创建连接远程PDB的DBLINK: SQL> create database link salespdb connect to c##test identified by test using 'orcl2'; Database link created. 连接源CDB将PDB置为redo only状态: $ sqlplus sys/oracle@orcl2 as sysdba SQL> alter pluggable database salespdb close; Pluggable database altered. SQL> alter pluggable database salespdb open read only; Pluggable database altered. 使用SYS用户连接目的CDB,然后通过克隆远程PDB,创建新的PDB: $ sqlplus / as sysdba SQL>create pluggable database salespdb2 from salespdb@salespdb file_name_convert = ('/oracle/app/oradata/orcl/salespdb','/oracle/app/oradata/orcl/salespdb2'); Pluggable database created. 测试期间遇到的错误: 错误1: ERROR at line 1: ORA-17628: Oracle error 1031 returned by remote Oracle server ORA-01031: insufficient privileges 原因就是源PDB用户权限不够 注意CREATE PLUGGABLE DATABASE 以及sysoper权限 错误2: //在PDB中创建用户无法连接,使用DBLINK远程克隆时会报如下错误: ORA-17627: ORA-01017: invalid username/password; logon denied ORA-17629: Cannot connect to the remote database server 4 克隆非CDB 要求: CDB和非CDB必须运行Oracle Database 12c第1版(12.1.0.2)或更高版本。 CDB和非CDB必须运行相同的Oracle数据库版本。 新创建的PDB的数据块大小必须与CDB相匹配。 在源库非CDB创建DBLINK连接用户 SQL> select cdb from v$database; CDB --- NO SQL> create user test identified by test; 给用户授予权限: SQL> grant CREATE PLUGGABLE DATABASE to test; SQL> grant create session,connect,resource,sysoper to test; 建立DBlink: SQL> create database link source connect to test identified by test using 'source'; Database link created. 源库状态: SQL> select open_mode from v$database; OPEN_MODE -------------------- READ WRITE 如果非CDB处于NOARCHIVELOG模式下,则必须以只读模式打开它。如果非CDB处于ARCHIVELOG模式,则可以将其打开为只读或读/写状态。 目标库进行克隆 SQL>create pluggable database testpdb from prod@source file_name_convert = ('/oracle/app/oradata/PROD/','/ora19c/app/oracle/oradata/ORA19C/ORA19C/testpdb/'); Pluggable database created. '/oracle/app/oradata/PROD/' 非CDB数据库的数据文件存放路径 '/ora19c/app/oracle/oradata/ORA19C/ORA19C/testpdb/' 目标库新建PDB存放路径 连接该PDB并运行脚本: SQL> alter session set container=testpdb; Session altered. 必须运行该脚本后才可打开数据库: SQL>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql 新建的PDB是无法直接open read only状态打开,必须需要先open read write一次,将其与CDB集成。 SQL> alter database open read only; alter database open read only * ERROR at line 1: ORA-65085: cannot open pluggable database in read-only mode SQL> alter database open read write; 后续就可read only打开 由于篇幅问题还有两种方式在下一篇中演示。
