oracle及操作系统对于文件大小的限制

来源:互联网 发布:太空漂浮舱骗局知乎 编辑:程序博客网 时间:2024/05/19 20:19

[ORACLE]:单个表空间的数据限制
当将表空间加到4GB的时候,系统提示表空间不足。 
原因:

FAT12 单文件最大支持8M 
Fat16单文件最大支持2G 
Fat32单文件不能大于4G 
NTFS单文件最大64GB 
NTFS5.0单文件最大2TB

解决方案: 
增加多个数据文件,对应同一个表空间。 
因为:size of a tablespace = size of each datafile * number of datafiles

 

========================================
Oracle中数据文件大小的限制

http://www.eygle.com/archives/2007/07/oracle_datafile_limit.html

Oracle数据文件的大小存在一个内部限制,这个限制是:
每个数据文件最多只能包含2^22-1个数据块。

这个限制也就直接导致了每个数据文件的最大允许大小。
在2K Block_size下,数据文件最大只能达到约8G
在32K的Block_size下,数据文件最大只能达到约16*8G的大小。

这个限制是由于Oracle的Rowid中使用22位来代表Block号,这22位最多只能代表2^22-1个数据块。

为了扩展数据文件的大小,Oracle10g中引入了大文件表空间,在大文件表空间下,Oracle使用32位来代表Block号,也就是说,在新的技术下,大文件表空间下每个文件最多可以容纳4G个Block。
那么也就是说当Block_size为2k时,数据文件可以达到8T 。
当block_size为32K时,数据文件可以达到128T。

上周在做2K block_size测试时,第一次遇到了这个限制:


SQL> alter tablespace eygle add datafile 'f:/eygle02.dbf' size 8192M;
alter tablespace eygle add datafile 'f:/eygle02.dbf' size 8192M
*
ERROR 位于第 1 行:
ORA-01144: 文件大小 (4194304 块) 超出 4194303 块的最大数

缩减一点,最后创建成功:


SQL> alter tablespace eygle add datafile 'f:/eygle02.dbf' size 8191M reuse;

表空间已更改。

已用时间: 00: 44: 42.08


计算一下,这台破烂的测试机的IO速度:
io speed = 8191 M / 00: 44: 42.08 = 8191 M / 44*60+42 = 8191M / 2682 s = 3.05M/s

够惊人的了吧。

=============================================
关于aix中大文件限制的问题

目前常见的主要有两种情况限制文件大小:

一,操作系统文件大小限制

一般文件大小限制为2g,如果要改变限制,可以有两种方法:

1, 如果文件系统为jfs,则必须重建jfs文件系统且将文件系统设置为允许大文件。之后就可以支持大于2g的文件了。

2, 如果文件系统为jfs2,则无此限制,理论上jfs2文件系统支持最大1T的文件。所以你也可以创建jfs2文件系统满足要求。

3, 如果以上2个都不行,则可能是操作系统对单一用户的文件大小有限制,必须修改/etc/secrucity/limits 文件中指定用户的 fsize参数为-1(表示无限制),修改完后,必须重新登陆shell生效。可使用ulimit –a命令查看修改后的值。

4, 为什么在一个目录下无法再创建目录,因为一个目录下最多只能创建32767个文件(含目录),该参数是由系统内核决定的,在系统安装以后该参数不能更改。

