第5章 存储管理

更新时间:2024-02-01 16:37:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第5章 存储管理

本章主要介绍表空间管理、数据文件、临时表空间、日志文件以及OMF等知识。

5.1 表空间

Oracle数据库把数据物理存储在数据文件中,通过逻辑对象来访问这些数据。表空间在操作系统级映射到一个或多个数据文件,这些数据文件是真正的物理数据库。

表空间有两类,一类是系统表空间SYSTEM和辅助系统表空间SYSAUX,这两个表空间在创建数据库时新建,不能重命名、不能删除,包含了Oracle数据库的所有数据字典信息。另一类是非系统表空间,如用户表空间USERS、临时表空间TEMP、工具表空间TOOLS、索引表空间INDEX及回退表空间UNDO等。

用户在设计数据库时,往往根据应用系统的不同,将数据库划分为若干个不同的表空间。不同的表空间用来存储不同业务逻辑的数据。

5.1.1 创建表空间

在Oracle11g中创建表空间非常容易,可以使用Oracle Enterprise Manager(OEM)来实现。创建表空间的步骤如下。

首先,在浏览器中登录OEM工具,在服务器选项卡上的存储中选择“表空间”,打开表空间界面,如图5-1所示。此界面显示数据库中所有表空间信息。

图5-1 表空间界面

单击“创建”按钮,进入创建表空间界面。在此界面的“一般信息”选项卡中,可以管理区管理、表空间类型和当前表空间的状态;向表空间添加或从中删除数据文件或者编辑数据文件等,如图5-2所示。

图5-2 创建表空间界面

下面介绍创建表空间的几个重要选项。 (1)区管理。

表空间是由段(SEGMETN)组成,表空间的空间管理就是对段的管理,而段空间的分配是以区间为单位进行的。当一个段中的所有区间都写满后,Oracle就会为该段分配新的区间。这里可以选择本地管理和字典管理。默认安装的所有表空间都是本地管理。

(2)类型。

指定创建表空间的类型,可选“永久”、“临时”或“还原”。分别介绍如下。

① “永久”选项,默认值,指定表空间用于存放永久性数据库对象。其中的“设置为默认永久表空间”选项,表示如果在创建用户时没有为该用户指定默认的表空间,将使用此表空间作为该用户的默认表空间。在该用户下创建对象时,如果没有明确指定所属的表空间,则把创建的对象存放在此表空间中。如果没有指定数据库的默认永久表空间,同时在创建用户时也没有指定默认永久表空间是哪一个,则会使用系统表空间作为该用户的默认永久表空间。数据库的永久表空间不能被删除,除非指定了另外一个表空间作为默认永久表空间。此处还可选择是否“加密”。

② “临时”选项,指定表空间仅用于存放临时对象,永久性对象都不能存放在临时表空间中。其中的“设置为默认临时表空间”选项,表示如果在创建用户时没有为该用户指定默认临时表空间,将使用此表空间作为该用户的默认临时表空间。该用户进行的排序等操作都将使用此表空间作为临时存储的地方。如果没有指定数据库的默认临时表空间,同时在创建用户时也没有指定默认临时表空间是哪一个,则会使用系统表空间作为该用户的默认临时表空间。数据库的临时表空间不能被删除,除非指定了另外一个临时表空间作为默认临时表空间。

③“还原”选项,为数据库的闪回(Flashback)特性提供撤销数据。 (3)状态。

可以选择表空间的状态为“读写”、“只读”和“脱机”,“读写”状态时允许用户对表空间进行读写操作,“只读”状态时用户只能对表空间进行读取,不能写入;“脱机”状态不允许用户访问表空间。

(4)数据文件。

指定创建表空间所包含的数据文件。如选中“使用大文件表空间” 选项,则使用大文件(Bigfile)表空间。其好处是减少了数据文件的数量,方便了数据文件的管理。选用大文件表空间,则只能有一个数据文件,大文件表空间仅可用于 Oracle10g 版或更高版本的数据库,且仅在本地管理表空间中才能获得支持。由于大文件表空间最大可达 8 EB,因此可以显著提高 Oracle 数据库的存储容量。

如果不使用大文件(Bigfile)表空间,则是Smallfile,此时可以为表空间创建多个数据文件,这种方式为默认方式。

在表空间“名称”文本框中输入“XXGCX”,在区管理中选中“本地管理”,状态选中“读写”,类型选中“永久”。单击“添加”按钮,显示“添加数据文件”界面。

这里,可以为数据文件输入文件名、文件目录以及文件大小等参数。其中,“重用现有文件”选项表示如果输入的文件已经存在将重用该文件;在“存储”选项组中,如果选中“数据文件满后自动扩展(AUTOEXTEND)” 复选框,则数据文件将会自动增长,同时还需指定最大文件的大小,如果没有选中“数据文件满后自动扩展(AUTOEXTEND)”复选框,则可以指定增量大小。如输入文件名XXGCX.DBF,文件大小为100MB,选中“数据文件满后自动扩展(AUTOEXTEND)”复选框,增量大小为100KB,并选择最大文件大小为“无限制”,如图5-3所示。

图5-3 添加数据文件界面

单击“继续”按钮返回“创建 表空间”界面。此时可以看到新创建的数据文件,还可以选择”继续”按钮添加数据文件。

在“创建 表空间” 界面的“存储”选项卡中,可以选择设置表空间的存储参数。其中,“区分配”部分包括“自动”和“统一”两个选项,如果选择“自动”,则下一次扩展的区大小由Oracle系统自动确定;如果选择“统一”,则可以指定区大小。

“段空间管理”部分包括“自动”和“手动”两种选项,决定了当向表中插入数据时,如何在段的区间里选择一个可用的数据块来存放数据。如果选择“自动”单选按钮,则表空间中的对象将自动管理其空闲空间,也称为自动段空间管理(Automatic Segment Space Management,ASSM),系统通过位图块(Bitmap Block,BMB)的组织结构来实现,这将有效提高空闲空间管理的性能;如果选择“手动”,则表空间中的对象将使用空闲列表(Freelist)的形式来管理其空闲空间。创建大文件(Bigfile)的表空间时,段空间管理必须是“自动”,而不能是“手动”,否则系统会提示出错。Oracle建议使用自动段空间管理(ASSM)方式。

“压缩选项”决定数据库是否启用数据段压缩,可以有效降低磁盘和高速缓存占用率。适用于在 OLTP 和数据仓库环境中。默认为“不压缩”。

设置好的“存储”选项卡如图5-4所示。

图5-4 存储选项卡

此时,创建上述XXGCX表空间对应的SQL语句如下。

CREATE SMALLFILE TABLESPACE \

DATAFILE 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\XXGCX.DBF' SIZE 100M

AUTOEXTEND ON NEXT 100K MAXSIZE UNLIMITED LOGGING EXTENT MANAGEMENT LOCAL

SEGMENT SPACE MANAGEMENT AUTO

单击”确定”按钮,表空间创建成功。此时查看表空间列表,可以看到新建的XXGCX表空间,该表空间大小为100 MB,已经使用1MB,占用率为1%,空闲空间为99.0MB,为在线(ONLINE)状态,类型为PERMANENT(永久),区管理为LOCAL(本地管理),段管理为AUTO(自动),如图5-5所示。

图5-5 查看新建的XXGCX表空间

5.1.2 管理表空间

1.修改表空间

在表空间创建完成后,在OEM中可以选择修改表空间。在图5-5中选择要修改的表空间,如刚刚创建的表空间XXGCX,,然后单击“编辑”按钮即可进行修改,如图5-6所示。

图5-6 编辑XXGCX表空间

在“编辑 表空间”界面中,可以看到只有能够修改的属性才处于编辑状态,一些不能被修改的属性呈灰色。这是因为Oracle系统规定表空间的一些属性只能在创建表空间时设置,一旦表空间创建完成就不能被修改。

