网站首页 > 技术文章 正文
12.5 临时表空间
12.5.1用途:
用于缓存排序的数据(中间结果),可以建立多个临时表空间,但默认的临时表空间只能有一个且不能offline和drop,temp表空间是nologing的(不记日志)。
SQL> select file_id,file_name,tablespace_name from dba_temp_files;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- -------------------------------------------------- ------------------------------
1 /u01/oradata/prod/temp01.dbf TEMP
SQL> col name for a60;
SQL> select file#,name ,bytes/1024/1024 from v$tempfile;
FILE# NAME BYTES/1024/1024
---------- -------------------------------------------------- ---------------
1 /u01/oradata/prod/temp01.dbf 100
12.5.2 基本操作
1)建立临时表空间temp2,增加或删除tempfile。
SQL> create temporary tablespace temp2 tempfile '/u01/oradata/prod/temp02.dbf' size 10m;
SQL> alter tablespace temp2 add tempfile '/u01/oradata/prod/temp03.dbf' size 5m;
SQL> select file_id,file_name,tablespace_name from dba_temp_files;
FILE_ID FILE_NAME TABLESPACE_NAME
---------- -------------------------------------------------------------------------------- -----------------------
1 /u01/oradata/prod/temp01.dbf TEMP
2 /u01/oradata/prod/temp02.dbf TEMP2
3 /u01/oradata/prod/temp03.dbf TEMP2
将temp2里删掉一个tempfile。
SQL> alter tablespace temp2 drop tempfile '/u01/oradata/prod/temp03.dbf';
SQL> select file_id,file_name,tablespace_name from dba_temp_files;
2) 查看默认的临时表空间
SQL> select * from database_properties where rownum<=5;
3) 指定用户使用临时表空间
SQL> alter user scott temporary tablespace temp2;
4) 切换默认的临时表空间
SQL> alter database default temporary tablespace temp2;
12.5.3 临时表空间组 (10g新特性)
在很多情况下,会有多个session 使用同一个用户名去访问Oracle,而临时表空间又是基于用户的,那么可以建立一个临时表空间组,组中由若干临时表空间成员构成,从而可以提高单个用户多个会话使用临时表空间的效率。
1)临时表空间组无法显式创建,组是通过第一个临时表空间分配时自动创建。
SQL> alter tablespace temp1 tablespace group tmpgrp;
SQL> alter tablespace temp2 tablespace group tmpgrp;
SQL> select * from dba_tablespace_groups;
GROUP_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TMPGRP TEMP1
TMPGRP TEMP2
2)将临时表空间组设成默认临时表空间,实现负载均衡。
SQL> alter database default temporary tablespace tmpgrp;
3)要移除表空间组时,该组不能是缺省的临时表空间。
SQL> alter database default temporary tablespace temp;
SQL> alter tablespace temp1 tablespace group '';
SQL> alter tablespace temp2 tablespace group '';
4)当组内所有临时表空间被移除时,组也被自动删除。
SQL> select * from dba_tablespace_groups;
no rows selected
SQL> drop tablespace temp2 including contents and datafiles;
某个tempfile坏掉使得default temporary tablespace不能正常工作,数据库不会crash, 解决的办法是add一个新的tempfile,然后再drop掉坏的tempfile。(default temporary tablespace不能offline,但temporary file可以offline)
12.6 如何调整表空间的尺寸
表空间的大小等同它下的数据文件大小之和,当发生表空间不足的问题时常用的3个解决办法:
1)增加原有数据文件大小(resize)
2)增加一个数据文件(add datafile)
3)设置表空间自动增长(autoextend)
示例:
SQL> create tablespace prod datafile '/u01/oradata/prod/prod01.dbf' size 5m;
SQL> create table scott.test1 (id int) tablespace prod;
SQL> insert into scott.test1 values(1);
SQL> insert into scott.test1 select * from scott.test1;
SQL> /
报错:ORA-01653: unable to extend table SCOTT.TEST1 by 8 in tablespace prod
1)用第一种方法扩充表空间
SQL> alter database datafile '/u01/oradata/prod/prod01.dbf' resize 10m;
SQL> insert into scott.test1 select * from scott.test1;
SQL> /
报错:ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace prod
2)用第二种方法扩充表空间:
SQL> alter tablespace prod add datafile '/u01/oradata/prod/prod02.dbf' size 20m;
SQL> insert into scott.test1 select * from scott.test1;
SQL> /
报错:ORA-01653: unable to extend table SCOTT.TEST1 by 128 in tablespace prod
3)用第三种方法扩充表空间:
SQL> alter database datafile '/u01/oradata/prod/prod01.dbf' autoextend on next 10m maxsize 500m;
SQL> insert into scott.test1 select * from scott.test1;
SQL> drop tablespace prod including contents and datafiles;
12.7 可恢复空间分配Resumable
当我们往一个表里面插入大量数据时,如果某条insert语句因表空间的空间不足(没有开启自动扩展),会报 ORA-01653:无法扩展空间的错误,该条SQL语句会中断,浪费了时间及数据库资源。为防范这个问题,Oracle设计了resumable。
1)功能:
在resumable开启的情况下,如果Oracle执行某条SQL申请不到空间了,比如数据表空间,undo表空间,temporary空间等,则会将该事务的语句挂起(suspended),等你把空间扩展后,Oracle又会使该insert语句继续进行。
2)设置方法
可以通过两个级别设置resumable:
①system级别:初始化参数RESUMABLE_TIMEOUT非0,这将使数据库中所有session使用可恢复的空间分配
②session级别:alter session enable|disable resumable [TIMEOUT]; 这将为当前session设置可恢复的空间分配。因为resumable是有资源消耗代价的, 所以session级的resumable是比较实用的。
3)参数RESUMABLE_TIMEOUT的用法(单位为秒)
RESUMABLE_TIMEOUT=0, enable session时应该指定TIMEOUT。否则使用缺省值7200秒。
RESUMABLE_TIMEOUT<>0,enable session时可以省略TIMEOUT,此时指定TIMEOUT会覆盖掉参数RESUMABLE_TIMEOUT值。
示例:
session 1:
1)建个小表空间,固定2m大小,然后建个表属于这个表空间
SQL> create tablespace small datafile '/u01/oradata/prod/small01.dbf' size 2m;
SQL> create table scott.test(n1 char(1000)) tablespace small;
2)向这个表插入数据,表空间满了,使for语句没有完成循环,2000条语句整体失败。
SQL> begin
for i in 1..2000 loop
insert into scott.test values('this is test');
end loop;
commit;
end;
/
报错:ORA-01653: 表 SCOTT.TEST 无法通过 128 (在表空间 SMALL 中) 扩展
这个128是块数,表明最后一次需要1M的extent,没有成功.
SQL> select count(*) from scott.test;
COUNT(*)
----------
0
因为没有在循环体内commit,所以插入的记录全部回滚了。
3)使用resumable功能
SQL> alter session enable resumable;
4)再重复第2)步,会话被挂起;
session 2:
5)查看视图的有关信息
SQL> select session_id,sql_text,error_number from dba_resumable;
SESSION_ID SQL_TEXT ERROR_NUMBER
---------- -------------------------------------------------- ------------
136 INSERT INTO SCOTT.TEST VALUES('this is test') 1653
SQL> select sid,event,seconds_in_wait from v$session_wait where sid=136;
SID EVENT SECONDS_IN_WAIT
---------- ---------------------------------------------------------------- ---------------
136 statement suspended, wait error to be cleared 1
6)加扩表空间,看到session1里挂起的会话得以继续并成功完成了2000条语句的插入。
SQL> alter tablespace small add datafile '/u01/oradata/prod/small02.dbf' size 4m;
SQL> select count(*) from scott.test;
COUNT(*)
----------
2000
7)查看EM告警日志报告了以上信息。验证结束后可以disable resumable, 并删除small表空间及数据文件。
session 1:
SQL> alter session disable resumable;
SQL> drop tablespace small including contents and datafiles;
the end !!!
@jackman 共筑美好!
猜你喜欢
- 2025-07-10 Oracle 与 Google Cloud 携手大幅扩展多云服务
- 2025-07-10 分享收藏的 oracle 11.2.0.4各平台的下载地址
- 2025-07-10 Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 2025-07-10 Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 2025-07-10 Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 2025-07-10 Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 2025-07-10 NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 2025-07-10 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 2025-07-10 解读丨《归档文件整理规则》— 电子文件元数据存储
- 2025-07-10 Data Guard跳归档恢复的实践(dataguard failover)
你 发表评论:
欢迎- 07-10Oracle 与 Google Cloud 携手大幅扩展多云服务
- 07-10分享收藏的 oracle 11.2.0.4各平台的下载地址
- 07-10Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- 07-10Oracle Database@Azure 推进到南美等新区域并增加了新服务
- 07-10Oracle宣布推出 Oracle Database@AWS 的有限预览版
- 07-10Oracle与Nextcloud合作,推出主权云上的安全协作平台
- 07-10NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 07-10对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 604℃几个Oracle空值处理函数 oracle处理null值的函数
- 596℃Oracle分析函数之Lag和Lead()使用
- 583℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 580℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 575℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 569℃【数据统计分析】详解Oracle分组函数之CUBE
- 555℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 549℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- Oracle 与 Google Cloud 携手大幅扩展多云服务
- 分享收藏的 oracle 11.2.0.4各平台的下载地址
- Oracle 和 Microsoft 推出 Oracle Exadata 数据库服务
- Oracle Database@Azure 推进到南美等新区域并增加了新服务
- Oracle宣布推出 Oracle Database@AWS 的有限预览版
- Oracle与Nextcloud合作,推出主权云上的安全协作平台
- NodeRED魔改版连接MsSql、PostgreSQL、MySQL、OracleDB存储无忧
- 对于企业数据云备份,“多备份”承诺的是成本更低,管理更高效#36氪开放日深圳站#
- 解读丨《归档文件整理规则》— 电子文件元数据存储
- Data Guard跳归档恢复的实践(dataguard failover)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)