1. 首页 > Oracle教程 > 正文

Oracle教程FG388-非CDB转PDB

本文档风哥主要介绍Oracle数据库非CDB转PDB相关知识,包括非CDB转PDB的概念、方法、要求、规划、配置、验证等内容,由风哥教程参考Oracle官方文档Multitenant内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 非CDB转PDB的概念

Oracle数据库非CDB转PDB是指将传统的非多租户容器数据库(non-CDB)转换为多租户容器数据库(CDB)中的可插拔数据库(PDB),包括非CDB转PDB、数据迁移、兼容性检查等。非CDB转PDB可以实现数据库架构升级,提高系统管理效率。非CDB转PDB包括非CDB转PDB、数据迁移、兼容性检查、PDB验证、PDB优化等组件。更多视频教程www.fgedu.net.cn

非CDB转PDB的特点:

  • 支持传统数据库转换为PDB
  • 支持非CDB转PDB
  • 支持数据迁移
  • 支持兼容性检查
  • 提高系统管理效率

1.2 非CDB转PDB的方法

Oracle数据库非CDB转PDB的方法:

  • 非CDB转PDB:将非CDB转换为PDB
  • 数据迁移:迁移非CDB数据到PDB
  • 兼容性检查:检查非CDB与PDB兼容性
  • PDB验证:验证PDB转换
  • PDB优化:优化PDB性能

1.3 非CDB转PDB的要求

Oracle数据库非CDB转PDB的要求:

  • 数据库版本:Oracle数据库版本必须支持非CDB转PDB
  • 系统资源:足够的CPU、内存和磁盘空间
  • 权限:需要SYSDBA权限
  • 兼容性:非CDB版本必须与CDB版本兼容
  • 备份:必须备份非CDB数据
风哥提示:非CDB转PDB是Oracle数据库多租户架构的核心功能,通过非CDB转PDB,可以实现数据库架构升级,提高系统管理效率。

Part02-生产环境规划与建议

2.1 非CDB转PDB规划

Oracle数据库非CDB转PDB规划要点:

# 非CDB转PDB规划步骤
1. 分析业务需求
2. 评估系统资源
3. 设计非CDB转PDB方案
4. 规划非CDB转PDB架构
5. 规划数据迁移策略
6. 规划兼容性检查策略
7. 测试和验证

# 适用场景
– 需要升级到多租户架构的系统
– 需要提高管理效率的系统
– 需要资源隔离的系统
– 需要快速部署的系统
– 需要降低成本的系统

# 不适用场景
– 已经是CDB架构的系统
– 非CDB转PDB需求简单的系统
– 低管理需求系统

2.2 非CDB转PDB设计

Oracle数据库非CDB转PDB设计建议:

# 非CDB转PDB设计原则
– 基于业务需求设计
– 基于资源需求设计
– 最小化转换开销
– 最大化系统管理效率
– 合理配置参数

# 非CDB转PDB设计策略
– 合理规划非CDB转PDB架构
– 配置适当的转换策略
– 配置适当的迁移策略
– 配置适当的验证策略
– 配置适当的监控策略

# 设计步骤
1. 分析业务需求
2. 评估系统资源
3. 设计非CDB转PDB方案
4. 规划非CDB转PDB架构
5. 测试非CDB转PDB效果
6. 调整配置

2.3 非CDB转PDB最佳实践

Oracle数据库非CDB转PDB最佳实践:

  • 规划非CDB转PDB架构:根据业务需求规划非CDB转PDB架构,最小化转换开销
  • 备份非CDB数据:转换前必须备份非CDB数据
  • 检查兼容性:转换前检查非CDB与PDB兼容性
  • 测试转换:在测试环境测试转换过程
  • 验证转换:转换后验证PDB功能
  • 准备回退:准备转换回退方案
生产环境建议:非CDB转PDB规划应基于业务需求和系统资源,规划非CDB转PDB架构,备份非CDB数据,检查兼容性,测试转换,验证转换,准备回退,确保系统稳定性。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 非CDB转PDB实施

3.1.1 查看非CDB状态

# 连接到非CDB
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Version 19.24.0.0.0

Copyright (c) 1982, 2024, Oracle. All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.24.0.0.0

# 查看数据库信息
SQL> SELECT name, database_role, open_mode, cdb
FROM v$database;

