陈老师:1415968548 郑老师:2735197625 乐老师:354331153
客服热线:
19941464235 / 19906632509 / 19906733890 / 19905812933(微信同号)

客服微信

【Oracle OCP】Oracle 19c之PDB管理

作者:炎燚小寶
发布时间:2023-12-19 09:21
浏览量:839

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

一、手工管理 (SQL*Plus)

CREATE PLUGGABLE DATABASE 和 ALTER PLUGGABLE DATABASE 命令有很多变体,因此我们将在这里保持简单,只关注那些模仿 DBCA 中可能的内容。

对于此处列出的所有操作,您必须连接到 CDB,并将容器设置为根(默认)。通常,您将连接到具有 SYSDBA 或 SYSOPER 权限的普通用户。创建新的可插入数据库时,用户必须具有 CREATE PLUGGABLE DATABASE 系统权限。

二、手工创建PDB

要从种子数据库创建新的可插入数据库,我们所要做的就是告诉 Oracle 文件应该放置在哪里。


我们可以使用三种方法之一来完成此操作。如果我们使用 Oracle Managed Files (OMF),则无需担心文件放置。 Oracle 将为我们处理。
ALTER SYSTEM SET db_create_file_dest = '/opt/oracle/oradata/ORCLCDB';

从 12.1.0.2 开始,有一个使用 CREATE_FILE_DEST 子句的内联变体。本节中设置的路径将用作新PDB 的 OMF 位置。

CONN / AS SYSDBA

host mkdir -p /opt/oracle/oradata/ORCLCDB/ORCLPDB2

CREATE PLUGGABLE DATABASE pdb2 ADMIN USER pdb_adm IDENTIFIED BY Password1
CREATE_FILE_DEST='/opt/oracle/oradata/ORCLCDB/ORCLPDB2';


第二种方法使用 CREATE PLUGGABLE DATABASE 语句中的 FILE_NAME_CONVERT 子句。

CONN / AS SYSDBA

