对数据库做检查,发现system表空间持续占满99%。使用如下语句查看:

  1、查询表空间使用状况

SELECT  b.tablespace_name  "表空间",
b.bytes / 1024 / 1024  "大小M",
(
	b.bytes - sum(
	nvl( a.bytes, 0 ))) / 1024 / 1024  "已使用M",
substr((
		b.bytes - sum(
		nvl( a.bytes, 0 ))) / ( b.bytes ) * 100,
	1,
	5 
)  "利用率"  FROM  dba_free_space a,
dba_data_files b  WHERE  a.file_id = b.file_id  AND  b.tablespace_name = 'SYSTEM'  GROUP BY  b.tablespace_name,
b.file_name,
b.bytes  ORDER BY  b.tablespace_name;

   2、查询表空间使用状况

SELECT UPPER(F.TABLESPACE_NAME) "表空间名", 
D.TOT_GROOTTE_MB "表空间大小(M)", 
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", 
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "使用比", 
F.TOTAL_BYTES "空闲空间(M)", 
F.MAX_BYTES "最大块(M)" 
FROM (SELECT TABLESPACE_NAME, 
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, 
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES 
FROM SYS.DBA_FREE_SPACE 
GROUP BY TABLESPACE_NAME) F, 
(SELECT DD.TABLESPACE_NAME, 
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB 
FROM SYS.DBA_DATA_FILES DD 
GROUP BY DD.TABLESPACE_NAME) D 
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME 
ORDER BY 4 DESC;

表空间            大小M        已使用M     利用率

------------- ----------     ----------     ----------

SYSTEM             6770          6505         96.08%              

从dba_segments中找出占用SYSTEM表空间中排名前10位的大对象:

SELECT
	* 
FROM
	( SELECT SEGMENT_NAME, SUM( BYTES ) / 1024 / 1024 MB FROM DBA_SEGMENTS WHERE TABLESPACE_NAME = 'SYSTEM' GROUP BY SEGMENT_NAME ORDER BY 2 DESC ) 
WHERE
	ROWNUM < 10;

SEGMENT_NAME     MB

--------------------    ----------

AUD$                         6016

IDL_UB1$                    280

SOURCE$                     80

IDL_UB2$                     33

C_TOID_VERSION#      24

C_OBJ#_INTCOL#        18

I_SOURCE1                   16

ARGUMENT$               13

C_OBJ#                         13

JAVA$MC$                   12

3.查看一下表空间是否开启自动扩展功能

SELECT T.TABLESPACE_NAME,D.FILE_NAME,D.AUTOEXTENSIBLE,D.BYTES,D.MAXBYTES,D.STATUS 
FROM DBA_TABLESPACES T,DBA_DATA_FILES D 
WHERE T.TABLESPACE_NAME =D.TABLESPACE_NAME 
ORDER BY TABLESPACE_NAME,FILE_NAME;

system表空间清理 system表空间满了_表空间

发现是AUD$审计表占用资源量大。为了避免对整体性能造成影响,决定把AUD$迁移到其他表空间

解决步骤一:

1,新建aud_space表空间和aud_index索引表空间

2,执行迁移命令,将AUD$表相关移到审计表空间中:

SQL> alter table aud$ move tablespace aud_space;

SQL> alter table audit$ move tablespace aud_space;

SQL> alter index i_audit rebuild online tablespace aud_index;

SQL> alter table audit_actions move tablespace aud_space;

SQL> alter index i_audit_actions rebuild online tablespace aud_index;

3,再此查看SYSTEM表空间使用状态:

SELECT  b.tablespace_name  "表空间",
b.bytes / 1024 / 1024  "大小M",
(
	b.bytes - sum(
	nvl( a.bytes, 0 ))) / 1024 / 1024  "已使用M",
substr((
		b.bytes - sum(
		nvl( a.bytes, 0 ))) / ( b.bytes ) * 100,
	1,
	5 
)  "利用率"  FROM  dba_free_space a,
dba_data_files b  WHERE  a.file_id = b.file_id  AND  b.tablespace_name = 'SYSTEM'  GROUP BY  b.tablespace_name,
b.file_name,
b.bytes  ORDER BY  b.tablespace_name;

表空间            大小M        已使用M     利用率

------------- ----------     ----------     ----------

SYSTEM             6770       792.3125     11.70

可见SYSTEM表空间已经降下来了。

4,为了安全起见,AUD$表数据目前3千多万,数据量大,后期考虑truncate此表,清空数据。

解决步骤二:

把表空间的数据文件设为自动增长alter database datafile '/opt/oracle/oradata/ora11g/system.dbf' autoextend on next 10M maxsize unlimited; 
不过这种方法不建议使用,因为会导致这个表空间文件太大了,查询以后,还有其他方法,先列在这里,如果以后有使用的话,也可以参考。

但如上显示的错误信息已经直接说明:

一是:数据库的审计功能已经开启(SYS.AUD$表,只有开了审计功能才会向其中插入数据),二是:system表空间不足了

其解决的方法有两个:

1)扩SYSTEM表空间,或者清理SYS.AUD$表;

扩展表空间可以参考如下方法:

方法一:手动重设并增加表空间tbsk的数据文件大小

SQL> alter database datafile '/opt/oracle/oradata/ora11g/system.dbf' resize 20G;

方法二:把表空间的数据文件设为自动增长(不建议使用此方法) 

SQL> alter database datafile '/opt/oracle/oradata/ora11g/system.dbf' autoextend on next 10M maxsize unlimited;

  一个表空间数据库文件最大可以扩展到32G。

方法三:增加新的数据文件(建议使用此方法)

SQL> alter tablespace system add datafile '/opt/oracle/oradata/ora11g/system2.dbf' size 10G autoextend off;

 下面语句清理审计表,释放系统表空间:

sqlplus / as sysdba

truncate table SYS.AUD$;

2)关闭审计功能:(关闭审计需要重新启动Oracle)

SQL> show parameter audit 
NAME TYPE VALUE

audit_file_dest string /oracle/app/admin/ora11g/adump 
audit_sys_operations boolean TRUE 
audit_syslog_level string 
audit_trail string DB –>说明已经开启审计功能 
SQL>

执行下面SQL:

SQL>alter system set audit_trail=none scope=spfile;

直接使用spfile文件中的审计功能参考audit_trail为none,即关闭审计功能。

执行完后,重启数据库。

启动后查看:

SQL> show parameter audit_trail

NAME TYPE VALUE

audit_trail string NONE

SYSTEM表空间现在又能插入数据了。