NAME DATABASE_ROLE OPEN_MODE CDB
——— —————- ——————– —-
ORCL PRIMARY READ WRITE NO

# 查看数据库版本
SQL> SELECT * FROM v$version;

BANNER
——————————————————————————–
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.24.0.0.0

# 查看表空间
SQL> SELECT tablespace_name, status, contents
FROM dba_tablespaces
ORDER BY tablespace_name;

TABLESPACE_NAME STATUS CONTENTS
—————————— ——— ———
SYSTEM ONLINE PERMANENT
SYSAUX ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT

# 验证非CDB状态查看成功

3.1.2 备份非CDB数据

# 关闭数据库
SQL> SHUTDOWN IMMEDIATE;

Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> EXIT

# 启动数据库到MOUNT状态
$ sqlplus / as sysdba

SQL> STARTUP MOUNT;

ORACLE instance started.

Total System Global Area 8388608000 bytes
Fixed Size 9147264 bytes
Variable Size 2147483648 bytes
Database Buffers 6227702528 bytes
Redo Buffers 4277536 bytes
Database mounted.

# 使用RMAN备份
$ rman target /

Recovery Manager: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Version 19.24.0.0.0

Copyright (c) 1982, 2024, Oracle and/or its affiliates. All rights reserved.

connected to target database: ORCL (DBID=1234567890, not open)

RMAN> BACKUP DATABASE;

Starting backup at 31-MAR-26
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=123 instance=orcl device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/app/oracle/oradata/fgedudb/system01.dbf
input datafile file number=00003 name=/oracle/app/oracle/oradata/fgedudb/sysaux01.dbf
input datafile file number=00004 name=/oracle/app/oracle/oradata/fgedudb/undotbs01.dbf
input datafile file number=00007 name=/oracle/app/oracle/oradata/fgedudb/users01.dbf
channel ORA_DISK_1: starting piece 1 at 31-MAR-26
channel ORA_DISK_1: finished piece 1 at 31-MAR-26
piece handle=/oracle/app/oracle/backup/orcl_20260331_01.bak tag=TAG20260331T100000 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:15:00
Finished backup at 31-MAR-26

RMAN> EXIT

# 验证非CDB备份成功

3.2 非CDB转PDB配置

3.2.1 检查兼容性

# 连接到非CDB
$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Version 19.24.0.0.0

Copyright (c) 1982, 2024, Oracle. All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.24.0.0.0

# 打开数据库
SQL> ALTER DATABASE OPEN;

Database altered.

# 检查数据库兼容性
SQL> BEGIN
DBMS_PDB.DESCRIBE(
pdb_descr_file => ‘/tmp/orcl_pdb.xml’
);
END;
/

PL/SQL procedure successfully completed.

# 验证兼容性
SQL> SET SERVEROUTPUT ON

SQL> DECLARE
v_result BOOLEAN;
BEGIN
v_result := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => ‘/tmp/orcl_pdb.xml’,
pdb_name => ‘ORCLPDB’
);

IF v_result THEN
DBMS_OUTPUT.PUT_LINE(‘PDB is compatible’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘PDB is not compatible’);
END IF;
END;
/

PDB is compatible

PL/SQL procedure successfully completed.

# 验证兼容性检查成功

3.2.2 转换非CDB为PDB

# 关闭非CDB
SQL> SHUTDOWN IMMEDIATE;

Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> EXIT

# 连接到CDB
$ sqlplus sys/oracle@orclcdb AS SYSDBA

SQL*Plus: Release 19.0.0.0.0 – Production on Mon Mar 31 10:00:00 2026
Version 19.24.0.0.0

Copyright (c) 1982, 2024, Oracle. All rights reserved.

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.24.0.0.0

# 查看CDB状态
SQL> SELECT name, database_role, open_mode, cdb
FROM v$database;

NAME DATABASE_ROLE OPEN_MODE CDB
——— —————- ——————– —-
ORCLCDB PRIMARY READ WRITE YES

# 创建PDB
SQL> CREATE PLUGGABLE DATABASE orclpdb USING ‘/tmp/orcl_pdb.xml’
COPY
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/fgedudb/’, ‘/oracle/app/oracle/oradata/orclcdb/orclpdb/’);

Pluggable database created.

# 打开PDB
SQL> ALTER PLUGGABLE DATABASE orclpdb OPEN;