此时,可以选择修改表空间的名称和状态。通过“操作”下拉列表框,可以进入不同的修改界面。如“添加数据文件”、“类似创建”、“生成DDL”、“本地管理”、“显示表空间内容”和“脱机”等操作。如选择修改“状态”为“脱机”时,有4种脱机模式可供选择。

(1)正常:在脱机前将执行检查,将要脱机的表空间所对应的数据缓冲区中的“脏”数据写回数据文件,然后才脱机。正常脱机模式不会丢失表空间的数据,表空间下次联机时也无需进行恢复。如果表空间中的所有数据文件都没有错误,表空间可以正常脱机。

(2)临时:在脱机前执行检查,脏数据能写入数据文件就写入,不能写入的就不写入。这种脱机模式会损坏表空间中的数据。如果表空间的数据文件因写入错误脱机,然后将表空间临时脱机,在将表空间联机之前需要介质恢复。通常用于表空间中的数据部分损坏或丢失的情况。

(3)立即:在脱机前不执行检查,脏数据也不写回数据文件。如果数据库运行在非归档(Noarchivelog)模式下,表空间不能立即脱机。立即脱机模式会损坏表空间中的数据,当联机表空间时需要介质恢复。通常用于表空间中的数据全部损坏或丢失的情况。

(4)用于恢复:将恢复集中的数据库表空间脱机,以便进行时间点恢复。

注意:表空间脱机时尽量采用正常(Normal)方式,这样可以避免将表空间联机时进行介质恢复。

2.移动表空间

在Oracle中如果将表空间所对应的数据文件从一个目录移动到另外一个目录,使用OEM工具是无法完成的,只能使用命令的方式。

如果是系统表空间,如SYSTEM表空间,需依次执行下面的命令:

SQL> SHUTDOWN IMMEDIATE 数据库已经关闭。 已经卸载数据库。

ORACLE 例程已经关闭。 SQL>STARTUP MOUNT ORACLE 例程已经启动。

Total System Global Area 778387456 bytes Fixed Size 1374808 bytes Variable Size 486540712 bytes Database Buffers 285212672 bytes Redo Buffers 5259264 bytes 数据库装载完毕。

SQL> HOST COPY D:\\app\\Administrator\\oradata\\orcl\\system01.dbf D:\\app\\Administrator\\oradata\\system01.dbf 已复制 1 个文件。

SQL>ALTER DATABASE RENAME FILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSTEM01.DBF' TO 'D:\\APP\\ADMINISTRATOR\\ORADATA\\SYSTEM01.DBF' ; 数据库已更改。

SQL>Alter Database Open; 数据库已更改。

此时,如果通过下面的命令查看SYSTEM表空间的存储路径,可以发现已经发生了更改。

SQL> SELECT NAME FROM V$DATAFILE; NAME

------------------------------------------------------------ D:\\APP\\ADMINISTRATOR\\ORADATA\\SYSTEM01.DBF

D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSAUX01.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\UNDOTBS01.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\EXAMPLE01.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\XXGCX.DBF 已选择6行。

如果是非系统表空间,如XXGCX表空间,则无需关闭数据库,直接执行下面的命令即可以完成移动的操作。

SQL> ALTER TABLESPACE xxgcx OFFLINE; 表空间已更改。

SQL> HOST COPY D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\XXGCX.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\XXGCX.DBF SQL> ALTER TABLESPACE xxgcx RENAME DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\XXGCX.DBF' to 'D:\\APP\\ADMINISTRATOR\\ORADATA \\XXGCX.DBF'; 表空间已更改。

SQL> ALTER TABLESPACE XXGCX ONLINE;

表空间已更改。

此时,查看查看XXGCX表空间的存储路径,可以发现已经发生了更改。

SQL> SELECT NAME FROM V$DATAFILE; NAME

------------------------------------------------------ D:\\APP\\ADMINISTRATOR\\ORADATA\\SYSTEM01.DBF

D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSAUX01.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\UNDOTBS01.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\EXAMPLE01.DBF D:\\APP\\ADMINISTRATOR\\ORADATA\\XXGCX.DBF 已选择6行。

3.删除表空间

当不再需要表空间时,可以从数据库中删除表空间以及内容。删除表空间的用户,必须具有DROP TABLESPACE系统权限。在Oracle Enterprise Manager工具中删除表空间,单击”删除”按钮,系统会显示警告信息,如图5-7所示。

图5-7 删除表空间的警告信息

如果用户确认要删除,在单击”是”按钮,Oracle系统将删除此表空间。 通过命令的方式也可以删除表空间和所对应的数据文件,如下面的语句。

SQL>DROP TABLESPACE XXGCX INCLUDING CONTENTS AND DATAFILES;

上面的语句在删除表空间时,同时删除表空间相对关的数据文件。如果希望保留该数据文件,则使用下面的语句。

SQL>DROP TABLESPACE XXGCX INCLUDING CONTENTS ;

如果删除的表空间不包含表、视图或者其他数据库对象时,则无需指定INCLUDING CONTENTS参数,即使用下面的语句。

SQL>DROP TABLESPACE XXGCX;

注意:如果删除的表空间非空,则必须使用包含including contents参数的drop tablespace语句,否则系统会提示出错。

5.1.3 非标准Oracle块大小的表空间

Oracle 11g在创建表空间时,如果没有指定BLOCKSIZE参数,则默认表空间使用DB_BLOCK_SIZE初始化参数指定的标准Oracle块大小。对于一些用来存储非结构化数据,如图片、文件等的表空间来说,使用标准Oracle块大小的表空间在存取数据的效率较低,可以使用较大的非标准Oracle块大小的表空间,则就需要创建非标准Oracle块小大的表空间。

在Oracle11g中创建非标准Oracle块大小的表空间,则需设定DB_nK_Cache_Size系列初始化参数,指定非标准Oracle块大小的所使用的缓冲区大小,否则无法创建非标准Oracle块大小的表空间。

下面的例子显示标准Oracle块大小为8KB,如果希望创建Oracle块大小为16KB的表空间,则必须首先设置DB_16K_CACHE_SIZE。

SQL> SHOW PARAMETER DB_16K_CACHE_SIZE NAME TYPE VALUE

------------------- ----------- ------------- db_16k_cache_size big integer 0

SQL> ALTER SYSTEM SET DB_16K_CACHE_SIZE=16k SCOPE=BOTH; 系统已更改。

SQL> SHOW PARAMETER DB_16K_CACHE_SIZE NAME TYPE VALUE

------------------ ----------- ----------- db_16k_cache_size big integer 16M

SQL> CREATE TABLESPACE TS_FILE

DATAFILE 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TS_FILE.DBF' SIZE 100M BLOCKSIZE 16K; 表空间已创建。

SQL> DESC DBA_TABLESPACES;

名称 是否为空? 类型

---------------------- -------- ------------------------- 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 ... ... ...

SQL> SELECT TABLESPACE_NAME,BLOCK_SIZE FROM DBA_TABLESPACES; TABLESPACE_NAME BLOCK_SIZE ---------------------- ------------- SYSTEM 8192 SYSAUX 8192 UNDOTBS1 8192 TEMP 8192 USERS 8192 EXAMPLE 8192 XXGCX 8192 TS_FILE 16384 已选择8行。

5.1.4 表空间的联机和脱机

表空间在联机状态下,用户可以访问表空间中的所有数据文件;表空间在脱机状态下,用户无法访问该表空间中的所有数据文件。在有些情况下,需要将表空间脱机来完成某些操作,如下面的一些情况。

