Oracle Bigfile Tablespace大文件表空间

 

Oracle表空间Tablespace是逻辑结构的最高层次,其他分别对应段对象segment、区extent和块block。而物理层面的Oracle数据库是通过一系列的文件构成,其中数据文件datafile是与Tablespace进行对应的对象。

 

 

Tablespace与Datafile的关系是一对多的关系。一个表空间Tablespace可以对应多个Datafile,Datafile则是只能归属在一个Tablespace里。传统的Oracle管理概念中,倡导一个表空间中创建多个数据文件,特别是创建分布在多个存储磁盘上,以期分散I/O。但是,Oracle10g推出的BigFile Tablespace大文件表空间,将这个概念有所变化。

 

 

1、  Bigfile tablespace

 

在Oracle 10g中,推出了Bigfile tablespace的概念。表空间Tablespace从Oracle 10g以后就分为两个类型,smallfile tablespace和bigfile tablespace。过去一个表空间对应多个数据文件我们成为Smallfile Tablespace。

 

所谓Bigfile Tablespace最显著的差别就是一个表空间只能对应一个数据文件。Bigfile Tablespace虽只对应一个数据文件,但数据文件对应的最大体积大大增加。传统的small datafile每个文件中最多包括4M个数据块,按照一个数据块8K的大小核算,最大文件大小为32G。每个Small Tablespace理论上能够包括1024个数据文件,这样计算理论的最大值为32TB大小。而Bigfile Datafile具有更强大的数据块block容纳能力,最多能够包括4G个数据块。同样按照数据块8K计算,Bigfile Datafile大小为32KG=32TB。理论上small tablespace和big tablespace总容量相同。

 

下面我们通过一连串的实验来观察Bigfile Tablespace。

 

 

SQL> select * from v$version;

 

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE     10.2.0.1.0       Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

 

SQL> create bigfile tablespace bttest datafile 'D:\ORADATA\ORCL\BTTEST.dbf' size 10m autoextend off

  2  extent management local uniform. size 1m

  3  segment space management auto;

 

Tablespace created

 

 

此处,我们通过create bigfile tablespace语句建立Bigfile Tablespace。注意两方面的问题,其一是Bigfile Tablespace必须使用local本地extent管理方式,不允许使用DMT(Dictionary Managed Tablespace)。另一方面是段segment空间使用auto自动方式,不要使用manual。

 

不过这两个条件在Undo或者临时Bigfile表空间的时候,是允许例外的。

 

Small Tablespace和Bigfile Tablespace是可以并存的。

 

 

SQL> select tablespace_name, bigfile from dba_tablespaces;

 

TABLESPACE_NAME                BIGFILE

------------------------------ -------

(篇幅原因,省略……)

QCDATA                         NO

QCTEMP                         NO

BTTEST                         YES

 

11 rows selected

 

 

在创建bigfile tablespace的时候,就已经指定了数据文件。如果此时我们尝试加入一个新的数据文件,Oracle系统会报错。

 

 

SQL> alter tablespace bttest add datafile 'D:\ORADATA\ORCL\BTTEST02.dbf' size 10m autoextend off;

 

alter tablespace bttest add datafile 'D:\ORADATA\ORCL\BTTEST02.dbf' size 10m autoextend off

 

ORA-32771: 无法在大文件表空间中添加文件

 

 

下面我们分析一下bigfile tablespace的特性。

 

2、Bigfile的相对文件编号

 

此处我们观察一下Bigfile Tablespace体系下的一些特征。

 

 

SQL> select file_name, file_id, relative_fno from dba_data_files;

 

FILE_NAME                         FILE_ID RELATIVE_FNO

------------------------------ ---------- ------------

D:\ORADATA\ORCL\USERS01.DBF             4            4

D:\ORADATA\ORCL\SYSAUX01.DBF            3            3

D:\ORADATA\ORCL\UNDOTBS01.DBF           2            2

D:\ORADATA\ORCL\SYSTEM01.DBF            1            1

D:\ORADATA\ORCL\EXAMPLE01.DBF           5            5

D:\ORADATA\ORCL\SPTABLESPACE            6            6

D:\ORADATA\ORCL\QCDATA.DBF              7            7

D:\ORADATA\ORCL\BTTEST.DBF              8         1024

 

8 rows selected

 

 

每个文件都包括两个编号,一个是绝对文件编号file_id,另一个是相对文件编号relative_fno。在文件数量较少,或者创建删除文件比较少情况下的数据库,file_id和relative_fno是相同的。Relative_fno是一个循环周期,以1024为一个循环。当file_id依次递增到1024整数倍之后,file_id会继续增加,而relative_fno会形成一个内部循环。

 

 

这种机制让我们联想起了Oracle Small Tablespace的数据文件上限限制,也是1023个文件。我们设想一种极端的情况,如果一个表空间中的数据文件个数超过了1024,也就是一个表空间内的数据文件中,存在相同的relative_fno。这种情况首先是不被允许的。

 

 

