前提
当数据库的表空间耗尽时,可能会引发一系列问题,对系统和业务产生严重影响。其中一些问题包括:
- 备份失败: 如果数据库表空间空间满了,导致备份操作(如 expdp)无法执行,会影响数据的备份和恢复能力,增加了数据丢失的风险。
- 业务中断: 表空间耗尽可能导致关联的业务中断。数据库无法正常执行 CRUD 操作,影响业务流程和用户体验。
- 查询性能下降: 数据库中的表空间不足可能导致查询性能下降,因为数据库引擎无法有效地执行查询操作,从而影响响应时间。
- 事务阻塞: 表空间满了可能导致事务阻塞,因为无法存储新的数据或更新现有数据,造成事务等待和超时。
- 归档问题: 表空间耗尽可能影响归档日志的生成和存储,可能导致数据库无法正常进行归档和恢复。
为了应对这些问题,我们需要定期监控数据库表空间的使用情况,并采取相应的预防和处理措施,确保数据库的稳定性和可用性。这包括定期清理无用数据、优化查询和索引、进行容量规划等措施,以避免表空间空间不足引发的各种问题。
一、表空间容量指标查询
[root@localhost ~]# su - oracle
[oracle@localhost ~]$ 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;

二、表空间文件使用信息
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;

三、查看用户表空间信息
注意:用户名称一定大写
SQL> select username,default_tablespace from dba_users where username='SYSTEM';
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
SYSTEM SYSTEM
四、查看表空间物理文件
SQL> select file#,name from v$datafile;

第一步的SQL语句中已经可以看到对应用户表空的详细信息了,这里再次查询确认下;接下来针对要扩容的表空间进行扩容
五、进行表空间扩容操作
方式1:手工改变数据文件大小
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system01.dbf' RESIZE 2048M;
- 注意:system01.dbf 为已经存在数据库中的文件,现在是在该文件的基础上改变文件的大小,路径一定写成自己查询出来的,大小根据自己服务器的实际情况添加

- 然后通过上面的查询语句再次查看表空间大小是否更改成功

方式2:添加表空间数据文件
SQL> alter tablespace SYSTEM add datafile '/u01/app/oracle/oradata/orcl/system02.dbf' size 128M;
- 注意:system02.dbf 为新添加的数据文件,SYSTEM是要扩容的用户表空间名称; 路径一定写成自己查询出来的
- 大小单位一定要写对

方式3:表空间文件自动扩容
1、查看表空间是否为自动扩容
SQL> select tablespace_name,file_name,autoextensible from dba_data_files where tablespace_name = 'SYSTEM';
- 注意:SYSTEM为查看的用户表空间名称
2、开启对应表空间文文章来源(Source):浅时光博客 件自动扩容
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system02.dbf' autoextend on;

- 注意:这里的system02.dbf文件为需要开启自动扩容的用户表空间名称,根据自己的实际查询到的情况更改为自己的
3、关闭对应表空间文件自动扩容
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/system02.dbf' autoextend off;
注意:这里的system02.dbf文件为需要关闭自动扩容的用户表空间名称,根据自己的实际查询到的情况更改为自己的

必须 注册 为本站用户, 登录 后才可以发表评论!