共计 1509 个字符,预计需要花费 4 分钟才能阅读完成。
ORA-30036:unable to extend segment by 8 in undo tablespace ‘UNDOTBS1’
出现问题原因:
大批量导入某表时 imp 报错如下:
Export file created by EXPORT:V11.02.00 via conventional path
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
import server uses WE8MSWIN1252 character set (possible charset conversion)
…..
IMP-00058: Oracle error 30036 encountered
ORA-30036: unable to extend segment by 8 in undo tablespace ‘UNDOTBS1’
IMP-00028: partial import of previous table rolled back: 814416 rows rolled back
IMP-00057: Warning: Dump file may not contain data of all partitions of this table
Import terminated successfully with warnings.
字面意思翻译就是:无法按 8 扩展字段
首先了解了一下 UNDO 的作用:
1. 什么是还原表空间?
还原表空间即 Undo 表空间,是 Oracle 特有的概念,Undo 表空间会自动分配 Undo 段,用来保存事务中 DML(Insert、Update 或 Delete)语句的 Undo 数据。在 Oracle9i 前,管理 Undo 数据只能使用 Rollback Segment。从 Oracle9i 开始,管理 Undo 数据不仅可以使用回滚段,还可以使用 Undo 表空间。而由于管理里规划回滚段太过复杂,Oracle10g 已经弃用回滚段,仅使用 Undo 表空间来管理 Undo 数据。
2. 什么是 Undo 数据?
Undo 数据也称回滚数据,当执行 DML 语句时,事务操作过程中的数据被称为 Undo 数据,主要有两个作用:
1、确保事务一致性:如果事务发生错误或者用户想要取消数据库操作,则可以通过 Rollback 回到修改前的值。
2、提供一致性读:如表 T 有 100 条记录,用户 A 在表 T 执行了语句删除掉 10 条记录,尚未提交,此时用户 B 执行查询语句,将返回 100 条记录而不是 90 条。
再来谈一下解决办法:
1、在原有数据文件中增加扩展容量:
alter database datafile ‘/opt/oracle/oradata/orcl/undotbs01.dbf’ resize 30G;
(注意:如果原有数据文件大小是 30G 的话,这个方法就不能用了,因为 oralce 最大文件只让配置成 30G 一个数据文件)
2. 新增数据文件(通用):
alter tablespace UNDOTBS1 add datafile ‘/opt/oracle/oradata/orcl/undotbs01_01.dbf’ size 30G;
–autoextend on next 1M maxsize 5000M; // 可选项;目的是设置文件的自动扩展属性,从最小 1M 到最大 5000M
3. 如果有需求要创建有多个 undotbs 表空间,可以定时检查 undo 表空间,并进行切换:
alter system set undo_tablespace = undotbs02;
(注意 undotbs02 需要提前新建,并设置相应的数据文件大小即可)
更多 Oracle 相关信息见 Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12
: