|
|
一、检查当前数据库是否为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.
|
|