Oracle / 数据库

扩容Oracle表空间的步骤与方法

浅时光博客 · 3月2日 · 2020年 14.6w 次已读

前提

当数据库的表空间耗尽时,可能会引发一系列问题,对系统和业务产生严重影响。其中一些问题包括:

  1. 备份失败: 如果数据库表空间空间满了,导致备份操作(如 expdp)无法执行,会影响数据的备份和恢复能力,增加了数据丢失的风险。
  2. 业务中断: 表空间耗尽可能导致关联的业务中断。数据库无法正常执行 CRUD 操作,影响业务流程和用户体验。
  3. 查询性能下降: 数据库中的表空间不足可能导致查询性能下降,因为数据库引擎无法有效地执行查询操作,从而影响响应时间。
  4. 事务阻塞: 表空间满了可能导致事务阻塞,因为无法存储新的数据或更新现有数据,造成事务等待和超时。
  5. 归档问题: 表空间耗尽可能影响归档日志的生成和存储,可能导致数据库无法正常进行归档和恢复。

为了应对这些问题,我们需要定期监控数据库表空间的使用情况,并采取相应的预防和处理措施,确保数据库的稳定性和可用性。这包括定期清理无用数据、优化查询和索引、进行容量规划等措施,以避免表空间空间不足引发的各种问题。

一、表空间容量指标查询

[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;
文章来源(Source):浅时光博客

注意:这里的system02.dbf文件为需要关闭自动扩容的用户表空间名称,根据自己的实际查询到的情况更改为自己的


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/1332.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站内容仅供个人学习与研究,严禁用于商业或非法目的。请在下载后24小时内删除相应内容。继续浏览或下载即表明您接受上述条件,任何后果由用户自行承担。

0 条回应

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