Skip to content

Oracle 物理架构

Oracle数据库的物理架构描述了数据库在磁盘上的存储结构,包括各种物理文件的组成和功能。了解Oracle的物理架构对于DBA进行数据库管理、备份恢复和性能优化至关重要。本文将详细介绍Oracle数据库的物理架构,包括数据文件、控制文件、重做日志文件、归档日志和参数文件等核心组件。

数据文件

数据文件是Oracle数据库中存储实际数据的物理文件,每个数据文件对应一个或多个表空间。数据文件的大小和数量直接影响数据库的存储容量和性能。

数据文件的特性

核心功能

  • 存储表、索引、视图等数据库对象的数据
  • 与表空间一一对应
  • 支持自动扩展
  • 支持多种存储格式
  • 实现数据的持久化存储

主要特性

  • 块结构:数据文件由多个Oracle块组成,块大小由DB_BLOCK_SIZE参数设置
  • 扩展:可以手动或自动扩展,通过AUTOEXTEND属性控制
  • 最大大小:受操作系统和Oracle版本限制
  • 状态:可以处于在线或离线状态
  • 可移动:可以在数据库运行时移动数据文件

数据文件管理

查看数据文件信息

sql
-- 查看数据文件列表
SELECT name, bytes/1024/1024 AS "Size (MB)", 
       maxbytes/1024/1024 AS "Max Size (MB)", 
       autoextensible, status 
FROM v$datafile;

-- 查看表空间对应的数据文件
SELECT ts.name AS tablespace_name, df.name AS datafile_name, 
       df.bytes/1024/1024 AS "Size (MB)" 
FROM v$tablespace ts, v$datafile df 
WHERE ts.ts# = df.ts#;

创建数据文件

sql
-- 为表空间添加数据文件
ALTER TABLESPACE users 
ADD DATAFILE '/u01/app/oracle/oradata/ORCL/users02.dbf' 
SIZE 100M AUTOEXTEND ON NEXT 10M MAXSIZE 1000M;

调整数据文件大小

sql
-- 扩展数据文件
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' 
RESIZE 200M;

-- 启用自动扩展
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' 
AUTOEXTEND ON NEXT 10M MAXSIZE 500M;

移动数据文件

sql
-- 1. 将数据文件设为离线
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' OFFLINE;

-- 2. 使用操作系统命令移动文件
-- mv /u01/app/oracle/oradata/ORCL/users01.dbf /u02/app/oracle/oradata/ORCL/users01.dbf

-- 3. 更新数据库中的数据文件路径
ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/ORCL/users01.dbf' 
TO '/u02/app/oracle/oradata/ORCL/users01.dbf';

-- 4. 将数据文件设为在线
ALTER DATABASE DATAFILE '/u02/app/oracle/oradata/ORCL/users01.dbf' ONLINE;

版本差异

  • Oracle 10g:引入了Bigfile表空间,支持单个数据文件最大128TB
  • Oracle 11g:增强了数据文件的自动管理功能
  • Oracle 12c:支持多租户架构下的数据文件管理
  • Oracle 19c:优化了数据文件的I/O性能

最佳实践

  • 使用多个数据文件,将I/O分布到不同磁盘
  • 合理设置数据文件的初始大小和自动扩展参数
  • 定期监控数据文件的使用情况,避免空间不足
  • 使用Bigfile表空间减少数据文件数量,简化管理
  • 将不同类型的数据(如数据、索引、LOB)存储在不同的数据文件中

控制文件

控制文件是Oracle数据库的关键文件,存储了数据库的结构信息和状态信息。数据库启动时需要读取控制文件来获取数据库的物理结构。

控制文件的内容

控制文件包含以下关键信息:

  • 数据库名称和DBID
  • 数据文件和重做日志文件的位置和状态
  • 检查点信息
  • 归档日志信息
  • RMAN备份信息
  • 数据库创建时间
  • 表空间信息

控制文件的特性

核心功能

  • 记录数据库的物理结构
  • 支持数据库恢复
  • 监控数据库状态
  • 支持RMAN备份
  • 实现数据一致性

主要特性

  • 大小固定:控制文件的大小在创建时确定,不能自动扩展
  • 多路复用:建议至少创建2-3个控制文件副本,提高可用性
  • 二进制格式:控制文件是二进制文件,不能直接编辑
  • 自动更新:数据库运行时自动更新控制文件内容
  • 必需文件:数据库启动和运行必需的文件

