2013年(350)
分类: Oracle
2013-04-10 13:31:10
===========================================================================
数据库中的实际数据存储于数据文件中。一个数据库中会有很多个数据文件。其实不要说数据库,一个表空间都有可能存在多个数据文件(表空间是一个逻辑存储结构,一个数据库中包含多个表空间),一个数据文件只能属于一个表空间。
每个数据文件在物理上都对应一个操作系统文件,或者一个裸设备。Oracle在创建数据文件时,是通过操作系统在指定路径下分配一块指定大小的磁盘空间,并将这块空间内的数据清空,然后按照指定的块大小格式化这块存储区域。如果一次分配的空间比较大,那么视磁盘的I/O速率,本步操作有可能要花费相当长的时间。如果创建数据文件时,指向的是裸设备的话,那么该数据文件指定的容量不能大于裸设备最大空间,并且,一个裸设备上只能创建一个数据文件。
提示:什么叫裸设备?
裸设备,英文叫Raw Device,你可以把它理解成没有文件系统的存储设备,如刚买回来一块硬盘,分完区(或者不分区),不执行格式化操作,直接挂到操作系统上使用。如果你脑细胞转得足够快,这会儿是不是已经琢磨过来了,没错,裸设备就是一种底层原始设备,操作系统提供的文件系统不过是于裸设备之上加了一层罢了,因此,某些情况下直接将数据文件、日志文件、控制文件存储于裸设备,能够在一定程度上提高I/O的读写效率(跳过了操作系统层嘛)。不过,号称Oracle的下一个版本12g就不再提供对裸设备的支持。一定要清晰地认识到,虽然数据文件是数据的最终存放地,但数据文件是一个物理概念,无法在创建对象或存储对象时,为对象指定存放到哪个数据文件中。对象在存储时只能指定存储的表空间,然后由Oracle自动对存储区域进行分配,如果指定的表空间含有多个数据文件,那么该对象就可能被存储到多个数据文件中。
数据文件有多种状态,其中联机(Online)、脱机(Offline)和SYSTEM(只有SYSTEM表空间数据文件的状态会显示为SYSTEM)比较常见,只有当数据文件处于联机状态或SYSTEM状态时,用户才能正常访问该数据文件中存储的数据。除非DBA手动指定数据文件(或数据文件所属的表空间)为脱机状态,否则在默认情况下数据文件将一直是联机状态。
要将数据文件置为脱机状态,可以通过下列语句实现,例如将SCOTT对象的数据文件置为脱机状态:
SQL> ALTER DATABASE DATAFILE ' F:\ORACLE\ORADATA\JSSBOOK\SCOTT01.DBF ' OFFLINE ;
Database altered.注意哟,SYSTEM 表空间对应的数据文件必须是SYSTEM状态。
将数据文件置于联机状态的语句与上类似,只需要将 OFFLINE 关键字换为 ONLINE 即可,例如:
SQL> ALTER DATABASE DATAFILE ' F:\ORACLE\ORADATA\JSSBOOK\SCOTT01.DBF ' ONLINE ;
Database altered.查询数据库中数据文件,以及文件的状态可以通过查询DBA_DATA_FILES和V$DATAFILE两个视图实现:
SQL> SELECT NAME,STATUS FROM V$DATAFILE;
NAME STATUS
---------------------------------------- -------
F:\ORACLE\ORADATA\JSSBOOK\SYSTEM01.DBF SYSTEM
F:\ORACLE\ORADATA\JSSBOOK\UNDOTBS01.DBF ONLINE
F:\ORACLE\ORADATA\JSSBOOK\SYSAUX01.DBF ONLINE
F:\ORACLE\ORADATA\JSSBOOK\USERS01.DBF ONLINE
F:\ORACLE\ORADATA\JSSBOOK\SCOTT01.DBF ONLINE提示:V$* 和DBA_*的区别。
你可能会感到疑惑,实现相同(或类似)功能为什么会有两种视图呢?V$*视图和DBA_*视图有什么区别吗?什么时候使用V$*视图,什么时候应该使用DBA_*视图呢?
这里三思并不想描述得太复杂,下面简单通过三五十万字描述一下这几个问题!噢,你说时间紧任务急,没空看大段文字,能不能稍简短描述?这个,好吧,那就把万字去了说。
在Oracle的定义中,V$*视图是指动态性能视图,而DBA_*(含ALL_*和USER_*等)则是数据字典表,V$*视图和DBA_*视图均是由Oracle自行维护的包含数据库中对象信息或当前运行状态的对象,两者并不一个东西,实现的功能也不同,至多只是类似。如说上面提到的两个视图,都可以用来查询数据文件信息,但是就上面的两个视图而言,V$*视图中提供的信息更全。
从应用的角度来看,V$*视图应用范围更广,只要Oracle数据库启动到MOUNT状态,就可以访问V$*视图;而对于DBA_*类的数据字典表,只有当Oracle数据库处于OPEN状态时才能查询。究竟何时应使用V$*视图,何时使用DBA_*视图,一方面是根据DBA的个人使用习惯而定,另一方面则是Oracle看数据库的实际状态。临时文件并不是指临时存在的文件,而是临时表空间对应的数据文件,从实际表现上来看,该文件也不是说用完就会被删除,而是指该文件中存储的对象属于临时存在对象。
这是一类特殊的数据文件,该文件也是用来保存数据。通常,Oracle在执行大规模排序操作时,如果PGA内存区中无法存放,就会将数据存储到临时表空间中作为中转,但是这部分空间并不是永久占用,当操作执行完毕后,这部分空间又可以随时再被其他操作临时使用,因此你可以把这类文件理解成需要时临时拿来用用的文件。不过,临时表空间的数据文件确实与普通表空间数据文件有不同之外:
可以通过DBA_TEMP_FILES或V$TEMPFILE视图查询当前数据库中临时表空间的数据文件信息,例如:
SQL> SELECT NAME FROM V$TEMPFILE;
NAME
--------------------------------------------------
F:\ORACLE\ORADATA\JSSBOOK\TEMP01.DBF=================================================