Oracle体系结构-警报日志文件 (Alert Log File / Alert SID.log)
第一部分:密码文件 (Password File)
1. 原理
- 核心目的: 密码文件主要用于远程数据库管理员身份验证。当用户需要以
SYSDBA
,SYSOPER
,SYSBACKUP
,SYSDG
,SYSKM
等特权身份从客户端通过网络连接到数据库实例(而不是直接在数据库服务器本机操作系统上连接)时,Oracle 就需要验证这些用户的权限。 - 认证机制: 数据库启动时(
NOMOUNT
或更高阶段),在监听器 (Listener
) 协助建立连接后,实例本身尚未完全打开数据库数据字典来验证用户。此时,密码文件提供了一个外部存储库,用于验证尝试以特权身份连接的用户名和密码。 - 文件本质: 它是一个加密的二进制文件,存储了被授予
SYSDBA
,SYSOPER
等权限的数据库用户的用户名及其对应的密码哈希值(不是明文密码)。 - 与操作系统的关系: 在 Unix/Linux 上,密码文件通常位于
$ORACLE_HOME/dbs
目录下,名称格式为orapw<ORACLE_SID>
(例如orapworcl
)。在 Windows 上,通常位于%ORACLE_HOME%\database
目录下,名称格式为PWD<ORACLE_SID>.ora
(例如PWDorcl.ora
)。文件权限通常设置为640
(-rw-r-----
),确保只有oracle
用户和dba
组可以读写。
2. 特性
- 静态文件: 内容不会在数据库正常操作期间频繁变动。只有在授予或撤销用户
SYSDBA/SYSOPER
等权限,或者更改这些用户的密码时才会更新。 - 实例级: 密码文件与特定的 Oracle 实例 (
ORACLE_SID
) 关联。 - 特权用户存储: 只存储被显式授予了
SYSDBA
,SYSOPER
,SYSBACKUP
,SYSDG
,SYSKM
权限的用户。普通数据库用户即使拥有DBA
角色,如果未被授予这些特权身份,其密码也不会存储在密码文件中。 - 共享与独占: 在单实例环境中,密码文件是独占的。在 RAC 环境中,强烈推荐在所有节点上使用同一个共享的密码文件(通常放在共享存储上,如 ASM 磁盘组或集群文件系统),以确保所有节点对特权用户的认证一致。也可以在每个节点维护一份拷贝,但必须保持同步,否则会导致连接问题。
- 加密: 存储的是密码的单向哈希值(早期版本算法较弱,后期版本如 12c+ 使用更安全的 SHA 算法),无法从文件内容反推出原始密码。
- 大小: 文件大小固定,在创建时指定(通过
orapwd
的entries
参数)。如果特权用户数量超过初始分配条目数,需要重建文件。
3. 作用
- 启用远程特权连接: 这是最主要的作用。允许 DBA 从远程客户端使用 SQL*Plus, SQL Developer, RMAN, Data Pump 等工具以
AS SYSDBA
等身份连接数据库,执行启动、关闭、备份恢复、创建用户等需要高权限的操作。 - 数据库启动初始阶段认证: 在数据库启动到
NOMOUNT
或MOUNT
阶段时,密码文件是验证SYS
用户连接(例如执行STARTUP MOUNT
命令)的唯一方式,因为数据字典此时还不可用。 - 权限管理: 通过
GRANT SYSDBA TO <username>;
和REVOKE SYSDBA FROM <username>;
命令,将用户加入或移出密码文件,从而授予或撤销其远程执行特权操作的能力。 - 强制密码更改: 当修改
SYS
用户或其他特权用户的密码时,密码文件会立即更新。下次远程特权连接必须使用新密码。
4. 管理操作
- 创建: 使用
orapwd
实用程序。orapwd file=$ORACLE_HOME/dbs/orapw<ORACLE_SID> password=<SYS_password> entries=<max_users> force=y
file
: 指定完整路径和文件名。password
: 设置SYS
用户的密码(12c 之前必须指定;12c 之后SYS
密码通常由数据库创建时指定,此参数可省略或用于重置)。entries
: 预计的最大特权用户数量。force
: 覆盖已存在的同名文件。- (可选)
format
: 12c+ 可用,指定格式12
或12.2
以使用更安全的 SHA512 算法。
- 添加/移除用户:
- 授予权限 (自动添加用户到密码文件):
GRANT SYSDBA TO scott;
- 撤销权限 (自动从密码文件移除用户):
REVOKE SYSDBA FROM scott;
- 授予权限 (自动添加用户到密码文件):
- 更改特权用户密码: 使用
ALTER USER
命令更改SYS
或其他特权用户的密码会同时更新数据字典和密码文件。 - 查看内容: 无法直接读取二进制内容。可通过动态性能视图
V$PWFILE_USERS
查询哪些用户拥有特权以及这些特权是什么:SELECT * FROM V$PWFILE_USERS;
5. 故障恢复
密码文件损坏或丢失会导致无法以特权身份进行远程连接。本地操作系统认证(如果配置了 OSDBA/OSOPER 组)通常不受影响。
- 症状:
- 尝试远程
CONNECT / AS SYSDBA
失败 (ORA-01031: insufficient privileges
)。 - 尝试远程
CONNECT sys/<password>@<service> AS SYSDBA
失败 (ORA-01017: invalid username/password; logon denied
),即使密码确认正确。 V$PWFILE_USERS
可能无法查询或返回错误。- 监听器日志或数据库告警日志 (
alert_<SID>.log
) 中可能出现相关错误。
- 尝试远程
- 恢复步骤:
- 确定本地操作系统认证可用 (关键!): 登录数据库服务器操作系统,确保当前用户属于
OSDBA
(通常dba
组) 或OSOPER
组。 - 本地连接: 使用操作系统认证连接到数据库实例 (通常
sqlplus / as sysdba
)。 - 重建密码文件:
- 使用
orapwd
命令重建文件 (参考上面的创建命令)。 - 重要: 如果重建时指定了
password
参数,它会重置SYS
用户的密码!如果不想重置SYS
密码 (12c+ 常见),在重建时不指定password
参数即可。文件重建后,SYS
的密码保持其在数据库内部的当前状态。
- 使用
- 重新授予权限: 重建后的密码文件只包含
SYS
用户。需要重新为其他特权用户执行GRANT SYSDBA/SYSOPER
命令。 - 测试远程连接: 尝试从远程客户端使用特权用户连接,验证恢复成功。
- 确定本地操作系统认证可用 (关键!): 登录数据库服务器操作系统,确保当前用户属于
- 预防与最佳实践:
- 将密码文件包含在常规的数据库文件系统备份策略中。
- 在 RAC 环境中,确保所有节点使用共享的密码文件或各节点副本保持严格同步。
- 定期检查
V$PWFILE_USERS
以确保权限分配符合预期。 - 使用强密码并定期更新特权用户密码。
第二部分:临时文件 (Temp Files)
1. 原理
- 核心目的: 临时文件是
TEMP
表空间的物理存储文件。TEMP
表空间专门用于存储数据库操作过程中产生的临时数据。这些数据是会话私有的或全局临时的,并且不需要持久化。 - 数据本质: 存储的数据包括:
- 大型排序操作(
ORDER BY
,GROUP BY
,DISTINCT
,UNION
, 创建索引等)的中间结果。 - 哈希连接 (
HASH JOIN
) 的哈希区。 - 临时
LOB
数据。 - 临时表和临时
LOB
的索引数据。 - 某些类型的查询重写操作。
- 结果集缓存(如果过大无法放入 PGA)。
- 大型排序操作(
- 存储管理: Oracle 使用临时文件作为磁盘上的溢出区域。当会话的私有 SQL 区域(在 PGA 中)无法容纳操作所需的临时数据时,数据就会被写入到
TEMP
表空间的临时文件中。写入是直接路径 I/O,绕过 Buffer Cache,提高效率。 - 空间分配:
TEMP
表空间使用临时文件扩展区 (Temp Extents) 管理。这些扩展区是按需分配的。当会话需要临时空间时,Oracle 会在临时文件中分配一个扩展区给该会话使用。会话结束时(或事务结束时,对于全局临时表行),该会话使用的扩展区会被标记为空闲,并可立即被其他会话重用。不需要等待检查点。这是TEMP
表空间和PERMANENT
表空间在空间回收机制上的关键区别。 - 文件本质: 临时文件也是操作系统文件,通常具有
.dbf
或.tmp
扩展名。它们由数据库创建和管理。
2. 特性
- 非持久性: 存储在临时文件中的数据是临时的。数据库重启后,临时文件中的所有数据都会被清除。临时文件本身不会被删除,但内容会被重置。
- 不生成 Redo: 对临时文件的写入操作**不产生重做日志 (Redo Log)**。因为临时数据不需要恢复。这是提高涉及大量临时数据操作性能的关键。
- 可能生成 Undo (特殊): 虽然不生成 Redo,但对全局临时表 (Global Temporary Tables, GTT) 的 DML 操作(
INSERT
,UPDATE
,DELETE
)会生成 Undo 数据(存储在 Undo 表空间),以确保事务的读一致性和回滚能力。这些 Undo 会生成 Redo。对排序和哈希操作的临时数据写入则完全不生成 Undo 或 Redo。 - NOLOGGING 模式: 临时文件总是处于
NOLOGGING
模式。即使显式指定LOGGING
也会被忽略。这进一步强调了临时数据不需要日志记录的特性。 - 空间管理:
TEMP
表空间使用临时文件扩展区 (Temp Extents) 管理,采用位图 (Bitmap) 方式跟踪空闲空间,效率很高。空间分配和回收非常快速。 - 自动扩展: 临时文件通常配置为自动扩展 (
AUTOEXTEND ON
), 以避免空间不足错误 (ORA-01652: unable to extend temp segment
)。可以设置NEXT
和MAXSIZE
来控制增长。 - 共享性:
TEMP
表空间是数据库级的共享资源。所有需要临时空间的会话都会从同一个(或配置的多个)TEMP
表空间分配临时扩展区。 - 默认存在: 数据库创建时 (
CREATE DATABASE
),通常会自动创建一个默认的TEMP
表空间及其关联的临时文件。
3. 作用
- 支持内存密集型操作: 为超出 PGA 内存容量的大型排序、哈希连接、位图操作等提供磁盘暂存空间,确保这些操作能够完成。
- 存储会话私有临时数据: 为每个会话在执行复杂 SQL 时产生的私有临时数据提供存储。
- 存储全局临时表 (GTT) 数据: 提供全局临时表数据的物理存储位置。GTT 的定义(元数据)存储在数据字典中,但其实际数据行存储在分配给的
TEMP
表空间中。 - 提高性能: 通过避免使用永久表空间存储临时数据,减少对永久表空间的 I/O 竞争和碎片化。直接路径 I/O 和 NOLOGGING 特性也提升了写入效率。
- 管理临时空间需求: 集中管理数据库运行期间产生的所有临时数据存储需求。
4. 管理操作
- 创建临时表空间:
CREATE TEMPORARY TABLESPACE temp TEMPFILE '/u01/oradata/orcl/temp01.dbf' SIZE 1G AUTOEXTEND ON NEXT 100M MAXSIZE 10G EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
- 使用
TEMPFILE
关键字指定临时文件。 EXTENT MANAGEMENT LOCAL
是必须的(也是唯一支持的)。UNIFORM SIZE
指定所有扩展区大小相同,是管理临时空间的最佳实践。
- 使用
- 添加临时文件: 给现有
TEMP
表空间添加更多空间。ALTER TABLESPACE temp ADD TEMPFILE '/u01/oradata/orcl/temp02.dbf' SIZE 2G AUTOEXTEND ON NEXT 200M MAXSIZE 20G;
- 调整大小/移动/重命名:
- Resize:
ALTER DATABASE TEMPFILE '/u01/oradata/orcl/temp01.dbf' RESIZE 5G;
- Move/Rename (需要表空间离线): 移动或重命名临时文件相对复杂,因为
TEMP
表空间通常不能轻易离线(除非没有活动会话使用它)。- 创建新的
TEMP
表空间 (CREATE TEMPORARY TABLESPACE ...
). - 将默认临时表空间切换到新的:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE new_temp;
- 等待所有使用旧
TEMP
表空间的会话结束(或强制 kill)。 - 删除旧的
TEMP
表空间及其文件:DROP TABLESPACE old_temp INCLUDING CONTENTS AND DATAFILES;
- (可选)重命名新的
TEMP
表空间为原来的名字(如果需要),并确保它是默认的。
- 创建新的
- Resize:
- 删除临时文件: 不能单独删除临时文件,只能通过删除其所属的
TEMP
表空间来删除。
在删除前,必须确保它不是默认临时表空间。DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;
- 监控:
DBA_TEMP_FILES
/V$TEMPFILE
: 查看临时文件信息(名称、大小、状态、已用/空闲空间)。V$SORT_USAGE
: 查看当前正在进行的排序操作及其使用的临时空间。V$TEMPSEG_USAGE
: 查看当前会话使用的临时段信息。DBA_TABLESPACES
: 查看表空间信息,包括TEMP
表空间。V$SESSTAT
/V$SYSSTAT
: 统计信息如sorts (disk)
可以指示排序溢出到磁盘的频率。V$TEMP_SPACE_HEADER
: (11gR2+) 提供更详细的临时空间使用信息。
5. 故障恢复
临时文件损坏或丢失通常不会导致数据库崩溃,但会严重影响依赖临时空间的查询和操作。
- 症状:
- 执行需要大量临时空间的操作(如大排序、哈希连接、使用大 GTT)时失败,报错
ORA-01578: ORACLE data block corrupted (file # <file_id>, block # <block_id>)
或ORA-00376: file <file_id> cannot be read at this time
或ORA-01110: data file <file_id>: '/path/to/tempfile.dbf'
。错误通常指向具体的临时文件。 - 操作报错
ORA-01652: unable to extend temp segment
,但如果检查文件系统空间充足且文件可写,则可能是文件内部损坏导致无法分配新扩展区。 - 数据库告警日志 (
alert_<SID>.log
) 中会记录文件 I/O 错误或校验和错误。
- 执行需要大量临时空间的操作(如大排序、哈希连接、使用大 GTT)时失败,报错
- 恢复步骤:
- 识别损坏的文件: 根据错误信息或告警日志确认哪个临时文件损坏。
- 重建临时文件 (推荐方法):
- 由于临时文件内容不重要,最简单的恢复方法是删除损坏的临时文件并添加一个新的。
- 确保有足够的磁盘空间。
- 执行删除和添加操作:
-- 假设损坏的文件是 file_id=3 ALTER DATABASE TEMPFILE '/path/to/corrupted_temp.dbf' DROP INCLUDING DATAFILES; ALTER TABLESPACE temp ADD TEMPFILE '/path/to/new_temp.dbf' SIZE ... AUTOEXTEND ... ;
- 如果
TEMP
表空间只有一个临时文件且它损坏了,需要先添加一个新的,然后再删除旧的:ALTER TABLESPACE temp ADD TEMPFILE '/path/to/new_temp.dbf' SIZE ... AUTOEXTEND ... ; ALTER DATABASE TEMPFILE '/path/to/corrupted_temp.dbf' DROP INCLUDING DATAFILES;
- 重建
TEMP
表空间 (备选方法): 如果损坏严重或想彻底重建:- 创建一个新的临时表空间
new_temp
。 - 将默认临时表空间切换到
new_temp
。 - 等待所有会话切换到新的
TEMP
表空间(可能需要时间或手动终止旧会话)。 - 删除损坏的旧
TEMP
表空间及其文件 (DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES;
)。 - (可选)重命名
new_temp
为原来的名字,并确保它是默认的。
- 创建一个新的临时表空间
- 为什么不需要介质恢复?
- 临时文件不包含持久化数据。
- 对临时文件的写入不生成 Redo。因此,无法使用 Redo Log 进行恢复。
- 数据库重启后,临时文件内容本就会被清空。直接重建文件是最快、最安全的方案。
- 预防与最佳实践:
- 将临时文件放置在高性能、高可用性的存储上(如 RAID 10, ASM),因为临时文件的 I/O 可能非常密集。
- 配置合理的
AUTOEXTEND
设置(NEXT
大小和MAXSIZE
),避免频繁的小扩展和潜在的磁盘空间耗尽问题。 - 监控
V$SORT_USAGE
和V$TEMP_SPACE_HEADER
以了解临时空间使用模式和压力,适时增加临时文件大小或数量。 - 使用
UNIFORM SIZE
扩展区管理以减少碎片。 - 在 RAC 环境中,可以为每个实例配置自己的
TEMP
表空间(实例私有)或使用共享的TEMP
表空间。共享TEMP
更常见,但需要确保底层存储能承受并发 I/O。私有TEMP
可以隔离实例间的临时 I/O 影响。 - 虽然不需要备份临时文件内容(因为非持久),但包含临时文件定义的数据库控制文件和元数据备份是重要的。如果整个数据库需要恢复,重建
TEMP
表空间是恢复步骤的一部分。
总结对比表
特性 | 密码文件 (Password File) | 临时文件 (Temp Files) |
---|---|---|
核心目的 | 远程特权用户 (SYSDBA , SYSOPER 等) 身份验证 | 存储数据库操作产生的临时数据 (排序, 哈希, GTT 等) |
文件本质 | 加密的二进制文件 | 数据库管理的操作系统文件 (通常 .dbf 或 .tmp ) |
持久性 | 持久化存储用户权限关系 | 非持久化 - 数据库重启后内容清空 |
关键数据 | 特权用户名及其密码哈希值 | 会话私有或全局临时的中间结果数据 |
生成 Redo | 否 (文件独立更新) | 否 (核心特性) |
生成 Undo | 否 | 仅针对 GTT 的 DML (Undo 本身产生 Redo) |
NOLOGGING | 不适用 | 总是 (即使指定 LOGGING 也无效) |
空间管理 | 固定条目数 (entries 参数) | 本地管理的临时扩展区 (位图), UNIFORM SIZE 最佳 |
故障恢复 | 重建文件 (orapwd ), 重新授权。不能 RMAN 恢复 | 直接重建文件/表空间。不需要/不能介质恢复 (无 Redo) |
关联对象 | 特定实例 (ORACLE_SID ) | TEMP 表空间 |
监控视图 | V$PWFILE_USERS | DBA_TEMP_FILES , V$TEMPFILE , V$SORT_USAGE , V$TEMP_SPACE_HEADER |
典型位置 | $ORACLE_HOME/dbs (Unix), %ORACLE_HOME%\database (Win) | $ORACLE_BASE/oradata/<DB_NAME>/ , ASM 磁盘组等 |
共享 (RAC) | 强烈推荐共享 或 严格同步各节点副本 | 通常共享一个 TEMP 表空间,也可配置实例私有 |
影响故障症状 | 无法远程特权连接 | 需要临时空间的操作失败 (ORA-01578, ORA-00376 等) |
理解密码文件和临时文件的原理、特性、作用和管理方法,特别是它们在故障恢复策略上的根本区别(密码文件需要重建和重授权,临时文件直接重建即可),对于 Oracle 数据库管理员进行有效的系统管理、性能调优和故障排除至关重要。