使用oracle时可能遇到无法通过8192在表空间中扩展
错误,原因是数据库的表空间不足。
oracle表空间数据文件容量与db_block_size有关,在初始建库时指定DB_BLOCK_SIZE值,后期修改需要重建库,默认值8k。oracle物理文件最大允许4194304个数据块(由操作系统决定),表空间数据文件的最大值为4194304 × db_block_size
。因此db_block_size决定了数据文件最大容量:
4k最大表空间: 16384M
8K最大表空间: 32768M
16k最大表空间: 65536M
32K最大表空间: 131072M
64k最大表空间: 262144M
oralce默认数据块大小为8k,这种情况下,单文件最大为32G,但是默认块大小不能更改,如需更改需要重建数据库。
因此当文件达到32g时,可以通过增加数据文件的方式进行表空间扩容。
查看所有表空间:
select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space
from dba_data_files where tablespace_name='***'
order by tablespace_name
查看表空间统计量:
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
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 and a.tablespace_name='***';
增加数据文件个数:
alter tablespace 表空间名称 add datafile '新的数据文件地址' size 数据文件大小
例如:
alter tablespace *** add datafile '/u01/app/oracle/oradata/***.dbf' size 34358689792;
如果数据库表空间扩展较快,需要分析一下是哪些表占用空间过大,是否存在优化空间,查看占用量:
select t.owner,t.segment_name,t.tablespace_name,bytes / (1024 * 1024 * 1024) as "sizes(G)",q.num_rows,t.segment_type
from dba_segments t
left join dba_tables q
on t.segment_name=q.table_name
and t.owner=q.owner
--where t.segment_type='TABLE'
--and t.tablespace_name='***'
order by bytes desc
如果表中使用了LOB类型字段,会发现以$$
结尾的是LOBSEGMENT,其中保存的数据类型是CLOB或BLOB大数据对象。
当我们建表的时候,oracle对在对应的表空间分配一个segment存放数据,并且会因为数据量的增大而做扩展。但当所建立的表含有lob型的数据时,oracle会为每个lob字段生成一个独立的segment用来存放数据,同时也建立了独立的index segment,oracle对它们是单独管理的。
普通表只会新增一个或两个段对象,类型为TABLE和INDEX,数据存放在TABLE段,索引放在INDEX段。但是LOB列则额外新增了两个段对象,类型为LOBSEGMENT和LOBINDEX,LOBINDEX用于指向LOB段,找出其中的某一部分,所以表中LOB字段存储的是一个地址(或者说是一个指针),通过lobindex能找到在lobSegment存储的实际数据。
因此lobSegment保存了LOB列的真正的数据,所以会非常大,可能会造成无法忍受的表空间占用量,这时候,如果从业务上能避免使用LOB字段,会明显减少表空间占用量。