外观
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数据库的物理架构,可以提高数据库的性能、可用性和安全性,为业务应用提供可靠的支持。