控制文件管理

查看控制文件信息

sql
-- 查看控制文件位置
SELECT name FROM v$controlfile;

-- 查看控制文件状态
SELECT status FROM v$instance;

-- 查看控制文件记录的文件信息
SELECT type, record_size, records_total, records_used 
FROM v$controlfile_record_section;

创建控制文件备份

sql
-- 创建二进制控制文件备份
ALTER DATABASE BACKUP CONTROLFILE TO '/u01/app/oracle/backup/controlfile.bak';

-- 创建文本格式的控制文件备份
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/u01/app/oracle/backup/controlfile.sql';

添加控制文件副本

sql
-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;

-- 2. 使用操作系统命令复制控制文件
-- cp /u01/app/oracle/oradata/ORCL/control01.ctl /u02/app/oracle/oradata/ORCL/control02.ctl

-- 3. 修改参数文件,添加新的控制文件路径
-- 修改SPFILE或PFILE中的CONTROL_FILES参数

-- 4. 启动数据库
STARTUP;

版本差异

  • Oracle 9i:引入了控制文件自动备份功能
  • Oracle 10g:增强了控制文件的管理功能
  • Oracle 11g:支持控制文件的快速恢复
  • Oracle 12c:支持多租户架构下的控制文件管理

最佳实践

  • 创建多个控制文件副本,存储在不同的磁盘上
  • 定期备份控制文件
  • 避免将控制文件存储在系统磁盘上
  • 合理设置控制文件的大小和位置
  • 监控控制文件的状态和完整性

重做日志文件

重做日志文件是Oracle数据库的重要组成部分,用于记录数据库的所有修改操作,确保数据的一致性和可恢复性。

重做日志文件的特性

核心功能

  • 记录所有数据修改操作
  • 支持数据库恢复
  • 实现事务的ACID特性
  • 支持日志归档
  • 支持故障恢复

主要特性

  • 循环使用:重做日志文件以循环方式使用,当一个日志文件写满后,会切换到下一个
  • 大小固定:重做日志文件的大小在创建时确定
  • 多路复用:建议至少创建2组重做日志文件,每组包含2-3个成员
  • 状态:可以处于当前、活动、非活动或未使用状态
  • 必需文件:数据库启动和运行必需的文件

重做日志组和成员

  • 重做日志组:由一组相同内容的重做日志文件组成,成员之间是镜像关系
  • 重做日志成员:单个重做日志文件,属于一个重做日志组
  • 当前日志组:正在写入的重做日志组
  • 活动日志组:包含未被写入数据文件的重做记录的日志组
  • 非活动日志组:所有重做记录已被写入数据文件的日志组

重做日志文件管理

查看重做日志信息

sql
-- 查看重做日志组信息
SELECT group#, status, type, member 
FROM v$logfile;

-- 查看重做日志组状态
SELECT group#, sequence#, status, bytes/1024/1024 AS "Size (MB)", 
       first_change#, first_time, next_change# 
FROM v$log;

创建重做日志组

sql
-- 创建重做日志组
ALTER DATABASE ADD LOGFILE GROUP 4 
('/u01/app/oracle/oradata/ORCL/redo04a.log', 
'/u02/app/oracle/oradata/ORCL/redo04b.log') 
SIZE 50M;

添加重做日志成员

sql
-- 为重做日志组添加成员
ALTER DATABASE ADD LOGFILE MEMBER 
'/u03/app/oracle/oradata/ORCL/redo01c.log' 
TO GROUP 1;

切换重做日志

sql
-- 手动切换重做日志
ALTER SYSTEM SWITCH LOGFILE;

清理重做日志

sql
-- 清除重做日志内容(仅在必要时使用)
ALTER DATABASE CLEAR LOGFILE GROUP 1;

-- 清除不可用的重做日志
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 1;

版本差异

  • Oracle 9i:引入了Flashback Database功能,依赖重做日志
  • Oracle 10g:增强了重做日志的管理功能
  • Oracle 11g:引入了redo log file size advisor
  • Oracle 12c:支持多租户架构下的重做日志管理

最佳实践

  • 创建多个重做日志组,每组至少包含2个成员
  • 将重做日志成员分布在不同的磁盘上
  • 合理设置重做日志文件大小,建议500MB-2GB
  • 定期监控重做日志的使用情况
  • 避免频繁的日志切换

归档日志

归档日志是重做日志文件的副本,当数据库运行在归档模式下时,会将写满的重做日志文件复制到归档目录。

