- 向表空间中增加新的datafile
SQL> alter tablespace EXX add datafile '/u01/app/oracle/oradata/orcl/exx06.dbf' size 10G;
Tablespace altered.
- 将表空间设置为可自动扩展
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/exx06.dbf'
autoextend on next 5G maxsize 32G;
alter database datafile '/u01/app/oracle/oradata/orcl/exx06.dbf'
*
ERROR at line 1:
ORA-03206: maximum file size of (4194304) blocks in AUTOEXTEND clause is out of range
根据报错信息可知,设置的文件最大大小超出了块的最大文件大小。
- 查看当前表空间的默认block size
SQL> show parameter block
NAME TYPE VALUE
----------------------- ----------- ------------------------------
db_block_buffers integer 0
db_block_checking string FALSE
db_block_checksum string TYPICAL
db_block_size integer 8192
db_file_multiblock_read_coun integer 128
SQL> select inst_id,name,bigfile from gv$tablespace;
INST_ID NAME BIG
---------- ------------------------------ ---
1 SYSTEM NO
1 SYSAUX NO
1 UNDOTBS1 NO
1 TEMP NO
1 USERS NO
1 EXX NO
1 EXY NO
1 EXZ NO
8 rows selected.
此表空间默认的block size 是8k,数据块大小8192,那么单个文件大小最大是32G。但是为什么alter database datafile '/u01/app/oracle/oradata/orcl/exx06.dbf' autoextend on next 5G maxsize 32G;
时会报错呢?
- 查看EXX表空间情况,大小用G表示
SQL> select file_id,file_name,tablespace_name,bytes/1024/1024/1024 G,status,autoextensible
from dba_data_files where tablespace_name='EXX' order by 1;
FILE_ID FILE_NAME TABLESPACE_NAME G STATUS AUTOEXT
---------- ----------------------------- ---------------- ---------- --------- -------
5 /u01/app/oracle/oradata/orcl/exx01.dbf EXX 31.9999847 AVAILABLE YES
8 /u01/app/oracle/oradata/orcl/exx02.dbf EXX 31.9999847 AVAILABLE YES
9 /u01/app/oracle/oradata/orcl/exx03.dbf EXX 31.9999847 AVAILABLE YES
10 /u01/app/oracle/oradata/orcl/exx04.dbf EXX 31.9999847 AVAILABLE YES
11 /u01/app/oracle/oradata/orcl/exx05.dbf EXX 31.9999847 AVAILABLE YES
- 尝试设置成31.9999847G依旧报错
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/exx06.dbf'
autoextend on next 5G maxsize 31.9999847G; 2
autoextend on next 5G maxsize 31.9999847G
*
ERROR at line 2:
ORA-02017: integer value required
这里的报错原因是,需要是整数值。
按照Oracle文档的描述,每个datafile的最大容量为(2^22-1)个block,即4194303个block。下面列表说明不同数据块数据库所能支持的最大物理文件大小:
数据块的大小 物理文件的最大值 M
===============================================
2048 8191 M
4096 16383 M
8192 32767 M
16384 65535 M
那么根据上表就可以解释,32G>32767 M(多了1M)也不能够创建。
SQL> alter database datafile '/u01/app/oracle/oradata/orcl/exx06.dbf'
autoextend on next 5G;
Database altered.
下面,总结一下ORA-03206报错的解决方案,推荐使用第一种解决方案。
1.不要创建单个文件超过32GB的表空间
如果你创建的表空间超过32GB,请把这个表空间存储为多个数据文件,每个文件不大于32GB。这样,就可以成功的创建表空间。
2.扩大db_block_size
根据oracle的算法,我们很容易想到这个解决方法。数目衡定,但是db_block_size可以更改(db_block_size的最大大小为32KB)。如果把db_block_size扩大到32KB(32位系统好像是16KB,我在Red Hat 企业版的操作系统创建32KB的block_size失败。),那么我们的系统就可以支持单个数据文件最大128GB。
这个方案听起来好像很迷人,但是实际上并不是那么回事。因为要修改db_block_size并不是很容易的事。因为这个db_block_size在创建实例的时候就要指定。而且不能通过简单修改参数来指定db_block_size。
3.创建bigfile表空间
在oracle10g中引进了bigfile表空间,充分利用了64位CPU的寻址能力,使oracle可以管理的数据文件总量达到8EB。单个数据文件的大小达到128TB,即使默认8K的db_block_size也达到了32TB。
创建bigfile的表空间使用的sql语句也很简单。
create bigfile tablespace…
后面的语句和普通的语句完全一样。需要注意OS的文件大小限制。