首先需要确认是哪个表空间空间不足,以及具体剩余空间和碎片情况。常用SQL如下:
SELECT a.tablespace_name,
ROUND(a.bytes / 1024 / 1024 / 1024, 2) "总大小(GB)",
ROUND((a.bytes - b.bytes) / 1024 / 1024 / 1024, 2) "已用(GB)",
ROUND(b.bytes / 1024 / 1024 / 1024, 2) "剩余(GB)",
ROUND(((a.bytes - b.bytes) / a.bytes) * 100, 2) "使用率(%)"
FROM (SELECT tablespace_name, SUM(bytes) bytes FROM dba_data_files GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) bytes, MAX(bytes) largest FROM dba_free_space GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
ORDER BY ((a.bytes - b.bytes) / a.bytes) DESC;
SELECT a.tablespace_name,
ROUND(SQRT(MAX(a.blocks)/SUM(a.blocks)) * (100/SQRT(SQRT(COUNT(a.blocks)))), 2) "碎片率(FSFI)"
FROM dba_free_space a, dba_tablespaces b
WHERE a.tablespace_name = b.tablespace_name
AND b.contents NOT IN ('TEMPORARY', 'UNDO')
GROUP BY a.tablespace_name
ORDER BY 2;
若碎片率低于30%,说明碎片严重,需进行碎片整理。优先清理无效数据,减少空间占用:
DELETE语句删除无用的历史数据(如超过3个月的日志表数据),注意配合COMMIT提交事务。PURGE RECYCLEBIN;
ALTER TABLE 表名 COMPRESS FOR OLTP),减少数据文件占用。若清理后仍空间不足,需通过扩展表空间提升容量,主要有以下三种方法:
若表空间的数据文件开启了AUTOEXTEND,可直接修改其大小:
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf'
RESIZE 2G; -- 修改为目标大小(如2GB)
需确保目标大小不超过操作系统文件系统限制。
若数据文件未开启自动扩展,需开启并设置扩展参数,避免后续再次出现空间不足:
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/users01.dbf'
AUTOEXTEND ON NEXT 100M MAXSIZE 4G; -- 每次扩展100MB,最大不超过4GB
NEXT:每次扩展的大小(根据业务增长调整,如100M-500M);MAXSIZE:最大扩展上限(建议设置为合理值,如4G-10G,避免无限扩展)。若现有数据文件无法继续扩展(如达到MAXSIZE),可新增数据文件扩展表空间:
ALTER TABLESPACE users_tablespace
ADD DATAFILE '/u01/app/oracle/oradata/orcl/users02.dbf'
SIZE 1G AUTOEXTEND ON NEXT 200M MAXSIZE UNLIMITED; -- 新增数据文件,初始1GB,自动扩展
若错误提示涉及临时表空间(如ORA-01652),需扩展临时表空间:
ALTER TABLESPACE temp_tablespace
ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp02.dbf'
SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;
CREATE TEMPORARY TABLESPACE temp_new
TEMPFILE '/u01/app/oracle/oradata/orcl/temp_new.dbf'
SIZE 1G AUTOEXTEND ON NEXT 200M MAXSIZE UNLIMITED;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp_new;
DROP TABLESPACE temp_old INCLUDING CONTENTS AND DATAFILES; -- 删除旧临时表空间(可选)
临时表空间主要用于排序、临时表等操作,扩展后可解决临时空间不足问题。若Oracle数据文件所在磁盘分区空间不足,需扩展磁盘容量:
fdisk新增磁盘,添加至卷组(VG),再扩展逻辑卷(LV)和文件系统:# 查看磁盘信息
lsblk
# 新增磁盘(如/dev/sdb),创建物理卷(PV)
pvcreate /dev/sdb
# 添加至卷组(VG,如vg_oracle)
vgextend vg_oracle /dev/sdb
# 扩展逻辑卷(LV,如lv_oradata)
lvextend -L +10G /dev/vg_oracle/lv_oradata
# 扩展文件系统(ext4为例)
resize2fs /dev/vg_oracle/lv_oradata
/u01/app/oracle/oradata),修改权限后即可使用。ALTER TABLESPACE ... COALESCE合并空闲空间,或重建表/索引减少碎片。