归档日志的特性

核心功能

  • 支持时间点恢复
  • 支持增量备份和恢复
  • 支持数据库克隆
  • 支持数据仓库加载
  • 实现长期数据保护

主要特性

  • 自动生成:数据库运行在归档模式下自动生成
  • 可管理:可以设置归档目标和保留策略
  • 压缩存储:支持归档日志压缩
  • 远程存储:支持将归档日志存储到远程位置
  • 必需文件:用于数据库恢复和备份

归档模式管理

查看归档模式

sql
-- 查看归档模式
SELECT log_mode FROM v$database;

-- 查看归档日志信息
SELECT name, sequence#, first_change#, next_change#, 
       first_time, completion_time 
FROM v$archived_log ORDER BY completion_time DESC;

-- 查看归档目标
SHOW PARAMETER log_archive_dest;

切换归档模式

sql
-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;

-- 2. 启动数据库到挂载状态
STARTUP MOUNT;

-- 3. 启用归档模式
ALTER DATABASE ARCHIVELOG;

-- 4. 打开数据库
ALTER DATABASE OPEN;

-- 5. 验证归档模式
SELECT log_mode FROM v$database;

配置归档目标

sql
-- 设置本地归档目标
ALTER SYSTEM SET log_archive_dest_1 = 'LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ORCL';

-- 设置远程归档目标
ALTER SYSTEM SET log_archive_dest_2 = 'SERVICE=standby_db LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STANDBY';

版本差异

  • Oracle 9i:增强了归档日志的管理功能
  • Oracle 10g:引入了Fast Recovery Area,简化归档日志管理
  • Oracle 11g:增强了归档日志的压缩和加密功能
  • Oracle 12c:支持多租户架构下的归档日志管理

最佳实践

  • 将数据库运行在归档模式下,确保数据可恢复性
  • 设置多个归档目标,提高归档日志的可用性
  • 使用Fast Recovery Area管理归档日志
  • 定期清理过期的归档日志
  • 监控归档日志的生成和使用情况

参数文件

参数文件用于存储Oracle数据库的配置参数,控制数据库的运行行为。Oracle数据库支持两种类型的参数文件:服务器参数文件(SPFILE)和文本参数文件(PFILE)。

参数文件类型

服务器参数文件(SPFILE)

  • 二进制格式,不能直接编辑
  • 数据库运行时可以动态修改参数
  • 自动备份
  • 支持RAC集群环境
  • 建议在生产环境中使用

文本参数文件(PFILE)

  • 文本格式,可以直接编辑
  • 需要重启数据库才能应用参数修改
  • 不支持自动备份
  • 适合测试和开发环境
  • 可以从SPFILE生成

参数文件管理

查看参数文件位置

sql
-- 查看SPFILE位置
SHOW PARAMETER spfile;

-- 查看参数值
SHOW PARAMETER db_name;

-- 查看所有参数
SELECT name, value, isdefault, isses_modifiable, issys_modifiable 
FROM v$parameter;

修改参数

sql
-- 动态修改参数(立即生效)
ALTER SYSTEM SET processes=300 SCOPE=BOTH;

-- 修改参数,重启后生效
ALTER SYSTEM SET sga_target=12G SCOPE=SPFILE;

-- 修改会话级参数
ALTER SESSION SET optimizer_mode=ALL_ROWS;

生成参数文件

sql
-- 从SPFILE生成PFILE
CREATE PFILE='/u01/app/oracle/pfile/initORCL.ora' FROM SPFILE;

-- 从PFILE生成SPFILE
CREATE SPFILE FROM PFILE='/u01/app/oracle/pfile/initORCL.ora';

版本差异

  • Oracle 9i:首次引入SPFILE
  • Oracle 10g:增强了SPFILE的功能和管理
  • Oracle 11g:支持参数文件的加密
  • Oracle 12c:支持多租户架构下的参数文件管理

最佳实践

  • 在生产环境中使用SPFILE,便于管理和维护
  • 定期备份SPFILE
  • 合理设置参数值,避免过度配置
  • 监控参数的使用情况
  • 记录参数变更历史

密码文件

密码文件用于存储具有SYSDBA、SYSOPER等特权的用户密码,支持远程登录数据库。

密码文件的特性

核心功能

  • 存储特权用户密码
  • 支持远程登录
  • 实现数据库的安全访问
  • 支持RAC集群环境

