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
+REDORedo LogHIGH
+ARCH归档日志NORMAL
+ACFSACFS 文件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. 最佳实践

  1. 使用 OMF:简化文件管理
  2. 多磁盘组分离:DATA/FRA/REDO/ARCH
  3. 生产用 NORMAL+ 冗余:数据安全
  4. PDB 使用模板:精细控制
  5. 监控磁盘组空间:避免耗尽
  6. RAC 中使用 ASM:集群共享存储
  7. 不同 PDB 不同磁盘组:性能隔离
  8. 定期 RMAN 备份:保护数据
  9. 启用 ASMFD:磁盘保护
  10. 监控 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/