客服微信
本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
12.1.0.2 补丁集引入了 PDB 子集克隆的概念,它允许克隆 PDB 中所有表空间的子集。当您想要构建PDB 来测试特定功能(不需要整个数据库)时,排除表空间可能会很有用。当将用于整合的实例拆分到各自的功能区域时,它也很有用。
为了查看此功能的工作原理,我们将创建一个干净的 PDB,然后添加 3 个新表空间,每个表空间都有一个默认用户和一个对象。这将模拟使用单个数据库来合并三个不同应用程序的情况。
CONN / AS SYSDBA -- Create a new PDB CREATE PLUGGABLE DATABASE pdb20 ADMIN USER pdb_adm IDENTIFIED BY Password1 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdbseed/','/u01/app/oracle/oradata/cdb1/ pdb20/'); ALTER PLUGGABLE DATABASE pdb20 OPEN; ALTER SESSION SET CONTAINER = pdb20; -- Create first TS, User, Table. CREATE TABLESPACE ts1 DATAFILE '/u01/app/oracle/oradata/cdb1/pdb20/ts101.dbf' SIZE 1M AUTOEXTEND ON NEXT 1M; CREATE USER test1 IDENTIFIED BY test1 DEFAULT TABLESPACE ts1 QUOTA UNLIMITED ON ts1; CREATE TABLE test1.t1 ( id NUMBER ); INSERT INTO test1.t1 VALUES (1); COMMIT; -- Create second TS, User, Table. CREATE TABLESPACE ts2 DATAFILE '/u01/app/oracle/oradata/cdb1/pdb20/ts201.dbf' SIZE 1M AUTOEXTEND ON NEXT 1M; CREATE USER test2 IDENTIFIED BY test2 DEFAULT TABLESPACE ts2 QUOTA UNLIMITED ON ts2; CREATE TABLE test2.t2 ( id NUMBER ); INSERT INTO test2.t2 VALUES (1); COMMIT; -- Create third TS, User, Table. CREATE TABLESPACE ts3 DATAFILE '/u01/app/oracle/oradata/cdb1/pdb20/ts301.dbf' SIZE 1M AUTOEXTEND ON NEXT 1M; CREATE USER test3 IDENTIFIED BY test3 DEFAULT TABLESPACE ts3 QUOTA UNLIMITED ON ts3; CREATE TABLE test3.t3 ( id NUMBER ); INSERT INTO test3.t3 VALUES (1); COMMIT;
我们可以在以下查询中看到模式之间的分离。
COLUMN owner FORMAT A20 COLUMN table_name FORMAT A20 COLUMN tablespace_name FORMAT A20 SELECT owner, table_name, tablespace_name FROM dba_tables WHERE table_name IN ('T1','T2','T3') ORDER BY owner; OWNER TABLE_NAME TABLESPACE_NAME -------------------- -------------------- -------------------- TEST1 T1 TS1 TEST2 T2 TS2 TEST3 T3 TS3
使用 USER_TABLESPACES 子句可以实现 PDB 子集克隆,该子句允许您以多种方式之一指定要包含在克隆中的用户定义表空间。
以下示例创建一个包含命名表空间列表的克隆。
CONN / AS SYSDBA CREATE PLUGGABLE DATABASE pdb21 FROM pdb20 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdb20/','/u01/app/oracle/oradata/cdb1/pd b21/') USER_TABLESPACES=('ts1', 'ts2'); ALTER PLUGGABLE DATABASE pdb21 OPEN; ALTER SESSION SET CONTAINER = pdb21;
如果我们查询表空间列表,就会发现T1和T2表空间在,T3表空间不在。
SELECT tablespace_name from dba_tablespaces; TABLESPACE_NAME -------------------- SYSTEM SYSAUX TEMP TS1 TS2 6 rows selected.
如果我们尝试访问每个模式中的对象
SQL> SELECT * FROM test1.t1; ID ---------- 1 SQL> SELECT * FROM test2.t2; ID ---------- 1 SQL> SELECT * FROM test3.t3; SELECT * FROM test3.t3 * ERROR at line 1: ORA-00376: file 72 cannot be read at this time ORA-01110: data file 72: 'No file with this number, file does not exist'
以下示例创建一个不存在任何用户定义表空间的克隆。
CREATE PLUGGABLE DATABASE pdb22 FROM pdb20 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdb20/','/u01/app/oracle/oradata/cdb1/pdb22/') USER_TABLESPACES=NONE; ALTER PLUGGABLE DATABASE pdb22 OPEN;
以下示例克隆所有用户定义的表空间,这与省略 USER_TABLESPACES 子句相同。
CREATE PLUGGABLE DATABASE pdb23 FROM pdb20 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdb20/','/u01/app/oracle/oradata/cdb1/pdb23/') USER_TABLESPACES=ALL; ALTER PLUGGABLE DATABASE pdb23 OPEN;
ALL EXCEPT 变体允许您列出要排除的表空间。
CREATE PLUGGABLE DATABASE pdb24 FROM pdb20 FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/pdb20/','/u01/app/oracle/oradata/cdb1/pdb24/') USER_TABLESPACES=ALL EXCEPT('ts3'); ALTER PLUGGABLE DATABASE pdb24 OPEN;