向Oracle 19g数据库中批量插入数据,当插入近2亿条数据后,报出如下错误:
ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展
查看表空间,发现表空间大小已达到32G,表空间无法进行自动扩展了。(初始空间为20G)
-
查看Oracle的 DB_BLOCK_SIZE
sql# sys 登陆 oracle 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。
- 在初始建库时,DB_BLOCK_SIZE要根据实际需要,设置为 4K、8K、16K、32K、64K等几种大小;
- ORACLE的物理文件最大只允许4194304(2^22)个数据块;
-
查看表空间
bash# 查看表空间 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;
列出所有表空间的使用情况:
bashSELECT 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 ;
解决
-
查看表空间是否自动增长
sqlSELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE FROM dba_data_files;-- 查看表空间是否自动增长
-
如果报错的表空间没有开启自动增加 ,则开启
sqlALTER DATABASE DATAFILE '/ora11g/data/oradata/lfzldb/LFZL.DBF' AUTOEXTEND ON NEXT 1024M ; -- 每次自动增长1024M
-
当自动增长表空间也无效的情况
当表空间为最大值,100%没办法自增的时候,这时可以考虑新增一个数据文件
sqlAlter 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
添加成功后,查看情况