CREATE PLUGGABLE DATABASE pdb3 ADMIN USER pdb_adm IDENTIFIED BY Password1
FILE_NAME_CONVERT=
('/opt/oracle/oradata/ORCLCDB/pdbseed/','/opt/oracle/oradata/ORCLCDB/pd
b3/');


或者,我们可以在调用命令之前指定 PDB_FILE_NAME_CONVERT 初始化参数,而不使用FILE_NAME_CONVERT 子句。

CONN / AS SYSDBA

ALTER SESSION SET
PDB_FILE_NAME_CONVERT='/opt/oracle/oradata/ORCLCDB/pdbseed/','/opt/oracle/oradata/ORCLCDB/pdb4/';

CREATE PLUGGABLE DATABASE pdb4 ADMIN USER pdb_adm IDENTIFIED BY
Password1;


我们可以通过查询 DBA_PDBS 和 V$PDBS 视图来查看 PDB 是否存在。

COLUMN pdb_name FORMAT A20

SELECT pdb_name, status
FROM dba_pdbs
ORDER BY pdb_name;

PDB_NAME STATUS
-------------------- -------------
PDB$SEED NORMAL
PDB1 NORMAL
PDB2 NEW
PDB3 NEW

SQL>

 COLUMN name FORMAT A20

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME OPEN_MODE
------------------------------ ----------
PDB$SEED READ ONLY
PDB1 MOUNTED
PDB2 MOUNTED
PDB3 MOUNTED

SQL>


您还可以使用 SQL*Plus 中的 SHOW PDBS 命令。

SQL> SHOW PDBS

    CON_ID CON_NAME             OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
    2 PDB$SEED               READ ONLY NO
    3 PDB1                   MOUNTED
    4 PDB2                   MOUNTED
    5 PDB3                   MOUNTED
SQL>


创建的 PDB 状态为“NEW”。它们必须以读写模式至少打开一次,才能完成 PDB 到 CDB 的集成。

ALTER PLUGGABLE DATABASE pdb2 OPEN READ WRITE;
ALTER PLUGGABLE DATABASE pdb3 OPEN READ WRITE;

SELECT pdb_name, status
FROM dba_pdbs
ORDER BY pdb_name;

PDB_NAME STATUS
-------------------- -------------
PDB$SEED NORMAL
PDB1 NORMAL
PDB2 NORMAL
PDB3 NORMAL

SQL>

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME OPEN_MODE
------------------------------ ----------
PDB$SEED READ ONLY
PDB1 MOUNTED
PDB2 READ WRITE
PDB3 READ WRITE


根据所使用的语法,您可能需要将 PDB_DBA 角色授予 PDB 的本地管理员用户。

三、手工拨出PDB


在尝试拔下 PDB 之前,必须确保其已关闭。要拔出数据库,请使用 ALTER PLUGGABLE DATABASE 命令和 UNPLUG INTO 子句来指定 XML 元数据文件的位置。

ALTER PLUGGABLE DATABASE pdb2 CLOSE;
ALTER PLUGGABLE DATABASE pdb2 UNPLUG INTO
'/u01/app/oracle/oradata/cdb1/pdb2/pdb2.xml';


可插入数据库仍然存在,但在元数据文件和所有数据文件复制到安全的地方之前,您不应该打开它。

SELECT name, open_mode
FROM   v$pdbs
ORDER BY name;

NAME                 OPEN_MODE
------------------------------ ----------
PDB$SEED             READ ONLY
PDB1                 MOUNTED
PDB2                 MOUNTED
PDB3                 READ WRITE


您可以删除 PDB,选择将文件保留在文件系统上。

DROP PLUGGABLE DATABASE pdb2 KEEP DATAFILES;

SELECT name, open_mode
FROM   v$pdbs
ORDER BY name;

NAME                 OPEN_MODE
------------------------------ ----------
PDB$SEED             READ ONLY
PDB1                 MOUNTED
PDB3                 READ WRITE


四、手工插入PDB


将 PDB 插入 CDB 类似于创建新的 PDB。首先通过调用 DBMS_PDB.CHECK_PLUG_COMPATIBILITY 函数检查 PBD 是否与 CDB 兼容,并传入 XML 元数据文件和要使用它创建的 PDB 的名称。

SET SERVEROUTPUT ON
DECLARE
  l_result BOOLEAN;
BEGIN
  l_result := DBMS_PDB.check_plug_compatibility(
              pdb_descr_file =>
'/u01/app/oracle/oradata/cdb1/pdb2/pdb2.xml',
              pdb_name => 'pdb2');

  IF l_result THEN
    DBMS_OUTPUT.PUT_LINE('compatible');
  ELSE
    DBMS_OUTPUT.PUT_LINE('incompatible');
END IF;
END;
/
compatible

PL/SQL procedure successfully completed.

SQL>


如果 PDB 不兼容,则会在 PDB_PLUG_IN_VIOLATIONS 视图中列出违规行为。如果 PDB 兼容,请使用它作为源创建一个新的 PDB。如果我们用新名称创建它,我们可能会这样做。

 --FILE_NAME_CONVERT不支持OMF管理的PDB
CREATE PLUGGABLE DATABASE pdb5 AS CLONE USING
'/u01/app/oracle/oradata/cdb1/pdb2/pdb2.xml'
FILE_NAME_CONVERT=
('/u01/app/oracle/oradata/cdb1/pdb2/','/u01/app/oracle/oradata/cdb1/pdb
5/')


相反,我们希望将数据库插入到相同的容器中,因此不需要复制文件或重新创建临时文件,因此可以执行以下操作。

--保留数据文件删除pdb2
drop pluggable database pdb2 KEEP DATAFILES;;

--将pdb2重新插入CDB中
CREATE PLUGGABLE DATABASE pdb2 as clone USING
'/u01/app/oracle/oradata/cdb1/pdb2/pdb2.xml'
NOCOPY
TEMPFILE REUSE; 

ALTER PLUGGABLE DATABASE pdb2 OPEN READ WRITE;

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME                   OPEN_MODE
------------------------------ ----------
PDB$SEED               READ ONLY
PDB1                   MOUNTED
PDB2                   READ WRITE
PDB3                   READ WRITE


五、手工克隆PDB

克隆一个现有的本地PDB类似于从种子PDB创建一个新的PDB,只是现在我们使用非种子PDB作为源,我们必须使用from子句来标识它。


如果您使用的是 12.1 或 12.2,没有本地撤消模式,请确保源 PDB 以只读模式打开。

ALTER PLUGGABLE DATABASE pdb3 OPEN ;

CREATE PLUGGABLE DATABASE pdb4 FROM pdb3
FILE_NAME_CONVERT=
('/u01/app/oracle/oradata/cdb1/pdb3/','/u01/app/oracle/oradata/cdb1/pdb
4/');

ALTER PLUGGABLE DATABASE pdb4 OPEN READ WRITE;


克隆语法还允许使用本地 CBD 中的数据库链接从远程数据库进行克隆。此功能有一些相关限制。

OMF转换示例

select name from v$datafile where con_id=5;

select name from v$tempfile where con_id=5;

CREATE PLUGGABLE DATABASE pdb4 FROM pdb2
FILE_NAME_CONVERT=
('/u01/app/oracle/oradata/ORCL/pdb2/','/u01/app/oracle/oradata/ORCL/pdb
4/','/u01/app/oracle/oradata/ORCL/pdb2/ORCL/03DE94353886972BE0638274A8C
0D742/datafile/o1_mf_system_lgog9f0p_.dbf','/u01/app/oracle/oradata/ORC
L/pdb4/system01.dbf','/u01/app/oracle/oradata/ORCL/pdb2/ORCL/03DE943538
86972BE0638274A8C0D742/datafile/o1_mf_sysaux_lgog9f0q_.dbf','/u01/app/o
racle/oradata/ORCL/pdb4/sysaux01.dbf','/u01/app/oracle/oradata/ORCL/pdb
2/ORCL/03DE94353886972BE0638274A8C0D742/datafile/o1_mf_undotbs1_lgog9f0
r_.dbf','/u01/app/oracle/oradata/ORCL/pdb4/undo01.dbf','/u01/app/oracle
/oradata/ORCL/pdb2/ORCL/03DE94353886972BE0638274A8C0D742/datafile/o1_mf
_temp_lgog9f0r_.dbf','/u01/app/oracle/oradata/ORCL/pdb4/temp01.dbf')


六、只克隆PDB中的元数据

12.1.0.2 补丁集引入了进行仅元数据克隆的功能。克隆 PDB 时添加 NO DATA 子句表示仅应克隆用户创建的对象的元数据,而不是表和索引中的数据。


6.1 准备环境

CONN / AS SYSDBA

CREATE PLUGGABLE DATABASE pdb10 ADMIN USER pdb_adm IDENTIFIED BY Password1
FILE_NAME_CONVERT=
('/u01/app/oracle/oradata/cdb1/pdbseed/','/u01/app/oracle/oradata/cdb1/
pdb10/');

ALTER PLUGGABLE DATABASE pdb10 OPEN;

ALTER SESSION SET CONTAINER = pdb10;

alter tablespace temp add tempfile
'/opt/oracle/oradata/ORCLCDB/pdb10/temp01.dbf' size 10m;

CREATE TABLESPACE users
DATAFILE '/opt/oracle/oradata/ORCLCDB/pdb10/users01.dbf'
SIZE 1M AUTOEXTEND ON NEXT 1M;

CREATE USER test IDENTIFIED BY test
DEFAULT TABLESPACE users
QUOTA UNLIMITED ON users;

CREATE TABLE test.t1 (
id NUMBER
);
INSERT INTO test.t1 VALUES (1);
COMMIT;

SELECT COUNT(*) FROM test.t1;

COUNT(*)
----------
         1


6.2、元数据克隆

使用 NO DATA 子句执行 PDB 的仅元数据克隆。

CONN / AS SYSDBA


CREATE PLUGGABLE DATABASE pdb11 FROM pdb10
FILE_NAME_CONVERT=
('/u01/app/oracle/oradata/cdb1/pdb10/','/u01/app/oracle/oradata/cdb1/pdb11/')
NO DATA;

--如果pdb10中包括OMF管理的数据文件,需要转换
--否则会报ORA-65005: missing or invalid file name pattern for file
-/opt/oracle/oradata/ORCLCDB/031DC5CB31DD3CABE063824AA8C065C2/datafile/o1_mf_users_lfw20flv_.dbf

CREATE PLUGGABLE DATABASE pdb11 FROM pdb10
FILE_NAME_CONVERT=
('/opt/oracle/oradata/ORCLCDB/pdb10/','/opt/oracle/oradata/ORCLCDB/pdb11/','/opt/oracle/oradata/ORCLCDB/031DC5CB31DD3CABE063824AA8C065C2/datafile/o1_mf_users_lfw20flv_.dbf','/opt/oracle/oradata/ORCLCDB/pdb11/user01.dbf')
NO DATA;



ALTER PLUGGABLE DATABASE pdb11 OPEN READ WRITE;


检查新 PDB 中测试表的内容显示该表存在,但它是空的。

CONN / AS SYSDBA
ALTER SESSION SET CONTAINER = pdb11;

SELECT COUNT(*) FROM test.t1;

COUNT(*)
----------
         0


6.3、使用限制

NO DATA子句只有在源PDB不包含以下任何内容时才有效。
·Index-organized表
·高级队列(AQ)表
·群集表

·表集群

如果是这样,您将收到以下类型的错误。

CREATE TABLE locations
(id NUMBER(10),
description VARCHAR2(50) NOT NULL,
map BLOB,
CONSTRAINT pk_locations PRIMARY KEY (id)
)
ORGANIZATION INDEX
TABLESPACE iot_tablespace
PCTTHRESHOLD 20
INCLUDING description
OVERFLOW TABLESPACE overflow_tablespace;


SQL> CREATE PLUGGABLE DATABASE pdb11 FROM pdb1
FILE_NAME_CONVERT=
('/u01/app/oracle/oradata/cdb1/pdb1/','/u01/app/oracle/oradata/cdb1/pdb11/')
NO DATA;
CREATE PLUGGABLE DATABASE pdb11 FROM pdb1
*
ERROR at line 1:
ORA-65161: Unable to create pluggable database with no data


七、手工删除PDB

删除可插拔数据库时,您必须决定是保留还是删除关联的数据文件。 PDB 在删除之前必须关闭。
ALTER PLUGGABLE DATABASE pdb2 CLOSE;
DROP PLUGGABLE DATABASE pdb2 KEEP DATAFILES;

ALTER PLUGGABLE DATABASE pdb3 CLOSE;
DROP PLUGGABLE DATABASE pdb3 INCLUDING DATAFILES;

ALTER PLUGGABLE DATABASE pdb4 CLOSE;
DROP PLUGGABLE DATABASE pdb4 INCLUDING DATAFILES;

SELECT name, open_mode
FROM v$pdbs
ORDER BY name;

NAME                   OPEN_MODE
------------------------------ ----------
PDB$SEED               READ ONLY
PDB1                   MOUNTED