Pluggable database altered.

# 查看PDB状态
SQL> SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;

CON_ID NAME OPEN_MODE
—— ——— ———-
2 PDB$SEED READ ONLY
3 SALESPDB READ WRITE
4 HRPDB READ WRITE
5 APP_ROOT READ WRITE
6 APP_PDB1 READ WRITE
7 ORCLPDB READ WRITE

# 验证非CDB转PDB成功

3.3 非CDB转PDB验证

3.3.1 验证PDB状态

# 切换到PDB
SQL> ALTER SESSION SET CONTAINER = orclpdb;

Session altered.

# 查看PDB信息
SQL> SELECT name, open_mode, status, restricted
FROM v$pdbs
WHERE name = ‘ORCLPDB’;

NAME OPEN_MODE STATUS RESTRICTED
——— ———- ——— ———-
ORCLPDB READ WRITE NORMAL NO

# 查看表空间
SQL> SELECT tablespace_name, status, contents
FROM dba_tablespaces
ORDER BY tablespace_name;

TABLESPACE_NAME STATUS CONTENTS
—————————— ——— ———
SYSTEM ONLINE PERMANENT
SYSAUX ONLINE PERMANENT
UNDOTBS1 ONLINE UNDO
TEMP ONLINE TEMPORARY
USERS ONLINE PERMANENT

# 验证PDB状态成功

3.3.2 验证PDB功能

# 查看用户
SQL> SELECT username, account_status, created
FROM dba_users
WHERE username NOT LIKE ‘SYS%’
AND username NOT LIKE ‘DBS%’
ORDER BY username;

USERNAME ACCOUNT_STATUS CREATED
—————————— ————- ———
HR OPEN 01-JAN-26
SCOTT OPEN 01-JAN-26
SYSTEM OPEN 01-JAN-26

# 测试数据访问
SQL> SELECT COUNT(*) FROM hr.employees;

COUNT(*)
———-
107

SQL> SELECT * FROM hr.employees WHERE employee_id = 100;

EMPLOYEE_ID FIRST_NAME: fgedu01
———– ——————– ————————- ————————- ——————– ——— ———- ————– ———- ————-
100 Steven King SKING 515.123.4567 17-JUN-03 AD_PRES 24000 100 90

# 测试PDB性能
SQL> SET TIMING ON

SQL> SELECT COUNT(*) FROM hr.employees;

COUNT(*)
———-
107

Elapsed: 00:00:00.01

# 验证PDB功能成功

风哥提示:验证非CDB转PDB是否成功,需要检查PDB状态、PDB功能、PDB性能等,确保数据库运行正常。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 非CDB转PDB案例

在某企业的生产环境中,需要将非CDB转换为PDB。

# 案例背景
– 数据库版本:Oracle 19c
– 系统规模:中等规模,日交易量100万
– 需求:将非CDB转换为PDB

# 实施方案
1. 查看非CDB
SQL> SELECT name, database_role, open_mode, cdb
FROM v$database;

NAME DATABASE_ROLE OPEN_MODE CDB
——— —————- ——————– —-
ORCL PRIMARY READ WRITE NO

2. 备份非CDB
SQL> SHUTDOWN IMMEDIATE;

Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> STARTUP MOUNT;

ORACLE instance started.

Total System Global Area 8388608000 bytes
Fixed Size 9147264 bytes
Variable Size 2147483648 bytes
Database Buffers 6227702528 bytes
Redo Buffers 4277536 bytes
Database mounted.

$ rman target /

RMAN> BACKUP DATABASE;

Starting backup at 31-MAR-26
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=123 instance=orcl device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=/oracle/app/oracle/oradata/fgedudb/system01.dbf
input datafile file number=00003 name=/oracle/app/oracle/oradata/fgedudb/sysaux01.dbf
input datafile file number=00004 name=/oracle/app/oracle/oradata/fgedudb/undotbs01.dbf
input datafile file number=00007 name=/oracle/app/oracle/oradata/fgedudb/users01.dbf
channel ORA_DISK_1: starting piece 1 at 31-MAR-26
channel ORA_DISK_1: finished piece 1 at 31-MAR-26
piece handle=/oracle/app/oracle/backup/orcl_20260331_01.bak tag=TAG20260331T100000 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:15:00
Finished backup at 31-MAR-26

