4.1 传统磁盘空间存储
在使用第三方逻辑卷或Oracle自动存储管理(稍后将讨论)的时候,必须能够管理数据库中的物理数据文件,从而确保高级别的性能、可用性和可恢复性。一般来说,这意味着将数据文件分散到不同的物理磁盘。通过在不同磁盘上保存重做日志文件和控制文件的镜像副本,除了可以确保可用性外,当用户访问驻留在多个物理磁盘(而不是一个物理磁盘)上的表空间中的表时,还可以有效地提高I/O性能。标识特定磁盘卷上的I/O瓶颈或存储缺陷只是完成了一半工作,一旦标识了瓶颈,就需要使用各种工具和知识将数据文件移到不同的磁盘。如果数据文件空间过多或空间不够,则调整已有数据文件的大小是一项常见任务。
本节将讨论重设表空间大小的不同方法,无论这些表空间是小文件表空间还是大文件表空间。此外,还将介绍将数据文件、联机重做日志文件和控制文件移到不同磁盘的最常见方法。
4.1.1 重设表空间和数据文件的大小
在理想数据库中,应按最优的大小创建所有的表空间和其中的对象。主动重设表空间的大小或建立自动扩展的表空间可潜在地避免对性能的影响,这些性能影响发生在表空间扩展或由于表空间中的数据文件无法扩展而造成应用程序失败的情况下。第6章将介绍监控空间利用率的更多细节。
重设表空间大小的过程和方法存在细微区别,具体取决于表空间是小文件表空间还是大文件表空间。小文件表空间是Oracle 10g之前唯一可用的表空间类型,可由多个数据文件组成。与之相反,大文件表空间可只由一个数据文件组成,但该数据文件可远大于小文件表空间中的数据文件:具有32KB块的大文件表空间可拥有最大为128TB的数据文件。此外,大文件表空间必须是本地管理的。
1.使用ALTER DATABASE重设小文件表空间的大小
在下面的示例中,尝试重设USERS表空间的大小,该表空间包含一个数据文件,并且开始时的大小为5GB。首先,将其调整为15GB,然后意识到该表空间过大,将其缩减到10GB。接下来,尝试更多地缩减该表空间的大小。最后,尝试增加该表空间的大小。
如果可用的空闲空间不支持重新调整大小的请求,或数据超出请求减少的大小,或者超出Oracle文件大小的限制,则Oracle都会返回错误。
为避免被动地手动调整表空间的大小,可在修改或创建数据文件时使用AUTOEXTEND、NEXT和MAXSIZE子句进行主动调整。表4-1列出了ALTER DATAFILE和ALTER TABLESPACE命令中用于修改或创建数据文件的与空间相关的子句。
表4-1 数据文件扩展子句
在以下示例中,针对数据文件/u01/app/oracle/oradata/rmanrep/users01.dbf,设置AUTOEXTEND为ON,指定数据文件的每次扩展为500MB,并指定数据文件的大小总计不能超出10GB:
SQL> alter database 2 datafile '/u01/app/oracle/oradata/rmanrep/users01.dbf' 3 autoextend on 4 next 500MB 5 maxsize 10GB; Database altered.
如果包含数据文件的磁盘卷没有可用于数据文件扩展的磁盘空间,则必须将数据文件移到另一个磁盘卷,或创建位于另一个磁盘卷上的表空间的第二个数据文件。在该例中,将第二个数据文件添加到不同磁盘卷上的USERS表空间,该表空间的初始大小为500MB,允许自动扩展数据文件,且每次扩展100MB,最大数据文件大小为2000MB(2GB):
SQL> alter tablespace users 2 add datafile '/u03/oradata/users02.dbf' 3 size 500MB 4 autoextend on 5 next 100MB 6 maxsize 2000MB; Tablespace altered.
注意,修改表空间中的已有数据文件时,使用ALTER DATABASE命令,而将数据文件添加到表空间时,使用ALTER TABLESPACE命令。如稍后所看到的那样,使用大文件表空间可简化这些类型的操作。
2.使用EM Database Express调整小文件表空间的大小
使用EM Database Express,可使用前面描述的两种方法中的任何一种:增加大小并针对表空间的单个数据文件启用自动扩展,或添加第二个数据文件。
调整小文件表空间中的数据文件 为在EM Database Express中调整数据文件的大小,从数据库实例主页中选择Storage | Tablespaces。在图4-1中,已经选择了XPORT表空间,它所分配空间的利用率已超过80%,因此通过扩展现有数据文件的大小来扩展它的大小。此表空间最初是使用如下命令创建的:
create tablespace xport datafile '/u02/oradata/xport.dbf' size 1000m autoextend on next 500m maxsize 2000m;
图4-1 使用EM Database Express编辑表空间特性
接下来将不设置表空间的数据文件自动扩展,而将其当前大小从1000MB改为2000MB。
单击XPORT左侧的“+”图标,可看到XPORT表空间的其他特征,如图4-2所示。单个数据文件是/u02/oradata/xport.dbf。
使用选中的单个XPORT数据文件,选择Actions | Resize,将看到如图4-3所示的Resize Datafile对话框,可在其中更改数据文件的大小。将文件大小改成2G(2000MB),然后单击OK按钮。
在提交更改前,最好在即将执行DDL操作的所有页面上单击Show SQL按钮,从而查看要执行的SQL命令。这是复习SQL命令语法的好方法。下面是单击OK按钮时执行的命令:
ALTER DATABASE DATAFILE '/u02/oradata/xport.dbf' RESIZE 2G
图4-2 表空间特征
图4-3 编辑表空间的数据文件
单击OK按钮时,Oracle更改数据文件的大小。表空间反映出成功的操作以及数据文件的新大小,如图4-4所示。
图4-4 调整数据文件大小的结果
将数据文件添加到小文件表空间 将数据文件添加到小文件表空间和使用EM Database
Express调整数据文件大小一样容易。在前面的示例中,将XPORT表空间的数据文件扩展到2000MB。因为包含XPORT表空间数据文件的文件系统(/u02)容量已满,所以必须关闭已有数据文件上的AUTOEXTEND,然后在不同的文件系统上创建新的数据文件。要为Tablespaces页面的现有数据文件关闭AUTOEXTEND,选择Actions | Edit Auto Extend。如图4-5所示,在打开的对话框中,取消选中Auto Extend复选框,然后单击OK按钮。下面是单击OK按钮时为该操作执行的SQL命令。
ALTER DATABASE DATAFILE '/u02/oradata/xport.dbf' AUTOEXTEND OFF;
图4-5 编辑表空间的数据文件特征
要在/u04上添加第二个数据文件,选择XPORT表空间,并单击Add Datafile。将看到如图4-6所示的对话框。为新数据文件指定文件名和目录位置。由于知道u04文件系统至少有500MB的空闲空间,故将/u04/oradata指定为目录,将xport2.dbf指定为文件名,当然文件名自身并不需要包含表空间名。此外,将文件大小设置为500MB。不要选中Auto Extend复选框。
图4-6 向XPORT表空间添加数据文件
单击OK按钮后,可在Tablespaces上看到XPORT表空间数据文件的新大小,如图4-7所示。
图4-7 添加数据文件的结果
3.从表空间中删除数据文件
在Oracle Database 11g之前的版本中,删除表空间中的数据文件存在一定的问题。那就是无法提交单个命令来删除数据文件,除非删除整个表空间。此时,只有3种选择:
●容忍该数据文件。
●缩减该数据文件并关闭AUTOEXTEND。
●创建新的表空间,将所有对象移到新的表空间,并删除原来的表空间。
从维护和元数据的观点看,虽然创建新的表空间是最理想的选择,但执行有关步骤很容易出错,并且表空间需要一定的停机时间,从而影响其可用性。
使用Cloud Control 12c或EM Database Express,可删除数据文件并最小化停机时间;如果要手动运行,可由Cloud Control 12c或EM Database Express生成脚本。前面的示例通过添加数据文件来扩展XPORT表空间,而这里通过重新组织表空间来删除数据文件。在如图4-7所示的Tablespace页面上,选择要删除的数据文件(在此例中是xport2.dbf),选择Actions | Drop,如图4-8所示。
图4-8 删除数据文件
如果有对象占用了要删除的指定数据文件,必须重新组织表空间,将所有对象移到第一个数据文件,或新建一个表空间,将对象迁移到新的表空间。
4.使用ALTER TABLESPACE调整大文件表空间的大小
大文件表空间由且仅由一个数据文件组成。第6章将介绍关于大文件表空间的更多内容,本节仅介绍一些重新调整大文件表空间大小的细节。用于改变表空间数据文件特征(如最大尺寸、是否完全可扩展及盘区大小)的大多数参数现在都可在表空间级别修改。首先创建一个大文件表空间,如下所示:
create bigfile tablespace dmarts datafile '/u05/oradata/dmarts.dbf' size 750m autoextend on next 100m maxsize 50g;
只在具有小文件表空间的数据文件级别进行的有效操作,才可以在表空间级别用于大文件表空间:
SQL> alter tablespace dmarts resize 1g;
Tablespace altered.
虽然将ALTER DATABASE和DMARTS表空间的数据文件规范一起使用也可以起作用,但使用ALTER TABLESPACE语法的优点是显而易见的:不需要知道数据文件存储在何处。你可能已经料到,在具有小文件表空间的表空间级别尝试改变数据文件参数是不允许的:
SQL> alter tablespace users resize 500m;
alter tablespace users resize 500m
*
ERROR at line 1:
ORA-32773: operation not supported for smallfile tablespace USERS
如果大文件表空间因为其单个数据文件无法在磁盘上扩展而用尽空间,则需要将数据文件重新分配到另一个卷,4.1.2小节将讨论这一点。使用本章后面介绍的自动存储管理(ASM),完全可能做到不需要手动移动数据文件:不需要移动数据文件,只要添加另一个磁盘卷到ASM存储组即可。
4.1.2 移动数据文件
为更好地管理数据文件的大小或改进数据库的整体I/O性能,可能需要将表空间中的一个或多个数据文件移到不同位置。重新定位数据文件有3种方法:使用ALTER DATABASE命令、使用ALTER TABLESPACE命令,以及通过EM Database Control或EM Database Express(尽管EM Database Control和EM Database Express没有提供重新定位数据文件需要的所有命令)。
对于Oracle Database 11g和更早版本,除了SYSTEM、SYSAUX、联机撤消表空间及临时表空间外,ALTER TABLESPACE方法可用于其他所有表空间中的数据文件。ALTER DATABASE方法可用于所有表空间中的数据文件,因为在进行移动操作时实例将被关闭。
如果正在使用Oracle Database 12c,可在整个数据库联机时移动任何数据文件,甚至从传统文件系统移动到ASM,或从ASM移动到传统文件系统。但使用该方法时会产生一点开销,应查看服务级别协议(Service-Level Agreement,SLA),并确保移动操作不会对响应时间产生负面影响。
1.使用ALTER DATABASE移动数据文件
使用ALTER DATABASE移动一个或多个数据文件的步骤如下:
(1)作为SYSDBA连接到数据库,并且关闭实例。
(2)使用操作系统命令移动数据文件。
(3)以MOUNT模式打开数据库。
(4)使用ALTER DATABASE改变对数据库中数据文件的引用。
(5)以OPEN模式打开数据库。
(6)对包括控制文件的数据库执行增量备份或完整备份。
在下面的示例中,将介绍如何将XPORT表空间的数据文件从文件系统/u02移到文件系统/u06。首先,用如下命令以SYSDBA权限连接到数据库:
sqlplus / as sysdba
接下来,使用针对动态性能视图V$DATAFIL和V$TABLESPACE的查询,确认XPORT表空间中数据文件的名称。
为完成步骤(1),关闭数据库:
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL>
对于步骤(2),在SQL*Plus中,使用“!”转义字符,执行操作系统命令,以移动数据文件:
SQL> ! mv /u02/oradata/xport.dbf /u06/oradata
在步骤(3)中,以MOUNT模式启动数据库,从而在不需要打开数据文件的情况下就可以使用控制文件:
SQL> startup mount
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1299112 bytes
Variable Size 230690136 bytes
Database Buffers 184549376 bytes
Redo Buffers 6131712 bytes
Database mounted.
对于步骤(4),改变控制文件中的路径名引用,以将其指向数据文件的新位置:
SQL> alter database rename file 2 '/u02/oradata/xport.dbf' to 3 '/u06/oradata/xport.dbf'; Database altered.
在步骤(5)中,打开数据库,使用户可使用该数据库:
SQL> alter database open; Database altered.
最后,在步骤(6)中,建立更新过的控制文件的备份副本:
SQL> alter database backup controlfile to trace; Database altered. SQL>
也可选用RMAN执行增量备份,其中包括了控制文件的备份。
2.使用ALTER TABLESPACE以脱机模式移动数据文件(11g或更早版本)
如果希望移动的数据文件是某个表空间的一部分,而该表空间不是SYSTEM、SYSAUX、活动的撤消表空间或临时表空间,则使用ALTER TABLESPACE方法移动表空间会更好一些,其主要原因在于:除了其数据文件将被移动的表空间外,所有用户在整个操作期间都可以使用数据库的剩余部分。
使用ALTER TABLESPAC移动一个或多个数据文件的步骤如下:
(1)使用具有ALTER TABLESPACE权限的账户,对表空间进行脱机处理。
(2)使用操作系统命令移动数据文件。
(3)使用ALTER TABLESPACE改变对数据库中数据文件的引用。
(4)将表空间返回到联机状态。
在ALTER DATABASE示例中,假设将XPORT表空间的数据文件移到错误的文件系统。在本例中,将数据文件从/u06/oradata移到/u05/oradata:
alter tablespace xport offline; Tablespace altered. ! mv /u06/oradata/xport.dbf /u05/oradata/xport.dbf alter tablespace xport rename datafile '/u06/oradata/xport.dbf' to '/u05/oradata/xport.dbf'; Tablespace altered. alter tablespace xport online; Tablespace altered.
需要注意,该方法比ALTER DATABASE方法更直观并且中断更少。XPORT表空间唯一的停机时间是将数据文件从一个磁盘卷移到另一个磁盘卷所用的时间量。
3.联机移动数据文件(Oracle Database 12c)
在Oracle Database 12c中,可在包含数据文件的表空间依然联机时,从ASM磁盘组移出数据文件,或将数据文件移入ASM磁盘组。这使DBA更容易管理Oracle的使用,用户也能更方便地使用Oracle数据库。
在本例中,DMARTS表空间驻留在/u02文件系统中,需要将其移到+DATA磁盘组。
在表空间依然联机时,可用一条命令,成功将DMARTS表空间中的单个数据文件移到+DATA磁盘组。
SQL> alter database 2 move datafile '/u02/oradata/dmartsbf.dbf' 3 to '+DATA'; Database altered.
4.1.3 移动联机重做日志文件
虽然通过删除整个重做日志组并在不同的位置重新添加这些组,可以间接移动联机重做日志文件,但是,如果只有两个重做日志文件组,则这种解决方案将不起作用,因为数据库不会在只有一个重做日志文件组的情况下打开。如果数据库必须保持打开状态,可选择临时添加第3个组并删除第一个或第二个组。也可以关闭数据库,并用以下方法移动重做日志文件。
在下面的示例中,有3个重做日志文件组,每个组有两个成员。每个组都有一个成员位于与Oracle软件相同的卷上,因此应将其移动到不同卷,以消除填充日志文件与访问Oracle组件之间的争用问题。这里使用的方法非常类似于使用ALTER DATABASE移动数据文件时所采取的方法。
重做日志文件不再和Oracle软件竞争I/O。另外,在两个不同的挂载点/u04和/u05之间多元复用了重做日志文件。
4.1.4 移动控制文件
在使用初始参数文件时,移动控制文件的步骤类似于前面移动数据文件和重做日志文件的过程:关闭实例,使用操作系统命令移动文件,然后重新启动实例。
然而,在使用服务器参数文件(SPFILE)时,该过程稍有不同。当实例正在运行,或者实例已经关闭但以NOMOUNT模式打开时,应使用ALTER SYSTEM . . . SCOPE=SPFILE改变初始文件参数CONTROL_FILES。由于CONTROL_FILES参数不是动态参数,因此无论何种情况都必须先关闭实例,然后重新启动。
在本例中,数据库中有控制文件的3个副本,但没有在不同的磁盘上实现多元复用。使用新位置编辑SPFILE,关闭实例,将控制文件移到不同的磁盘,然后再重新启动实例。
至此已将3个控制文件移到单独的文件系统,不再位于具有Oracle软件的卷上,且具有较高的可用性配置(如果包含一个控制文件的卷失败,那么其他两个卷包含更新的控制文件)。
注意:
在对表空间存储和闪回恢复区使用ASM磁盘的Oracle Database 11g或12c默认安装中,控制文件的一个副本在默认表空间ASM磁盘中创建,另一个副本在闪回恢复区中创建。
将控制文件的一个或多个副本放到ASM卷很容易:使用RMAN实用工具(第12章将详细介绍),将控制文件备份还原到ASM磁盘位置即可,如以下示例所示:
RMAN> restore controlfile to '+DATA/dw/controlfile/control_bak.ctl';
下一步与前面介绍的添加基于文件系统的控制文件的步骤是相同的:改变CONTROL_FILES参数,除已有控制文件位置外,添加位置+DATA/dw/controlfile/control_ bak.ctl,然后关闭数据库,再重新启动数据库。
类似地,可使用Linux实用工具asmcmd,将控制文件从一个磁盘组复制到另一个磁盘组,并改变CONTROL_FILES参数,以反映控制文件的新位置。稍后将概括介绍asmcmd命令。