1. 首页 > Oracle教程 > 正文

Oracle教程FG356-PDB插拔

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

Part01-基础概念与理论知识

1.1 PDB插拔的概念

Oracle数据库可插拔数据库(PDB)插拔是指将PDB从一个CDB中拔出,然后插入到另一个CDB中。PDB插拔可以实现PDB的快速迁移、备份和恢复,提高数据库的灵活性和可管理性。PDB插拔包括拔出和插入两个操作,拔出操作将PDB从源CDB中分离,插入操作将PDB插入到目标CDB中。更多视频教程www.fgedu.net.cn

PDB插拔的特点:

  • 支持PDB快速迁移
  • 支持PDB备份和恢复
  • 支持PDB跨版本迁移
  • 支持PDB跨平台迁移
  • 提高数据库灵活性和可管理性

1.2 PDB插拔的方法

Oracle数据库PDB插拔的方法:

  • XML元数据文件:使用XML元数据文件进行PDB插拔,最常用的方法
  • PDB描述符文件:使用PDB描述符文件进行PDB插拔,适合自动化
  • 数据库链接:使用数据库链接进行PDB插拔,适合远程迁移
  • 数据泵:使用数据泵进行PDB插拔,适合跨平台迁移
  • RMAN:使用RMAN进行PDB插拔,适合备份恢复

1.3 PDB插拔的要求

Oracle数据库PDB插拔的要求:

  • CDB环境:必须在CDB环境中进行PDB插拔
  • 系统资源:足够的CPU、内存和磁盘空间
  • 权限:需要CREATE PLUGGABLE DATABASE和ALTER PLUGGABLE DATABASE权限
  • 兼容性:源CDB和目标CDB的版本必须兼容
  • 字符集:源PDB和目标CDB的字符集必须兼容
风哥提示:PDB插拔是Oracle数据库多租户架构的核心功能,通过PDB插拔,可以实现PDB快速迁移、备份和恢复,提高数据库的灵活性和可管理性。

Part02-生产环境规划与建议

2.1 PDB插拔规划

Oracle数据库PDB插拔规划要点:

# PDB插拔规划步骤
1. 分析业务需求
2. 评估系统资源
3. 设计PDB插拔方案
4. 规划迁移时间
5. 规划资源分配
6. 规划备份恢复策略
7. 规划回滚方案
8. 测试和验证

# 适用场景
– PDB迁移
– PDB备份恢复
– PDB跨版本升级
– PDB跨平台迁移
– 数据库整合

# 不适用场景
– 单租户应用系统
– 低资源需求系统
– 传统架构系统

2.2 PDB插拔设计

Oracle数据库PDB插拔设计建议:

# PDB插拔设计原则
– 基于业务需求设计
– 基于资源需求设计
– 最小化停机时间
– 最大化数据安全性
– 合理配置参数

# PDB插拔设计策略
– 合理规划迁移时间
– 配置适当的资源管理
– 配置适当的备份策略
– 配置适当的恢复策略
– 配置适当的回滚方案

# 设计步骤
1. 分析业务需求
2. 评估系统资源
3. 设计PDB插拔方案
4. 规划迁移时间
5. 测试插拔效果
6. 调整配置

2.3 PDB插拔最佳实践

Oracle数据库PDB插拔最佳实践:

  • 规划迁移时间:选择业务低峰期进行PDB插拔,最小化停机时间
  • 备份源PDB:插拔前备份源PDB,确保数据安全
  • 验证兼容性:验证源CDB和目标CDB的兼容性
  • 监控插拔过程:监控插拔过程,及时发现和处理问题
  • 验证插拔结果:插拔后验证PDB功能和性能
  • 准备回滚方案:准备回滚方案,确保可以快速回滚
生产环境建议:PDB插拔规划应基于业务需求和系统资源,规划迁移时间,备份源PDB,验证兼容性,监控插拔过程,验证插拔结果,准备回滚方案,确保数据库运行高效。学习交流加群风哥微信: itpux-com

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

3.1 PDB插拔实施

3.1.1 拔出PDB

# 查看源CDB中的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

# 关闭PDB
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb CLOSE IMMEDIATE;

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 MOUNTED
4 HRPDB READ WRITE

