向Oracle 11g数据库中批量插入数据,当插入近2亿条数据后,报出如下错误:
ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展。
查看表空间,发现表空间大小已达到32G,但创建表空间时已设置了无限扩展(初始空间为20G),磁盘空间没满,说明表空间无法进行自动扩展了。
sys 登陆 oracle
查看Oracle的 DB_BLOCK_SIZE
SQL> select value from v$parameter where name ='db_block_size';
VALUE
---------------------------------------------------------------
8192
本机数据库的数据块大小为8K,算出本机Oracle 单个表空间数据文件的最大值为:
4194304 * 8/1024 = 32768M (32G);
所以既使创建表空间时设置了 autoextend on maxsize unlimited,其最大空间也是不会超过32G。
注:
1、表空间数据文件容量与DB_BLOCK_SIZE有关,在初始建库时,DB_BLOCK_SIZE要根据实际需要,设置为 4K、8K、16K、32K、64K等几种大小;
2、ORACLE的物理文件最大只允许4194304(2^22)个数据块;
#查看表空间
select * from dba_tablespaces;
#查看表空间是否自动增
SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE FROM dba_data_files;
#表空间文件位置
select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;
列出所有表空间的使用情况:
SELECT a.tablespace_name "表空间名称",
total / (1024 * 1024) "表空间大小(M)",
free / (1024 * 1024) "表空间剩余大小(M)",
(total - free) / (1024 * 1024 ) "表空间使用大小(M)",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name ;
解决方法
第一步、查看表空间是否自动增长
SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE FROM dba_data_files;--查看表空间是否自动增长
第二步、如果报错的表空间没有开启自动增加 ,则开启
ALTER DATABASE DATAFILE '/ora11g/data/oradata/lfzldb/LFZL.DBF' AUTOEXTEND ON NEXT 1024M ;--每次自动增长1024M
补充当自动增长表空间也无效的情况
当表空间为最大值,100%没办法自增的时候,这时可以考虑新增一个数据文件
Alter tablespace 表空间名 add datafile '数据文件存放的路径' size 数据文件大小M autoextend on next 每次自增长大小M Maxsize UNLIMITED
--例子
Alter tablespace LFZL add datafile '/ora11g/data/oradata/lfzldb/LFZL2.DBF' size 10240M autoextend on next 1024M Maxsize UNLIMITED
添加成功后,查看情况