概述
数据文件是用来存储数据库中所有逻辑结数据的物理文件,它是一个操作系统文件.我们可以用ls(UNIX/LINUX操作系统命令)在操作系统级查看到这些文件.我们在创建表空间的时候需要显式的制定数据文件.
ORACLE在创建数据文件的时候会给每个数据文件分配两个相关的文件编号, 绝对文件号(absolute file number)和相对文件号(relative file number).
绝对文件号:
在整个数据库中唯一标识数据文件.
相对文件号:

在一个表空间中唯一标识数据文件.对于中小型数据库来讲相对文件号和绝对文件号通常是一样的,只有当数据库中的数据文件超过1023(相对文件号最大值, 也就是每个tablespace能容纳的最大数据文件数量),相对文件号和绝对文件号就不会相同了,这个时候数据库会重用相对文件号(1-1023).
看了上面的解释你或许有似懂非懂的感觉,也许你已经完全理解了,反正我刚开始看的时候没有完全理解.下面讲一下绝对文件号和相对文件号到底是如何分配的.主要包括以下几点:
1. 多表空间共享相对文件号分配
从下的查询结果我们可以看到,当给数据库添加数据文件的时候会按照顺序从小到大给数据文件分配相对文件号,而不区分表空间,直到相对文件号达到1023.

SELECT file_id,
relative_fno,
tablespace_name
FROM dba_data_files
WHERE file_id<=3000 ORDER BY file_id;
 
FILE_ID     RELATIVE_FNO  TABLESPACE_NAME
----------  ------------  ----------------
1           1             SYSTEM
2           2             UNDOTBS
3           3             DATA_01
4           4             INDEX_01
5           5             TRADE_DATA
6           6             UNDOTBS
7           7             SYSTEM
8           8             BUILD_INDEX1
9           9             DATA_01
10          10            DATA_01

2. 超过单表空间最大数据文件数后,为表空间数据文件分配本表空间未使用过的相对文件号.

1023 1023 BOXV2_LARGE1_INDEX
1024 1    PVST_MAX_LARGE1
1025 2    PVST_MAX_LARGE1
1026 3    PVST_MAX_LARGE1
1027 4    PVST_MAX_LARGE1
1028 5    PVST_MAX_LARGE1
1029 6    PVST_MAX_LARGE1
1030 7    PVST_MAX_LARGE1
1031 8    DATA_01
1032 12   DATA_01
1033 10   DATAPROD_LARGE1_DATA
1034 11   DATAPROD_LARGE1_DATA
1035 12   DATAPROD_LARGE1_DATA
1036 13   TASKTRADE_DATA
1037 14   BOXV2_LARGE1_INDEX
1038 15   BOXV2_LARGE1_INDEX

这里我们可以看到当总的数据文件超过1023后,再给数据文件分配相对文件号的时候使用的是本表空间没有使用过的编号,如DATA_01.

DB_FILES初试化参数
DB_FILES参数在数据库实例启动的时候指定为数据文件信息等保留的SGA空间.以及可以为实例创建的最大数据文件数量.参数值可以被修改,但必须重启数据库会生效.
.如果DB_FILES太小,你不能增加超过DB_FILES的数据文件.
.如果DB_FILES太大,会增加不必要的内存消耗.

添加数据文件到表空间的一些限制
.通常操作系统对一个进程可以同时打开的文件数量是有限制的(linux可以用命令查看;ulimit -n)。当达到操作系统可以打开文件数量的限制时,将不能再添加数据文件。
.操作系统对数据文件的数量(linux可以通过命令查看:sysctl -a | grep fs.file-max)和大小(linux可以用命令查看:ulimit -f)有一定的限制
.Oracle对一个实例可以打开的数据文件数量有限制,这个限制依赖于操作系统。
.你不能添加超过DB_FILES参数所设置的大小。
.当你用CREATE DATABASE或CREATE CONTROLFILE语句的时候,会根据初始化参数MAXDATAFILES在控制文件中设置可以添加数据文件的数目。
但是,如果你添加的数据文件数大于MAXDATAFILES小于DB_FILES的话,控制文件会自动增加,调整MAXDATAFILES的大小。

