一、数据文件概述
在Oracle数据库中,SYSTEM和SYSAUX表空间至少需要包含一个数据文件,此外还将包含多个其他表空间及与其相关的数据文件和临时文件。Oracle的数据文件和临时文件是操作系统文件,属于数据库物理结构范畴,用于存储数据库中的逻辑结构的数据。在创建表空间时,必须明确的为每个表空间指定数据文件。 Oracle通过两种方式为文件分配编号:绝对文件号,用于唯一标识数据库中的数据文件,绝对文件号可以通过v$datafile或v$tempfile视图的FILE#列查询,也可以通过DBA_DATA_FILES或DBA_TEMP_FILES视图的FILE_ID列查询;相对文件号,用于唯一标识表空间内的数据文件。大多数情况下,绝对文件编号和相对文件编号都是相等的,但当数据库中的数据文件数量超出了一个阈值(比如1023),那么他们就不再相等了。大文件表空间数据文件的相对文件号总为1024。 查询数据文件的绝对文件号和相对文件号: select t.name tablespace_name,d.file#,d.rfile#,d.name file_name from v$tablespace t,v$datafile d where t.ts#=d.ts#; TABLESPACE_NAME FILE# RFILE# FILE_NAME -------------------- ---------- ---------- -------------------------------------------------- SYSTEM 1 1 /u01/app/oracle/oradata/stdb/system01.dbf UNDOTBS1 2 2 /u01/app/oracle/oradata/stdb/undotbs01.dbf SYSAUX 3 3 /u01/app/oracle/oradata/stdb/sysaux01.dbf USERS 4 4 /u01/app/oracle/oradata/stdb/users01.dbf USERS 8 8 /u01/app/oracle/oradata/stdb/user02.dbf EXAMPLE 5 5 /u01/app/oracle/oradata/stdb/example01.dbf TEST 7 7 /u01/app/oracle/oradata/stdb/test02.dbf TEST 6 6 /u01/app/oracle/oradata/stdb/test01.dbf BIGTBS 9 1024 /u01/app/oracle/oradata/stdb/bigfile01.dbf 9 rows selected. 数据库所能够创建的数据文件数量受CREATE DATABASE ... MAXDATAFILES语句和DB_FILES参数的影响。另外,还应注意操作系统在创建文件数量方面的强制限制。在实例启动过程中,Oracle将根据初始化参数DB_FILES分配SGA中用于保存数据文件信息的空间,实例可以根据这个参数值来决定所能创建的最大文件的数量。该参数可以修改,但必须重启数据库方可生效,该参数在实例的整个生命周期中有效。 表空间中包含的数据文件的数据量的多少,最终会影响到数据库的性能。Oracle允许的在线文件数量超过了操作系统的默认限制,DBWn进程能够打开所有的在线数据文件,并有能力缓存所有处理中的文件,当打开文件数据量达到操作系统的默认限制时,Oracle将自动关闭文件。这可能会对性能产生负面的影响,建议调整操作系统的默认限制值,使其大于数据库的在线文件数量。二、为表空间创建和添加文件 为表空间创建和添加数据文件的方法在之前已经学习过了,这里仅简要回顾一下。 1、在创建表空间的同时创建数据文件 create tablespae ... datafile '/xxx/xxxx/xxxx ...' size xx create temporary tablespace datafile '/xxx/xxxx/xxxx ...' size xx 2、为已存在的表空间添加数据文件 alter tablespace ... add datafile '/xxx/xxxx/xxxx ... ' size xx alter tablespace ... add tempfile '/xxx/xxxx/xxxx ... ' size xx三、修改数据文件大小 使用自动扩展子句为表空间添加数据文件: SQL> create tablespace test_tbs 2 datafile '/u01/app/oracle/oradata/stdb/test03.dbf' size 10m 3 autoextend on 4 next 1m 5 maxsize 100m; Tablespace created. 打开数据文件自动扩展: SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test02.dbf' 2 autoextend on 3 next 1m 4 maxsize 100m; Database altered. 关闭数据文件自动扩展: SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test02.dbf' 2 autoextend off; Database altered. 手动RESIZE数据文件大小: SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' resize 20m; Database altered.四、修改数据文件可用性 可以通过执行数据文件的在线和离线操作修改数据文件的可用性,离线的数据文件不能被数据库所访问,直到它恢复在线状态之前。只读表空间中的数据文件也可以被离线或在线,只读表空间内的数据文件的在线或离线不影响表空间自身的状态,不管怎么样,在表空间未处于读写状态之前,这些文件都是不可写的。 1、归档模式下的数据文件离线 SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' offline; Database altered. SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' online; alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' online * ERROR at line 1: ORA-01113: file 10 needs media recovery //test03.dbf文件离线时不触发检查点操作,所以该文件恢复在线时提示需要介质恢复 ORA-01110: data file 10: '/u01/app/oracle/oradata/stdb/test03.dbf' SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /u02/arch_1 Oldest online log sequence 5 Next log sequence to archive 7 Current log sequence 7 SQL> recover datafile 10; Media recovery complete. SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' online; Database altered. 2、非归档模式下的数据文件离线 在非归档模式下使用alter database ... offline for drop语句离线数据文件。offline关键字标记该数据文件离线,不论其是否损坏,所以可以打开数据库;for drop关键字标记该数据文件随后被删除,该数据文件不能再次恢复到在线状态。(实际上,在在线日志组还未发生切换之前,还是可以恢复到在线状态的) SQL> alter database datafile 'D:\app\Manganese\oradata\orcl\test01.dbf' offline for drop; 数据库已更改。 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 SQL> alter database datafile 'D:\app\Manganese\oradata\orcl\test01.dbf' online; alter database datafile 'D:\app\Manganese\oradata\orcl\test01.dbf' online * 第 1 行出现错误: ORA-01113: 文件 7 需要介质恢复 ORA-01110: 数据文件 7: 'D:\APP\MANGANESE\ORADATA\ORCL\TEST01.DBF' SQL> recover datafile 7; ORA-00279: 更改 1108304 (在 03/19/2014 15:44:41 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\APP\MANGANESE\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_03_19\O1_MF_1_9_%U_.ARC ORA-00280: 更改 1108304 (用于线程 1) 在序列 #9 中 指定日志: {=suggested | filename | AUTO | CANCEL} auto ORA-00308: 无法打开归档日志 'D:\APP\MANGANESE\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_03_19\O1_MF_1_9_%U_.ARC' ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 ORA-00308: 无法打开归档日志 'D:\APP\MANGANESE\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_03_19\O1_MF_1_9_%U_.ARC' ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 3、修改表空间内所有数据文件和临时文件的可用性 alter tablespace ... datafile { online | offline } alter tablespace ... tempfile { online | offline }五、重命名(修改存储位置)数据文件 1、将包含数据文件的表空间离线。 2、使用操作系统命令修改数据文件名。 3、使用alter database ... rename datafile ...语句改变数据库中的数据文件名。 4、备份数据库。 示例一:重命名同一表空间内的数据文件 SQL> alter tablespace test_tbs offline normal; Tablespace altered. [oracle@stdb stdb]$ mv test03.dbf test04.dbf SQL> alter tablespace test_tbs 2 rename datafile '/u01/app/oracle/oradata/stdb/test03.dbf' 3 to '/u01/app/oracle/oradata/stdb/test04.dbf'; Tablespace altered. SQL> alter tablespace test_tbs online; Tablespace altered.示例二:重命名不同表空间中的数据文件
SQL> select status from v$instance; STATUS ------------ MOUNTED //该操作必须在mount下进行 SQL> alter database 2 rename file '/u01/app/oracle/oradata/stdb/test01.dbf', 3 '/u01/app/oracle/oradata/stdb/test02.dbf', 4 '/u01/app/oracle/oradata/stdb/test04.dbf' 5 to 6 '/u01/app/oracle/oradata/stdb/test1.dbf', 7 '/u01/app/oracle/oradata/stdb/test2.dbf', 8 '/u01/app/oracle/oradata/stdb/test3.dbf'; Database altered. SQL> alter database open; Database altered.六、删除数据文件 从表空间内删除数据文件: alter tablespace ... drop datafile ... ; alter tablespace ... drop tempfile ... ; 从数据库中删除数据文件: alter database tempfile '/xxx/xxxx/....' drop including datafiles; SQL> alter database tempfile '/u01/app/oracle/oradata/stdb/temp03.dbf' drop including datafiles; Database altered. SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test1.dbf' drop including datafiles; //注意:数据文件不能以这样的方式删除 alter database datafile '/u01/app/oracle/oradata/stdb/test1.dbf' drop including datafiles * ERROR at line 1: ORA-01916: keyword ONLINE, OFFLINE, RESIZE, AUTOEXTEND or END/DROP expected 注意: 1、从字典管理迁移到本地管理的只读表空间内的数据文件时不能被删除的。除此之外,其他的只读表空间内的数据文件可以删除。 2、系统表空间内的数据文件无法被删除。 3、如果一个本地管理的表空间被离线,则其内的数据文件无法被删除。 SQL> alter tablespace test_tbs drop datafile '/u01/app/oracle/oradata/stdb/test4.dbf'; alter tablespace test_tbs drop datafile '/u01/app/oracle/oradata/stdb/test4.dbf' * ERROR at line 1: ORA-03264: cannot drop offline datafile of locally managed tablespace 4、如果表空间内仅包含一个数据文件,该数据文件无法被删除。 SQL> alter tablespace test_tbs drop datafile '/u01/app/oracle/oradata/stdb/test3.dbf'; alter tablespace test_tbs drop datafile '/u01/app/oracle/oradata/stdb/test3.dbf' * ERROR at line 1: ORA-03261: the tablespace TEST_TBS has only one file 5、如果数据文件不为空,该数据文件无法被删除。 6、删除数据文件必须保证数据块处于打开状态。zhuan :http://blog.itpub.net/29515435/viewspace-1125105/