3. 检查兼容性
SQL> ALTER DATABASE OPEN;

Database altered.

SQL> BEGIN
DBMS_PDB.DESCRIBE(
pdb_descr_file => ‘/tmp/orcl_pdb.xml’
);
END;
/

PL/SQL procedure successfully completed.

SQL> DECLARE
v_result BOOLEAN;
BEGIN
v_result := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => ‘/tmp/orcl_pdb.xml’,
pdb_name => ‘ORCLPDB’
);

IF v_result THEN
DBMS_OUTPUT.PUT_LINE(‘PDB is compatible’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘PDB is not compatible’);
END IF;
END;
/

PDB is compatible

PL/SQL procedure successfully completed.

4. 转换非CDB为PDB
SQL> SHUTDOWN IMMEDIATE;

Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> EXIT

$ sqlplus sys/oracle@orclcdb AS SYSDBA

SQL> CREATE PLUGGABLE DATABASE orclpdb USING ‘/tmp/orcl_pdb.xml’
COPY
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/fgedudb/’, ‘/oracle/app/oracle/oradata/orclcdb/orclpdb/’);

Pluggable database created.

SQL> ALTER PLUGGABLE DATABASE orclpdb OPEN;

Pluggable database altered.

5. 验证转换
SQL> SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;

CON_ID NAME OPEN_MODE
—— ——— ———-
2 PDB$SEED READ ONLY
3 SALESPDB READ WRITE
4 HRPDB READ WRITE
5 APP_ROOT READ WRITE
6 APP_PDB1 READ WRITE
7 ORCLPDB READ WRITE

# 实施效果
– 成功转换非CDB为PDB
– 非CDB备份正常
– 兼容性检查正常
– PDB转换正常
– PDB功能正常
– 系统管理效率提高

4.2 非CDB转PDB优化案例

在某金融机构的生产环境中,需要优化非CDB转PDB,提高转换效率。

# 案例背景
– 数据库版本:Oracle 19c
– 系统规模:大规模,日交易量1000万
– 问题:非CDB转PDB需要优化

# 优化方案
1. 查看非CDB配置
SQL> SELECT name, database_role, open_mode, cdb
FROM v$database;

NAME DATABASE_ROLE OPEN_MODE CDB
——— —————- ——————– —-
ORCL PRIMARY READ WRITE NO

2. 优化转换配置
SQL> ALTER SYSTEM SET job_queue_processes = 100 SCOPE = BOTH;

System altered.

SQL> ALTER SYSTEM SET parallel_max_servers = 16 SCOPE = BOTH;

System altered.

SQL> ALTER SYSTEM SET db_block_checksum = TRUE SCOPE = BOTH;

System altered.

3. 执行优化转换
SQL> BEGIN
DBMS_PDB.DESCRIBE(
pdb_descr_file => ‘/tmp/orcl_pdb.xml’
);
END;
/

PL/SQL procedure successfully completed.

SQL> SHUTDOWN IMMEDIATE;

Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> EXIT

$ sqlplus sys/oracle@orclcdb AS SYSDBA

SQL> CREATE PLUGGABLE DATABASE orclpdb USING ‘/tmp/orcl_pdb.xml’
NOCOPY
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/fgedudb/’, ‘/oracle/app/oracle/oradata/orclcdb/orclpdb/’);

Pluggable database created.

SQL> ALTER PLUGGABLE DATABASE orclpdb OPEN;

Pluggable database altered.

4. 验证优化效果
SQL> SELECT con_id, name, open_mode FROM v$pdbs ORDER BY con_id;

CON_ID NAME OPEN_MODE
—— ——— ———-
2 PDB$SEED READ ONLY
3 SALESPDB READ WRITE
4 HRPDB READ WRITE
5 APP_ROOT READ WRITE
6 APP_PDB1 READ WRITE
7 ORCLPDB READ WRITE

# 优化效果
– 转换配置优化
– 转换参数优化
– 转换效率提高
– 系统管理效率提高

4.3 非CDB转PDB问题处理

在某电商网站的生产环境中,非CDB转PDB出现问题,需要处理。

# 问题现象
– 非CDB转PDB失败
– PDB无法打开
– PDB功能异常

# 分析步骤
1. 查看PDB状态
SQL> SELECT name, open_mode, status, restricted
FROM v$pdbs
WHERE name = ‘ORCLPDB’;

