Oracle报错ORA-01653:表xx⽆法通过8192(在表空间
xx_data中)扩展
1 问题
向Oracle 10g数据库中批量插⼊数据,当插⼊近2亿条数据后,报出如下错误:
ORA-01653: 表xx⽆法通过 8192 (在表空间 xx_data 中) 扩展。
查看表空间,发现表空间⼤⼩已达到32G,但创建表空间时已设置了⽆限扩展(初始空间为20G),磁盘空间没满,说明表空间⽆法进⾏⾃动扩展了。
2 原因
查资料了解到Oracle 10g 单个表空间数据⽂件的最⼤值为:
最⼤数据块 * DB_BLOCK_SIZE
查看Oracle的 DB_BLOCK_SIZE
SQL> select value from v$parameter where name ='db_block_size';
8192
oracle登录命令本机数据库的数据块⼤⼩为8K,算出本机Oracle 单个表空间数据⽂件的最⼤值为:
4194304 * 8/1024 = 32768M (32G);
所以既使创建表空间时设置了 autoextend on maxsize unlimited,其最⼤空间也是不会超过32G。
注:
表空间数据⽂件容量与DB_BLOCK_SIZE的设置有关,⽽这个参数在创建数据库实例的时候就已经指定。DB_BLOCK_SIZE参数可以设置为4K、8K、16K、32K、64K等⼏种,Oracle的物理⽂件最⼤只允许4194304个数据块(这个参数具体由操作系统决定,⼀般应该是此数字),表空间数据⽂件的最⼤值对应关系就可以通过4194304×DB_BLOCK_SIZE/1024M计算得出。
4k最⼤表空间为:16384M
8K最⼤表空间为:32768M
16k最⼤表空间为:65536M
32K最⼤表空间为:131072M
64k最⼤表空间为:262144M
⽽Oracle默认分配的为8K,也就是对应于32768M左右的空间⼤⼩,如果想继续增⼤表空间的话,只需要通过alter tablespace name add datafile ‘path/file_name’ size 1024M;添加数据⽂件的⽅式就可以了。
数据块是oracle中最⼩的空间分配单位,各种操作的数据就的放在这⾥,oracle从磁盘读写的也是块。⼀旦create database,db_block_size就是不可更改的。因为oracle是以块为单位存储数据的,任何⼀个存储元素最少占⽤⼀个块,如果你改变了db_block_size,必然导致部分块不能正常使⽤。
其实在unix类操作系统中,⽂件块和oracle块的关系⾮常紧密(建议相等),这样才能保证数据库的执⾏效率。在windows下可能就不这么讲究了。建议使⽤8k以上的块,有⼈做过测试,同样的配置,8k的块⽐4k快⼤约40%,⽐2k倍以上。
3 解决⽅法
处理⽅法两种:①假如当前表空间只有⼀个数据⽂件,可以扩⼤该数据⽂件的⼤⼩(单个数据⽂件最⼤32G);②为当前表空间新增数据⽂件。
为当前表空间新增数据⽂件⽅法如下:
在命令⾏下,以oracle系统管理员⽤户登录oracle,再执⾏以下操作:
1)⽅法⼀:分步骤。为指定的表空间增加数据⽂件(三步骤)
①为指定的表空间创建数据⽂件,并指定初始⼤⼩
ALTER TABLESPACE 表空间名称
ADD DATAFILE 'D:\Oracle\app\Administrator\oradata\orcl\新数据⽂件名称.DBF'
SIZE 32M;
②为该数据⽂件打开⾃动增长
ALTER DATABASE DATAFILE 'D:\Oracle\app\Administrator\oradata\orcl\新数据⽂件名称.DBF' AUTOEXTEND ON;
③指定每次⾃动增长的⼤⼩
ALTER DATABASE DATAFILE 'D:\Oracle\app\Administrator\oradata\orcl\新数据⽂件名称.DBF' AUTOEXTEND ON NEXT 200M ;
2)⽅法⼆:⼀步到位。为指定的表空间增加数据⽂件(⼀步到位:指定初始⼤⼩,打开⾃动增长,设置每次⾃动增长的⼤⼩)
ALTER TABLESPACE 表空间名称 ADD DATAFILE 'D:\app\Administrator\oradata\ORCL\DATAFILE\新数据⽂件名称.DBF' SIZE 10240M AUTOEXTEND ON NEXT 1024M MAXSIZE UNLIMITED;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。