数据文件数量对系统能的一些影响
ORACLE 允许在数据库中存在超过操作系统限制的可以打开数量的文件。ORACLE的DBWn进程可以打开所有online的数据文件。当打开文件数量超过操作系统限制的时候,Oracle会自动关闭文件。
这中操作会有一些性能上的影响。如果可能,尽量将操作系统可打开文件数量设置为大于数据库在线数据文件数量。
定义数据文件的大小
ORACLE数据库的第一个数据文件(用于SYSTEM tablespace)的大小至少要有150M用来存放数据字典和回滚段。如果你还要安装其他的ORACLE 产品还需要额外的空间。

将Datafiles和Redo Log Files分开存放
数据文件和重做日志文件不应该存放在同一个磁盘上,如果放在同一个磁盘上,当磁盘损坏的时候,这些文件将不能被用在数据库的恢复中。

创建数据文件和给表空间添加数据文件
当创建表空间的时候,你需要估算数据库对象的可能增长的大小,并创建足够的数据文件。当然,如果需要你也可以在以后将数据文件添加到表空间中,给表空间分配更多的磁盘空间。

修改数据文件的大小
当你创建数据文件的时候或者修改数据文件为自动增长模式。这样做有两个好处:
1.当表空间空间用完的时候你不需要立即干预空间管理。
2.不会因为无法分配extents是的应用失败。
你可以通过DBA_DATA_FILES查看数据文件是否可以自动扩展。

如:

 ALTER TABLESPACE users
 ADD DATAFILE '../user3.dbf' size 10M
    AUTOEXTEND ON
	NEXT 512k
	MAXSIZE 250M;
 
 ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/users03.dbf'
    AUTOEXTEND OFF;

手工修改数据文件大小
你也可以使用ALTER DATBASE 语句手工增大或缩小数据文件的大小。
当数据库数据文件达到最大数目限制的时候,你可以通过增大数据文件大小来解决这个问题。
而减小数据文件大小可以用于又有最初空间估计错误而没有被使用到的空间。

如:

 ALTER DATABASE DATAFILE '../stuff01.dbf' RESIZE 100M;

修改数据文件的可用性
你可以将单个数据文件online或者offline,oracle数据库将不能使用offline的数据文件直到被online.
你也可以通过指定表空名字,将某个表空间(包括临时表空间)的所有数据文件设置为offline.
在非归档模式下,只有read only 的tablespace 中的datafile可以被 offline.
当然你也可以用:ALTER DATABASE DATAFILE ‘../user.dbf’ OFFLINE DROP;来删除数据文件。
这里的数据文件并不是真正被删除,你需要用操作系统工具rm等删除真正的数据文件。
ALTER TABLESPACE … OFFLINE IMMEDIATE or ALTER DATABASE DATAFILE … OFFLINE 只有在归档模式下才可以使用。

归档模式下用ALTER DATABASE …OFFLINE后你如果想ALTER DATABASE …ONLINE。会提示需要介质恢复。
这个比较复杂,涉及到备份恢复这一块,暂时不去讨论。

通过指定tablespace name 将表空间(或临时表空间)中包含的所有数据文件(或临时文件)offline.
ALTER TABLESPACE … DATAFILE {ONLINE|OFFLINE}
ALTER TABLESPACE … TEMPFILE {ONLINE|OFFLINE}
通过这中方式只会修改对应表空间中数据文件的status,而tablespace对应的status是不会被修改的。
想要将tablespace offline,你只能用:ALTER TABLESPACE …offline,这个命令会将表空间和数据文件的status同时修改为offline.
但这个命令不能用于temporary tablespace.

ALTER TABLESPACE命令offline,或者online tablespace,可以在数据库open,或者mount状态下使用。
但是如果要修改system tablespace,undo tablespace, 或者default temporary tablespace,数据库不能在open状态下进行。
当然你也可以使用:ALTER DATABASE DATAFILE 和 ALTER DATABASE TEMPFILE,但你必须指定所有的数据文件。