设置1024的relative_fno是进行Oracle数据寻址的需要。这里我们要关注到Oracle定位数据行的rowid信息,rowid是Oracle内部唯一标注一行记录的地址。Rowid包括四部分组成,对象号+文件号+块号+slot行号。Rowid长度固定,所以四部分的长度都是固定的,这里的文件号fno是相对文件编号。这里的查找顺序是,对象号获取所在表空间的编号,在表空间内部使用相对文件号来定位到文件。如果一个表空间内出现相同的relative_fno文件,定位就不可能了。所以,small tablepsace的内部文件上限必然是1023。

 

 

但是,Bigfile Tablespace存在一些不同之处。如果一个表空间只有一个数据文件且只能拥有一个数据文件,那么relative_fno就失去了存在的意义。所以在dba_data_files中的relative_fno列上,bigfile tablespace对应的datafile是直接1024。

 

 

SQL> create table t_big tablespace bttest as select * from dba_tables;

Table created

 

SQL> select dbms_rowid.rowid_object(t.rowid) obj_id, dbms_rowid.rowid_relative_fno(t.rowid,'BIGFILE') relative_fno,

  2  dbms_rowid.rowid_block_number(t.rowid) block_num, dbms_rowid.rowid_row_number(t.rowid) rownums,

  3  dbms_rowid.rowid_to_absolute_fno(t.rowid,'SYS','T_BIG') abso_fno

  4  from t_BIG t where rownum<4;

 

    OBJ_ID RELATIVE_FNO  BLOCK_NUM    ROWNUMS   ABSO_FNO

---------- ------------ ---------- ---------- ----------

     55707         1024         21          0          8

     55707         1024         21          1          8

     55707         1024         21          2          8

 

 

借助dbms_rowid包的相应方法,我们也可以看清bigfile tablespace上rowid行的relative_fno信息。

 

3、Bigfile Datafile大小探索

 

一个数据文件最大能有多大,在Oracle中有两个因素控制,一个是Oracle内部寻址能够寻找到的最大范围多少个块,另一个是数据库每个块大小是多大。

 

我们首先来看看Small Datafile的情况。Rowid是一个用16进制表示的18位长度类字符串。其中,前6位表示object_id,之后3位表示文件编号,之后6位表示块号,最后3位表示row的slot编号。

 

--语句摘自MOS[ID 1057891.6]

 

   SQL> select substr(rowid,1,6) "object",

               substr(rowid,7,3) "file",

               substr(rowid,10,6) "block",

               substr(rowid,16,3) "row"

       from test;

 

        object fil block  row

        ------ --- ------ ---

        AAABPW AAF AAAAv1 AAA

 

 

在small datafile中,对数据块有6×4=24位二进制表示。Oracle利用中间的22位进行块地址存储。这样,22位二进制可以表示的数据块编号范围为(2^22-1)=4M个数据块。如果按照每个数据块8K的普遍大小计算,这样每个small datafile大小上限就是32G。如果按照每个数据块上限32K计算,这样每个small datafile大小上限就是128G。

 

 

在bigfile datafile中,事情有所不同。由于没有relative_fno的问题,这样rowid中就不需要保存relative_fno的最多1024的数值。这样就节省出10位二进制位给数据块定位,相同长度的rowid就可以进行32位二进制长度的数据块寻址。每个bigfile datafile中,最多可以包括到(2^32-1)=4G个数据块。在数据块大小8K的环境下,最大为32TB数据。如果是数据块大小为32K环境下,文件最大可以到128TB大小。

 

 

4、结论和讨论

 

在本文第一部分中,我们讨论了Bigfile Tablespace和Small Tablespace的理论分析,两者理论上最大容量值是一样的。只是Bigfile的单个文件容量上限很大,我们如何看待这种新类型呢?

 

首先,实际生产环境下,Bigfile Tablespace在应对大数据量存储的时候略有优势。因为Small Tablespace在实现相同的存储大小时,要消耗大量的多文件管理开销。同时控制文件为了维护多位置上的文件,协同检查点和文件头SCN等内容,要消耗很大精力。

 

其次,Small Tablespace的存储量只是理论,很少有系统真的建立上千个文件在一个表空间中。从这个角度看,Bigfile吸引力是不小的。

 

最后,Oracle对于Bigfile Tablespace支持是全面的。存储层面上,ASM、Logical Volumn Manager/RAID、Dynamically Extensible Logical Volumes和OMF都提供了比较全面的支持。

 

 

但是,Bigfile Tablespace并不是万灵药。Bigfile是Oracle层面的Bigfile,并不涉及到OS层面的支持。使用Bigfile的时候,要选择合适的底层存储系统提供支持。此外,Bigfile的理念违背了我们过去宣称的I/O分散理论。所以,最好在有底层强大存储支持(如ASM)的情况下使用Bigfile,达到最优的性能平衡点。

