Oracle如何将文件映射到物理设备
在数据文件为文件系统文件的环境中,要了解表空间和底层设备之间的关联是相对简单的。Oracle数据库提供了DBA_TABLESPACES、 DBA_DATA_FILES、V$DATAFILE等视图,提供了文件到设备的映射。这些映射和设备统计信息可以用来评估I/O性能。
然而,随着基于主机的逻辑卷管理器(LVM)和提供RAID (Redundant Array of Inexpensive Disks)特性的复杂存储子系统的引入,确定文件到设 备的映射变得不容易。这带来了一个问题,因为当你的“最热门”文件隐藏在“黑盒”之后时,很难确定它们。本节介绍Oracle数据库解决这个 问题的方法。
本节概述Oracle数据库文件映射接口,并解释如何使用DBMS_STORAGE_MAP包和动态性能视图来公开文件到物理设备的映射。您可以通过Oracle Enterprise Manager Cloud Control更轻松地访问此功能。它提供了一个易于使用的图形界面来映射文件到物理设备。有关更多信息,请参阅云 控制在线帮助。
.Oracle数据库文件映射接口概述
为了了解I/O性能,必须详细了解文件所在的存储层次结构。
.Oracle文件映射接口是如何工作的
Oracle数据库文件映射包括以下组件:FMON(后台进程)、FMPUTL进程和映射库。
.使用Oracle数据库文件映射接口
您可以通过Oracle数据库文件映射接口启用文件映射,并在一组视图中获取有关文件映射的信息。
.映射文件例子
示例说明了Oracle数据库文件映射特性的一些强大功能。
Oracle数据库文件映射接口概述
要了解I/O性能,必须详细了解文件所在的存储层次结构。
Oracle数据库提供了一种机制来显示文件到逻辑卷中间层到实际物理设备的完整映射。这是通过一组动态性能视图(V$视图)来实现的。使用这些 视图,可以定位文件的任何块所在的确切磁盘。
为了构建这些视图,存储供应商必须提供负责映射其特定I/O堆栈元素的映射库。数据库通过一个外部的非oracle数据库进程与这些库通信,该 进程由一个名为FMON的后台进程派生。FMON负责管理映射信息。Oracle提供了一个PL/SQL包DBMS_STORAGE_MAP,您可以使用它来调用映射操作来 填充映射视图。
注意:
如果您没有使用Oracle自动存储管理,那么文件映射接口在Windows平台上是不可用的。如果您使用Oracle自动存储管理,那么文件映射接口在 所有平台上都是可用的。
Oracle文件映射接口是如何工作的
Oracle数据库文件映射包括以下组件:FMON(后台进程)、FMPUTL进程和映射库。
.文件映射组件:文件映射机制包括几个组件。
.映射结构:您必须了解映射结构和这些结构的Oracle数据库表示,才能解释映射视图中的信息。
.映射结构的例子:一个示例说明了映射结构。
.配置ID:配置ID捕获与元素或文件相关联的版本信息。
文件映射组件
文件映射机制包括几个组件。
.FMON
只要FILE_MAPPING初始化参数设置为true, FMON就是数据库启动的一个后台进程。FMON构建映射信息,并在发生变化时刷新映射信息。
.外部进程(FMPUTL)
FMON生成一个名为FMPUTL的外部非oracle数据库进程,该进程直接与厂商提供的映射库通信。
.映射库
Oracle数据库使用映射库来发现属于特定映射库的元素的映射信息。
FMON
只要FILE_MAPPING初始化参数设置为true, FMON就是数据库启动的一个后台进程。FMON构建映射信息,并在发生变化时刷新映射信息。
FMON负责:
.构建映射信息,存储在SGA中。该信息由以下结构组成:
– 文件
– 文件系统扩展
– 元素
– 子元素
.当由于以下原因发生变更时,刷新映射信息:
– 改变数据文件(大小)
– 添加或删除数据文件
– 改变存储配置(不频繁)
.将映射信息保存在数据字典中,以维护跨启动和关闭操作持久保存的信息视图
.在实例启动时将映射信息恢复到SGA。这避免了在每次实例启动时重新构建映射信息的潜在昂贵需求。
大家可以使用DBMS_STORAGE_MAP包调用的过程来帮助控制这个映射。
外部进程(FMPUTL)
FMON生成一个外部非oracle数据库进程FMPUTL,它直接与供应商提供的映射库通信。
该过程通过I/O栈的所有级别获取映射信息,假设所有级别都存在映射库。在某些平台上,外部进程需要将SETUID位设置为On,因为需要根权限 才能映射到I/O映射栈的所有级别。
外部进程负责发现映射库,并将它们动态加载到其地址空间中。
映射库
Oracle数据库使用映射库来发现属于特定映射库的元素的映射信息。
通过这些映射库传递有关各个I/O栈元素的信息。此信息用于填充可由用户查询的动态性能视图。
映射库需要存在于栈的所有级别,以便映射完整,而且不同的库可能拥有自己的I/O映射栈部分。例如,VERITAS VxVM库将拥有与VERITAS卷管理 器相关的堆栈元素,而EMC库将拥有I/O映射堆栈的所有EMC存储特定层。
映射库是供应商提供的。然而,Oracle目前为EMC存储提供了一个映射库。数据库服务器可用的映射库在名为filemap.ora的特殊文件中标识。
映射结构
您必须了解映射结构和这些结构的Oracle数据库表示,才能解释映射视图中的信息。以下是组成映射信息的主要结构:
.文件
文件映射结构为文件提供了一组属性,包括文件大小、文件组成的文件系统区段数量和文件类型。
.文件系统区段
文件系统区段映射结构描述驻留在一个元素上的连续块。这包括设备偏移量、区段大小、文件偏移量、类型(数据或奇偶校验)以及区段所在元素 的名称。
注意:
文件系统的区与Oracle数据库的区不同。文件系统区段是写入由文件系统管理的设备的物理连续数据块。数据库区是由数据库管理的逻辑结构, 如表空间区。
.元素
元素映射结构是描述I/O堆栈中的存储组件的抽象映射结构。元素可以是镜像、条带、分区、RAID5、连接的元素和磁盘。这些结构是映射的构建 块。
.子元素
子元素映射结构描述了I/O映射堆栈中一个元素和下一个元素之间的链接。该结构包含子元素号、大小、子元素所在的元素名称和元素偏移量。
下面的示例说明了所有这些映射结构
映射结构的示例
一个示例说明了映射结构。
考虑一个Oracle数据库,它由两个数据文件X和y组成X和Y位于挂载在卷a上的文件系统上。文件X由两个区组成,而文件Y仅由一个区组成。
文件X的两个区间和文件Y的一个区间都映射到元素A。元素A被条带化到元素B和C。元素A分别通过子元素B0和C1映射到元素B和C。
元素C镜像到元素E和F(都是物理磁盘)上,并分别通过子元素E0和F1镜像到这些物理磁盘。
请注意,所表示的映射结构足以描述Oracle数据库实例的整个映射信息,从而将文件中的每个逻辑块映射到I/O堆栈中每个级别的(元素名称、元 素偏移量)元组(如果是镜像,则更多)。
配置ID
配置ID捕获与元素或文件相关的版本信息。
供应商库提供配置ID,并在发生更改时更新它。如果没有配置ID,数据库就无法判断映射是否已更改。
配置id有两种:
.持久
这些配置id在实例关闭期间是持久的
.非持久
配置id在实例关闭期间不持久。数据库只能在实例启动时刷新映射信息。
使用Oracle数据库文件映射接口
您可以通过Oracle数据库文件映射接口启用文件映射,并在一组视图中获取有关文件映射的信息。
启用文件映射
为了启用文件映射。
1.确保filemap.ora文件是有效的。对于32位平台,在/opt/ORCLfmap/prot1_32/etc目录下;对于64位平台,在/opt/ORCLfmap/prot1_64/etc目录 下。
[root@19c1 /]# find / -name filemap.ora
/opt/ORCLfmap/prot1_64/etc/filemap.ora
/u01/app/19.0.0/grid/rdbms/install/filemap.ora
/u01/app/oracle/19.0.0/db/rdbms/install/filemap.ora
[root@19c1 /]# cat /opt/ORCLfmap/prot1_64/etc/filemap.ora
###############################################################################
# #
# This is the configuration file that describes all the mapping libraries #
# available. #
# #
# The following row needs to be created for each library: #
# lib={vendor name}: {mapping library path} #
# #
# Note that the ordering of the libraries in this file is extremely #
# important. The libraries are queried based on their order in the #
# configuration file. #
# #
# Oracle provides a mapping library for EMC Symmetrix arrays. This library #
# (LIBMAPSYM.SO) uses the SYMAPI and SYMLVM EMC libraries. #
# #
# UNCOMMENT THE ROW CORRESPONDING TO THAT LIBRARY ONLY IF THE SYM LIBRARIES #
# ARE AVAILABLE ON SOLARIS. #
###############################################################################
## The next row needs to be commented out only for Solaris on EMC storage
#lib=Oracle: /u01/app/19.0.0/grid/lib/%s_mapsym%
## The next row can be comented out on ALL UNIX PLATFORMS if no other
## libraries exist
#lib=Oracle: /u01/app/19.0.0/grid/lib/%s_mapdummy%
注意:虽然这里讨论了文件映射表(filemap.ora)文件的格式和内容,但仅供参考。文件映射表(filemap.ora)文件是由数据库在系统安装时 创建的。在供应商提供自己的库之前,文件映射表(filemap.ora)文件中将只有一条记录,即Oracle提供的EMC库。如果拥有EMC Symmetrix阵 列,则应手动修改此文件,仅需取消注释此条记录。
filemap.ora文件是描述所有可用映射库的配置文件。 FMON 要求存在一个 `filemap.ora` 文件,并且该文件指向一个有效的映射库路径。否则 ,FMON 将无法成功启动。
filemap中必须包含下一行。
lib=vendor_name:mapping_library_path
这里;
. vendor_name应该是Oracle对EMC的对称库
. mapping_library_path是映射库的全路径
请注意,这个文件中库的顺序非常重要。库是根据它们在配置文件中的顺序查询的。
即使没有可用的映射库,也可以启动文件映射服务。filemap.ora文件仍然必须存在,即使它是空的。在这种情况下,映射服务受到限制,因为 不能发现新的映射信息。在这种配置中,只允许恢复和删除操作。
2.将FILE_MAPPING初始化参数设置为TRUE。
不必关闭实例即可设置此参数。您可以使用下面的ALTER SYSTEM语句设置它:
SQL> show parameter file_mapping NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ file_mapping boolean FALSE SQL> ALTER SYSTEM SET FILE_MAPPING=TRUE scope=both sid='*'; System altered. SQL> show parameter file_mapping NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ file_mapping boolean TRUE [root@19c1 ~]# ps -ef | grep fmon oracle 15552 1 0 15:24 ? 00:00:00 ora_fmon_hy1 root 16269 16207 0 15:24 pts/1 00:00:00 grep --color=auto fmon
3.调用适当的DBMS_STORAGE_MAP映射过程。你有两个选择:
.在冷启动场景中,Oracle数据库刚刚启动,尚未调用任何映射操作。执行DBMS_STORAGE_MAP.MAP_ALL过程为与数据库关联的整个I/O子系统构建 映射信息。
.在已经构建了映射信息的热启动场景中,您可以选择调用DBMS_STORAGE_MAP.MAP_SAVE过程将映射信息保存到数据字典中。(注意,这个过程是 在调用DBMS_STORAGE_MAP.MAP_ALL()过程中默认调用的)。这将强制将SGA中的所有映射信息刷新到磁盘。
重新启动数据库后,使用DBMS_STORAGE_MAP.RESTORE()将映射信息恢复到SGA中。如果需要,可以调用DBMS_STORAGE_MAP.MAP_ALL()来刷新映 射信息。
使用DBMS_STORAGE_MAP包
DBMS_STORAGE_MAP包允许您控制映射操作。
下表描述了您可以使用的各种程序。
MAP_OBJECT:构建由对象名称、所有者和类型标识的数据库对象的映射信息
MAP_ELEMENT:
为指定元素生成映射信息
MAP_FILE:为指定的文件名生成映射信息
MAP_ALL:为所有类型的数据库文件构建完整的映射信息(存档日志除外)
DROP_ELEMENT:删除指定元素的映射信息
DROP_FILE:删除指定文件名的文件映射信息
DROP_ALL:删除此实例的SGA中的所有映射信息
SAVE:将重新生成整个映射所需的信息保存到数据字典中
RESTORE:将数据字典中的整个映射信息加载到实例的共享内存中
LOCK_MAP:在SGA中锁定此实例的映射信息
UNLOCK_MAP:解锁该实例在SGA中的映射信息
从文件映射视图获取信息
DBMS_STORAGE_MAP包生成的映射信息在动态性能视图中捕获。
V$MAP_LIBRARY:包含由外部进程动态加载的所有映射库的列表
V$MAP_FILE:包含实例的共享内存中所有文件映射结构的列表
V$MAP_FILE_EXTENT:包含实例的共享内存中所有文件系统区段映射结构的列表
V$MAP_ELEMENT:包含实例的SGA中所有元素映射结构的列表
V$MAP_EXT_ELEMENT:包含所有元素映射的补充信息
V$MAP_SUBELEMENT:包含实例共享内存中所有子元素映射结构的列表
V$MAP_COMP_LIST:包含所有元素映射结构的补充信息。
V$MAP_FILE_IO_STACK:文件存储容器的层次结构排列显示为一系列行。每行表示层次结构中的一个级别。
然而,由 DBMS_STORAGE_MAP.MAP_OBJECT 过程生成的信息会被捕获到一个名为 MAP_OBJECT 的全局临时表中。此表展示了对象存储容器的层级 排列。表中的每一行代表层级结构中的一个层级。以下是对 MAP_OBJECT 表的描述。
SQL> desc MAP_OBJECT; Name Null? Type ----------------------------------------- -------- ---------------------------- OBJECT_NAME VARCHAR2(2000) OBJECT_OWNER VARCHAR2(2000) OBJECT_TYPE VARCHAR2(2000) FILE_MAP_IDX NUMBER DEPTH NUMBER ELEM_IDX NUMBER CU_SIZE NUMBER STRIDE NUMBER NUM_CU NUMBER ELEM_OFFSET NUMBER FILE_OFFSET NUMBER DATA_TYPE VARCHAR2(2000) PARITY_POS NUMBER PARITY_PERIOD NUMBER
内存映射文件例子
示例说明了Oracle数据库文件映射特性的一些强大功能。
这些功能包括:
.映射跨特定设备的所有数据库文件的能力
.将特定文件映射到相应设备的能力
.映射特定数据库对象的能力,包括它在I/O堆栈内所有级别上的块分布
例1:映射跨设备的所有数据库文件
一个示例说明返回与主机设备关联的所有Oracle数据库文件。
下面的查询将返回与+/dev/asmdisk02主机设备关联的所有Oracle数据库文件:
SQL> SELECT UNIQUE me.ELEM_NAME, mf.FILE_NAME 2 FROM V$MAP_FILE_IO_STACK fs, V$MAP_FILE mf, V$MAP_ELEMENT me 3 WHERE mf.FILE_MAP_IDX = fs.FILE_MAP_IDX 4 AND me.ELEM_IDX = fs.ELEM_IDX 5 AND me.ELEM_NAME = '+/dev/asmdisk02'; ELEM_NAME FILE_NAME -------------------- -------------------------------------------------------------------------------- +/dev/asmdisk02 +DATA/HY/DATAFILE/sysaux.259.1035285279 +/dev/asmdisk02 +DATA/HY/811A060B58140C01E053DC06E80AF3C6/DATAFILE/undotbs1.268.1035285455 +/dev/asmdisk02 +DATA/HY/DATAFILE/undotbs1.260.1035285305 +/dev/asmdisk02 +DATA/HY/811A060B58140C01E053DC06E80AF3C6/DATAFILE/system.266.1035285455 +/dev/asmdisk02 +DATA/HY/811A060B58140C01E053DC06E80AF3C6/DATAFILE/sysaux.267.1035285455 +/dev/asmdisk02 +DATA/HY/A105A63457DE7172E053BF828A0A80E2/DATAFILE/sysaux.276.1035286627 +/dev/asmdisk02 +DATA/HY/A105A63457DE7172E053BF828A0A80E2/DATAFILE/undotbs1.274.1035286627 +/dev/asmdisk02 +DATA/HY/DATAFILE/system.258.1035285225 +/dev/asmdisk02 +DATA/HY/DATAFILE/users.261.1035285305 +/dev/asmdisk02 +DATA/HY/DATAFILE/undotbs2.270.1035285777 +/dev/asmdisk02 +DATA/HY/A105A63457DE7172E053BF828A0A80E2/DATAFILE/system.275.1035286627 +/dev/asmdisk02 +DATA/HY/A105A63457DE7172E053BF828A0A80E2/DATAFILE/undo_2.278.1035286673 +/dev/asmdisk02 +DATA/HY/A105A63457DE7172E053BF828A0A80E2/DATAFILE/users.279.1035286689 13 rows selected.
例2:将文件映射到对应的设备
示例显示数据文件的拓扑图。
下面的查询显示了/oracle/dbs/t_db1的拓扑图。F数据文件:
FILE_NAME ELEM_NAME ----------------------- ------------------------------------------------- /oracle/dbs/t_db1.f _sym_plex_/dev/vx/rdsk/ipfdg/ipf-vol1_-1_-1 /oracle/dbs/t_db1.f _sym_subdisk_/dev/vx/rdsk/ipfdg/ipf-vol1_0_0_0 /oracle/dbs/t_db1.f /dev/vx/rdmp/c2t1d0s2 /oracle/dbs/t_db1.f _sym_symdev_000183600407_00C /oracle/dbs/t_db1.f _sym_hyper_000183600407_00C_0 /oracle/dbs/t_db1.f _sym_hyper_000183600407_00C_1 /oracle/dbs/t_db1.f _sym_subdisk_/dev/vx/rdsk/ipfdg/ipf-vol1_0_1_0 /oracle/dbs/t_db1.f /dev/vx/rdmp/c2t1d1s2 /oracle/dbs/t_db1.f _sym_symdev_000183600407_00D /oracle/dbs/t_db1.f _sym_hyper_000183600407_00D_0 /oracle/dbs/t_db1.f _sym_hyper_000183600407_00D_1
示例3:映射数据库对象
一个示例显示了一个表的I/O堆栈中所有级别的块分布。
这个例子显示了scott.bonus表的I/O堆栈中所有级别的块分布。
MAP_OBJECT()操作必须先执行如下:
SQL> EXECUTE DBMS_STORAGE_MAP.MAP_OBJECT('BONUS','SCOTT','TABLE');
PL/SQL procedure successfully completed.
SQL> SELECT io.OBJECT_NAME o_name, io.OBJECT_OWNER o_owner, io.OBJECT_TYPE o_type,
2 mf.FILE_NAME, me.ELEM_NAME, io.DEPTH,
3 (SUM(io.CU_SIZE * (io.NUM_CU - DECODE(io.PARITY_PERIOD, 0, 0,
4 TRUNC(io.NUM_CU / io.PARITY_PERIOD)))) / 2) o_size
5 FROM MAP_OBJECT io, V$MAP_ELEMENT me, V$MAP_FILE mf
6 WHERE io.OBJECT_NAME = 'MGMT_SNAPSHOT'
7 AND io.OBJECT_OWNER = 'DBSNMP'
8 AND io.OBJECT_TYPE = 'TABLE'
9 AND me.ELEM_IDX = io.ELEM_IDX
10 AND mf.FILE_MAP_IDX = io.FILE_MAP_IDX
11 GROUP BY io.ELEM_IDX, io.FILE_MAP_IDX, me.ELEM_NAME, mf.FILE_NAME, io.DEPTH,
12 io.OBJECT_NAME, io.OBJECT_OWNER, io.OBJECT_TYPE
13 ORDER BY io.DEPTH;
O_NAME O_OWNER O_TYPE FILE_NAME ELEM_NAME DEPTH O_SIZE
------ ------- ------ ------------------- ----------------------------- ------ ------
BONUS SCOTT TABLE /oracle/dbs/t_db1.f dev/vx/dsk/ipfdg/ipf-vol1 0 20
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_plex_/dev/vx/rdsk/ipf 1 20
pdg/if-vol1_-1_-1
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_subdisk_/dev/vx/rdsk/ 2 12
ipfdg/ipf-vol1_0_1_0
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_subdisk_/dev/vx/rdsk/ipf 2 8
dg/ipf-vol1_0_2_0
BONUS SCOTT TABLE /oracle/dbs/t_db1.f /dev/vx/rdmp/c2t1d1s2 3 12
BONUS SCOTT TABLE /oracle/dbs/t_db1.f /dev/vx/rdmp/c2t1d2s2 3 8
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_symdev_000183600407_00D 4 12
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_symdev_000183600407_00E 4 8
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_hyper_000183600407_00D_0 5 12
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_hyper_000183600407_00D_1 5 12
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_hyper_000183600407_00E_0 6 8
BONUS SCOTT TABLE /oracle/dbs/t_db1.f _sym_hyper_000183600407_00E_1 6 8