(/usr/include/sys/limits.h文件里的 #define SHRT_MAX 参数      (32767))

    This is due to the fact that ".." in each subdirectory is a hard-link back to
the parent directory and the link count is implemented with a signed 16
bit quantity. Hence the error, EMLINK. Regular files are ok since they
do not require this link. You could work around this limitation by using
symbolic <links> to directories

/usr/include/sys/limits.h as the LINK_MAX value set to 32767

二,tar文件大小限制

tar文件最大只能为8g,原因是:tar命令介绍,因为tar使用USTAR格式,(美国磁带归档程序),而ustar头格式允许文件大到8GB,所以tar支持归档最大8GB文件。

The ustar header format allows for file sizes to be as large as 8 GB. Therefore, the tar command is enabled to archive files of up to 8 GB in size.

解决办法有以下三种:

1, pax

    pax使用方法:

备份:pax -wvf /dev/rmt0 <directory or filename>

查看备份文件列表:pax -vf /dev/rmt0

解备份:pax -rvf /dev/rmt0 <directory or filename> -----可以随意解哪个都行,空为全部

复制:pax -rw <old directory> <new directory>

向磁带后追加:pax -avf /dev/rmt0 <directory or filename>

处理大文件(超过8GB):pax -x pax -wvf /dev/rmt0 <directory or filename>

不方便之处:分卷、不存在的目录不能恢复、存在的目录自动覆盖。

  2, backup

backup使用方法:

find <directory1 or filename1> <directory2 or filename2> ... -print | backup -iqvf /dev/rmt0

注:qv不是关键参数,默认是/dev/fd0所以f一般为主要参数,i为文件而非文件系统。

restore -Tqf /dev/rmt0 查看备份列表

restore -xdqvf /dev/rmt0 <directory1 or filename1> <directory2 or filename2> ...

注:d表示如果为目录将目录下的文件全部RESTORE,x为主要解备参数。

3, exp 的filesize参数

如果是数据库的备份文件,可以使用exp 的filesize参数。将大文件分片存取。

=============================================
看了一篇关于oracle表空间的数据文件大小上限的文章,里面介绍oracle的数据文件大小除了和数据块大小有关之外,还和操作系统的限制有关,下面是根据块大小的限制:
            数据块的大小         物理文件的最大值 M
        ===============================================                 
                2048                         8191 M
                4096                        16383 M
                8192                        32767 M
               16384                        65535 M
在裸设备上有没有其他限制呢?还是说裸设备的限制是基于操作系统的。

转fenng版主的一篇文章,bft也受限于操作系统的文件系统,不过在一定程度上扩展了单个表空间、单个文件的大小,不过只能建一个文件。
作者:fenng 
日期:27-nov-2004 
出处:
http://www.dbanotes.net
版本:0.1

简单介绍
oracle 10g 的存储能力有了显著的增强。这表现在很多方面,下面介绍 10g 新增的表空间类型:大文件 (bigfile) 表空间。

大文件表空间从某种角度来说提高了 oracle 在 vldb 上的管理能力。 只有自动段空间管理的 lmt (locally managed tablespaces ) 支持 bigfile 表空间。 大文件表空间只能包含一个文件,但是文件可以达到 4g 个数据块大小。(以下用 bft 指代 bigfile tablespace。)

bft 可以和以下存储技术结合使用:
自动存储管理(asm) lvm omf
理论上的 bft 可以达到下面所列的值:
数据块大小(单位:k)bft 最大值(单位:t)2k8t4k16t8k32t16k64t32k128t
在实际环境中,这还受到操作系统的文件系统的限制。
bft基本操作
10g 数据库在创建的时候,会指定默认的表空间类型。如果不特殊指定的话,默认为 smallfile 类型的表空间。

sql> select * 2 from database_properties 3 where property_name = default_tbs_type;property_name property_value description-------------------- --------------- ----------------------------------------default_tbs_type smallfile default tablespace type

这种情况下,如果我们创建表空间的时候不指定类型,那么默认创建的都是 smallfile 类型的表空间。可以通过 alter database 命令来修改数据库默认的表空间类型:

sql> alter database set default bigfile tablespace;database altered.sql> select * 2 from database_properties 3 where property_name = default_tbs_type;property_name property_value description-------------------- --------------- ----------------------------------------default_tbs_type bigfile default tablespace typesql>

sql> alter database set default smallfile tablespace;

创建 bigfile 类型的表空间,只需指定额外的一个参数 bigfile 即可,其他和原有创建表空间语法类似:

create bigfile tablespace bftbs datafile /u01/app/oracle/oradata/demo/bftbs01.dbf size 5m;

dba_tablespaces (user_tablespaces)与 v$tablespace 这两个视图可以查看 bigfile 表空间的相关信息。先看看 dba_tablespaces 在 10g 中有了什么变化:

sql> desc dba_tablespaces name null? type ----------------------------------------- -------- ------------------------ tablespace_name not null varchar2(30) block_size not null number initial_extent number next_extent number min_extents not null number max_extents number pct_increase number min_extlen number status varchar2(9) contents varchar2(9) logging varchar2(9) force_logging varchar2(3) extent_management varchar2(10) allocation_type varchar2(9) plugged_in varchar2(3) segment_space_management varchar2(6) def_tab_compression varchar2(8) retention varchar2(11) bigfile varchar2(3)sql>

和 9i 相比, dba_tablespaces 视图多了两列:retention 和 bigfile。其中 bigfile 列说明该表空间是否为 bft:

sql> select tablespace_name, bigfile 2 from dba_tablespaces;tablespace_name big------------------------------ ---system noundotbs nosysaux notemp nousers noexample notest nobftbs yes8 rows selected.
v$tablespace 视图相对 9i 也增加了新的列: 
sql> desc v$tablespace name null? type ----------------------------------------- -------- ------------------------ ts# number name varchar2(30) included_in_database_backup varchar2(3) bigfile varchar2(3) flashback_on varchar2(3)

其中 flashback_on 和 bigfile 列都是新增的。
bft 属性
bft有一些特有的属性。

1.每个表空间只能包含一个数据文件。如果试图添加新的文件,则会报告 ora-32771 错误:

sql> alter tablespace bftbs 2 add datafile /u01/app/oracle/oradata/demo/bftbs02.dbf size 5m;alter tablespace bftbs*error at line 1 ora-32771: cannot add file to bigfile tablespace

2.只有自动段空间管理的 lmt (locally managed tablespaces ) 支持 bft

sql> create bigfile tablespace bftbs02 2 datafile /u01/app/oracle/oradata/demo/bftbs02.dbf size 5m 3 extent management dictionary;create bigfile tablespace bftbs02*error at line 1 ora-12913: cannot create dictionary managed tablespacesql> create bigfile tablespace bftbs02 2 datafile /u01/app/oracle/oradata/demo/bftbs02.dbf size 5m 3 segment space management manual;create bigfile tablespace bftbs02*error at line 1 ora-32772: bigfile is invalid option for this type of tablespace

3.相对文件号(relative_fno)为1024 ( 4096 on os/390)

因为bft只有一个数据文件,所以其相对文件号也是固定的:1024

sql> select tablespace_name, file_id, relative_fno 2 from dba_data_files;tablespace_name file_id relative_fno------------------------------ ---------- ------------users 4 4sysaux 3 3undotbs 2 2system 1 1example 5 5test 6 6bftbs 7 10247 rows selected.sql>

4.rowid的变化

在 bft 上存储的表的 rowid 与 smallfile 表空间上的 rowid 结构有些不同的。要正确得到 rowid 信息,dbms_rowid 包增加了一个新的参数 ts_type_in 来解决这个问题。参考这个范例:

sql> select dbms_rowid.rowid_block_number (rowid, bigfile) 2 from foo;dbms_rowid.rowid_block_number(rowid,bigfile)---------------------------------------------- 24sql> 
你可以创建多大的表空间? 
我们在前面提及,bft 还受到操作系统的文件系统的限制。下面我们以 linux 操作系统为例:

sql> show parameters db_block_sizename type value------------------------------------ ----------- ------------------------------db_block_size integer 8192sql> 
也就是说,理论上我们可以创建最大 32t (4g*8k) 的表空间。我们可以做到么? 
sql> create bigfile tablespace bftbs02 2 datafile /u01/app/oracle/oradata/demo/bftbs02.dbf size 20t reuse;create bigfile tablespace bftbs02*error at line 1 ora-01119: error in creating database file /u01/app/oracle/oradata/demo/bftbs02.dbfora-27059: could not reduce file sizelinux error: 27: file too largeadditional information: 2sql>

注意我们得到的操作系统信息(黑色部分):file too large 。这说明超出了操作系统允许值。我所用的环境是fedora core linux, 内核的版本是2.6.9,文件系统是 ext3 。2.4以后的版本的内核都是支持 lfs (large file support)的。
文件系统(块)文件大小限制文件系统大小限制ext2/3 (2k)256g8text2/3 (4k)2t16text2/3 (8k)64t32treiserfs 3.6 1e16t
我们检查一下os文件系统块大小:

[root@fc3 ~]# tune2fs -l /dev/hda7 | grep blockblock count: 2621440block size: 4096blocks per group: 32768[root@fc3 ~]#

也即,我们可以在操作系统上创建不大于 2t 的文件。虽然我们没有那么大的存储空间,不妨也测试一下:

sql> create bigfile tablespace bftbs02 2 datafile /u01/app/oracle/oradata/demo/bftbs02.dbf size 1800g;

在另外一个终端中,观察该目录的变化情况:

[root@fc3 demo]# ls -ltrtotal 1159048-rw------- 1 oracle oracle 5251072 nov 28 20:05 bftbs01.dbf-rw------- 1 oracle oracle 1932735291392 nov 28 20:49 bftbs02.dbf[root@fc3 demo]#

哇,我们真的能观察到oracle在创建“超大”文件呢,接近1.8t 的文件 :-) 要过一会儿,oracle 才会报告错误(毕竟1800g 的大文件):