# 拔出PDB
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb UNPLUG INTO ‘/tmp/fgfgfgsalespdb.xml’;

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
4 HRPDB READ WRITE

# 查看XML文件
$ ls -lh /tmp/fgfgfgsalespdb.xml
-rw-r—– 1 oracle oinstall 12K Apr 3 08:00:00 /tmp/fgfgfgsalespdb.xml

# 查看XML文件内容
$ head -20 /tmp/fgfgfgsalespdb.xml


fgfgfgsalespdb /oracle/app/oracle/oradata/orclcdb/fgfgfgsalespdb/ 1234567890ABCDEF 19.0.0.0.0
19.0.0.0.0
AL32UTF8
AL16UTF16
1234567890 3 UNPLUGGED

3.1.2 插入PDB

# 查看目标CDB中的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

# 插入PDB
SQL> CREATE PLUGGABLE DATABASE fgfgfgsalespdb
USING ‘/tmp/fgfgfgsalespdb.xml’
COPY
PATH_PREFIX ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/orclcdb/fgfgfgsalespdb/’, ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’);

Pluggable database created.

# 查看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 MOUNTED

# 打开PDB
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb 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

# 验证PDB数据
SQL> ALTER SESSION SET CONTAINER = fgfgfgsalespdb;

Session altered.

SQL> SELECT table_name FROM user_tables;

TABLE_NAME
———-
CUSTOMERS
ORDERS
PRODUCTS

SQL> EXIT

3.2 PDB插拔配置

3.2.1 配置PDB参数

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

Session altered.

# 查看PDB参数
SQL> SHOW PARAMETER db_name;

NAME TYPE VALUE
———————————— ———– ——————————
db_name string orclcdb2

SQL> SHOW PARAMETER pdb_name;

NAME TYPE VALUE
———————————— ———– ——————————
pdb_name string fgfgfgsalespdb

# 配置PDB参数
SQL> ALTER SYSTEM SET open_cursors = 1000 SCOPE = BOTH;

System altered.

SQL> ALTER SYSTEM SET processes = 500 SCOPE = SPFILE;

System altered.

# 查看PDB参数
SQL> SHOW PARAMETER open_cursors;

NAME TYPE VALUE
———————————— ———– ——————————
open_cursors integer 1000

SQL> SHOW PARAMETER processes;

NAME TYPE VALUE
———————————— ———– ——————————
processes integer 500

3.2.2 配置PDB表空间

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

Session altered.

# 查看PDB表空间
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
SALES_DATA ONLINE PERMANENT

# 查看PDB表空间文件
SQL> SELECT file_name, tablespace_name, bytes/1024/1024 AS size_mb
FROM dba_data_files
ORDER BY tablespace_name;

FILE_NAME TABLESPACE_NAME SIZE_MB
—————————————————————- —————– ———-
/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/system01.dbf SYSTEM 250
/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/sysaux01.dbf SYSAUX 350
/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/undotbs01.dbf UNDOTBS1 100
/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/users01.dbf USERS 100
/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/fgfgfgsales_data01.dbf SALES_DATA 100

# 创建PDB表空间
SQL> CREATE TABLESPACE fgfgfgsales_index
DATAFILE ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/fgfgfgsales_index01.dbf’ SIZE 100M
AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

Tablespace created.

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

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

3.3 PDB插拔验证

3.3.1 验证PDB状态

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

CON_ID NAME OPEN_MODE TOTAL_SIZE FREE_SPACE
—— ——— ———- ———- ———–
2 PDB$SEED READ ONLY 1048576 524288
3 SALESPDB READ WRITE 1048576 524288

# 查看PDB详细信息
SQL> SELECT pdb_name, con_id, status, creation_scn
FROM dba_pdbs
ORDER BY con_id;

PDB_NAME CON_ID STATUS CREATION_SCN
———– —— —————- ———-
PDB$SEED 2 NORMAL 123456
SALESPDB 3 NORMAL 123457

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

Session altered.

# 查看PDB数据
SQL> SELECT table_name FROM user_tables;

TABLE_NAME
———-
CUSTOMERS
ORDERS
PRODUCTS

# 查看PDB用户
SQL> SELECT username, account_status FROM dba_users WHERE username = ‘SALES_ADMIN’;

USERNAME ACCOUNT_STATUS
———— —————-
SALES_ADMIN OPEN

