Oracle数据库的SYS.AUD$表是系统默认的审计数据表,用于存储数据库的各类审计记录,其所在的表空间如果无法完成扩容操作,会直接触发数据库登录阻断机制,导致所有用户都无法正常登录数据库,对业务系统造成严重影响。

SYS.AUD$无法扩容的常见原因
- 表空间存储空间耗尽:SYS.AUD$默认存放在SYSTEM表空间或者指定的审计表空间,当该表空间的数据文件已经占满,且没有可扩展的空间时,就会出现无法扩容的情况。
- 数据文件扩展限制:表空间的数据文件设置了最大大小限制,或者数据文件所在的磁盘分区已经没有剩余空间,导致数据文件无法继续扩展。
- 权限不足:执行扩容操作的用户没有足够的权限修改表空间或者数据文件的配置,也会导致扩容失败。
- 审计数据过量堆积:长期未清理SYS.AUD$中的历史审计数据,导致表体积过大,表空间剩余空间不足以支撑后续的数据写入和扩容需求。
问题排查步骤
1. 检查表空间使用情况
首先登录数据库(如果已经无法登录,可尝试使用sysdba身份无密码登录),查询SYS.AUD$所在表空间的使用情况,执行以下SQL语句:
-- 查询表空间使用情况
SELECT
a.tablespace_name,
a.bytes / 1024 / 1024 AS total_mb,
b.bytes / 1024 / 1024 AS used_mb,
(a.bytes - b.bytes) / 1024 / 1024 AS free_mb,
ROUND(((a.bytes - b.bytes) / a.bytes) * 100, 2) AS free_percent
FROM
(SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_data_files GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) AS bytes FROM dba_free_space GROUP BY tablespace_name) b
WHERE
a.tablespace_name = b.tablespace_name
AND a.tablespace_name = (SELECT tablespace_name FROM dba_tables WHERE table_name = 'AUD$' AND owner = 'SYS');2. 检查数据文件配置
查询对应表空间的数据文件信息,确认是否存在扩展限制:
-- 查询数据文件配置
SELECT
file_name,
bytes / 1024 / 1024 AS file_size_mb,
maxbytes / 1024 / 1024 AS max_file_size_mb,
autoextensible,
increment_by * 8192 / 1024 / 1024 AS increment_mb
FROM
dba_data_files
WHERE
tablespace_name = (SELECT tablespace_name FROM dba_tables WHERE table_name = 'AUD$' AND owner = 'SYS');3. 检查磁盘剩余空间
如果数据文件所在磁盘分区剩余空间不足,也会导致无法扩容,需要到服务器层面查看对应磁盘的使用情况。
解决方案
方案一:清理历史审计数据
如果表空间剩余空间不足是因为SYS.AUD$表数据过多导致,可以先清理无用的历史审计数据:
-- 清理指定日期之前的审计数据,根据实际需求调整日期
DELETE FROM sys.aud$ WHERE ntimestamp# < TO_TIMESTAMP('2024-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
-- 提交事务
COMMIT;
-- 收缩表空间释放空间
ALTER TABLE sys.aud$ SHRINK SPACE;方案二:扩展数据文件
如果数据文件支持自动扩展,可调整自动扩展的参数:
-- 修改数据文件自动扩展配置,根据实际需求调整大小 ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/audit01.dbf' AUTOEXTEND ON NEXT 100M MAXSIZE 4096M;
如果需要新增数据文件到表空间:
-- 新增数据文件,路径根据实际环境调整 ALTER TABLESPACE AUDIT_TBS ADD DATAFILE '/u01/app/oracle/oradata/orcl/audit02.dbf' SIZE 100M AUTOEXTEND ON NEXT 50M MAXSIZE 2048M;
方案三:调整SYS.AUD$的存储表空间
如果SYSTEM表空间本身已经无法扩容,可以将SYS.AUD$表迁移到其他有足够空间的表空间:
-- 迁移表到新的表空间,新表空间需要提前创建好 ALTER TABLE sys.aud$ MOVE TABLESPACE NEW_TBS_NAME; -- 迁移索引 ALTER INDEX sys.I_AUD1 REBUILD TABLESPACE NEW_TBS_NAME;
预防措施
- 定期清理SYS.AUD$表中的历史审计数据,避免数据过量堆积。
- 为审计表空间设置合理的自动扩展策略,同时监控表空间的使用情况,提前预警。
- 根据实际需求调整审计策略,减少不必要的审计数据产生。
- 不要将SYS.AUD$表默认存放在SYSTEM表空间,建议单独创建审计表空间存放审计数据。