重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 230|回复: 0
打印 上一主题 下一主题

[Oracle] 非CDB转化为CDB

[复制链接]
跳转到指定楼层
楼主
发表于 2026-2-1 17:12:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、检查当前数据库是否为CDB

-- 连接到当前数据库
sqlplus / as sysdba

-- 检查是否为CDB
SELECT name, cdb FROM v$database;
SELECT con_id, name FROM v$containers ORDER BY con_id;

如果显示CDB=NO,说明当前是非CDB数据库,需要转换为CDB。

二、将非CDB转换为CDB(如果当前是非CDB)

方法1:使用DBCA创建新的CDB(推荐,不影响现有数据)

# 1. 创建新的CDB
dbca -silent -createDatabase \
  -templateName General_Purpose.dbc \
  -gdbname cdb1 -sid cdb1 \
  -createAsContainerDatabase true \
  -numberOfPDBs 2 \
  -pdbName pdb1 \
  -pdbName pdb2 \
  -sysPassword oracle \
  -systemPassword oracle \
  -emConfiguration NONE \
  -datafileDestination /u01/app/oracle/oradata \
  -storageType FS \
  -characterSet AL32UTF8 \
  -nationalCharacterSet AL16UTF16 \
  -totalMemory 2048 \
  -recoveryAreaDestination /u01/app/oracle/fast_recovery_area \
  -recoveryAreaSize 4096 \
  -enableArchive true

方法2:使用现有非CDB作为种子创建PDB(需要12.2+)

-- 如果现有版本支持,可以创建CDB并将非CDB作为PDB插入
-- 首先需要创建CDB
-- 1. 登录到现有的非CDB数据库
sqlplus / as sysdba

-- 2. 检查当前数据库类型
SELECT name, cdb, open_mode FROM v$database;

-- 3. 将数据库置于只读模式(确保数据一致性)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;

-- 4. 使用DBMS_PDB包创建XML描述文件

BEGIN
  DBMS_PDB.DESCRIBE(
    pdb_descr_file => '/u01/app/oracle/noncdb.xml'
  );
END;
/
-- 5. 关闭源数据库
SHUTDOWN IMMEDIATE;

-- 6. 编辑初始化参数文件,创建新的CDB
# 备份当前参数文件
sqlplus / as sysdba
SQL> create pfile='$ORACLE_HOME/dbs/initorcl.ora' from spfile;

cp $ORACLE_HOME/dbs/initorcl.ora $ORACLE_HOME/dbs/initorcl.ora.bak

# 创建新的CDB参数文件
cat > $ORACLE_HOME/dbs/initcdb1.ora << EOF
*.db_name='cdb1'
*.db_unique_name='cdb1'
*.enable_pluggable_database=TRUE
*.common_user_prefix='C##'
*.control_files='/u01/app/oracle/oradata/cdb1/control01.ctl'
*.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=20G
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=cdb1XDB)'
*.audit_file_dest='/u01/app/oracle/admin/cdb1/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.db_block_size=8192
*.db_domain=''
*.db_files=1024
*.memory_target=2G
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
EOF

-- 8. 创建必要的目录
mkdir -p /u01/app/oracle/oradata/cdb1/pdbseed
mkdir -p /u01/app/oracle/admin/cdb1/adump
mkdir -p /u01/app/oracle/fast_recovery_area/cdb1

-- 9.创建CDB实例

-- 设置环境变量
export ORACLE_SID=cdb1

-- 启动到nomount状态
sqlplus / as sysdba
STARTUP NOMOUNT  PFILE='$ORACLE_HOME/dbs/initcdb1.ora';

-- 执行CREATE DATABASE命令
CREATE DATABASE cdb1
  USER SYS IDENTIFIED BY oracle
  USER SYSTEM IDENTIFIED BY oracle
  LOGFILE GROUP 1 ('/u01/app/oracle/oradata/cdb1/redo01.log') SIZE 200M,
          GROUP 2 ('/u01/app/oracle/oradata/cdb1/redo02.log') SIZE 200M,
          GROUP 3 ('/u01/app/oracle/oradata/cdb1/redo03.log') SIZE 200M
  MAXLOGHISTORY 1
  MAXLOGFILES 16
  MAXLOGMEMBERS 3
  MAXDATAFILES 1024
  CHARACTER SET AL32UTF8
  NATIONAL CHARACTER SET AL16UTF16
  EXTENT MANAGEMENT LOCAL
  DATAFILE '/u01/app/oracle/oradata/cdb1/system01.dbf'
    SIZE 700M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
  SYSAUX DATAFILE '/u01/app/oracle/oradata/cdb1/sysaux01.dbf'
    SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
  DEFAULT TABLESPACE users
    DATAFILE '/u01/app/oracle/oradata/cdb1/users01.dbf'
    SIZE 500M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED
  DEFAULT TEMPORARY TABLESPACE temp
    TEMPFILE '/u01/app/oracle/oradata/cdb1/temp01.dbf'
    SIZE 20M REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED
  UNDO TABLESPACE undotbs1
    DATAFILE '/u01/app/oracle/oradata/cdb1/undotbs01.dbf'
    SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
  ENABLE PLUGGABLE DATABASE
  SEED
  FILE_NAME_CONVERT=('cdb1','cdb1_seed')
  SYSTEM DATAFILES SIZE 125M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
  SYSAUX DATAFILES SIZE 100M;

