ORACLE 19C NONCDB 转 PDB

使用DBMS_PDB.DESCRIBE ,将 非CDB 库插入到CDB 中

主机信息

角色主机名IP地址数据库版本实例名DB名
NONCDBtest01192.168.65.16919.30orcltest01orcltest01
CDBechodd192.168.65.16819.30orclorcl

NONCDB 库操作

1、以只读模式打开:

SQL> startup mount;
ORACLE instance started.

Total System Global Area 4731172128 bytes
Fixed Size                  8906016 bytes
Variable Size             872415232 bytes
Database Buffers         3841982464 bytes
Redo Buffers                7868416 bytes
Database mounted.

// 开启到只读状态
SQL> alter database open read only;
Database altered.

2、执行 DBMS_PDB.DESCRIBE 包,创建 XML 文件,其中包含有关 NONCDB 数据库数据文件的描述:

SQL> exec dbms_pdb.describe(pdb_descr_file => '/home/oracle/testdb01.xml');

PL/SQL procedure successfully completed.

3、关闭 NONCDB 数据库:

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

注意:这里不能打开数据库,详细原因在后面,先看

4、完整拷贝数据文件目录和 XML文件拷贝到目标端:

[oracle@test01:/home/oracle]$ scp testdb01.xml 192.168.65.168:/home/oracle
oracle@192.168.65.168's password: 
testdb01.xml                   100% 6945     7.2MB/s   00:00  
[oracle@test01:/home/oracle]$ cd /u01/app/oracle/oradata
[oracle@test01:/u01/app/oracle/oradata]$ scp -r ORCLTEST01 192.168.65.168:/oradata
oracle@192.168.65.168's password: 
system01.dbf                                                                                                                                100%  990MB 123.7MB/s   00:08    
sysaux01.dbf                                                                                                                                100%  710MB 177.4MB/s   00:04    
undotbs01.dbf                                                                                                                               100%  605MB 121.0MB/s   00:05    
users01.dbf                                                                                                                                 100% 5128KB 114.3MB/s   00:00    
control01.ctl                                                                                                                               100%   10MB 162.5MB/s   00:00    
control02.ctl                                                                                                                               100%   10MB 165.3MB/s   00:00    
redo01.log                                                                                                                                  100%  200MB 100.0MB/s   00:02    
redo02.log                                                                                                                                  100%  200MB 199.9MB/s   00:01    
redo03.log                                                                                                                                  100%  200MB 199.9MB/s   00:01    
temp01.dbf                                                                                                                                  100%   95MB  95.0MB/s   00:01  

CDB 库操作

1、执行 DBMS_PDB.CHECK_PLUG_COMPATIBILITY ,检查 NON-CDB 兼容性,修改新pdb名称:

SQL> set serveroutput on
DECLARE
  compatible CONSTANT VARCHAR2(3) := CASE dbms_pdb.check_plug_compatibility(pdb_descr_file => '/home/oracle/testdb01.xml',
                                                                        pdb_name       => 'Echodd')
                                       WHEN TRUE THEN
                                        'YES'
                                       ELSE
                                        'NO'
                                     END;
BEGIN
  dbms_output.put_line(compatible);
END;
/SQL>   2    3    4    5    6    7    8    9   10   11   12  
YES   //这个是输出

PL/SQL procedure successfully completed.

注:输出 YES,代表正常兼容,可以正常转换

(如果返回 FALSE/NO,需在 PDB_PLUG_IN_VIOLATIONS 视图中检查)

select time, name, type, error_number error, status, line, message, cause, action from pdb_plug_in_violations order by time desc;

2、插入为新pdb:

// copy 创建
SQL> CREATE PLUGGABLE DATABASE echodd USING '/home/oracle/testdb01.xml'
    COPY FILE_NAME_CONVERT = ('/oradata/ORCLTEST01', '/oradata/ORCL/ECHODD');  2  

Pluggable database created.

