Oracle ASM 与多租户(CDB/PDB on ASM)
Oracle ASM 与多租户(CDB/PDB on ASM)
适用版本:Oracle Database 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
多租户架构下 ASM 提供存储服务[1],CDB 和 PDB 文件均存储在 ASM 上:
优势:
- 集中存储管理
- I/O 性能优化
- 高可用与冗余
- 简化运维
2. ASM 存储架构
2.1 CDB 文件布局
+DATA (ASM Disk Group)
├── <DB_UNIQUE_NAME>/
│ ├── <CDB SID>/
│ │ ├── controlfile/
│ │ │ ├── current.256.1234567
│ │ │ └── current.257.1234567
│ │ ├── datafile/
│ │ │ ├── system.258.1234567
│ │ │ ├── sysaux.259.1234567
│ │ │ ├── undotbs1.260.1234567
│ │ │ ├── users.261.1234567
│ │ │ ├── pdbseed_system.262.1234567
│ │ │ ├── pdbseed_sysaux.263.1234567
│ │ │ ├── hrpdb_system.264.1234567
│ │ │ ├── hrpdb_sysaux.265.1234567
│ │ │ └── hrpdb_users.266.1234567
│ │ ├── online_log/
│ │ │ ├── group_1.267.1234567
│ │ │ ├── group_2.268.1234567
│ │ │ └── group_3.269.1234567
│ │ ├── tempfile/
│ │ │ └── temp.270.1234567
│ │ └── parameterfile/
│ │ └── spfile.271.1234567
2.2 OMF 自动管理
-- 启用 OMF
ALTER SYSTEM SET db_create_file_dest='+DATA' SCOPE=BOTH;
ALTER SYSTEM SET db_create_online_log_dest_1='+DATA' SCOPE=BOTH;
ALTER SYSTEM SET db_create_online_log_dest_2='+FRA' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest='+FRA' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest_size=100G SCOPE=BOTH;
3. 创建 CDB 到 ASM
3.1 DBCA 创建
dbca -silent -createDatabase \
-templateName General_Purpose.dbc \
-gdbName ORCL \
-sid ORCL \
-createAsContainerDatabase true \
-numberOfPDBs 1 \
-pdbName hrpdb \
-sysPassword sys_pwd \
-systemPassword sys_pwd \
-storageType ASM \
-diskGroupName +DATA \
-recoveryAreaDestination +FRA \
-recoveryAreaSize 100 \
-characterSet AL32UTF8 \
-totalMemory 2048
3.2 手动创建
-- 1. 设置 OMF
ALTER SYSTEM SET db_create_file_dest='+DATA' SCOPE=SPFILE;
ALTER SYSTEM SET db_create_online_log_dest_1='+DATA' SCOPE=SPFILE;
-- 2. 启动到 nomount
STARTUP NOMOUNT;
-- 3. 创建 CDB
CREATE DATABASE ORCL
USER SYS IDENTIFIED BY ******
USER SYSTEM IDENTIFIED BY ******
LOGFILE GROUP 1 SIZE 100M,
GROUP 2 SIZE 100M,
GROUP 3 SIZE 100M
EXTENT MANAGEMENT LOCAL
DATAFILE SIZE 1G AUTOEXTEND ON
SYSAUX DATAFILE SIZE 1G AUTOEXTEND ON
DEFAULT TABLESPACE users
DEFAULT TEMPORARY TABLESPACE temp
UNDO TABLESPACE undotbs1
ENABLE PLUGGABLE DATABASE
SEED FILE_NAME_CONVERT=('+DATA/ORCL/','+DATA/ORCL/pdbseed/');
4. PDB 文件管理
4.1 创建 PDB
-- 创建 PDB(OMF 自动管理路径)
CREATE PLUGGABLE DATABASE hrpdb
ADMIN USER admin IDENTIFIED BY ******
-- 打开
ALTER PLUGGABLE DATABASE hrpdb OPEN;
4.2 查看 PDB 文件
-- 切换到 PDB
ALTER SESSION SET CONTAINER = hrpdb;
-- 数据文件
SELECT file_name, bytes/1024/1024 AS size_mb
FROM dba_data_files;
-- 临时文件
SELECT file_name FROM dba_temp_files;
-- 输出示例
-- +DATA/ORCL/HRPDB/DATAFILE/system.264.1234567
-- +DATA/ORCL/HRPDB/DATAFILE/sysaux.265.1234567
-- +DATA/ORCL/HRPDB/DATAFILE/users.266.1234567
4.3 添加数据文件
-- 切换到 PDB
ALTER SESSION SET CONTAINER = hrpdb;
-- 添加表空间
CREATE TABLESPACE sales_ts DATAFILE SIZE 1G AUTOEXTEND ON;
-- OMF 自动命名
-- +DATA/ORCL/HRPDB/DATAFILE/sales_ts.267.1234567
5. ASM Disk Group 规划
5.1 推荐磁盘组
| 磁盘组 | 用途 | 冗余 |
|---|---|---|
| +DATA | 数据文件 | NORMAL/HIGH |
| +FRA | 快速恢复区 | NORMAL/HIGH |
| +REDO | Redo Log | HIGH |
| +ARCH | 归档日志 | NORMAL |
| +ACFS | ACFS 文件 | NORMAL |
5.2 多磁盘组配置
-- 设置不同磁盘组
ALTER SYSTEM SET db_create_file_dest='+DATA' SCOPE=BOTH;
ALTER SYSTEM SET db_create_online_log_dest_1='+REDO' SCOPE=BOTH;
ALTER SYSTEM SET db_create_online_log_dest_2='+FRA' SCOPE=BOTH;
ALTER SYSTEM SET db_recovery_file_dest='+FRA' SCOPE=BOTH;
5.3 多租户隔离
-- 不同 PDB 使用不同磁盘组
ALTER SESSION SET CONTAINER = hrpdb;
ALTER SYSTEM SET db_create_file_dest='+DATA_HR' SCOPE=BOTH;
ALTER SESSION SET CONTAINER = salespdb;
ALTER SYSTEM SET db_create_file_dest='+DATA_SALES' SCOPE=BOTH;
6. ASM 模板
6.1 默认模板
SELECT name, redundancy, stripe, system
FROM v$asm_template
WHERE group_number=1;
6.2 创建自定义模板
-- 创建高性能模板
ALTER DISKGROUP data ADD TEMPLATE high_perf
ATTRIBUTES (HIGH FINE);
-- 创建归档模板
ALTER DISKGROUP data ADD TEMPLATE archive
ATTRIBUTES (MIRROR COARSE);
6.3 使用模板
-- 在 PDB 中使用
ALTER SESSION SET CONTAINER = hrpdb;
CREATE TABLESPACE important_ts
DATAFILE '+DATA(high_perf)' SIZE 100M;
详细内容见:Oracle ASM File Extent 与 Mirroring 详解。
7. ASM 与 RAC + PDB
7.1 RAC 中的 PDB
-- RAC 中所有实例共享 ASM
-- PDB 在所有实例可见
SELECT name, open_mode FROM v$pdbs;
-- 不同实例可打开不同 PDB
-- 实例 1: hrpdb OPEN
-- 实例 2: salespdb OPEN
7.2 PDB 服务
# 创建 PDB 服务(RAC)
srvctl add service -db orcl -service hrpdb
-preferred orcl1,orcl2
srvctl start service -db orcl -service hrpdb
8. ASM 备份与恢复
8.1 RMAN 备份 ASM 上的 PDB
-- 备份单个 PDB
RMAN> BACKUP PLUGGABLE DATABASE hrpdb PLUS ARCHIVELOG;
-- 备份所有 PDB
RMAN> BACKUP PLUGGABLE DATABASE ALL PLUS ARCHIVELOG;
8.2 恢复到 ASM
-- 恢复 PDB
RMAN> ALTER PLUGGABLE DATABASE hrpdb CLOSE;
RMAN> RESTORE PLUGGABLE DATABASE hrpdb;
RMAN> RECOVER PLUGGABLE DATABASE hrpdb;
RMAN> ALTER PLUGGABLE DATABASE hrpdb OPEN;
详细内容见:Oracle RMAN 备份恢复全流程。
9. ASM 监控
9.1 磁盘组使用
SELECT
name,
type,
total_mb,
free_mb,
ROUND(free_mb/total_mb*100,2) AS free_pct
FROM v$asm_diskgroup;
9.2 PDB 文件大小
SELECT
p.name AS pdb_name,
SUM(d.bytes)/1024/1024/1024 AS size_gb
FROM v$datafile d, v$pdbs p
WHERE d.con_id = p.con_id
GROUP BY p.name;
9.3 ASM I/O 统计
SELECT
group_number,
disk_number,
reads,
writes,
read_errs,
write_errs,
read_time,
write_time
FROM v$asm_disk_stat
WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name='DATA');
10. 常见坑与排错
10.1 ORA-15041: 磁盘组空间不足
修复:
-- 1. 检查空间
SELECT name, total_mb, free_mb FROM v$asm_diskgroup;
-- 2. 添加磁盘
ALTER DISKGROUP data ADD DISK '/dev/asm-disk_new';
-- 3. 或清理旧文件
RMAN> DELETE OBSOLETE;
RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
10.2 PDB 数据文件路径错误
修复:
-- 1. 检查 OMF 配置
SHOW PARAMETER db_create_file_dest;
-- 2. 设置 OMF
ALTER SYSTEM SET db_create_file_dest='+DATA' SCOPE=BOTH;
-- 3. 创建文件自动命名
10.3 ASM 磁盘组无法挂载
修复:
-- 1. 检查 ASM 磁盘
SELECT path, header_status FROM v$asm_disk;
-- 2. 强制挂载
ALTER DISKGROUP data MOUNT FORCE;
-- 3. 检查 Clusterware
crsctl stat res -t
10.4 PDB 文件丢失
修复:
-- 1. RMAN 恢复
RMAN> ALTER PLUGGABLE DATABASE hrpdb CLOSE;
RMAN> RESTORE PLUGGABLE DATABASE hrpdb;
RMAN> RECOVER PLUGGABLE DATABASE hrpdb;
RMAN> ALTER PLUGGABLE DATABASE hrpdb OPEN;
10.5 ASM 与 PDB 性能问题
修复:
-- 1. 检查 ASM I/O
SELECT * FROM v$asm_disk_stat;
-- 2. 检查 PDB 等待事件
SELECT event, count(*)
FROM v$session
WHERE con_id = (SELECT con_id FROM v$pdbs WHERE name='HRPDB')
GROUP BY event;
-- 3. 优化 ASM
ALTER DISKGROUP data REBALANCE MODIFY POWER 11;
11. 最佳实践
- 使用 OMF:简化文件管理
- 多磁盘组分离:DATA/FRA/REDO/ARCH
- 生产用 NORMAL+ 冗余:数据安全
- PDB 使用模板:精细控制
- 监控磁盘组空间:避免耗尽
- RAC 中使用 ASM:集群共享存储
- 不同 PDB 不同磁盘组:性能隔离
- 定期 RMAN 备份:保护数据
- 启用 ASMFD:磁盘保护
- 监控 ASM I/O:v$asm_disk_stat
12. 参考资料
[1] Oracle ASM Administrator’s Guide 19c, “Managing Oracle ASM Disk Groups” https://docs.oracle.com/en/database/oracle/oracle-database/19/ostmg/managing-asm-disk-groups.html
[2] Oracle Multitenant Administrator’s Guide 19c https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/