-- 10.运行必要的数据库创建后脚本

-- 连接到CDB
CONNECT / AS SYSDBA

-- 运行CATALOG脚本
@?/rdbms/admin/catalog.sql

-- 运行CATPROC脚本
@?/rdbms/admin/catproc.sql

-- 运行PUPBLD(可选)
@?/sqlplus/admin/pupbld.sql

-- 编译无效对象
@?/rdbms/admin/utlrp.sql


-- 验证PDB$SEED是否已创建
SELECT name, open_mode FROM v$pdbs;

-- 打开PDB$SEED(通常是自动打开的)
ALTER PLUGGABLE DATABASE pdb$seed OPEN READ ONLY;

-- 11.创建PDB$SEED的正确方法(如果之前没有创建)----------------

如果在CREATE DATABASE时没有创建SEED,可以这样创建:

-- 必须使用_oracle_script参数
ALTER SESSION SET "_oracle_script"=TRUE;

-- 创建PDB$SEED
CREATE PLUGGABLE DATABASE pdb$seed AS SEED
  FILE_NAME_CONVERT=('/u01/app/oracle/oradata/cdb1/',
                     '/u01/app/oracle/oradata/cdb1/pdbseed/');

-- 恢复参数设置
ALTER SESSION SET "_oracle_script"=FALSE;

-- 打开SEED数据库
ALTER PLUGGABLE DATABASE pdb$seed OPEN READ ONLY;
----------------------------------------------------------------

-- 12. 将原ORCL数据库作为PDB插入

--- 1. 首先确保原ORCL数据库已准备XML文件
退出,重新登入oracle账户:

-- 在原ORCL数据库中执行:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE OPEN READ ONLY;

BEGIN
  DBMS_PDB.DESCRIBE(
    pdb_descr_file => '/u01/app/oracle/noncdb.xml'
  );
END;
/

--- 2. 在新CDB中创建PDB

CREATE PLUGGABLE DATABASE orcl_pdb
  USING '/u01/app/oracle/noncdb.xml'
  COPY
  FILE_NAME_CONVERT = (
    '/u01/app/oracle/oradata/orcl/',
    '/u01/app/oracle/oradata/cdb1/orcl_pdb/'
  );

--- 3. 打开PDB并运行转换脚本
ALTER PLUGGABLE DATABASE orcl_pdb OPEN;
ALTER SESSION SET CONTAINER = orcl_pdb;

-- 运行非CDB到PDB转换脚本
@?/rdbms/admin/noncdb_to_pdb.sql

--- 4. 重新打开PDB
ALTER PLUGGABLE DATABASE orcl_pdb CLOSE;
ALTER PLUGGABLE DATABASE orcl_pdb OPEN;


验证环境
-- 验证CDB
SELECT name, cdb, open_mode FROM v$database;

-- 查看所有容器
COLUMN name FORMAT A20
COLUMN open_mode FORMAT A15
SELECT con_id, name, open_mode FROM v$containers ORDER BY con_id;

-- 验证数据迁移
ALTER SESSION SET CONTAINER = orcl_pdb;
SELECT COUNT(*) FROM dba_tables WHERE owner = 'SYSTEM';


-- 查看CDB$ROOT状态
ALTER SESSION SET CONTAINER = CDB$ROOT;

SELECT name, cdb FROM v$database;

NAME                 CDB
-------------------- ---
CDB1                 YES

1 row selected.
-- 查看所有容器
SELECT con_id, name, open_mode FROM v$containers ORDER BY con_id;

-- 应该看到至少3个容器:
-- 1. CDB$ROOT (con_id=1)
-- 2. PDB$SEED (con_id=2)
-- 3. ORCL_PDB (con_id=3或4)

    CON_ID NAME                 OPEN_MODE
---------- -------------------- ---------------
         1 CDB$ROOT             READ WRITE
         2 PDB$SEED             READ ONLY
         4 ORCL_PDB             READ WRITE

3 rows selected.



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-17 23:43 , Processed in 0.246204 second(s), 22 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表