NAME OPEN_MODE STATUS RESTRICTED
——— ———- ——— ———-
ORCLPDB MOUNTED MOUNTED NO

2. 尝试打开PDB
SQL> ALTER PLUGGABLE DATABASE orclpdb OPEN;

ALTER PLUGGABLE DATABASE orclpdb OPEN
*
ERROR at line 1:
ORA-04020: deadlock detected while trying to lock dictionary objects

3. 查看错误日志
$ tail -50 /oracle/app/oracle/diag/rdbms/orclcdb/orclcdb/trace/alert_orclcdb.log

Errors in file /oracle/app/oracle/diag/rdbms/orclcdb/orclcdb/trace/alert_orclcdb.log:
ORA-04020: deadlock detected while trying to lock dictionary objects

# 问题原因
– 非CDB转PDB失败
– 字典对象锁定
– 转换参数错误

# 解决方案
1. 关闭PDB
SQL> ALTER PLUGGABLE DATABASE orclpdb CLOSE IMMEDIATE;

Pluggable database altered.

2. 清理PDB
SQL> DROP PLUGGABLE DATABASE orclpdb INCLUDING DATAFILES;

Pluggable database dropped.

3. 重新转换
SQL> CREATE PLUGGABLE DATABASE orclpdb USING ‘/tmp/orcl_pdb.xml’
COPY
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/fgedudb/’, ‘/oracle/app/oracle/oradata/orclcdb/orclpdb/’);

Pluggable database created.

4. 打开PDB
SQL> ALTER PLUGGABLE DATABASE orclpdb OPEN;

Pluggable database altered.

5. 验证解决效果
SQL> SELECT name, open_mode, status
FROM v$pdbs
WHERE name = ‘ORCLPDB’;

NAME OPEN_MODE STATUS
——— ———- ———
ORCLPDB READ WRITE NORMAL

# 解决效果
– 非CDB转PDB成功
– 字典对象锁定解决
– PDB打开成功
– 系统管理效率恢复

生产环境建议:转换非CDB为PDB前,需要分析业务需求和系统资源,确保转换配置合理。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 非CDB转PDB经验

Oracle数据库非CDB转PDB经验:

  • 规划非CDB转PDB架构:根据业务需求规划非CDB转PDB架构,最小化转换开销
  • 备份非CDB数据:转换前必须备份非CDB数据
  • 检查兼容性:转换前检查非CDB与PDB兼容性
  • 测试转换:在测试环境测试转换过程
  • 验证转换:转换后验证PDB功能
  • 准备回退:准备转换回退方案
风哥提示:非CDB转PDB是Oracle数据库多租户架构的核心功能,通过规划非CDB转PDB架构,备份非CDB数据,检查兼容性,测试转换,验证转换,准备回退,可以显著提高系统管理效率和数据库管理效率。from oracle:www.itpux.com

5.2 非CDB转PDB检查清单

# 非CDB转PDB检查清单
– [ ] 检查系统资源
– [ ] 检查数据库版本
– [ ] 检查转换需求
– [ ] 检查转换配置
– [ ] 检查备份状态
– [ ] 检查兼容性
– [ ] 规划非CDB转PDB架构
– [ ] 备份非CDB数据
– [ ] 检查兼容性
– [ ] 验证转换功能

# 非CDB转PDB问题处理流程
1. 检查系统资源
2. 检查数据库版本
3. 检查转换需求
4. 规划非CDB转PDB架构
5. 备份非CDB数据
6. 检查兼容性
7. 验证转换功能
8. 处理转换问题
9. 优化配置
10. 监控转换使用情况

5.3 非CDB转PDB工具

Oracle数据库非CDB转PDB常用工具:

  • SQL*Plus:SQL命令行工具,用于执行SQL命令
  • Oracle Enterprise Manager:图形化管理工具,用于监控和管理数据库
  • SQL Developer:SQL开发工具,用于开发和调试SQL
  • RMAN:恢复管理器,用于备份和恢复数据库
  • Data Pump:数据泵,用于数据导入导出
  • DBMS_PDB:PL/SQL包,用于管理PDB
持续改进:非CDB转PDB是一个持续的过程,需要定期review和优化。建议建立非CDB转PDB的规范和流程,不断改进系统管理效率和数据库管理效率。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息