// nocopy 创建
SQL> create pluggable database echodddb using '/home/oracle/testdb01.xml' nocopy tempfile reuse;

Pluggable database created.

注意:在上面生成XML文件后如果打开了数据库,关闭后再传输,会导致数据不一致,如下XML文件中记录的fcpsb值是2292714,而数据文件中的值是2292717

SQL> CREATE PLUGGABLE DATABASE echodd USING '/home/oracle/testdb01.xml'
    COPY FILE_NAME_CONVERT = ('/oradata/ORCLTEST01', '/oradata/ORCL/ECHODD');
CREATE PLUGGABLE DATABASE echodd USING '/home/oracle/testdb01.xml'
    COPY FILE_NAME_CONVERT = ('/oradata/ORCLTEST01', '/oradata/ORCL/ECHODD')
*
ERROR at line 1:
ORA-65139: Mismatch between XML metadata file and data file
/oradata/ORCLTEST01/system01.dbf for value of fcpsb (2292714 in the plug XML
file, 2292717 in the data file)

3、连接到 pdb并执行noncdb_to_pdb.sql 脚本,对新创建的PDB进行必要的数据字典和信息转换:

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDB                            MOUNTED
         5 ECHODD                         READ WRITE NO
SQL> alter session set container=ECHODD;

Session altered.

SQL> @?/rdbms/admin/noncdb_to_pdb.sql
。。。。。。很长。。。等等等等。。。

4、打开 PDB:

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         5 ECHODD                         MOUNTED
SQL> alter pluggable database echodd open;

Pluggable database altered.

SQL> 
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         5 ECHODD                         READ WRITE NO
SQL> SELECT * FROM CUST;  //查看原库数据

   CUST_ID LAST_NAME                      FIRST_NAME
---------- ------------------------------ ------------------------------
         1 Smith                          John
         2 Jones                          Jane
         3 Brown                          Michael
         4 Davis                          Emily
         5 Wilson                         David

5 rows selected.

完成。

注:

1、如果是copy方式,会在目标路径下生成如下文件:

[root@echodd:/oradata/ORCL/echodd]# ll
total 1054808
-rw-r----- 1 oracle oinstall 482353152 Feb 25 21:01 sysaux01.dbf
-rw-r----- 1 oracle oinstall 377495552 Feb 25 21:01 system01.dbf
-rw-r----- 1 oracle oinstall  84942848 Feb 25 20:37 temp01.dbf
-rw-r----- 1 oracle oinstall 214966272 Feb 25 21:01 undotbs01.dbf
-rw-r----- 1 oracle oinstall   5251072 Feb 25 21:01 users01.dbf

2、如果是nocopy方式,还会复用传输过来的文件,但是control、redo不再使用:

