在Ubuntu上管理Oracle数据库空间前,需确保具备SYSDBA权限(可通过sqlplus / as sysdba登录),并确认Oracle数据库服务正常运行(systemctl status oracle)。
df -h命令,显示所有挂载点的总容量、已用空间、可用空间及使用百分比(如/u01/app/oracle目录是否接近满额)。du -sh /path/to/directory命令(如du -sh /u01/app/oracle/oradata/*),快速找出占用空间大的目录或文件。SELECT tablespace_name,
ROUND(SUM(bytes)/(1024*1024), 2) AS total_mb,
ROUND(SUM(bytes-NVL(free_space,0))/(1024*1024), 2) AS used_mb,
ROUND(NVL(free_space,0)/(1024*1024), 2) AS free_mb,
ROUND((SUM(bytes)-NVL(free_space,0))/SUM(bytes)*100, 2) AS used_percent
FROM (
SELECT tablespace_name, bytes,
SUM(CASE WHEN autoextensible='NO' THEN bytes ELSE maxbytes END) OVER (PARTITION BY tablespace_name) AS max_bytes,
bytes - NVL(SUM(CASE WHEN autoextensible='YES' THEN bytes ELSE 0 END) OVER (PARTITION BY tablespace_name), 0) AS free_space
FROM dba_data_files
)
GROUP BY tablespace_name;
SELECT dest_name, status, destination, space_used/1024/1024 AS used_mb, space_limit/1024/1024 AS limit_mb FROM v$recovery_file_dest;,查看归档日志的使用情况及剩余空间。表空间是Oracle存储数据的逻辑单元,合理管理表空间是空间优化的核心。
根据业务需求创建合适的表空间(如数据表空间、索引表空间、临时表空间),建议开启自动扩展以减少人工干预:
-- 创建数据表空间(自动扩展,最大2G)
CREATE TABLESPACE userdata
DATAFILE '/u01/app/oracle/oradata/userdata01.dbf'
SIZE 100M
AUTOEXTEND ON
NEXT 5M
MAXSIZE 2G;
-- 创建临时表空间(用于排序、临时表等操作)
CREATE TEMPORARY TABLESPACE temp_temp
TEMPFILE '/u01/app/oracle/oradata/temp_temp01.dbf'
SIZE 50M
AUTOEXTEND ON
NEXT 10M
MAXSIZE 1G;
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/userdata01.dbf'
RESIZE 150M; -- 扩展至150M
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/userdata01.dbf'
AUTOEXTEND ON
NEXT 10M
MAXSIZE 3G; -- 每次扩展10M,最大3G
ALTER TABLESPACE userdata
ADD DATAFILE '/u01/app/oracle/oradata/userdata02.dbf'
SIZE 100M
AUTOEXTEND ON
NEXT 5M
MAXSIZE 2G;
若表空间存在大量空闲空间(如删除大量数据后),可收缩数据文件以释放空间:
-- 收缩单个数据文件(需确保表空间有足够的空闲空间)
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/userdata01.dbf'
RESIZE 120M; -- 收缩至120M
-- 收缩整个表空间(Oracle 10g及以上版本支持)
ALTER TABLESPACE userdata
SHRINK SPACE KEEP 100M; -- 保留100M可用空间
注意:收缩表空间前需确保表空间内的对象(如表、索引)没有占用高水位线(HWM)以上的空间,否则需先执行
ALTER TABLE table_name MOVE或ALTER INDEX index_name REBUILD操作。
归档日志是数据库恢复的关键,但过度积累会占用大量空间,需定期清理。
-- 关闭数据库
SHUTDOWN IMMEDIATE;
-- 启动到MOUNT模式
STARTUP MOUNT;
-- 开启归档模式
ALTER DATABASE ARCHIVELOG;
-- 打开数据库
ALTER DATABASE OPEN;
-- 查看归档目的地状态
SELECT dest_name, status, destination, space_used/1024/1024 AS used_mb, space_limit/1024/1024 AS limit_mb
FROM v$recovery_file_dest;
-- 查看归档日志文件列表
SELECT name, sequence#, first_time, next_time, blocks*block_size/1024/1024 AS size_mb
FROM v$archived_log
ORDER BY sequence# DESC;
RMAN> DELETE NOPROMPT ARCHIVELOG ALL BACKED UP 1 TIMES TO DISK;
RMAN> DELETE NOPROMPT ARCHIVELOG UNTIL TIME 'SYSDATE-7';
冗余数据是空间不足的主要原因之一,需定期清理。
ALTER TABLE sales DROP PARTITION sales_q3_2024;
DELETE语句分批删除(避免锁表),再提交事务:DELETE FROM orders WHERE order_date < TO_DATE('2024-01-01', 'YYYY-MM-DD');
COMMIT; -- 每删除1000条提交一次
索引碎片会占用大量空间,定期重建可释放空间:
-- 重建单个索引
ALTER INDEX idx_order_id REBUILD;
-- 重建表的所有索引
ALTER INDEX idx_order_id REBUILD ONLINE; -- 在线重建,不影响业务
临时表空间用于存储排序、临时表等操作的中间数据,定期清理可释放空间:
-- 查看临时表空间使用情况
SELECT tablespace_name, file_name, bytes/1024/1024 AS size_mb, status
FROM dba_temp_files;
-- 清空临时表空间(不会删除文件,仅清空内容)
ALTER TABLESPACE temp_temp SHRINK SPACE;
若数据库规模较大,建议使用ASM(Automatic Storage Management)统一管理磁盘空间,ASM可自动平衡数据分布、扩展存储容量,并提高I/O性能。ASM的管理需通过asmcmd命令行工具或Oracle Enterprise Manager(OEM)实现,此处不再赘述。