(1)部分数据库不可用,而允许正常访问数据库的其他部分。 (2)执行表空间的备份,尽管表空间联机状态下也可以进行备份。 (3)使某个应用程序对应的表在更新或维护该应用程序时暂时不可用。 Oracle系统中的SYSTEM和SYSAUX表空间不能脱机,其余表空间都可以将数据文件脱机,来完成某些操作后,再将表空间联机。同时要求在将表空间联机时,这些数据文件必

须全部存在。

Oracle系统可以使用ALTER TABLESPACE语句来实现表空间的联机和脱机。如下面的语句将USERS表空间脱机。

SQL>ALTER TABLESPACE USERS OFFLINE;

要将表空间联机,使用下面的语句。

SQL> ALTER TABLESPACE USERS ONLINE;

注意:为了使用ALTER TABLESPACE语句将表空间联机或脱机,用户必须具有ALTER TABLESPACE或MANAGE TABLESPACE的系统权限。

在OEM工具中执行联机或脱机表空间的操作比较简单,在表空间界面中选择“操作”下拉列表框中的“脱机”或“联机”选项,单击“开始”按钮即可。其中脱机时一般选择“正常”的脱机模式,如图5-8所示。

图5-8 将表空间脱机的

5.1.5 与表空间相关的数据字典

Oracle11g系统中与表空间相关的主要数据字典请见表5-1。

表5-1 有关表空间的数据字典

名 称 DBA_TABLESPACES USER_TABLESPACES DBA_DATA_FILES DBA_TEMP_FILES DBA_USERS V$TABLESPACE V$DATAFILE V$TEMPFILE 所有表空间信息 当前用户可用的表空间信息 所有表空间和所对应的数据文件信息 所有临时表空间和所对应的临时文件信息 所有用户的默认表空间和临时表空间等信息 所有表空间的名称和数量以及是否大文件格式等信息 所有表空间对应的数据文件,包括名称、块大小、创建时间等信息 所有临时文件信息 说 明 下面以V$DATAFILE为例说明使用方法。 SQL> DESC V$DATAFILE;

名称 是否为空? 类型

--------------------------------- -------- ------------ FILE# NUMBER CREATION_CHANGE# NUMBER CREATION_TIME DATE TS# NUMBER RFILE# NUMBER

STATUS VARCHAR2(7)

ENABLED VARCHAR2(10) CHECKPOINT_CHANGE# NUMBER CHECKPOINT_TIME DATE UNRECOVERABLE_CHANGE# NUMBER UNRECOVERABLE_TIME DATE LAST_CHANGE# NUMBER LAST_TIME DATE OFFLINE_CHANGE# NUMBER ONLINE_CHANGE# NUMBER ONLINE_TIME DATE BYTES NUMBER BLOCKS NUMBER ...... ......

SQL> SELECT NAME,BLOCKS,BYTES FROM V$DATAFILE;

NAME BLOCKS BYTES ----------------------------------------------- ---------- --------- D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSTEM01.DBF 92160 754974720 D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSAUX01.DBF 97280 796917760 D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\UNDOTBS01.DBF 13440 110100480 D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF 640 5242880 D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\EXAMPLE01.DBF 12800 104857600 D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\XXGCX.DBF 12800 104857600

已选择6行。

5.2 数据文件

数据文件是Oracle数据库存储所有数据库数据的物理文件。表空间的物理组成元素就是数据文件,一个表空间可以包含多个数据文件,并且每个数据文件只能属于一个表空间。对数据文件的管理包括创建数据文件、向表空间添加数据文件、改变数据文件的大小以及联机脱机等操作。

5.2.1 创建数据文件

在Oracle 11g中创建数据文件可以使用OEM工具来实现。创建数据文件的步骤如下。 首先,在OEM的主界面中的服务器选项卡的存储部分中选择“数据文件”,打开数据文件界面,如图5-9所示。此界面显示数据库中所有数据文件信息。

图5-9 数据文件界面

单击“创建”按钮,进入创建数据文件界面。在此界面的一般信息选项卡中可以输入创建数据文件的名称、文件目录、所在表空间、文件大小和存储参数等信息,如图5-10所示。

图5-10 创建数据文件界面

其中,创建数据文件的各项参数设置可以参考5.1.1节在创建表空间时添加数据文件的操作。这里不再累述。

采用命令形式来创建数据文件也比较容易,如下面的语句用来创建TEST表空间的数据文件TEST.DBF,其实就是在创建表空间的同时创建了对应的数据文件。

SQL> CREATE TABLESPACE TEST DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TEST.DBF' SIZE 10M REUSE; 表空间已创建。

对于创建临时表空间的数据文件,可以采用下面的语句。

SQL> CREATE TEMPORARY TABLESPACE TS_TEMP TEMPFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TS_TEMP.DBF' SIZE 10M REUSE; 表空间已创建。

注意:创建临时表空间的命令为CREATE TEMPORARY TABLESPACE,后面的DATAFILE参数也变成TEMPFILE。

5.2.2 向表空间添加数据文件

创建表空间的同时将创建数据文件,Oracle系统也允许在表空间创建以后再向表空间中添加数据文件。通过向表空间中添加数据文件,可以达到改变表空间大小的目的。

通过命令的方式可以向表空间添加数据文件。Oracle系统提供了ALTER TABLESPACE命令用来完成此操作。例如,执行下面的语句可以向USERS表空间添加一个大小为5M的数据文件:

SQL>ALTER TABLESPACE USERS ADD DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS02.DBF' SIZE 5M AUTOEXTEND ON NEXT 5M MAXSIZE 20M; 表空间已更改

其中,SIZE值为文件大小,NEXT值为文件扩展时的最小尺寸,MAXSIZE值为文件能够自动扩展的最大尺寸。

查看添加的数据文件,可以打开“D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\”文件夹,发现该目录下存在一个新的数据文件USERS02.DBF,文件大小为5M。在OEM工具里查看表空间USERS,同样也发现已经新增了名为USERS02.DBF的数据文件,如图5-11所示。

图5-11 向表空间添加数据文件

选中数据文件USERS02.DBF,单击“编辑”按钮,可以编辑数据文件USERS02.DBF的有关属性,包括是否脱机、文件大小以及存储方式等。如图5-12所示。

图5-12 编辑数据文件

向表空间添加数据文件也可以直接在OEM工具中完成,选中要添加数据文件的表空间,在“操作”下拉列表框中选择“添加数据文件”,单击“开始”按钮,在随后出现的“添加数据文件”界面中输入必要的参数。

注意:对于大文件表空间来说,因为大文件表空间只能有一个数据文件,所以不允许向大文件表空间添加数据文件。但可以使用ALTER DATABASE语句来改变大文件表空间的数据文件大小。

5.2.3 改变数据文件的大小

在创建表空间完成后,通过向表空间中添加数据文件可以改变表空间的大小,也可以直接改变现有数据文件的大小或存储方式,同样达到改变表空间大小的目的。

Oracle系统可以使用ALTER DATABASE语句来改变数据文件的大小。对于有些数据库中的数据文件数量达到数据库所允许的最大数量时,使用这种方法非常有效。

例如,下面的语句将数据文件USERS02.DBF大小由5M增加为10M。

SQL> ALTER DATABASE DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF' RESIZE 10M; 数据库已更改。

下面的语句将数据文件USERS02.DBF大小由5M减少为2M。

SQL> ALTER DATABASE DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS02.DBF' RESIZE 2M; 数据库已更改。

注意:减小表空间的大小不能少于表空间中所存储的数据容量,否则Oracle系统会提示错误信息。

改变数据文件的大小还可以通过修改数据文件的存储方式来实现。将数据文件设置为自动扩展,这样当表空间的容量使用完时可以不用DBA立即进行手工干涉,确保应用程序不会因表空间的容量不够而导致系统中止。

在Oracle 11g中,可以在ALTER DATABASE、ALTER TABLESPACE、CREATE DATABASE、CREATE TABLESPACE语句中指定AUTOEXTEND ON子句来启用自动扩展,或指定AUTOEXTEND OFF子句来取消自动扩展。

