 
             
             
            客服微信

 
        本文为云贝教育 刘峰 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。
	
 
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;