重命名和重部署数据文件
1.为单个表空间(non-SYSTEM)重命名和重部署数据文件,具体步骤如下:
(1)将包含数据文件的tablespace offline.如:
ALTER TABLESPACE users OFFLINE NORMAL;
(2)将要重命名的数据文件拷贝到新的地方(如果只是重命名不需要这一步),在OS层将数据文件重命名
(3)使用ALTER TABLESPACE … RENAME DATAFILE 语句在database 曾重命名数据文件。
如将数据文件:
/u02/oracle/rbdb1/user1.dbf
/u02/oracle/rbdb1/user2.dbf
重命名为:
/u02/oracle/rbdb1/users01.dbf
/u02/oracle/rbdb1/users02.dbf

   ALTER TABLESPACE users
    RENAME DATAFILE '/u02/oracle/rbdb1/user1.dbf',
                    '/u02/oracle/rbdb1/user2.dbf'
                 TO '/u02/oracle/rbdb1/users01.dbf',
                    '/u02/oracle/rbdb1/users02.dbf';

如果tablespace 是offline但是database 是open的。用命令:ALTER TABLESPACE … RENAME DATAFILE.
如果database是mount状态,但没有打开,用命令:ALTER DATABASE …RENAME FILE.
新的数据文件在OS中必须以及存在,可以产看DBA_DATA_FILES来些重命名语句,要包含数据文件路径。

(4)将TABLESPACE ONLIE或者将DATABASE OPEN.

(5)备份数据库。当对数据库做了结构上的修改后通常要做一个全备份。

2.为多表空间重命名和重部署数据文件
你可以用ALTER DATABASE… RENAME FILE语句为多个表空间的数据文件重命名或者重新部署存放位置。
这是你可以同时为多个表空间数据文件重命名或重部署以及为SYSTEM表空间重命名数据文件的唯一方法。
要执行这个操作,你必须拥有ALTER DATABASE 权限。具体步骤如下:
(1).确保数据库处于mount状态(必须是关闭的)。
(2).将要重命名的数据文件拷贝到新的地方(如果只是重命名不需要这一步),在OS层将数据文件重命名
(3).用 ALTER DATABASE 重命名数据文件在控制文件中的指向。
如:
将数据文件:
/u02/oracle/rbdb1/sort01.dbf
/u02/oracle/rbdb1/user3.dbf
重命名为:
/u02/oracle/rbdb1/temp01.dbf
/u02/oracle/rbdb1/users03.dbf.

    ALTER DATABASE
      RENAME FILE '/u02/oracle/rbdb1/sort01.dbf',
                '/u02/oracle/rbdb1/user3.dbf'
             TO '/u02/oracle/rbdb1/temp01.dbf',
                '/u02/oracle/rbdb1/users03.dbf;

(4)将DATABASE OPEN.

(5)备份数据库。当对数据库做了结构上的修改后通常要做一个全备份。

删除数据文件
我们没有办法将某个表空间的数据文件删除,删除数据文件的唯一办法是将包含该数据文件的表空间删除。
你可以按照以下方法删除:
1. 创建一个新的表空间
2. 将旧表空间的数据移到新表空间
3. 删除旧表空间
但是是你可以通过ALTER DATABASE语句删除一个临时文件,如:
ALTER DATABASE TEMPFILE ‘/u02/oracle/data/lmtemp02.dbf’ DROP
INCLUDING DATAFILES;

校验数据文件的数据块
oracle 数据库chechsum值用来校验所有数据块是否有坏块,包括临时数据文件。DBWn进程会将CHECKSUM值写入每个数据库头。
Oracle9i Database Administrator’s Guide Release 2 (9.2)里说 db_block_checksum这个初始化参数值默认是FALSE,
不知道问什么我本机装的几个版本的值都是TRUE.11g是TYPICAL。难道是版本的问题?文档建议这个值在ORACLE SUPPORT人员需要
诊断一些data corruption问题的时候打开,因为打开这个参数会有很大的性能问题。

9.2.0.1(Win)
NAME TYPE VALUE
—————— ———– ——–
db_block_checking string FALSE
db_block_checksum string TRUE

10.2.0.1.0(Win)
NAME TYPE VALUE
—————— ———– ——–
db_block_checking boolean FALSE
db_block_checksum boolean TRUE

11.1.0.6.0(Linux)
NAME TYPE VALUE
—————— ———– ——–
db_block_checking string FALSE
db_block_checksum string TYPICAL

Popularity: 25% [?]