例如,下面的语句取消了USERS02.DBF文件的自动扩展。首先查看DBA_DATA_FILES数据字典来确定数据文件是否自动扩展。

SQL> SELECT TABLESPACE_NAME,FILE_NAME,AUTOEXTENSIBLE FROM DBA_DATA_FILES; TABLESPACE_NAME FILE_NAME AUT ---------------- ----------------------------------------- ----- USERS D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF YES SYSAUX D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSAUX01.DBF YES UNDOTBS1 D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\UNDOTBS01.DBF YES SYSTEM D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\SYSTEM01.DBF YES EXAMPLE D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\EXAMPLE01.DBF YES USERS D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS02.DBF YES XXGCX D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\XXGCX.DBF TEST D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TEST.DBF 已选择8行。

SQL>ALTER DATABASE DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS02.DBF' AUTOEXTEND OFF; 数据库已更改

SQL>SELECT TABLESPACE_NAME,FILE_NAME,AUTOEXTENSIBLE FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='USERS';

TABLESPACE_NAME FILE_NAME AUT ----------------- ------------------------------------ ------- USERS D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF YES USERS D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS02.DBF NO

可以看到USERS02.DBF数据文件的自动扩展已经被禁用。

下面的语句在USERS表空间中添加一个自动扩展的数据文件USER03.DBF。

SQL>ALTER TABLESPACE USERS ADD DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS03.DBF' SIZE 5M AUTOEXTEND ON NEXT 5M MAXSIZE 20M; 表空间已更改。

5.2.4 数据文件的联机和脱机

数据文件在联机状态下,用户可以访问数据库中的数据,数据文件在脱机状态下,用户无法访问数据库中的数据。通常情况下,将数据文件脱机的目的有:

(1)脱机备份数据文件。

(2)移动或重命名数据文件,先将该数据文件脱机,或将包含数据文件的表空间脱机。 (3)数据库载入数据文件时出错,并自动将该数据文件脱机。此时,DBA可以在解决

问题后,手工将该数据文件联机。

(4)某个数据文件损坏或丢失,在打开数据库前必须将该数据文件脱机。 值得注意的是,在将数据文件所属的表空间脱机后,该表空间所属的所有数据文件将默认脱机。而将数据文件联机后,其所属的表空间并不会自动联机。

Oracle系统可以使用ALTER DATABASE语句来实现数据文件的联机和脱机。如下面的语句将USERS02.DBF数据文件脱机。

SQL>ALTER DATABASE DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS02.DBF' OFFLINE;

要将数据文件联机,使用下面的语句。

SQL>ALTER DATABASE DATAFILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS03.DBF' ONLINE;

为了使数据文件联机或脱机,用户必须具有ALTER DATABASE系统权限。 值得注意的是,在使用ALTER DATABASE语句将数据文件脱机时,数据库必须处于归档(ARCHIVELOG)模式,如果在非归档(NOARCHIVELOG)模式下,使数据文件脱机系统会提示错误信息“ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机”。

在数据文件脱机/联机时需要介质恢复,而表空间联机则不需要进行介质恢复。这是因为表空间脱机需要作一次检查点,之后表空间的数据将不再改变,所以联机时不需要进行恢复操作,只需要更新一下检查点。数据文件由于是表空间的一部分,整个表空间的数据仍然在改变,所以当数据文件时脱机/联机时,需要对它进行恢复,以便于和其他的数据文件保持一致。

在OEM中执行数据文件的联机或脱机操作,在数据文件界面中选择“操作”下拉列表框中的“脱机”或“联机”选项。单击“开始”按钮。其中,脱机时选择“正常”的脱机模式。

5.3 临时表空间

Oracle临时表空间主要是用来存放一些查询所产生的临时数据,其内容如下。 (1)SQL查询操作所产生的中间排序数据。 (2)临时表和临时索引数据。 (3)临时的LOB数据。 (4)临时的B-TREE数据。 (5)一些异常情况的数据。 默认情况下,Oracle数据库创建时会自动创建一个TEMP临时表空间,作为整个Oracle数据库和用户的默认临时表空间。一个临时表空间可以被多个用户使用。永久表空间不能作为临时表空间使用。

下面的语句查询当前数据库使用的默认临时表空间。

SQL>DESC DATABASE_PROPERTIES;

名称 是否为空? 类型

---------------------- -------- ----------------- PROPERTY_NAME NOT NULL VARCHAR2(30) PROPERTY_VALUE VARCHAR2(4000) DESCRIPTION VARCHAR2(4000)

SQL>SELECT PROPERTY_NAME,PROPERTY_VALUE FROM DATABASE_PROPERTIES

WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE'; PROPERTY_NAME PROPERTY_VALUE ------------------------ ---------- DEFAULT_TEMP_TABLESPACE TEMP

5.3.1 创建临时表空间

创建临时表空间使用CREATE TEMPORARY TABLESPACE语句。

SQL>CREATE TEMPORARY TABLESPACE TEST_TEMP

TEMPFILE 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TEST_TEMP01.DBF' SIZE 20M AUTOEXTEND ON NEXT 10M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL; 表空间已创建。

创建临时表空间完成后,就可以将创建的临时表空间分配给用户使用,或者设为数据库的默认临时表空间。如下面的语句设置临时表空间 TEST_TEMP为数据库的默认临时表空间。

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEST_TEMP; 数据库已更改。

下面的语句表示创建test用户时,分配了TEST_TEMP临时表空间。

SQL>CREATE USER TEST IDENTIFIED BY TEST DEFAULT TABLESPACE USERS

TEMPORARY TABLESPACE TEST_TEMP; 用户已创建。

如果创建用户时没有指定DEAULT TEMPORARY TABLESPACE子句,那么用户将使用数据库的默认临时表空间作为用户的默认临时表空间。当然,用户创建以后,可以通过ALTER USER语句来修改用户的临时表空间。

5.3.2 创建临时表空间组

临时表空间组(Temporary Tablespace Group)允许用户在不同的会话中同时利用多个临时表空间。在数据库中可以存在多个临时表空间和多个临时表空间组,可以给用户分配单独的临时表空间或临时表空间组作为该用户的默认临时表空间。

临时表空间组的主要特征有:

(1)一个临时表空间组必须由至少一个临时表空间组成。

(2)如果删除了一个临时表空间组的所有成员,该组也自动被删除。 (3)临时表空间的名字不能与临时表空间组的名字相同。

(4)在给用户分配一个临时表空间时,可以使用临时表空间组的名字代替实际的临时表空间名;在给数据库分配默认临时表空间时也可以使用临时表空间组的名字。

使用临时表空间组而非普通的临时表空间,可以带来以下好处:

(1)由于SQL查询可以并发使用几个临时表空间进行排序操作,因此SQL查询很少会出现排序空间超出,避免当临时表空间不足时所引起的磁盘排序问题。

(2)可以在数据库级指定多个默认临时表空间。 (3)并行服务器将有效地利用多个临时表空间。

(4)一个用户在不同会话中可以同时使用多个临时表空间。

创建临时表空间组是在创建临时表空间时通过指定GROUP子句创建的。临时表空间组无法显式创建,当第一个临时表空间分配给该组时自动创建,当组内所有临时表空间被移除时自动删除。

下面的语句创建了两个临时表空间,注意其中的GROUP子句:

SQL>CREATE TEMPORARY TABLESPACE \

TEMPFILE 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TEST_TEMP01A.DBF' SIZE 20M REUSE

AUTOEXTEND ON NEXT 10M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL

TABLESPACE GROUP TEMP_GROUP1;

SQL> CREATE TEMPORARY TABLESPACE \

TEMPFILE 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TEST_TEMP01B.DBF' SIZE 20M REUSE

AUTOEXTEND ON NEXT 10M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL

TABLESPACE GROUP TEMP_GROUP1;

SQL>CREATE TEMPORARY TABLESPACE \

TEMPFILE 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TEST_TEMP02A.DBF' SIZE 20M REUSE

AUTOEXTEND ON NEXT 10M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL

TABLESPACE GROUP TEMP_GROUP2;

SQL> CREATE TEMPORARY TABLESPACE \

TEMPFILE 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\TEST_TEMP02B.DBF' SIZE 20M REUSE

AUTOEXTEND ON NEXT 10M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL

TABLESPACE GROUP TEMP_GROUP2;

下面通过查看DBA_TABLESPACE_GROUPS数据字典确定当前数据库系统存在的临时表空间组和所包含的临时表空间。

SQL> DESC DBA_TABLESPACE_GROUPS; 名称 是否为空? 类型

-------------------- -------- ------------ GROUP_NAME NOT NULL VARCHAR2(30) TABLESPACE_NAME NOT NULL VARCHAR2(30)

SQL> SELECT * FROM DBA_TABLESPACE_GROUPS; GROUP_NAME TABLESPACE_NAME

-------------- ------------------ TEMP_GROUP1 TEMP02 TEMP_GROUP1 TEMP03 TEMP_GROUP2 TEMP04 TEMP_GROUP2 TEMP05

在OEM中,也可以查看到上面创建的两个临时表空间组。如图5-13所示。

图5-13 临时表空间组

5.3.3 管理临时表空间组

管理临时表空间组的成员时,可以往组里添加新的表空间,或将一个表空间从一个组移动另一个组,或是从一个组中删除临时表空间。

下面的语句将一个表空间TEST_TEMP添加到临时表空间组TEMP_GROUP1中。

SQL> ALTER TABLESPACE TEST_TEMP TABLESPACE GROUP TEMP_GROUP1; 表空间已更改。

下面的语句将临时表空间组TEMP_GROUP1中的临时表空间TEST_TEMP移动到临时表空间组TEMP_GROUP2中。

SQL> ALTER TABLESPACE TEST_TEMP TABLESPACE GROUP TEMP_GROUP2; 表空间已更改。

下面的语句将临时表空间TEST_TEMP从临时表空间组TEMP_GROUP2中删除。

SQL> ALTER TABLESPACE TEST_TEMP TABLESPACE GROUP ''; 表空间已更改。

删除后的临时表空间TEST_TEMP仍然存在并可以供用户使用,只是不属于临时表空间组而已。

下面的语句修改数据库使用默认临时表空间组TEMP_GROUP1。

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP_GROUP1; 数据库已更改。

5.4 日志文件

日志文件将数据库中所有数据库的变化都记录下来,日志文件的内容就是重做记录,又称重做项,每个重做项由一个系统修改号码(SCN)来标记。日志文件分为重做日志文件和归档日志文件。重做日志文件的主要目的就是为了进行恢复。

Oracle数据库创建后一般包含3组重做日志组,每个重做日志组包含两个以上的重做日志文件,每个日志文件称为成员。

重做日志组采取循环写入的方式。日志写入进程(LGWR)写入第1个重做日志组,当该重做日志组写满后,自动产生日志切换,LGWR会写入到第2个重做日志组,当第2个重做日志组也写满后,再自动产生日志切换, LGWR再写入第3个重做日志组,当第3个重做日志组也写满后,再写入到第1个重做日志组,依次循环写入。如图5-14所示。

group1group2group3membermembermembermembermembermember 图5-14 LGWR循环写入重做日志组

Oracle系统支持多路复用重做日志文件,即将重做日志文件的多个副本保存在不同的物理磁盘上或者同一个磁盘的不同位置上,LGWR将重做日志同步写入到多个副本的重做日志文件中,并自动维护这些副本,可以大大减少Oracle系统因磁盘I/O失败或文件丢失而出错的可能性。Oracle系统建议将重做日志组成员放置在不同的物理磁盘上,这样单一磁盘访问失败,那么只要有一个日志组成员能够正常被LGWR访问,Oracle系统仍然可以正常运行。

注意:如果Oracle系统运行在归档模式下,可以将重做日志文件和归档日志文件存放在不同的磁盘上,以避免LGWR和ARCn后台进程对重做日志文件的争用。另外,数据文件和重组日志文件也应该存放在不同的磁盘,以减少数据块和重做日志之间的I/O冲突。

5.4.1 创建重做日志组及成员

Oracle要求至少包含两个重做日志组。有时需要增加重做日志组。如果重做日志组内只有一个成员,则需要增加成员,以便多个成员形成一个镜像关系。

增加日志组的语句用到ALTER DATABASE的ADD LOGFILE子句,下面的语句增加了一个日志组GROUP4,该组有两个成员。

SQL> ALTER DATABASE

ADD LOGFILE GROUP 4(

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\redo4a.log', 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\redo4b.log') SIZE 51200K; 数据库已更改。

下面的语句为当前数据库系统的每组重做日志组添加一个日志成员。

SQL>ALTER DATABASE

ADD LOGFILE Member

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\redo1b.log' to group 1, 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\redo2b.log' to group 2, 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\redo3b.log' to group 3, 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\redo4c.log' to group 4; 数据库已更改。

注意:添加联机重做日志文件不用指定大小,因为每个重做日志组中的文件都是相互冗余,因此文件大小必须一致。实际上每一个重做日志组都可以拥有不同于其他重做日志组的大小,不过Oracle建议数据库中每组重做日志文件都拥有相同的大小。

5.4.2 移动重做日志文件

如果希望将重做日志文件从一个磁盘移动到另一个磁盘以减少磁盘访问冲突,可以使用操作系统命令移动重做日志文件,然后使用带有RENAME FILE子句的ALTER DATABSE语句重定位日志文件的路径。

移动重做日志文件的主要步骤如下。 (1)关闭数据库,完整备份数据库。

(2)复制要移动的重做日志文件到新的位置。 (3)启动并装载数据库,但不打开数据库。

(4)使用带有RENAME FILE子句的ALTER DATABASE语句重定位重做日志文件的路径。

(5)打开数据库,备份控制文件。

下面的语句将当前数据库系统中存在的3个重做日志组的其中各1个日志成员移动到其他位置。

SQL> SHUTDOWN IMMEDIATE 数据库已经关闭。 已经卸载数据库。

ORACLE 例程已经关闭。

SQL> HOST COPY D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO1B.LOG D:\\ORADATA\\REDO1B.LOG

SQL> HOST COPY D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO2B.LOG D:\\ORADATA\\REDO2B.LOG

SQL> HOST COPY D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO3B.LOG D:\\ORADATA\\REDO3B.LOG

SQL> STARTUP MOUNT ORACLE 例程已经启动。

Total System Global Area 778387456 bytes Fixed Size 1374808 bytes Variable Size 486540712 bytes Database Buffers 285212672 bytes Redo Buffers 5259264 bytes 数据库装载完毕。

SQL> ALTER DATABASE RENAME FILE

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO1B.LOG', 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO2B.LOG', 'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO3B.LOG' TO

'D:\\ORADATA\\REDO1B.LOG', 'D:\\ORADATA\\REDO2B.LOG', 'D:\\ORADATA\\REDO3B.LOG'; 数据库已更改。

SQL> ALTER DATABASE OPEN; 数据库已更改。

SQL>SELECT GROUP#,TYPE ,MEMBER FROM V$LOGFILE; GROUP# TYPE MEMBER

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

3 ONLINE D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG 2 ONLINE D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG 1 ONLINE D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG 1 ONLINE D:\\ORADATA\\REDO1B.LOG 2 ONLINE D:\\ORADATA\\REDO2B.LOG 3 ONLINE D:\\ORADATA\\REDO3B.LOG

在OEM中查看重做日志文件信息,发现日志文件的存放位置的确已发生改变。

