<P></P><P>该文档包含了运用ALTER DATABASE DATAFILE RESIZE命令来重新设置数据文件大小的方法 范围及应用 Instructional 如何重设数据文件的大小: 数据文件的管理拥有两面性:没有足够的空间分配给现有的数据文件,又或者是在现有的数据文件中没有充足的空间。典型的解决方案是删掉并用足够大小的数据文件重建表空间,或者向表空间中添加更多的数据文件。oracle提供了一个比较简单的方法来重设数据库中数据文件的大小。 从RDBMS 7.2,开始,你可以使用新的命令对数据文件进行操作,该命令就是:RESIZE。此命令允许你改变数据文件的物理大小使其在创建的时候被指定。 1. 增加数据文件的大小 2. 降低数据文件的大小 3. 注意和警告 尝试在7.2版本之前使用resize命令将收到以下错误 ORA-00923: FROM keyword not found where expected(没有发现关键字——RESIZE) 1. 增加数据文件大小 为了增加数据文件的大小,你可以使用一下命令: ALTER DATABASE DATAFILE '' RESIZE [K|M|G];在这里定义的文件大小要比现有的数据文件大。通过V$DATAFILE来查看刚刚的设置。BYTES列显示的即为刚刚设置的数据文件的大小,CREATE_BYTES列指的是文件被创建时所指定的大小。数据文件的大小在操作系统级别上也是被修改了 举个例子: SELECT FILE#, STATUS, ENABLED, CHECKPOINT_CHANGE#, BYTES, CREATE_BYTES, NAME FROM V$DATAFILE; FILE# STATUS ENABLED CHECKPOINT BYTES CREATE_BYT NAME ------ ------- ---------- ---------- ---------- ---------- ---------------- 5 ONLINE READ WRITE 7450 2097152 102400 /databases/oracle/test.dbf 该文件创建时的大小为100K (CREATE_BYTES) ,通过RESIZE命令被增加到2M (BYTES) . 2. 减小数据文件的大小 3. 你可以使用相同的命令来减小数据文件的大小,只是重新定义了比现有的数据文件更小的一个值。例如,我们可以用命令将上述文件减小回1M的大小 ALTER DATABASE DATAFILE '/databases/oracle/test.dbf' RESIZE 1M; 缩减数据文件比增加了数据文件大小更复杂,因为你不能对数据库对象当下正在使用的数据文件进行空间释放。为了从数据文件中删除的空间,在数据文件的尾部必须要有连续空间通过查看 DBA_FREE_SPACE 视图来判断在数据文件中有多少的空间没有被使用。 例如: SELECT * FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME='TEMP' ORDER BY BLOCK_ID; TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS ------------------ ---------- ---------- ---------- ---------- TEMP 4 2 102400 50 TEMP 4 55 96256 47 TEMP 4 102 1890304 923 在数据文件的的高端存在两个大的extents(BLOCK_ID=55 contains 47 blocks, and BLOCK_ID=102 contains 923 blocks),这也就意味着在数据文件的末端存在1986560 bytes接近2M的空间未被使用。我们取决于该数据文件的对象是如何分配新的分区来为数据文件的增长留出一些空间,我们可以从数据文件中删除1.89 MB的磁盘空间而不损害任何表空间中的对象 如果在数据文件的中间有大的空闲分区,并且某些对象在数据文件的尾部占用了空间,你可以通过下面的FINDEXT.SQL查询来找出这些对象。如果将此对象导出,再删掉对象,就可以使连续的空闲空间上升到数据文件的尾部,这样就可以将此数据文件重新设置为更小的值。但是一定要保留足够的空间来确保可以把之前导出的对象再导回到表空间中。 3.注意和警告 为安全起见,每当改变其数据库结构包括改变数据文件的大小的时候我们都应该先备份数据库 如果尝试将数据文件重设的大小小于用来在数据文件中保存数据库对象所需的空间大小时,将会返回以下的错误: ORA-03297: file contains blocks of data beyond requested RESIZE value Or ORA-03297: file contains used data beyond requested RESIZE value 此时,RESIZE 操作将会失败 如果尝试重设数据文件的大小大于允许被创建的大小时,也会报错。例如,尝试创建一个2G的文件,但是没有2G的磁盘空间提供,将会报以下的错: ORA-01237: cannot extend datafile ORA-01110: data file : '' ORA-19502: write error on file "", blockno (blocksize=) ORA-27072: File I/O error 当你通过V$DATAFILE查看时,除非之前的操作成功,否则文件的大小将不会被改变。 MANUAL 与 AUTOMATIC 扩展: 为数据文件定义AUTOEXTEND(自动增长)属性必须要谨慎,要指定NEXT和MAXSIZE参数,如果使用的是数据字典管理表空间,在表空间级别上设置适当的存储参数默认值和MAXEXTENTS参数,避免使用UNLIMITED以防止拥有大量的分区的对象被创建,它带来的不仅仅是数据字典中产生大量的记录,并且当删除那些对象的时候由于SMON进程将消耗掉所有它所能获得的CPU资源,所以删除操作将会消耗大量的时间。。 如果在RDBMS版本低于7.3.4.1的系统中使用多个DBWR进程(db_writers > 1),可能会出现bug:311905。当访问一个已经被RESIZE的数据文件时,将会报ORA-7374的错误。遇到这种错误的解决方法就是在重设数据文件的大小后先关掉再重启数据库(在一个方便的时间备份数据库)。这将使得对于所有的DBWR从进程来讲,新的数据文件的大小信息被刷新。 FINDEXT.SQL 该脚本用来根据给出的数据文件来查找数据库对象的位置 -----------CUT-----------------CUT-----------------CUT-------- ###这个脚本提示用户数据文件的ID号,并且列出包含有数据文件的所有的段,起始的数据块块号,以及一个段中包含多少数据块,显示了拥有者,段名,以及段的类型。### SET ECHO OFF ttitle - center 'Segment Extent Summary' skip 2 col ownr format a8 heading 'Owner' justify c col type format a8 heading 'Type' justify c trunc col name format a28 heading 'Segment Name' justify c col exid format 990 heading 'Extent#' justify c col fiid format 9990 heading 'File#' justify c col blid format 99990 heading 'Block#' justify c col blks format 999,990 heading 'Blocks' justify c select owner ownr, segment_name name, segment_type type, extent_id exid, file_id fiid, block_id blid, blocks blks from dba_extents where file_id = &file_id order by block_id / -----------------CUT--------------CUT---------------CUT------ Example Output: SQL> @findext.sql Enter value for file_id: 5 old 12: file_id = &file_id new 12: file_id = 5 Segment Extent Summary Owner Segment Name Type Extent# File# Block# Blocks -------- ------------ -------- ------- ------ ------- -------- USER EMP TABLE 0 5 2 5 USER TAB3 TABLE 0 5 108 5 USER TEST TABLE 0 5 348 5 USER PK_EMP INDEX 0 5 483 5 USER EMP TABLE 1 5 433 5 USER EMP TABLE 2 5 438 10 USER PK_EMP INDEX 1 5 488 10 注意: 请注意'alter database datafile resize'命令也可用导出/导入工具替代来完成数据文件大小的重设。使用导出/导入工具也将导致相关数据文件所在的表空间里的对象的重组。 Errors ORA-1110; ORA-1237; ORA-3297; ORA-923; ORA-9971</P><P></P>
|