时间: 2024-10-27 14:03:58

Oracle Bigfile Tablespace大文件表空间的相关文章

Oracle bigfile大文件表空间

Database 是由一个或多个被称为表空间(tablespace)的逻辑存储单位构成.表空间内的逻辑存 储单位为段(segment),段又可以继续划分为数据扩展(extent).而数据扩展是由一组连续的数据 块(datablock)构成. 大文件表空间 在Oracle中用户可以创建大文件表空间(bigfile tablespace).这样Oracle数据库使用的表空间 (tablespace)可以由一个单一的大文件构成,而不是若干个小数据文件.这使Oracle可以发挥64位 系统的能力,创建.

Oracle bigfile大文件表空间介绍及其优势和劣势分析

Database 是由一个或多个被称为表空间(tablespace)的逻辑存储单位构成.表空间内的逻辑存 储单位为段(segment),段又可以继续划分为数据扩展(extent).而数据扩展是由一组连续的数据 块(datablock)构成. 大文件表空间 在Oracle中用户可以创建大文件表空间(bigfile tablespace).这样Oracle数据库使用的表空间 (tablespace)可以由一个单一的大文件构成,而不是若干个小数据文件.这使Oracle可以发挥64位 系统的能力,创建.

探索ORACLE之RMAN_07整个业务表空间丢失恢复

探索ORACLE之RMAN_07整个业务表空间丢失恢复 作者:吴伟龙   Name:Prodence Woo QQ:286507175  msn:hapy-wuweilong@hotmail.com   1.     整个业务表空间丢失恢复 注意:以下的所有实验,都是基于上面的全库备份来做的恢复. 2.1 删除wwl表空间的所有数据文件 [root@wwldb ~]# cd /DBData/WWL/ [root@wwldb WWL]# rm -rf wwl* [root@wwldb WWL]#

Oracle学习(一)表空间和区

1.表空间:表空间是数据库的逻辑划分,一个表空间只属于一个数据库.每个表空间由一个或多个 数据文件组成. 表空间中其他逻辑结构的数据存储在这些数据文件中.在Oracle安装完成后,会自动建立多个表空间 , 主要有: (1)System表空间:该表空间用于存放Oracle系统内部表和数据字典的数据,如表名.列名.用户 名等. (2)undo表空间:该表空间是存储撤销信息的表空间.当用户对数据库表进行修改(insert, update,delete)时, Oracle会自动使用undo表空间来临时存

命令行中使用oracle命令创建数据库和表空间

本文详细介绍命令行中使用oracle命令创建数据库和表空间 1.使用超级用户登录sqlplus. 2.创建表空间: SQL> create tablespace test 2 datafile 'D:\oracle\oradata\test\test.dbf' 3 size 100M autoextend on next 10M maxsize unlimited extent management local; 3.创建用户和密码: SQL> create user Username ide

oracle逻辑结构(1)表空间概述

1. 表空间(tablespace) 表空间是数据库中的基本逻辑结构,一系列数据文件的集合.一个表空间可以包含多个数据文件, 但是一个数据文件只能属于一个表空间. 查询表空间: SQL>select * form dba_data_files; 查询表空间的空闲信息: SQL>select * from dba_free_space; SQL>alter tablespace ***? offline; 限制表空间大小: SQL>alter user *** quota ***m

Oracle技术:手动实现表空间基于时间点的恢复

实验说明: (1)先创建2个表空间. create tablespace user01 datafile '/opt/oracle/oradata/ocp/user01.dbf' size 1M; create tablespace user02 datafile '/opt/oracle/oradata/ocp/user02.dbf' size 1M; (2)在每个表空间上各创建一张表. create table scott.customers (cust_id int,cust_name v

Oracle在不同平台间表空间迁移

平台环境:   1.源库:         Windows Service 2003 SP2 x86         Oracle Service 10.2.0.4 x86    2.目标库          Redhat Linux   5.5  X64          Oracle Service 10.2.0.5    3.检查目标数据库的系统环境 /G'xLC*M.D!zH!_&d206744233.检查目标系统环境O,[`Qf%s20674423内存大小:M:Y@8Z0sV20674

Oracle中删除用户和表空间的常见问题(比如:ORA-01940无法删除当前已连接用户的解决方案)

这时候以管理员身份进入sqlplus命令窗口. 在删除用户的时候有时候会出现以下问题: ORA-01940无法删除当前已连接用户 这时候的解决方案是: 1)查看用户的连接状况   select username,sid,serial# from v$session (2)找到要删除用户的sid,和serial,并删除 例如:你要删除用户'WUZHQ',可以这样做: alter system kill session'532,4562'; 这里的532表示的是sid,4562表示的是seria.