5.4.3 删除重做日志组及成员

使用ALTER DATABASE DROP LOGFILE命令删除重做日志组时,不能删除当前系统正在使用(Current)或活动(Active)状态的重做日志组。删除重做日志组必须具有ALTER DATABASE的系统权限。

如删除日志组GROUP 4,可以使用下面的语句。

SQL>ALTER DATABASE DROP LOGFILE GROUP 4; 数据库已更改。

值得注意的是在Oracle系统没有使用Oracle管理文件(OMF)功能时,ALTER DATABASE DROP LOGFILE命令只删除该重做日志组在数据字典中的定义,不会删除操作系统中对应的物理文件,如果需要删除对应的物理文件,DBA必须手动通过操作系统命令进行删除。如果Oracle系统使用OMF功能,则Oracle将自动完成对物理文件的清理工作。

Oracle系统还支持删除重做日志成员,使用ALTER DATABASE DROP LOGFILE MEMBER语句。但要确保删除后该重做日志组中至少还拥有一个组员,不然系统会提示删除错误,系统提示 “ORA-00361: 无法删除最后一个日志成员”。

下面的语句删除了日志组GROUP 4中的一个日志成员。

SQL>ALTER DATABASE DROP LOGFILE MEMBER

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO4C.LOG'; 数据库已更改。

如果要删除一个当前活动的日志成员,首先必须进行日志切换。

5.4.4 日志切换

在默认情况下,当重做日志文件写满后Oracle系统会自动发生日志切换。此时,Oracle系统将向下一个要写入的重做日志产生一个新的SCN号,执行一个检查点。

Oracle允许用户强制执行日志切换,使当前活动组变成非活动组,以便DBA能够执行某项管理和维护的工作,如删除一个当前活动的日志成员,首先必须进行日志切换。

强制日志切换的语句是ALTER SYSTEM SWITCH LOGFILE,执行此项操作必须具有ALTER SYSTEM系统权限。

下面的语句为删除当前重做日志组GROUP 3的日志成员,系统提示当前正在使用,此时进行强制日志切换,再删除就可以了。

SQL> SELECT GROUP#,MEMBERS,STATUS FROM V$LOG; GROUP# MEMBERS STATUS

---------- ---------- ---------------- 1 2 INACTIVE 2 2 INACTIVE 3 2 CURRENT

SQL>ALTER DATABASE DROP LOGFILE MEMBER 'D:\\ORADATA\\REDO3B.LOG'; ALTER DATABASE DROP LOGFILE MEMBER 'D:\\ORADATA\\REDO3B.LOG' *

第 1 行出现错误:

ORA-01609: 日志 3 是线程 1 的当前日志 - 无法删除成员 ORA-00312: 联机日志 3 线程 1:

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG'

ORA-00312: 联机日志 3 线程 1: 'D:\\ORADATA\\REDO3B.LOG'

SQL> ALTER SYSTEM SWITCH LOGFILE; 系统已更改。

SQL> ALTER DATABASE DROP LOGFILE MEMBER 'D:\\ORADATA\\REDO3B.LOG'; 数据库已更改。

5.4.5 清除重做日志文件

在数据库实例处于打开状态时,重做日志文件可能发生损坏而不能归档,导致数据库停止提供服务。此时,可以在不关闭数据库的情况下使用ALTER DATABASE CLEAR LOGFILE语句清除重做日志文件的内容。

下面的语句清除了GROUP 3中的日志文件内容。

SQL>ALTER DATABASE CLEAR LOGFILE GROUP 3; 数据库已更改。

此时,该重做日志组的STATUS为UNUSED,序列号为0。

如果受到损坏的重做日志文件还没有归档,可以使用下面的语句。

SQL>ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;

这样,可以清除损坏没有归档的重做日志,并避免归档这些日志。

Oracle系统规定当系统中仅存在两个重做日志组或者受到损坏的重做日志文件处于当前组时不能清除重做日志。

5.4.6 设置数据库为归档模式

Oracle数据库可以运行在两种模式下:归档模式和非归档模式。Oracle数据库默认运行在非归档模式下。归档就是Oracle自动将写满(或被切换)的联机重做日志文件复制到指定路径下,并按照相应规则重命名。归档模式能提高Oracle数据库的可恢复性。在开发和测试环境中,数据库一般运行在非归档模式下,有利于系统应用的调整,也避免生成大量的归档日志文件占用额外的磁盘空间。但生产数据库都应该运行在归档模式下,因为这将有效预防灾难,保证系统安全。

归档模式应该和相应的备份策略相结合,通过定时备份数据库和在两次备份间隔之间的日志文件,可以有效的恢复这段时间的任何时间点的数据,在很多时候可以挽回或最大可能地减少数据丢失。

下面介绍如何将数据库设置为归档模式。首先查看当前数据库的运行模式。

SQL> ARCHIVE LOG LIST

数据库日志模式 非存档模式 自动存档 禁用

存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 158 当前日志序列 160

或者使用下面的语句查看数据库的运行模式。

SQL> SELECT NAME,LOG_MODE FROM V$DATABASE; NAME LOG_MODE

--------- ------------ ORCL NOARCHIVELOG

切换归档模式之前关闭正在运行的数据库

SQL> SHUTDOWN IMMEDIATE; 数据库已经关闭。 已经卸载数据库。

ORACLE 例程已经关闭。

启动并装载数据库,但不打开数据库。

SQL> STARTUP MOUNT ORACLE 例程已经启动。

Total System Global Area 778387456 bytes Fixed Size 1374808 bytes Variable Size 486540712 bytes Database Buffers 285212672 bytes Redo Buffers 5259264 bytes 数据库装载完毕。

修改数据库的运行模式为归档模式,如果要将归档模式切换为非归档模式,则使用ALTER DATABASE NOARCHIVELOG语句。

SQL> ALTER DATABASE ARCHIVELOG; 数据库已更改。

接下来打开数据库。

SQL> ALTER DATABASE OPEN; 数据库已更改。

此时,查看数据库的运行模式,发现已经是归档模式。

SQL> ARCHIVE LOG LIST;

数据库日志模式 存档模式 自动存档 启用

存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 158 下一个存档日志序列 160 当前日志序列 160

在归档模式下,当重做日志文件被重用前,Oracle首先需要确认该重做日志是否已经被归档,如果没有,那么首先必须对该重做日志进行归档,而后才能重用该联机重做日志文件。虽然每个联机重做日志文件组中可以有多个成员,不过归档时,每组仅会生成一个归档文件。

在默认情况下,ARCn后台进程会在联机重做日志文件被写满之后再触发归档操作,当然DBA也可以通过手动进行归档。下面的语句可对所有未归档的重做日志归档:

SQL>ALTER SYSTEM SYSTEM ARCHIVE LOG ALL;

5.4.7 LogMiner工具的使用

LogMiner是Oracle系统用于分析日志文件的工具,包括对重做日志文件和归档日志文件进行分析,分析结果保存到V$LOGMNR_CONTENTS中,用户通过查询该视图从而获取对Oracle数据库操作的历史信息。

1. 安装LogMiner

首先安装LogMiner,调用下面的脚本。

SQL> @?/RDBMS/ADMIN/DBMSLM.SQL 程序包已创建。 授权成功。

同义词已创建。

SQL> @?/RDBMS/ADMIN/DBMSLMD.SQL 程序包已创建。

同义词已创建。

这样,LogMiner工具就安装好了。其中,DBMSLM.SQL是用来创建DBMS_LOGMNR的系统包,这个包是用来分析日志的。DBMSLMD.SQL是用来创建DBMS_LOGMNR_D的系统包,这个包是用来创建数据字典文件的。注意以上两个包的创建用户须具有SYSDBA系统权限。

2. 创建数据字典文件

