增加数据文件

现场有台服务器的表空间要几个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.

Table F-2 File Size Limits

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

200

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会自动扩展。

我承认我的语言表达能力差,当别人都忙的时候我天天无所事事显得我是吃闲饭的。真的想回国了。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值