Oracle 表空间用满不是小事:expdp 备份会失败,业务的增删改查直接中断,查询性能下降,事务卡在等待和超时上,归档日志也可能生成异常。所以表空间使用率要定期盯,满了就及时扩。
先摸清现状:容量与文件查询
连上库(sqlplus “/as sysdba”),第一步查每个表空间的总量、剩余和使用比例,按使用率倒序排:
SQL> SELECT TABLESPACE_NAME "表空间",
To_char(Round(BYTES / 1024, 2), '99990.00')
|| '' "实有",
To_char(Round(FREE / 1024, 2), '99990.00')
|| 'G' "现有",
To_char(Round(( BYTES - FREE ) / 1024, 2), '99990.00')
|| 'G' "使用",
To_char(Round(10000 * USED / BYTES) / 100, '99990.00')
|| '%' "比例"
FROM (SELECT A.TABLESPACE_NAME TABLESPACE_NAME,
Floor(A.BYTES / ( 1024 * 1024 )) BYTES,
Floor(B.FREE / ( 1024 * 1024 )) FREE,
Floor(( A.BYTES - B.FREE ) / ( 1024 * 1024 )) USED
FROM (SELECT TABLESPACE_NAME TABLESPACE_NAME,
Sum(BYTES) BYTES
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) A,
(SELECT TABLESPACE_NAME TABLESPACE_NAME,
Sum(BYTES) FREE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) B
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME)
--WHERE TABLESPACE_NAME LIKE 'SYS%' --这一句用于指定表空间名称
ORDER BY Floor(10000 * USED / BYTES) DESC;

再往下钻一层,看每个表空间对应的物理文件(dbf)大小、已使用和利用率,确定到底是哪个文件吃紧了:
SQL> select mAX(B.file_id) id,
B.TABLESPACE_NAME 表空间,
B.FILE_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
GROUP BY B.TABLESPACE_NAME, B.FILE_NAME, B.BYTES
ORDER BY B.TABLESPACE_NAME;

需要确认某个用户默认落在哪个表空间时查 dba_users。注意用户名必须大写,小写查不到:
SQL> select username,default_tablespace from dba_users where username='SYSTEM';
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
SYSTEM SYSTEM
物理文件清单也可以直接从 v$datafile 核对一遍:
SQL> select file#,name from v$datafile;

扩容方式一:直接改数据文件大小
RESIZE 是在已有 dbf 文件的基础上改大小,路径必须用上面查询出来的实际路径,目标大小按服务器磁盘余量定:
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system01.dbf' RESIZE 2048M;

执行完用第一步的 SQL 再查一次,确认表空间总量已经变化:

扩容方式二:给表空间加数据文件
原文件所在的磁盘分区没空间时,就在这个表空间下新增一个 dbf。system02.dbf 是新文件名,SYSTEM 是被扩的表空间名,大小单位别写错:
SQL> alter tablespace SYSTEM add datafile '/u01/app/oracle/oradata/orcl/system02.dbf' size 128M;

扩容方式三:开自动扩展
先看当前文件是不是已经开了 autoextend:
SQL> select tablespace_name,file_name,autoextensible from dba_data_files where tablespace_name = 'SYSTEM';
没开的话对目标文件开启(文件名按实际查询结果替换):
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system02.dbf' autoextend on;

反过来要关就是 autoextend off:
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system02.dbf' autoextend off;
几条实操提醒
RESIZE 只能扩不能缩,改小了会直接报错。自动扩展省事,但要留好磁盘余量,不然满了同样炸;条件允许的话把 dbf 放在容量充足、独立挂载的磁盘目录,扩起来从容很多。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



















暂无评论内容