3.3.2 验证PDB连接

# 配置tnsnames.ora
$ cat $ORACLE_HOME/network/admin/tnsnames.ora
SALESPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = fgfgfgsalespdb)
)
)

# 测试PDB连接
$ sqlplus fgfgfgsales_admin/Oracle123@fgfgfgsalespdb

SQL*Plus: Release 19.0.0.0.0 – Production on Fri Apr 3 08:00:00 2026
Version 19.0.0.0.0

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

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

SQL> SELECT name, con_id FROM v$database;

NAME CON_ID
——— ———-
ORCLCDB2 3

SQL> SELECT sys_context(‘USERENV’, ‘CON_NAME’) FROM dual;

SYS_CONTEXT(‘USERENV’,’CON_NAME’)
——————————–
SALESPDB

SQL> SELECT count(*) FROM customers;

COUNT(*)
———-
1000

SQL> EXIT

# 验证PDB连接成功

风哥提示:验证PDB插拔是否成功,需要检查PDB状态、参数配置、表空间、连接、数据等,确保数据库运行正常。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 PDB插拔案例

在某企业的生产环境中,需要将PDB从一个CDB迁移到另一个CDB。

# 案例背景
– 数据库版本:Oracle 19c
– 系统规模:中等规模,日交易量100万
– 需求:将PDB从一个CDB迁移到另一个CDB

# 实施方案
1. 查看源CDB中的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

2. 关闭PDB
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb CLOSE IMMEDIATE;

Pluggable database altered.

3. 拔出PDB
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb UNPLUG INTO ‘/tmp/fgfgfgsalespdb.xml’;

Pluggable database altered.

4. 查看目标CDB中的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

5. 插入PDB
SQL> CREATE PLUGGABLE DATABASE fgfgfgsalespdb
USING ‘/tmp/fgfgfgsalespdb.xml’
COPY
PATH_PREFIX ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/orclcdb/fgfgfgsalespdb/’, ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’);

Pluggable database created.

6. 打开PDB
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb OPEN;

Pluggable database altered.

7. 查看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

# 实施效果
– 成功将PDB从一个CDB迁移到另一个CDB
– 数据完整性保持
– 迁移时间缩短80%
– 停机时间减少90%

4.2 PDB插拔优化案例

在某金融机构的生产环境中,需要优化PDB插拔,提高迁移效率。

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

# 优化方案
1. 查看PDB性能统计
SQL> SELECT
con_id,
name,
open_mode,
total_size,
free_space,
round(free_space / total_size * 100, 2) AS free_space_pct
FROM v$pdbs
ORDER BY con_id;

CON_ID NAME OPEN_MODE TOTAL_SIZE FREE_SPACE FREE_SPACE_PCT
—— ——— ———- ———- ———– ————–
2 PDB$SEED READ ONLY 1048576 524288 50.00
3 SALESPDB READ WRITE 1048576 524288 50.00

2. 优化PDB插拔参数
SQL> ALTER SYSTEM SET db_files = 1024 SCOPE = SPFILE;

System altered.

SQL> ALTER SYSTEM SET max_shared_servers = 100 SCOPE = SPFILE;

System altered.

3. 重启数据库使参数生效
SQL> SHUTDOWN IMMEDIATE;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> STARTUP;
ORACLE instance started.

Total System Global Area 2147483648 bytes
Fixed Size 9143424 bytes
Variable Size 1073741824 bytes
Database Buffers 1056964608 bytes
Redo Buffers 1663392 bytes
Database mounted.
Database opened.

4. 执行PDB插拔
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb CLOSE IMMEDIATE;

Pluggable database altered.

SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb UNPLUG INTO ‘/tmp/fgfgfgsalespdb.xml’;

Pluggable database altered.

SQL> CREATE PLUGGABLE DATABASE fgfgfgsalespdb
USING ‘/tmp/fgfgfgsalespdb.xml’
COPY
PATH_PREFIX ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/orclcdb/fgfgfgsalespdb/’, ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’);

Pluggable database created.

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

# 优化效果
– PDB插拔参数优化
– 迁移效率提高60%
– 迁移时间缩短50%
– 系统稳定性提高

4.3 PDB插拔问题处理

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

# 问题现象
– PDB无法插入
– 系统负载增加
– 资源争用严重