create bigfile tablespace bftbs02*error at line 1 ora-19502: write error on file "/u01/app/oracle/oradata/demo/bftbs02.dbf",blockno 898048 (blocksize=8192)ora-27072: file i/o erroradditional information: 898047

可见,在本例中,由于操作系统文件系统的限制,我们只可以创建2t以下的 bft。
你需要bft么?
应用 bft 的话,优点缺点都存在。根据 oracle 官方的文档,db_files 和 maxdatafiles 这两个参数的值给 sga 带来的压力会减轻(原来的压力就很大么?)。数据库中最大数据文件数是有限的 (64k files),bft 的出现的确对海量数据库有一定的积极意义。从一定程度上来说,bft 简化了管理,但是在恢复的时候可能是一场灾难。

在笔者看来,至少我们现在在大多数情况下不需要用 bft 。"你要把鸡蛋都放到一个篮子里么? "


参考信息

oracle database administrators guide 10g release 1 (10.1) part number b10739-01 ( note 62294.1 ) 
large file support in linux - 
http://www.suse.de/~aj/linux_lfs.html
metalink [note:262472.1] 10g: bigfile type tablespaces versus smallfile type

=============================================

大文件表空间
Oracle允许你创建大文件表空间。这允许Oracle数据库包含由一个大文件而不是多个小文件组成的表空间。这使得Oracle可以利用64位系统的优势来创建和管理超大文件。这样的结果是Oracle数据库可以扩大至8EB(1EB = 1,073,741,824 (1024**3)GB)。