主要特性

  • 二进制格式:密码文件是二进制文件,不能直接编辑
  • 可创建和修改:使用orapwd工具创建和修改
  • 必需文件:用于远程登录具有特权的用户

密码文件管理

创建密码文件

bash
# 使用orapwd工具创建密码文件
orapwd file=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwORCL 
password=Oracle123 entries=5 force=y format=12

查看密码文件用户

sql
-- 查看密码文件中的用户
SELECT username, sysdba, sysoper, sysasm 
FROM v$pwfile_users;

-- 添加用户到密码文件
GRANT SYSDBA TO scott;

版本差异

  • Oracle 11g:增强了密码文件的安全性
  • Oracle 12c:支持多租户架构下的密码文件管理
  • Oracle 19c:优化了密码文件的性能和安全性

最佳实践

  • 使用强密码保护密码文件
  • 限制密码文件中的用户数量
  • 定期更换密码文件密码
  • 将密码文件存储在安全位置
  • 监控密码文件的访问情况

常见问题(FAQ)

1. 如何确定数据文件的最佳大小?

  • 考虑存储设备的I/O性能
  • 考虑数据库的增长需求
  • 对于OLTP系统,建议每个数据文件大小在100GB以下
  • 对于DSS系统,可以使用更大的数据文件
  • 使用自动扩展功能,避免频繁添加数据文件

2. 如何监控数据文件的使用情况?

sql
-- 监控表空间使用率
SELECT ts.name AS tablespace_name, 
       round((df.total_space - fs.free_space) / df.total_space * 100, 2) AS "Used %",
       round(df.total_space, 2) AS "Total (GB)",
       round(fs.free_space, 2) AS "Free (GB)" 
FROM (
  SELECT tablespace_name, sum(bytes/1024/1024/1024) AS total_space 
  FROM dba_data_files 
  GROUP BY tablespace_name
) df,
(
  SELECT tablespace_name, sum(bytes/1024/1024/1024) AS free_space 
  FROM dba_free_space 
  GROUP BY tablespace_name
),
v$tablespace ts 
WHERE df.tablespace_name = fs.tablespace_name 
AND ts.name = df.tablespace_name 
ORDER BY "Used %" DESC;

3. 如何优化重做日志性能?

  • 使用快速存储设备(如SSD)存储重做日志文件
  • 将重做日志文件分布在不同的磁盘上
  • 合理设置重做日志文件大小,建议500MB-2GB
  • 避免频繁的日志切换
  • 使用适当的写入模式(同步或异步)

4. 如何恢复丢失的控制文件?

  • 如果有控制文件副本,将副本复制到原位置
  • 如果没有副本,使用备份的控制文件恢复
  • 如果没有备份,使用CREATE CONTROLFILE语句重建控制文件

5. 如何清理归档日志?

  • 使用RMAN的DELETE命令清理归档日志
  • 设置归档日志的保留策略
  • 使用OS命令手动删除过期的归档日志
  • 配置自动清理策略

6. 如何修改SPFILE中的参数?

sql
-- 动态修改参数
ALTER SYSTEM SET parameter_name=value SCOPE=BOTH;

-- 修改参数,重启后生效
ALTER SYSTEM SET parameter_name=value SCOPE=SPFILE;

7. 如何从SPFILE切换到PFILE?

sql
-- 生成PFILE
CREATE PFILE='/u01/app/oracle/pfile/initORCL.ora' FROM SPFILE;

-- 修改启动脚本,使用PFILE启动数据库
-- 在/etc/oratab中修改启动选项

8. 如何监控重做日志切换频率?

sql
-- 监控最近的日志切换
SELECT to_char(first_time, 'YYYY-MM-DD HH24:MI:SS') AS first_time, 
       sequence#, group# 
FROM v$log_history 
ORDER BY first_time DESC 
FETCH FIRST 20 ROWS ONLY;

总结

Oracle数据库的物理架构是DBA管理和维护数据库的基础,了解数据文件、控制文件、重做日志文件、归档日志和参数文件的功能和管理方法,对于确保数据库的可用性、性能和可恢复性至关重要。

DBA应该定期监控和管理这些物理文件,确保它们处于良好状态,避免因物理文件问题导致数据库故障。同时,DBA还应该了解不同版本之间的物理架构差异,以便在升级或迁移时做出正确的决策。

通过合理配置和管理Oracle数据库的物理架构,可以提高数据库的性能、可用性和安全性,为业务应用提供可靠的支持。