安装好LogMiner之后,为了能够正常使用LogMiner,还需创建数据字典文件,用于日志分析需要。在初始化参数文件SPFILE中,通过设定UTL_FILE_DIR参数来指定数据字典文件的位置目录。

下面的语句用来设置UTL_FILE_DIR参数并创建数据字典文件。

SQL> SHOW PARAMETER SPFILE; NAME TYPE VALUE

---------- ----------- --------------------------------- spfile string D:\\APP\\ADMINISTRATOR\\PRODUCT\\11.2.0\\ DBHOME_1\\DATABASE\\SPFILEORCL.ORA

SQL>ALTER SYSTEM SET UTL_FILE_DIR='D:\\ORACLE' SCOPE=SPFILE; 系统已更改。

重启数据库系统后,该参数才能生效。需执行下面的语句。

SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP

SQL> SHOW PARAMETER UTL_FILE_DIR NAME TYPE VALUE

---------- ---------------- -------------------- utl_file_dir string d:\\oracle

接着开始创建数据字典。

SQL>EXEC DBMS_LOGMNR_D.BUILD(DICTIONARY_FILENAME=>'DICT.ORA', DICTIONARY_LOCATION=>'D:\\ORACLE'); PL/SQL 过程已成功完成。

此时,查看D盘下的Oracle目录,可以发现已经存在DICT.ORA文件。至此,数据字典文件也已经创建成功。

3. 添加分析列表中的日志文件

添加需要进行分析的日志文件列表语句如下。

SQL> SELECT MEMBER FROM V$LOGFILE; MEMBER

----------------------------------------------------- D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG

已选择3行。

这里,将日志成员添加到分析列表,语句如下:

SQL>EXEC DBMS_LOGMNR.ADD_LOGFILE(

LOGFILENAME=>'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG', OPTIONS=>DBMS_LOGMNR.ADDFILE); PL/SQL 过程已成功完成。

SQL>EXEC DBMS_LOGMNR.ADD_LOGFILE(

LOGFILENAME=>'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG', OPTIONS=>DBMS_LOGMNR.ADDFILE); PL/SQL 过程已成功完成。

SQL>EXEC DBMS_LOGMNR.ADD_LOGFILE(

LOGFILENAME=>'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG', OPTIONS=>DBMS_LOGMNR.ADDFILE); PL/SQL 过程已成功完成。

查看V$LOGMNR_LOGS动态性能视图,可以看到分析列表中目前的日志成员。

SQL> SELECT FILENAME FROM V$LOGMNR_LOGS; FILENAME

---------------------------------------------------- D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG

如果需要从分析列表里去掉一个文件用,如执行下面的语句。