在Oracle管理文件的情况下,大文件表空间使得数据文件对用户来说完全透明。换句话说,你可以在表空间上执行操作,而不是在底层的数据文件上操作。大文件表空间使得表空间成为磁盘空间管理、备份、恢复等等的主要单位。大文件表空间还简化了Oracle管理文件和自动存储管理的文件管理,因为它降低了增加新文件和处理多个文件的必要性。

系统默认是创建一个小文件表空间,这也是Oracle表空间的传统格式。SYSTEM和SYSAUX表空间总是创建为系统默认类型。

大文件表空间只支持使用自动段空间管理的本地管理表空间的情况。不过也有两个例外:本地管理的undo表空间和临时表空间即使在段空间手动管理的情况下也可以是用大文件表空间。

一个Oracle数据库可以同时包含大文件和小文件表空间。表空间的不同类型对于执行没有明确指定数据文件的SQL语句来说是没有多大区别。

你可以创建一个临时表空间组,这样一个用户就可以从多个表空间获得临时空间了。表空间组也可以指定为数据库的默认临时表空间。这对于大文件表空间很有用,这里你可能需要大量的临时表空间来进行排序。

大文件表空间的优点

* 大文件表空间可以有效的提高一个Oracle数据库的存储容量。小文件表空间能够包含1024个数据文件,但是大文件表空间可以只包含一个1024倍小文件表空间大小的文件。小文件表空间和大文件表空间总容量是相同的。虽然如此,由于存在一个数据库数据文件数不能超过64K的限制,一个包含大文件表空间的数据库可以1024倍小文件表空间的数据库,所以大文件表空间提升了整个数据库容量达3个数量级。换句话说,当文件表空间使用最大块大小(32K)时,Oracle数据库的最大尺寸是8EB。

