查看文章 |
[ORACLE]:单个表空间的数据限制 FAT12 单文件最大支持8M 解决方案: ======================================== http://www.eygle.com/archives/2007/07/oracle_datafile_limit.html Oracle数据文件的大小存在一个内部限制,这个限制是: 这个限制也就直接导致了每个数据文件的最大允许大小。 这个限制是由于Oracle的Rowid中使用22位来代表Block号,这22位最多只能代表2^22-1个数据块。 为了扩展数据文件的大小,Oracle10g中引入了大文件表空间,在大文件表空间下,Oracle使用32位来代表Block号,也就是说,在新的技术下,大文件表空间下每个文件最多可以容纳4G个Block。 上周在做2K block_size测试时,第一次遇到了这个限制:
缩减一点,最后创建成功:
表空间已更改。 已用时间: 00: 44: 42.08
够惊人的了吧。 ============================================= 目前常见的主要有两种情况限制文件大小: 一,操作系统文件大小限制 一般文件大小限制为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 /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参数。将大文件分片存取。 ============================================= 转fenng版主的一篇文章,bft也受限于操作系统的文件系统,不过在一定程度上扩展了单个表空间、单个文件的大小,不过只能建一个文件。 简单介绍 大文件表空间从某种角度来说提高了 oracle 在 vldb 上的管理能力。 只有自动段空间管理的 lmt (locally managed tablespaces ) 支持 bigfile 表空间。 大文件表空间只能包含一个文件,但是文件可以达到 4g 个数据块大小。(以下用 bft 指代 bigfile tablespace。) bft 可以和以下存储技术结合使用: 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. ----------------------------------------- -------- ------------------------ ts# number name varchar2(30) included_in_database_backup varchar2(3) bigfile varchar2(3) flashback_on varchar2(3) 其中 flashback_on 和 bigfile 列都是新增的。 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) ---------------------------------------------- 24 sql> sql> show parameters db_block_sizename type value ------------------------------------ ----------- ------------------------------ db_block_size integer 8192 sql> 注意我们得到的操作系统信息(黑色部分):file too large 。这说明超出了操作系统允许值。我所用的环境是fedora core linux, 内核的版本是2.6.9,文件系统是 ext3 。2.4以后的版本的内核都是支持 lfs (large file support)的。 [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 。"你要把鸡蛋都放到一个篮子里么? "
oracle database administrators guide 10g release 1 (10.1) part number b10739-01 ( note 62294.1 ) ============================================= 大文件表空间 在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.. To add more space to a file issue following command: 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: ============================================= --check tablespace usage
发现MAXBYTES为34359721984,而其中一个数据文件已经接近于这个值。 (2^22-1)*8192=34359730176 SQL> alter database datafile '/u02/oradata/PROD/app_data.dbf' resize 40960M; 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; |

