现场有台服务器的表空间要几个T 的空间来存放数据,需要增加数据文件.
数据库的 db_files 参数文件为200。根据需要的总空间的大小及还可用的数据文件的数量算出来新增加的数据文件大小大约为56G。
于是创建挂载在裸设备上的lv,然后增加数据文件。咦,出现报错
sys@ocm> alter tablespace num add datafile 'f:\sqlplus\num0994.dbf' size 57300m;
alter tablespace num add datafile 'f:\sqlplus\num0994.dbf' size 57300m
*
第 1 行出现错误:
ORA-01144: 文件大小 (7334400 块) 超出 4194303 块的最大数
对4194303这个值,官方文档里是这样描述的:
F Database Limits
Table F-2 lists the Oracle Database file size limits in bytes.
File Type | Platform | File size limit |
Data files | Any | 4,194,303 multiplied by the value of the DB_BLOCK_SIZE parameter |
就是说每个数据文件最多只能有4,194,303个块,而我的每个块是8K,那么每个数据文件最大只能有32g,显然这无法达到我需要的空间总量。
解决方法有两个:增加块大小; 增加数据文件的数量
1. 增加块大小
db_block_size参数是创建数据库的时候指定的,与操作系统块相关,oracle里块是最小的I/O单位,任何存储元素至少占用一个块。改块大小,会导致某些块不能用,如果非要改这个参数,需要重建数据库。
但是可以指定表空间的块大小,在创建表空间时,可以指定那个表空间的块大小为多少。一个表空间只能有一个块大小,并且要在创建时指定。这样一来,我那个表空间显然不能改了。这个方法行不通。
2.增加数据文件数量
数据文件最大数量受到两个参数的限制:参数文件db_files和控制文件里的maxfiles的值。那当这两个值不同时,到底谁会限制dbf总数呢,下面来做个测试:
--1. 确认参数及控制文件里的maxdatafiles信息,得到db_files大小为200,MAXDATAFILES大小为100
sys@ocm> show parameter db_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 200
sys@ocm> alter database backup controlfile to trace as 'ctl.txt';
linux:/script # cat ctl.txt |grep -i MAXDATAFILES
MAXDATAFILES 100
MAXDATAFILES 100
--2. 改参数文件,将db_fils改为1000
sys@ocm> alter system set db_files=1000 scope=spfile;
系统已更改。
sys@ocm> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
sys@ocm> startup
ORACLE 例程已经启动。
Total System Global Area 414298112 bytes
Fixed Size 1374976 bytes
Variable Size 306185472 bytes
Database Buffers 100663296 bytes
Redo Buffers 6074368 bytes
数据库装载完毕。
数据库已经打开。
sys@ocm> show parameter db_files
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_files integer 1000
--3. 建表空间
sys@ocm> create tablespace num datafile 'f:\sqlplus\num0001.dbf' size 1m;
表空间已创建。
--4. 写了个批量增加数据文件的脚本 add.sql ,新加一千个数据文件
alter tablespace num add datafile 'f:\sqlplus\num0002.dbf' size 1m;
alter tablespace num add datafile 'f:\sqlplus\num0003.dbf' size 1m;
alter tablespace num add datafile 'f:\sqlplus\num0004.dbf' size 1m;
alter tablespace num add datafile 'f:\sqlplus\num0005.dbf' size 1m;
alter tablespace num add datafile 'f:\sqlplus\num0006.dbf' size 1m;
.
.
.
alter tablespace num add datafile 'f:\sqlplus\num0997.dbf' size 1m;
alter tablespace num add datafile 'f:\sqlplus\num0998.dbf' size 1m;
alter tablespace num add datafile 'f:\sqlplus\num0999.dbf' size 1m;
alter tablespace num add datafile 'f:\sqlplus\num1000.dbf' size 1m;
--5. 执行脚本加数据文件,
sys@ocm> @add.sql
sys@ocm> alter tablespace num add datafile 'f:\sqlplus\num0002.dbf' size 1m;
表空间已更改。
sys@ocm> alter tablespace num add datafile 'f:\sqlplus\num0003.dbf' size 1m;
表空间已更改。
.
.
.
sys@ocm> alter tablespace num add datafile 'f:\sqlplus\num0993.dbf' size 1m;
表空间已更改。
sys@ocm> alter tablespace num add datafile 'f:\sqlplus\num0994.dbf' size 1m;
表空间已更改。
sys@ocm> alter tablespace num add datafile 'f:\sqlplus\num0995.dbf' size 1m;
alter tablespace num add datafile 'f:\sqlplus\num0995.dbf' size 1m
*
第 1 行出现错误:
ORA-00059: 超出 DB_FILES 的最大值 --这里建到995号里出错,我原来的数据库本来就有5个数据文件
--6. 查看数据文件总数,果然为1000,数据文件的总数受db_files限制
sys@ocm> select count(*) from v$datafile;
COUNT(*)
----------
1000
--7. 再来看控制文件里的参数,MAXDATAFILES的值变为1600了,它会自动扩展
sys@ocm> alter database backup controlfile to trace as 'ctl.txt';
linux:/script # cat ctl.txt |grep -i MAXDATAFILES
MAXDATAFILES 1600
MAXDATAFILES 1600
来 看看官方文档里对db_files这个参数的描述:
DB_FILES
Property | Description |
Parameter type | Integer |
Default value |
|
Modifiable | No |
Range of values | Minimum: the largest among the absolute file numbers of the datafiles in the database Maximum: operating system-dependent |
Basic | No |
Oracle RAC | Multiple instances must have the same value. |
结论:数据文件总数还是受到db_files的限制。而且这个参数只受操作系统限制,只要我的操作系统里还能加裸设备,这个数据文件就可以增加。
MAXDATAFILES会自动扩展。
我承认我的语言表达能力差,当别人都忙的时候我天天无所事事显得我是吃闲饭的。真的想回国了。