SQL> EXEC DBMS_LOGMNR.REMOVE_LOGFILE(

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG'); PL/SQL 过程已成功完成。

SQL> SELECT FILENAME FROM V$LOGMNR_LOGS; FILENAME

------------------------------------------------- D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG

4. 分析并查询日志的分析结果

利用LogMiner进行日志分析用到DBMS_LOGMNR系统包中的START_LOGMNR过程。

SQL>EXEC DBMS_LOGMNR.START_LOGMNR(

DICTFILENAME=>'D:\\ORACLE\\DICT.ORA'); PL/SQL 过程已成功完成。

START_LOGMNR过程可以指定要分析的时间范围,如下面的语句。

SQL> EXEC DBMS_LOGMNR.START_LOGMNR(

OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG, ENDTIME=>TO_DATE('2012-10-14','YYYY-MM-DD')); PL/SQL 过程已成功完成。

分析完毕后所有分析的内容都保存到了GV$LOGMNR_CONTENTS和V$LOGMNR_CONTENTS动态性能视图里,首先查看V$LOGMNR_LOGS的结构信息。

SQL> DESC V$LOGMNR_LOGS;

名称 是否为空? 类型

---------------- -------- ------------- LOG_ID NUMBER

FILENAME VARCHAR2(512) LOW_TIME DATE HIGH_TIME DATE DB_ID NUMBER

DB_NAME VARCHAR2(8) RESET_SCN NUMBER RESET_SCN_TIME DATE THREAD_ID NUMBER THREAD_SQN NUMBER LOW_SCN NUMBER NEXT_SCN NUMBER …… ……

同样,可以查看GV$LOGMNR_CONTENTS的结构信息。 接着就可以查询我们感兴趣的内容,如下面的语句。

SQL>SELECT SCN,TIMESTAMP, SESSION#, SQL_REDO FROM V$LOGMNR_CONTENTS; SCN TIMESTAMP SESSION# SQL_REDO

------- ----------------- ------------------------------------- 5190145 14-10月-12 0 set transaction read write; 5190145 14-10月-12 0 5190145 14-10月-12 0

5190146 14-10月-12 0 commit;

5190146 14-10月-12 0 set transaction read write; 5190148 14-10月-12 0 commit;

5190161 14-10月-12 0 ALTER DATABASE DROP LOGFILE MEMBER

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO4A.LOG';

5190164 14-10月-12 0 commit;

5190165 14-10月-12 0 set transaction read write; 5190165 14-10月-12 0

5190166 14-10月-12 0 ALTER DATABASE DROP LOGFILE MEMBER

'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO4B.LOG'; 5190169 14-10月-12 0 commit; ... ... ... ... 已选择18行。

当分析结束后,应当把V$LOGMNR_CONTENTS关闭,释放内存。

SQL> EXEC DBMS_LOGMNR.END_LOGMNR; PL/SQL 过程已成功完成。

5.5 OMF

5.5.1 什么是OMF

从Oracle 9i数据库开始,Oracle系统可以使用OMF(Oracle Manage File)技术管理物理文件。OMF就是让Oracle来管理文件而无需手动指定文件名称、大小以及存放位置等信息。

使用OMF需要配置以下两个初始化参数。

(1)DB_CREATE_FILE_DEST:指定数据文件和临时文件默认的存放位置,该目录必须是已经存在。可以通过ALTER SESSION或者ALTER SYSTEM命令动态地改变这个参数。

(2)DB_CREATE_ONLINE_LOG_DEST_n:指定联机重做日志和控制文件的默认存放位置,该目录必须已经存在。对于多路复用的联机重做日志和控制文件,n可以是从1到5的值。可以通过ALTER SESSION或者ALTER SYSTEM命令动态地改变这个参数。如果没有指定DB_CREATE_ONLINE_LOG_DEST_n 参数,则联机重做日志和控制文件将以DB_CREATE_FILE_DEST作为默认的存放位置。

在OMF的文件命名规则中,文件名由默认的文件系统目录、基于文件类型的文件名称摸板和惟一字符串三部分组成。其结构如下表5-2所示。

表5-2 OMF文件的命名规则

文 件 类 型 数据文件 临时文件 联机重做日志文件 控制文件 格 式 ora_%t_%u.dbf ora_%t_%u.tmp ora_%g_%u.log ora_%u.ctl 其中:%t 是表空间的名称,%g 是联机重做日志文件的组号,%u 是一个包含8 个字符的惟一字符串。

对于OMF表空间来说,删除表空间时将自动删除对应的数据文件。

5.5.2 启用OMF

默认情况下,OMF功能没有启用。可以通过下面的语句来确认OMF是否启用。

SQL> SHOW PARAMETER DB_CREATE_FILE_DEST; NAME TYPE VALUE

-------------------- ------- ---------------------------- db_create_file_dest string

如果VALUE为空,则表明OMF未启用。

通过更改DB_CREATE_FILE_DEST和DB_CREATE_ONLINE_LOG_DEST_n初始化参数来启动OMF。如下面的语句。

SQL> ALTER SYSTEM SET DB_CREATE_FILE_DEST='D:\\ORACLE' SCOPE=BOTH; 系统已更改。

其中,D:\\ORADATA目录为数据库用来创建和管理数据文件或者临时文件的目录,要求已经存在。DB_CREATE_FILE_DEST是一个动态参数,修改时需使用SCOPE=BOTH选项,这样修改后立即生效,且在数据库重启后仍然有效。因为SCOPE=BOTH这个选项表示在内存中更改这个参数值的同时更改服务器参数文件中的参数值。所以数据库重启后修改会被保存下来。不过需要注意的是,此时数据库采用的必须是服务器参数文件,即二进制参数文件。只有如此,利用ALTER SYSTEM语句对数据库系统参数的更改才会保存到数据库的初始化参数文件中,下次重新启动后才会继续生效。如果采用的是文本参数文件,那么利用这个命令更改的配置不会被保存到初始化参数文件中。数据库管理员必须要手工更改文本参数文件。所以,在采取这个命令更改参数时,需要确认这个更改是否需要永远有效。如果需要永远有效的话,那么就需要考虑数据库启动的时候使用的初始化参数文件是服务器参数文件还是文本参数文件。通过下面的语句确定数据库采用的初始化参数文件。

SQL>SHOW PARAMETER SPFILE NAME TYPE VALUE

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

spfile string D:\\APP\\ADMINISTRATOR\\PRODUCT\\11.2.0\\DBHOME_1 \\DATABASE\\SPFILEORCL.ORA

SQL>SHOW PARAMETER PFILE NAME TYPE VALUE

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

spfile string D:\\APP\\ADMINISTRATOR\\PRODUCT\\11.2.0\\DBHOME_1 \\DATABASE\\SPFILEORCL.ORA

如果是服务器参数文件那么只需要采用SCOPE=BOTH选项即可。如果不是的话,那么

就可能在更改内存中的参数值的同时,在数据库初始化文件中也进行相应的更改。

如果使用OMF只对数据文件和临时文件进行管理,则只需设置DB_CREATE_FILE_DEST初始化参数;如果只对联机重做日志文件和控制文件进行管理,则只需设置DB_CREATE_ONLINE_LOG_DEST初始化参数。另外,如果要管理归档日志文件、回闪日志文件和RMAN操作文件的存放位置,则需设置DB_RECOVERY_FILE_DEST初始化参数。

默认情况下采用OMF建立的表空间,是小文件表空间。如果需要创建的是大文件表空间的话,那么需要采用关键字BIGFILE。即使启用了OMF方式来管理表空间,其实还可以采用传统的表空间管理方式。如通过CREATE TABLESPACE test DATAFILE 'D:\\ORADATA\\ORCL\\TEST.DBF' SIZE 100M这种方式来建立表空间与数据文件。也就是说OMF和传统的表空间管理方式可以并存。

5.5.3 使用OMF

下面的语句为使用OMF来管理数据文件示例。首先查看当前数据库系统中的DB_CREATE_FILE_DEST和DB_CREATE_ONLINE_LOG_DEST初始化参数的设置情况,确认当前数据库的OMF功能是否启用。

SQL> SHOW PARAMETER DB_CREATE_FILE_DEST NAME TYPE VALUE --------------------- ------------ --------- db_create_file_dest string

SQL> SHOW PARAMETER DB_CREATE_ONLINE_LOG_DEST NAME TYPE VALUE -------------------------- ----------- ------ db_create_online_log_dest_1 string db_create_online_log_dest_2 string db_create_online_log_dest_3 string db_create_online_log_dest_4 string db_create_online_log_dest_5 string

以上VALUE为空,表明OMF未启用,接着设置DB_CREATE_FILE_DEST和DB_CREATE_ONLINE_LOG_DEST这两个初始化参数。

SQL> ALTER SESSION SET DB_CREATE_FILE_DEST=\会话已更改。

SQL> ALTER SESSION SET DB_CREATE_ONLINE_LOG_DEST_1=\会话已更改。

SQL> SHOW PARAMETER DB_CREATE_FILE_DEST NAME TYPE VALUE

------------------------ ------------ --------- db_create_file_dest string d:\\oracle

SQL> SHOW PARAMETER DB_CREATE_ONLINE_LOG_DEST NAME TYPE VALUE

--------------------------- ----------- ------ db_create_online_log_dest_1 string d:\\oracle db_create_online_log_dest_2 string db_create_online_log_dest_3 string db_create_online_log_dest_4 string db_create_online_log_dest_5 string

经过上面对DB_CREATE_FILE_DEST和DB_CREATE_ONLINE_LOG_DEST这两个初始化参数的设置,就可以使用OMF功能。下面创建一个名为TEST_OMF的表空间,OMF奖自动在指定目录下创建数据文件并对之进行自动管理。

SQL> CREATE TABLESPACE TEST_OMF; 表空间已创建。

此时,可以在D:\\ORACLE目录下查看到通过刚刚创建的数据文件O1_MF_TEST_OMF_5WHMN8QG_.DBF。

如果删除表空间,将自动删除相应的数据文件。

SQL> DROP TABLESPACE TEST_OMF; 表空间已删除。

OMF还允许对一个现有的表空间中添加一个OMF文件。

SQL> ALTER TABLESPACE USERS ADD DATAFILE SIZE 100M; 表空间已更改。

SQL>SELECT TABLESPACE_NAME,FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='USERS'; TABLESPACE_NAME FILE_NAME

------- ---------------------------------------------- USERS D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS01.DBF USERS D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS02.DBF USERS D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\USERS03.DBF

USERS D:\\ORACLE\\ORCL\\DATAFILE\\O1_MF_USERS_95SXWQ4W_.DBF

可以看到新建的OMF文件O1_MF_USERS_95SXWQ4W_.DBF已经存在。

思考与练习

1.简述表空间的区间管理有哪几种? 2.在什么情况下,需要将表空间脱机?

3.添加联机重做日志文件时需要指定文件大小吗? 4.简述改变表空间大小有几种不同的方式。 5.简述临时表空间的内容。 6.简述临时表空间组的用途。

7.简述Oracle数据库的两种运行模式的不同。

8.简述将Oracle数据库运行模式设置为归档模式的步骤。 9.简述OMF的优点所在。

10.设置Oracle数据库使用OMF的主要步骤。 11.简述移动非系统表空间和系统表空间的不同。

上机实验

1.在SQL*PLUS中创建表空间MYTBS,初始大小为20M,当该表空间的容量不够时自动扩展,且每次扩展的大小为5M,最大容量可以扩展到100M。

2.在SQL*PLUS中将MYTBS表空间立即脱机后,然后再联机。 3.在SQL*PLUS中修改MYTBS表空间的大小为200M。

4.在SQL*PLUS中将MYTBS表空间对应的数据文件移动到上一级目录,如从D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\目录移动到D:\\APP\\ADMINISTRATOR\\ORADATA\\目录下。

5.在OEM中创建名为TEST的表空间,初始大小为10M,可以无限扩展存储空间。 6.将SYSTEM系统表空间对应的数据文件移动到上一级目录,如从D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\目录移动到D:\\APP\\ADMINISTRATOR\\ORADATA\\目录下。

7.在SQL*PLUS中移去表空间MYTBS。

8.在SQL*PLUS中通过SQL语句列出当前数据库中表空间和数据文件的对应关系。 9.在SQL*PLUS中列出当前数据库总共有多少个重做日志组,并且各自的状态。 10.在SQL*PLUS中列出当前数据库的重做日志组以及当前日志组和序列号信息。 11.在SQL*PLUS中对创建一组重做日志组GROUP 4。 12.在SQL*PLUS中对GROUP 1增加一个重做日志文件。

13.在SQL*PLUS中将重做日志文件组GROUP 4移去,并在资源管理器中查看该重做日志文件是否还存在。

14.在SQL*PLUS中执行一次日志切换。 15.启用Oracle数据库的OMF功能。

本文来源:https://www.bwwdw.com/article/26dw.html

Top