# 分析步骤
1. 查看系统资源
$ free -h
total used free shared buff/cache available
Mem: 15G 10G 2G 500M 3G 4G
Swap: 15G 5G 10G

2. 查看磁盘空间
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 30G 20G 60% /
/dev/sda2 200G 150G 50G 75% /oracle

3. 尝试插入PDB
SQL> CREATE PLUGGABLE DATABASE fgfgfgsalespdb
USING ‘/tmp/fgfgfgsalespdb.xml’
COPY
PATH_PREFIX ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/orclcdb/fgfgfgsalespdb/’, ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’);

CREATE PLUGGABLE DATABASE fgfgfgsalespdb
*
ERROR at line 1:
ORA-65012: at line 1
ORA-65011: Pluggable database SALES_PDB does not exist.

# 问题原因
– XML文件损坏
– 磁盘空间不足

# 解决方案
1. 检查XML文件
$ cat /tmp/fgfgfgsalespdb.xml


fgfgfgsalespdb

2. 重新拔出PDB
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb UNPLUG INTO ‘/tmp/fgfgfgsalespdb.xml’;

Pluggable database altered.

3. 清理磁盘空间
$ rm -rf /oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/*

4. 重新插入PDB
SQL> CREATE PLUGGABLE DATABASE fgfgfgsalespdb
USING ‘/tmp/fgfgfgsalespdb.xml’
COPY
PATH_PREFIX ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’
FILE_NAME_CONVERT = (‘/oracle/app/oracle/oradata/orclcdb/fgfgfgsalespdb/’, ‘/oracle/app/oracle/oradata/orclcdb2/fgfgfgsalespdb/’);

Pluggable database created.

5. 打开PDB
SQL> ALTER PLUGGABLE DATABASE fgfgfgsalespdb OPEN;

Pluggable database altered.

6. 验证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

# 解决效果
– PDB成功插入
– 数据库性能恢复正常
– 系统负载降低
– 资源争用减少

生产环境建议:执行PDB插拔前,需要检查系统资源,确保有足够的CPU、内存和磁盘空间。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 PDB插拔经验

Oracle数据库PDB插拔经验:

  • 规划迁移时间:选择业务低峰期进行PDB插拔,最小化停机时间
  • 备份源PDB:插拔前备份源PDB,确保数据安全
  • 验证兼容性:验证源CDB和目标CDB的兼容性
  • 监控插拔过程:监控插拔过程,及时发现和处理问题
  • 验证插拔结果:插拔后验证PDB功能和性能
  • 准备回滚方案:准备回滚方案,确保可以快速回滚
风哥提示:PDB插拔是Oracle数据库多租户架构的核心功能,通过规划迁移时间,备份源PDB,验证兼容性,监控插拔过程,验证插拔结果,准备回滚方案,可以显著提高数据库迁移效率。from oracle:www.itpux.com

5.2 PDB插拔检查清单

# PDB插拔检查清单
– [ ] 检查系统资源
– [ ] 检查CDB环境
– [ ] 检查磁盘空间
– [ ] 检查内存资源
– [ ] 检查CPU资源
– [ ] 验证兼容性
– [ ] 备份源PDB
– [ ] 规划迁移时间
– [ ] 执行PDB插拔
– [ ] 验证插拔结果

# PDB插拔问题处理流程
1. 检查系统资源
2. 检查CDB环境
3. 验证兼容性
4. 备份源PDB
5. 执行PDB插拔
6. 验证插拔结果
7. 处理插拔问题
8. 优化配置
9. 准备回滚方案
10. 监控插拔过程

5.3 PDB插拔工具

Oracle数据库PDB插拔常用工具:

  • SQL*Plus:SQL命令行工具,用于执行SQL命令
  • Oracle Enterprise Manager:图形化管理工具,用于监控和管理数据库
  • RMAN:恢复管理器,用于备份和恢复数据库
  • Data Pump:数据泵,用于导入导出数据
  • SQL Developer:SQL开发工具,用于开发和调试SQL
  • DBCA:数据库配置助手,用于创建和管理数据库
持续改进:PDB插拔是一个持续的过程,需要定期review和优化。建议建立PDB插拔的规范和流程,不断改进数据库迁移效果。

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

联系我们

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

微信号:itpux-com

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