* 超大规模的数据库中使用大文件表空间可以简化数据文件的管理,因为它降低了需要数据文件的数目。你也可以调整参数来减少数据文件信息需要的SGA空间和控制文件的大小。

* 通过数据文件透明来简化了数据库管理。

使用大文件表空间应该注意

* 大文件表空间倾向于在自动存储管理或者其他的支持自动扩展的逻辑卷和条带化的逻辑卷管理或者RAID的情况下使用。

* 避免在不支持条带化的系统上创建大文件数据库。因为它不支持并发执行和并发RMAN备份。

* 避免在下列情况下使用大文件表空间:磁盘组中没有足够的空闲空间,只能通过在另外一个磁盘组中增加数据文件的方式扩展表空间。

* 不推荐在不支持大文件尺寸的平台上使用大文件数据库,因为这会限制表空间容量。参考你的操作系统规格文档来获得支持的最大的文件大小的信息。

* 在大文件表空间上而不是在传统表空间上保存数据,可以提高数据库打开、检查点和DBWR进程的性能。虽然如此,提高数据文件大小可能会增加创建一个新数据文件或者恢复一个被破坏的数据文件所需的时间。

 

=============================================

ORA-01653: Unable to extend table %s.%s by %s in tablespace %s

The tablespace the table is residing in is unable to extend.

There is not enough space left either due to the datafiles being full, autoextend which is not set at datafile level or due to a disk which's full.

You'll have to check the size of the datafiles attached to the tablespace and check whether they can autoextend or not.. 
select file_name, bytes, autoextensible, maxbytesfrom dba_data_fileswhere tablespace_name='TABLESPACE_NAME'
Either add more datafiles to the tablespace, set the autoextensible flag or enlarge the datafile(s).

To add more space to a file issue following command: 
alter database datafile 'C:/ORACLE/ORADATA/TOOLS01.DBF' resize 1000m;

To turn on the autoextend feature on a datafile use following command:

alter database datafile 'C:/ORACLE/ORADATA/TOOLS01.DBF' autoextend on next 100m maxsize 2000m;

To add a new datafile to the tablespace use following command:
alter tablespace TOOLS add datafile 'C:/ORACLE/ORADATA/TOOLS02.DBF' size 100m autoextend on next 100m maxsize 2000m;

=============================================
ORA-01653
Unable to extend table XXX by 8192 in tablespace XXX

--check tablespace usage
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC;


--check autoextensible
SELECT T.TABLESPACE_NAME,D.FILE_NAME,
D.AUTOEXTENSIBLE,D.BYTES,D.MAXBYTES,D.STATUS
FROM DBA_TABLESPACES T,DBA_DATA_FILES D
WHERE T.TABLESPACE_NAME =D.TABLESPACE_NAME
ORDER BY TABLESPACE_NAME,FILE_NAME;

发现MAXBYTES为34359721984,而其中一个数据文件已经接近于这个值。
原来我们的ORACLE db_block_size = 8192
我们的AIX中已经设置了fsize=-1 (/etc/secrucity/limits)
It is not an OS limitation.
It is an Oracle limitation.
Using 8k block size the maximum file size is 32G.

(2^22-1)*8192=34359730176
(2^22-1)*8192/1024/1024/1024= 31.99999237G

SQL> alter database datafile '/u02/oradata/PROD/app_data.dbf' resize 40960M;
alter database datafile '/u02/oradata/PROD/app_data.dbf' resize 40960M
*
ERROR at line 1:
ORA-01144: File size (5242880 blocks) exceeds maximum of 4194303 blocks

 

action:

alter tablespace TABLE_SPACE add datafile '/u02/oradata/PROD/app_data1.dbf' size 500M;

alter datafile '/u02/oradata/PROD/app_data1.dbf' autoextend on next 10240K maxsize unlimited;

原创粉丝点击