[root@echodd:/oradata/ORCLTEST01]# ll
total 3446036
-rw-r----- 1 oracle oinstall   10600448 Feb 27 17:47 control01.ctl
-rw-r----- 1 oracle oinstall   10600448 Feb 27 17:47 control02.ctl
-rw-r----- 1 oracle oinstall  209715712 Feb 27 17:47 redo01.log
-rw-r----- 1 oracle oinstall  209715712 Feb 27 17:47 redo02.log
-rw-r----- 1 oracle oinstall  209715712 Feb 27 17:47 redo03.log
-rw-r----- 1 oracle oinstall  744497152 Feb 27 19:05 sysaux01.dbf
-rw-r----- 1 oracle oinstall 1038098432 Feb 27 19:05 system01.dbf
-rw-r----- 1 oracle oinstall   99622912 Feb 27 17:56 temp01.dbf
-rw-r----- 1 oracle oinstall  990912512 Feb 27 19:04 undotbs01.dbf
-rw-r----- 1 oracle oinstall    5251072 Feb 27 18:01 users01.dbf
<think>首先,用户的问题是:我想查询 Oracle 19c 中所有的 CDBPDB。用户需要查看所有 CDBPDB 的列表。 从系统级指令来看: - 所有行内数学表达式必须使用 $...$ 格式,但这个问题是关于 Oracle 数据库的,不涉及数学表达式,所以可能不需要。 - 独立公式必须使用 $$...$$ 格式,但同样,这里没有数学公式。 - LaTeX 语法正确:确保任何数学表达式正确,但这里不适用。 - 使用中文回答:我的回答必须用中文。 - 生成相关问题:在回答结束时,生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:例如 [^1]。用户提供了几个引用,我需要参考它们。 用户提供的引用: - 引用[1]: 关于 CDB 安装、PDB 安装,查询 CDB 名称,创建 PDB 的步骤。 - 引用[2]: 关于 CDBPDB 的关系,创建 PDB 的方法。 - 引用[3]: 解释 CDBPDB,提到默认 PDBPDB$SEED。 - 引用[4]: 关于 CDBPDB换。 这些引用是关于 Oracle 19c 的 CDBPDB 的安装和操作,但用户的问题是查询所有 CDBPDB 的列表。所以,我需要基于这些信息,提供查询方法。 关键点: - CDB (Container Database) 是容器数据库。 - PDB (Pluggable Database) 是可插拔数据库。 - 在 Oracle 19c 中,CDB 包含多个 PDB。 要查询所有 CDBPDB,我需要提供 SQL 查询语句。 从引用中: - 引用[1] 提到:SELECT PDB_ID, PDB_NAME, GUID, STATUS FROM DBA_PDBS ORDER BY PDB_ID; 这查询了 PDB 信息。 - 引用[4] 提到:在 sqlplus 下用 sys 登陆 CDB 数据库。 所以,查询 PDB 列表可以使用 DBA_PDBS 视图。 对于 CDB,通常只有一个 CDB per instance, but in Oracle, a CDB can have multiple PDBs. To see the CDB itself, we might query v$database or similar. Common ways: - To see the CDB name: SELECT NAME FROM V$DATABASE; - To see all PDBs: SELECT PDB_NAME, STATUS FROM DBA_PDBS; or using CDB_ views if connected to CDB. Since the user is asking for all CDB and PDB, I need to clarify that in a typical setup, there is one CDB containing multiple PDBs. So, querying the CDB name and then the list of PDBs. Steps to query: 1. Connect to the CDB as a privileged user (like SYS). 2. Query the CDB name. 3. Query the PDBs. SQL queries: - For CDB: SELECT NAME FROM V$DATABASE; -- This gives the CDB name. - For PDBs: SELECT PDB_ID, PDB_NAME, STATUS FROM DBA_PDBS; -- This lists all PDBs in the CDB. Also, from reference [3], it mentions that there is a default PDB and PDB$SEED. In Oracle 19c, when connected to CDB root, you can see all PDBs. To show all PDBs including their open status, you might use: SELECT NAME, OPEN_MODE FROM V$PDBS; But DBA_PDBS is also fine. Now, for the answer structure: - Answer should be clear and step-by-step. - Use Chinese. - Add references naturally. Structure my response: 1. Explain briefly what CDB and PDB are for context. 2. Provide step-by-step instructions to query: a. Connect to the CDB. b. Query CDB name. c. Query PDB list. 3. Include SQL examples. 4. Add references where applicable. 5. End with generated related questions. References to add: - When mentioning querying DBA_PDBS, refer to [^1]. - When explaining CDB and PDB, refer to [^2] or [^3]. From references: - [^1] has the query: SELECT PDB_ID, PDB_NAME,GUID,STATUS FROM DBA_PDBS ORDER BY PDB_ID; - [^3] explains CDB and PDB. - [^4] shows connecting as SYS. So, I can cite them. Finally, generate related questions at the end.</think>### 查询 Oracle 19c 中所有 CDBPDB 列表的方法 在 Oracle 19c 中,CDB(Container Database,容器数据库)是一个包含多个 PDB(Pluggable Database,可插拔数据库)的数据库容器。每个 CDB 实例通常包含一个根容器(CDB$ROOT)和多个 PDB。要查询所有 CDBPDB 的列表,您需要以特权用户(如 SYS)连接到 CDB 根容器,然后执行特定的 SQL 查询。以下是详细步骤和示例代码: #### 步骤 1: 连接到 CDB 根容器 首先,使用 SQL*Plus 或其他工具以 `SYS` 用户(或具有 `SYSDBA` 权限的用户)连接到 CDB 根容器。参考引用 [^4],连接命令如下: ```sql sqlplus sys/您的密码 as sysdba ``` - 确保您已正确设置 Oracle 环境变量(如 `ORACLE_SID`),指向目标 CDB 实例。 - 如果连接成功,您会看到类似输出:`Connected to: Oracle Database 19c Enterprise Edition`。 #### 步骤 2: 查询 CDB 名称 CDB 名称可以通过 `V$DATABASE` 视图获取。执行以下 SQL: ```sql SELECT NAME AS CDB_NAME FROM V$DATABASE; ``` - **输出示例**: ``` CDB_NAME --------- ORCLCDB ``` - 这表示当前连接的 CDB 名称(例如 `ORCLCDB`)。在 Oracle 19c 中,一个实例通常只运行一个 CDB,因此该查询返回当前活动的 CDB 名称 [^3]。 #### 步骤 3: 查询所有 PDB 列表 要查看该 CDB 中的所有 PDB,包括状态和名称,使用 `DBA_PDBS` 视图(或 `V$PDBS` 视图)。参考引用 [^1],推荐查询: ```sql SELECT PDB_ID, PDB_NAME, STATUS, GUID FROM DBA_PDBS ORDER BY PDB_ID; ``` - **输出示例**: ``` PDB_ID PDB_NAME STATUS GUID ------- -------------- --------- ---------------------------------- 1 PDB$SEED NORMAL 6F1B4A9C8E7F3D12E0530A000AFC4A1C 2 ORCLPDB1 NORMAL 7A2B5C3D9E8F1A23E0530A000AFC8B2D 3 ORCLPDB2 NORMAL 8B3C6D4F0A9B1C34E0530A000AFCD3E4 ``` - **关键字段解释**: - `PDB_NAME`: PDB 的名称(如 `ORCLPDB1`)。 - `STATUS`: PDB 的状态(`NORMAL` 表示正常,`NEW` 表示新创建)。 - `GUID`: PDB 的唯一标识符。 - 默认包含 `PDB$SEED`,这是 PDB 的模板数据库 [^3]。 如果需要更详细的状态(如 PDB 是否已打开),使用 `V$PDBS` 视图: ```sql SELECT PDB_ID, NAME AS PDB_NAME, OPEN_MODE FROM V$PDBS; ``` - **输出示例**: ``` PDB_ID PDB_NAME OPEN_MODE ------- -------------- --------- 2 ORCLPDB1 READ WRITE 3 ORCLPDB2 MOUNTED ``` #### 注意事项 - **权限要求**:执行这些查询需要 `SYSDBA` 或 `DBA` 权限。普通用户可能无法访问 `DBA_PDBS` 或 `V$PDBS` 视图。 - **多 CDB 环境**:Oracle 19c 通常一个实例只运行一个 CDB。如果您的系统有多个 CDB(例如通过不同实例),需要分别连接到每个 CDB 重复上述步骤。 - **PDB 状态**:`STATUS` 为 `NEW` 的 PDB 可能需要运行 `noncdb_to_pdb.sql` 脚本来完成换 [^2]。 - **引用说明**:以上方法基于 Oracle 19c 的标准实践,确保您的数据库已正确安装和配置 [^1][^3]。 如果您在查询中遇到问题(如视图不存在),请检查数据库版本和用户权限。 ### 相关问题 1. 如何创建新的 PDB 数据库? 2. 如何切换或连接到特定的 PDB? 3. Oracle 19c 中 CDBPDB 的管理有哪些最佳实践? 4. 如何备份和恢复 PDB
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值