Oracle Database 11gR2:面向 DBA 和开发人员的重要特性

来源:互联网 发布:淘宝后台客服电话 编辑:程序博客网 时间:2024/05/22 11:50

原文地址:http://www.oracle.com/technetwork/cn/articles/sql/11g-ha-302502-zhs.html

 

在 Oracle Database 11g 第 2 版中,安装过程发生了三项重大改动。首先,一个新界面取代了我们熟悉的 Oracle Universal Installer 屏幕。

Oracle 安装程序

注意左侧的列表显示了安装步骤。右侧显示了安装的详细信息。与先前版本中仅显示进度条相比,这是一个重大改进。左侧不仅向您显示已完成的部分,还允许您随意回退到特定部分以更正某些内容或进行修改。

您要注意的第二个重要区别在数据库补丁集区域中。过去,Oracle 数据库补丁集仅用于修复错误;充其量也就是引入些微小的新功能。但此版本的 Oracle 打破了这一传统:Oracle Database 11g 第 2 版的第一个补丁集 11.2.0.2 引入了一些重要的新功能。

最后,第三项改动也涉及到补丁集。过去,补丁集(例如,Oracle 10.2.0.4 或 9.2.0.8)作为补丁进行发布;您必须将补丁(通常是名称类似于 p8202632_10205_LINUX.zip 的文件)应用到现有安装。但是,使用此版本,补丁集现在是独立的:例如,11.2.0.2 补丁集是一个全新安装 — 它包含七个文件,总共约 4GB,是您创建 11.2 数据库所需的所有文件。

这就引发了一个逻辑问题:如果您从 11.2.0.1 升级到 11.2.0.2,将会是什么情况?您将在一个完全不同的主目录中安装 11.2.0.2 软件,关闭主数据库,将 ORACLE_HOME 变量更改为新的 Oracle 主目录,然后开始升级过程。

此方法在修补 Clusterware 时非常有用。当旧的集群件已启动且正在运行时,您将在不同的 Oracle 主目录中安装 Clusterware。然后,只需关闭旧主目录上的集群服务,然后将这些集群服务转移到新的主目录。在一个由两个节点组成的 RAC 集群中,这使您能够实现零停机或近乎零停机的升级。

升级选项

谈到升级,您只能从以下版本升级到 Oracle Database 11g 第 2 版。源数据库必须至少处于以下补丁集级别。

  • 如果在 Oracle 9i 第 2 版中,应使用了补丁集 9.2.0.8 或更高版本
  • 如果在 Oracle Database 10g 第 1 版中,应使用了补丁集 10.1.0.5 或更高版本
  • 如果在 Oracle Database 10g 第 2 版中,应使用了补丁集 10.2.0.2 或更高版本
  • 如果在 Oracle Database 11g 第 1 版中,应使用了补丁集 11.1.0.6 或更高版本

如果您处于较低版本的数据库或补丁集中,那么在升级之前,应先将其升级到所需的级别。例如,如果您的数据库为 10.1.0.4,那么在尝试 11.2 升级之前,必须先应用补丁 10.1.0.5。如果您是更低的版本(例如 Oracle8i),那么必须执行两步式升级:升级到 Oracle 10.2.0.4,然后升级到 11.2。

升级提示

为了更好的升级体验,在升级之前,您应注意几个问题。升级指南中进行了明确描述。以下是一些提示。(请注意,这并不全面。我只介绍有代表性的几个。)

字典统计信息

Oracle Database 11.2 需要有关字典表的优化器统计信息。如果源数据库没有此类统计信息(大多数情况下如此),那么将在升级期间收集统计信息。不用说,这会使升级过程极为漫长。由于数据库在该时间段内将关闭,因此可能极不希望出现升级时间过长的情况。

要压缩升级时间,应在升级之前计算有关字典对象的统计信息。以 SYS 身份执行以下 SQL:

begin     dbms_stats.gather_dictionary_stats;   end;


此过程不要求停机。在 Oracle9i 中,以上过程不存在。因此,您应改为执行 dbms_stats.gather_schema_stats。

无效对象

此提示适用于任何升级,并不只针对于 11.2。在升级期间,将会编译无效对象。根据此类对象的数量,所需的时间可能很漫长。因此,最好在升级之前编译所有无效对象。对于由于依赖性故障而无法编译的对象,应将其删除。可以使用 Data Pump Export 来备份这些对象。

CONNECT 角色

还记得 CONNECT 角色吗?在先前的版本中,该角色具有的权限不仅限于连接。它还具有创建表、创建同义词等权限。在 Oracle Database 11.2 中,该角色只有一个权限:CREATE SESSION。因此,只具有该角色的用户可能会因为缺少权限而无法执行某些操作,例如,如果用户以前需要创建表,现在将无法执行该操作。

所以,您应识别具有 connect 角色的用户,并为他们授予所需的权限。此操作可在升级之后执行,但最好是在升级之前执行。

原始设备支持

这不是一个问题,但是我想在此提一下以澄清某些疑惑。Oracle Database 11.2 完全不支持原始设备。请看清楚:是不支持;而不是不赞成使用。那么这是否意味着必须在转换之前将原始设备上的数据文件转换到文件系统或 ASM?

并非如此。11.2 中不支持原始设备意味着将不能在原始设备上创建新数据库,必须使用 ASM 或文件系统。但是,在原始设备上升级现有数据库时,可以在原始设备上继续进行。您仍然可以在原始设备上创建新数据文件。

在下一个主要版本中,Oracle 可能完全不支持原始设备升级以及新建数据库。因此,您应尽快舍弃原始设备。

Grid Infrastructure 主目录

此版本的 Oracle Database 中最重要的改动之一是将 ASM 与 RDBMS 代码分离,正如您在 ASM 部分中所了解的那样。概括来说,在之前版本的 Oracle Database 中,ASM 不是一个独立软件,而是 RDBMS 代码本身的一部分。您无需单独安装 ASM(不过最好为 ASM 创建一个单独的主目录)。在此版本中,ASM 不再是 RDBMS 代码的一部分。已将其打包到名为 Grid Infrastructure (GI) 的新组件中,这个新组件还包括 Clusterware。即使您不使用 RAC(因此也就没有集群),如果您计划使用 ASM,那么也必须安装 GI。

因此,您需要在两个不同主目录中执行两个安装:GI 主目录和 RDBMS 主目录。

下载页面中,注意所提供的不同软件下载:

  • 适用于 Linux x86 的 Oracle Database 11g 第 2 版 Grid Infrastructure (11.2.0.1.0)
  • 适用于 Linux x86 的 Oracle Database 11g 第 2 版 (11.2.0.1.0)

应同时下载这两项(如果您计划使用 ASM;即使您不打算使用 RAC)。首先,需要安装 Grid Infrastructure,它会配置 ASM 并启动 ASM。接下来,为 RDBMS 安装 Database 软件,该软件将使用之前创建的 ASM 磁盘组。

提供 ASM 服务并非 Grid Infrastructure 的唯一功能。下一部分将介绍它的另一个重要用途。

为了提高安全性,应对数据库和 GI 使用不同的用户 ID。例如,可以对 GI 使用 oragrid,对数据库软件使用 oradb。这样做可以将 Grid Infrastructure 的控制权授予非 DBA 的组,如系统管理员。您无需进行这样的职责分离,但是根据不同的用户 ID 进行设置可使您在将来需要的时候实现职责分离。

Oracle Restart

如果 Oracle 的 PMON 进程被终止,会发生什么情况?当然,实例终止。同样的结果也适用于任何其他关键进程的终止,如 SMON、LGWR 等。有些时候,问题本质上是暂时性的,可由自身解决。在这些情况下,如果您重新启动实例,它将恢复正常;但您必须亲自处理检测故障和启动进程这一过程。

之前,使用 Oracle RAC 时,CRS 负责检测和重新启动。如果您没有使用 RAC,则没有这种选择。但是,在此版本的 Oracle Database 中,即使您不使用 RAC,也具有这种能力。Grid Infrastructure 中提供被称作 Oracle Restart 的功能。代理会检查数据库、监听器、ASM 等重要组件的可用性,在这些组件关闭的情况下自动将其启动。该功能是现成可用的,除了基本配置外,无需额外编程。用于检查可用性并重新启动故障组件的组件被称作 HAS(高可用性服务)。

以下是检查 HAS 自身可用性的方法(在 Grid Infrastructure 主目录中):

$ crsctl check hasCRS-4638: Oracle High Availability Services is online


该服务必须联机才能生效。可通过以下命令来检查版本:

$ crsctl query has releaseversionOracle High Availability Services release version on the local node is [11.2.0.1.0]
$ crsctl query has softwareversionOracle High Availability Services version on the local node is [11.2.0.1.0]


该服务可设置为自动启动。检查该服务是否已配置为自动启动:

$ crsctl config hasCRS-4622: Oracle High Availability Services autostart is enabled.


如果该服务未设置为自动启动,可以通过以下方式进行设置:

$ crsctl enable hasCRS-4622: Oracle High Availability Services autostart is enabled.


将“enable”替换为“disable”将删除 HAS 的自动启动属性。如果未启动,可通过如下方式启动:

$ crsctl start has


类似地,“stop”子句可停止 HAS。Grid Infrastructure 安装将一个名为 ohasd 的可执行文件放在服务器的自动启动目录中,例如,对于 Linux,放在 /etc/init.d 中。这个可执行文件提供 HAS 服务,换言之,它是 HAS 后台程序。在 Linux 中,可通过检查以下进程来进行确认:

$ ps -aef|grep hasroot      5185     1  0 Aug10 ?        00:00:00 /bin/sh /etc/init.d/init.ohasd runoracle    5297     1  0 Aug10 ?        00:05:24 /opt/oracle/product/11.2.0/grid/bin/ohasd.bin reboot


有了 HAS 之后,就可以注册应由 HAS 监视并在需要时进行恢复的组件。这些操作通过 Grid Infrastructure 的 ORACLE_HOME/bin 下的 srvctl 命令完成。您可能熟悉此命令;它用于 RAC 中。在 Oracle Database 11.2 中,也可以在单个实例中使用此命令。

您要添加的第一个组件是 Oracle Database 本身。下面是注册数据库的方式:

$ srvctl add database -d D112D2 -o /opt/oracle/product/11.2.0/db1 -y AUTOMATIC -r PRIMARY -s open 


以上命令注册了一个在 Oracle 主目录 /opt/oracle/product/11.2.0/db1 中运行、名为 D112D2 的数据库。“-y”选项可命令 HAS 在发生故障时自动重新启动数据库。“-r”选项指明角色,在此例中为 Primary(假定采用 Data Guard 配置)。“-s”选项可命令 HAS 在重新启动时恢复数据库直到打开状态。

完成配置后,可使用如下所示的命令启动数据库:

$ srvctl start database -d D112D2


该命令按正确顺序启动组件,即,必须先启动 ASM 实例并挂载磁盘组,然后才能启动数据库。仅在使用 SRVCTL 时才有此要求。如果您使用 SQL*Plus 启动数据库,就不会检查这些依赖性。

检查数据库的状态:

$ srvctl status database -d D112D2Database is running.


选项“-v”显示数据库中正在运行的服务:

$ srvctl status database -d D112D2 -vDatabase D112D2 is running with online services APP


要获取数据库的详细信息,应使用“config”选项

$ srvctl config database -d D112D2 -aDatabase unique name: D112D2Database name: D112D2Oracle home: /opt/oracle/product/11.2.0/db1Oracle user: oracleSpfile: +DATA/D112D2/spfileD112D2.oraDomain: Start options: openStop options: immediateDatabase role: PRIMARYManagement policy: AUTOMATICDisk Groups: DATAServices: APPDatabase is enabled


类似地,可以通过如下所示的命令来配置监听器:

$ srvctl config listener -l LISTENER1Name: LISTENER1Home: /opt/oracle/product/11.2.0/gridEnd points: TCP:1522


完成配置后,就会创建监听器;检查监听器的状态:

$ srvctl status listener -l LISTENER1Listener LISTENER1 is enabledListener LISTENER1 is not running


监听器没有运行。只是创建了监听器;并未启动。启动监听器:

$ srvctl start listener -l LISTENER1


可以用同样的方式检查 ASM 的配置。

$ srvctl config asm -aASM home: /opt/oracle/product/11.2.0/gridASM listener: LISTENERSpfile: +DATA/asm/asmparameterfile/registry.253.720043719ASM diskgroup discovery string: /dev/sdb*ASM is enabled.


检查 ASM 的状态:

$ srvctl status asm -aASM is running on oradba2ASM is enabled.


也可以对磁盘组以及服务进行配置。下面是创建名为 APP 服务的方法(切记,我们是在单个实例中执行此操作,而非在长久使用这些命令的 RAC 中)。

$ srvctl add service -d D112D2 -s APP


创建 APP 服务后,可以检查该服务的各种属性:

$ srvctl config service -d D112D2 -aService name: APPService is enabledCardinality: SINGLETONDisconnect: falseService role: PRIMARYManagement policy: AUTOMATICDTP transaction: falseAQ HA notifications: falseFailover type: NONEFailover method: NONETAF failover retries: 0TAF failover delay: 0Connection Load Balancing Goal: LONGRuntime Load Balancing Goal: NONETAF policy specification: NONE


服务已创建,但尚未启动。可以检查服务的状态并启动服务:

$ srvctl status service -d D112D2 -s APPService APP is not running.$ srvctl start service -d D112D2 -s APP$ srvctl status service -d D112D2 -s APPService APP is running


也可以对 ASM 中的磁盘组使用这个命令,这些磁盘组也被视为资源。

$ srvctl start diskgroup -g <dg_name>$ srvctl stop diskgroup -g <dg_name> [-f] 


(“-f”选项强制停止磁盘组,即使某个数据库正在使用该磁盘组并且当前正在运行)

$ srvctl status diskgroup -g <dg_name> [-a] 


(“-a”选项用于显示所有状态)

$ srvctl enable diskgroup -g <dg_name>$ srvctl disable diskgroup -g <dg_name>


要修改配置,可以使用“modify”子句:

$ srvctl modify database -d D112D2 –z


在此示例中,我们已配置为删除数据库上磁盘组的依赖性(–z 选项执行该操作)

要从 Oracle Restart 中删除数据库,可以使用

$ srvctl remove database -d D112D2 -v Remove the database D112D2? (y/[n]) ySuccessfully removed database and its dependent services.


这只是从 HAS 服务中删除了数据库。不会删除数据库本身。

您可以在 HAS 所管理的资源运行时获取它们的大量信息。以下命令可执行该操作。代表“详细”输出的“-v”选项可执行该操作。

$ crsctl status resource -vNAME=ora.DATA.dgTYPE=ora.diskgroup.typeLAST_SERVER=oradba2STATE=ONLINE on oradba2TARGET=ONLINECARDINALITY_ID=ONLINECREATION_SEED=6CURRENT_RCOUNT=0FAILURE_COUNT=0FAILURE_HISTORY=ID=ora.DATA.dg oradba2 1INCARNATION=1LAST_RESTART=1281465040STATE_DETAILS=

… 删减了部分输出 …

NAME=ora.diskmonTYPE=ora.diskmon.typeLAST_SERVER=oradba2STATE=ONLINE on oradba2TARGET=ONLINECARDINALITY_ID=1CREATION_SEED=1CURRENT_RCOUNT=0FAILURE_COUNT=0FAILURE_HISTORY=ID=ora.diskmon 1 1INCARNATION=1LAST_RESTART=1281462735STATE_DETAILS=


尽管有一些详细信息,但是不太便于阅读。可通过以下命令获取更简洁的报告:

$ crsctl status resource -t--------------------------------------------------------------------------------NAME              TARGET  STATE        SERVER        STATE_DETAILS       --------------------------------------------------------------------------------Local Resources--------------------------------------------------------------------------------ora.DATA.dg       ONLINE  ONLINE       oradba2                                      ora.DG1.dg        ONLINE  ONLINE       oradba2                                      ora.DG2.dg        OFFLINE OFFLINE      oradba2                                      ora.LISTENER.lsnr ONLINE  ONLINE       oradba2                                      ora.asm           ONLINE  ONLINE       oradba2       Started             --------------------------------------------------------------------------------Cluster Resources--------------------------------------------------------------------------------ora.cssd 1        ONLINE  ONLINE       oradba2                                      ora.d112d2.db     ONLINE  ONLINE       oradba2       Open                ora.diskmon       ONLINE  ONLINE       oradba2             


如果您希望仅获取特定资源的详细输出,该怎么办?通过将该资源命名为参数可实现此目的。(请注意:必须提供完整的资源名称,就像 crsctl 输出中显示的那样。例如,资源 APP 不是完整名称。完整名称为 ora.d112d2.app.svc。)

$ crsctl status resource ora.d112d2.app.svcNAME=ora.d112d2.app.svcTYPE=ora.service.typeTARGET=ONLINESTATE=ONLINE on oradba2


“-v”选项使输出更加详细。

$ crsctl status resource ora.d112d2.app.svc -vNAME=ora.d112d2.app.svcTYPE=ora.service.typeLAST_SERVER=oradba2STATE=ONLINE on oradba2TARGET=ONLINECARDINALITY_ID=1CREATION_SEED=17CURRENT_RCOUNT=0FAILURE_COUNT=0FAILURE_HISTORY=ID=ora.d112d2.app.svc 1 1INCARNATION=1LAST_RESTART=1293305825STATE_DETAILS=


可通过以下命令启动所有资源

$ crsctl start resource -allCRS-5702: Resource 'ora.DG1.dg' is already running on 'oradba2'CRS-5702: Resource 'ora.LISTENER.lsnr' is already running on 'oradba2'CRS-5702: Resource 'ora.asm' is already running on 'oradba2'CRS-5702: Resource 'ora.cssd' is already running on 'oradba2'CRS-5702: Resource 'ora.d112d2.app.svc' is already running on 'oradba2'CRS-5702: Resource 'ora.d112d2.db' is already running on 'oradba2'CRS-5702: Resource 'ora.diskmon' is already running on 'oradba2'CRS-2672: Attempting to start 'ora.DG2.dg' on 'oradba2'CRS-2676: Start of 'ora.DG2.dg' on 'oradba2' succeededCRS-4000: Command Start failed, or completed with errors.


这是一个有用的命令,可一次启动所有资源,但如果一个命令失败,将在结尾处显示“completed with errors”输出。如果对所有组件启用了自动启动,那么该命令确实没什么必要。在某些情况下,特别是在您尝试诊断环境中的问题时,可能希望禁用自动启动,然后手动启动组件。

要停止在特定 Oracle 主目录中运行的所有资源,可执行以下命令:

$ srvctl stop home -o /opt/oracle/product/11.2.0/db1 -s mystate.txt


文件 mystate.txt 被称作“状态文件”,记录组件关闭时 HAS 组件的状态。该文件如下所示:

$ cat mystate.txtsvc-APPdb-d112d2


类似地,要启动在特定 Oracle 主目录中启动的所有资源,可执行以下命令:

$ srvctl start home -o /opt/oracle/product/11.2.0/db1 -s mystate.txt


需要有状态文件才能启动在关闭时所运行的资源。

RAC One Node

您是否熟悉主动/被动集群的概念,比如 Veritas Storage Foundation、HP ServiceGuard 和 IBM HACMP?如果不熟悉,简单来说,它们监视运行数据库的“主动”服务器上的故障。当该服务器发生故障时,集群将在被动服务器上挂载磁盘并启动数据库实例。它还将 IP 地址(称为虚拟 IP)移至被动服务器,这样,客户端实际上无需任何更改。集群会面临短暂停机,但很快会继续运转。(尽管这些技术被称作集群,但严格来说并非“集群”,至少不是 Oracle 所定义的集群。)

RAC One Node 是 Oracle 针对这类问题的答案。在此配置中,Oracle Clusterware 通过 ASM 创建一个使存储跨多个节点可见的集群。可以对这个概念进行扩展,以创建一种特殊类型的 RAC 数据库:一个节点上只运行一个实例。如果某个节点发生故障,那么可以将另一个实例安排到集群中的其他节点上以继续处理。RAC One Node 在某种程度上是一个完整的 RAC 数据库,但是由于只有一个实例运行,不存在跨实例通信,因此您可能感受不到由此产生的性能问题。

但这并不意味着另一个处于被动状态的“节点”成了浪费的资源?对于这个数据库而言,另一个节点当然是被浪费了。但是您可以在被动服务器上为其他数据库创建实例,这样就使其成为该数据库的主动服务器。通过以这种方式使用许多数据库,您可以创造一种负载平衡的假象,同时使所有这些数据库具有更好的可用性。用于数据库的主动/被动节点的服务器组称为“服务器池”。

Oracle Clusterware 用特定配置来创建 RAC One Node 数据库。下面是创建名为 RAC1 的数据库的示例。

$ srvctl add database -c RACONENODE -e "dantstpdb01,dantstpdb02" -i RAC12 -d RAC1 -o /Proltst/oradb/db1


“-c”选项指定数据库类型,在此例中为 RAC One Node。服务器池包含由“-e”选项指定的两台服务器:dantstpdb01 和 dantstpdb02。实例名称由“-I”选项指定,Oracle 主目录由“-o”指定。

如果希望将数据库移至其他节点,可执行以下命令:

$ srvctl relocate database -d RAC1 -n dantstpdb01


如果要将常规数据库转换为 RAC One Node 数据库,首先应仅在一个节点上将其转换为 RAC 数据库。然后使用 convert 命令:

$ srvctl convert database -d RAC1 -c RACONENODE


如果您改变了主意,可以仅在一个节点上将其转换回常规 RAC 数据库:

$ srvctl convert database -d RAC1 -c RAC


如果您对 RAC One Node 的效用感到困惑,想知道为何常规 Oracle RAC 不能提供相同的优势,您应了解它们之间的一些区别。

  • RAC One Node 更便宜
  • RAC One Node 没有 RAC 那么复杂,并且可由经验不甚丰富的 DBA 提供支持
  • RAC One Node 有其自己的一组命令,这些命令可使 DBA 免受 RAC 管理的某些细微差异的影响
  • 作为一个单独的节点,它不会产生高频率节点间通信的性能开销

但 RAC One Node 绝不是万能的。它绝对不是一个 DR 解决方案,对此,Data Guard 才是更好的替代方法。由于仅使用集群的一个节点,因此,无法对同一数据库实现负载平衡。

SCAN 监听器

开始讨论此特性之前,我们要先谈谈 RAC 配置的一个潜在问题。假设您的 RAC 集群中有两个节点,VIP 主机名分别为 node1-vip 和 node2-vip。客户端将需要在这两个节点之间进行负载平衡。为此,您可能已创建了一个 TNSNAMES.ORA 文件条目,如下所示:

APP=  (DESCRIPTION=    (FAILOVER=on)    (LOAD_BALANCE=on)    (ADDRESS_LIST=      (ADDRESS=        (PROTOCOL=TCP)        (HOST=node1-vip)        (PORT=1521)      )      (ADDRESS=        (PROTOCOL=TCP)        (HOST=node2-vip)        (PORT=1521)      )    )    (CONNECT_DATA=      (FAILOVER_MODE=        (TYPE=select)        (METHOD=basic)        (RETRIES=120)      )      (SERVER=dedicated)      (SERVICE_NAME=APP)    )  )


假设您决定向集群中添加第三个节点 node3-vip。即使您在第三个节点上定义了服务 APP,客户端也将无法连接到该节点,这是因为 TNS 条目中实际未提及 node3-vip。这时该怎么办?

唯一的选择是在客户端更新 TNS 条目以添加第三个节点的信息。如果是屈指可数的几个客户端,这可能并非一个复杂任务,但是请考虑有数千个客户端的情况。

解决办法可能是引入 Oracle Internet Directory 或类似的软件。某些组织甚至将 TNSNAMES.ORA 存储在 NFS 挂载点上的单个位置中。所有这些办法即使可以执行,也非常困难,尤其是在大型组织中。

为解决此问题,11g 第 2 版引入了单客户端访问名称 (SCAN) 的概念。它就是一个主机名,比如 app-scan。集群节点中的监听器监听该主机名。该主机名会映射到三个 IP 地址(也可以是一个;但最好是三个,以避免单点故障)。在 DNS 中定义该主机名后,该名称会解析为三个 IP 地址,如下所示:

C:\>nslookup dantstp-scanServer:  stcadcpdc04.proligence.comAddress:  10.20.223.108
Name:    dantstp-scan.proligence.comAddresses:  192.168.76.62, 192.168.76.63, 192.168.76.64


对该名称进行 ping 操作时,它应以循环方式解析为三个 IP。然后,每个节点运行一个特殊类型的监听器 — SCAN 监听器。过程如下:

# ps -aef|grep lsnroragrid  9437224        1   0   Dec 23      -  0:04 /Proltst/oragrid/grid1/bin/tnslsnr LISTENER_SCAN1 -inherit oragrid 32374934 55902452   0 21:15:04  pts/1  0:00 grep lsnr oragrid 64356462        1   0   Dec 23      -  0:05 /Proltst/oragrid/grid1/bin/tnslsnr LISTENER –inherit


要检查监听器状态,可以使用众所周知的 lsnrctl 实用程序:

# lsnrctl status LISTENER_SCAN1LSNRCTL for IBM/AIX RISC System/6000: Version 11.2.0.2.0 - Production on 26-DEC-2010 21:15:42Copyright (c) 1991, 2010, Oracle.  All rights reserved.Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))STATUS of the LISTENER------------------------Alias                     LISTENER_SCAN1Version                   TNSLSNR for IBM/AIX RISC System/6000: Version 11.2.0.2.0 - ProductionStart Date                23-DEC-2010 14:37:10Uptime                    3 days 6 hr. 38 min. 31 secTrace Level               offSecurity                  ON: Local OS AuthenticationSNMP                      ONListener Parameter File   /Proltst/oragrid/grid1/network/admin/listener.oraListener Log File         /Proltst/oragrid/grid1/log/diag/tnslsnr/dantstpdb01/listener_scan1/alert/log.xmlListening Endpoints Summary...  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1)))  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.76.62)(PORT=1521)))Services Summary...Service "PROLADMIN" has 1 instance(s).  Instance "PROLTST11", status READY, has 1 handler(s) for this service...Service "PROLTST1" has 1 instance(s).  Instance "PROLTST11", status READY, has 1 handler(s) for this service...Service "PROLTST1XDB" has 1 instance(s).  Instance "PROLTST11", status READY, has 1 handler(s) for this service...Service "Proltst_t1_preconnect" has 1 instance(s).  Instance "PROLTST11", status READY, has 1 handler(s) for this service...Service "Proltst_t2_preconnect" has 1 instance(s).  Instance "PROLTST11", status READY, has 1 handler(s) for this service...The command completed successfully


利用该实用程序检查 SCAN 监听器:

# srvctl config scan   SCAN name: dantstp-scan, Network: 1/192.168.76.0/255.255.255.0/en0SCAN VIP name: scan1, IP: /dantstp-scan/192.168.76.62SCAN VIP name: scan2, IP: /dantstp-scan/192.168.76.63SCAN VIP name: scan3, IP: /dantstp-scan/192.168.76.64 


这三个 SCAN 在两个节点上运行 — 其中两个 SCAN 在一个节点节点上运行,第三个 SCAN 在另一个节点上运行。您可以确认:

dantstpdb01.oragrid:/home/oragrid # srvctl status scanSCAN VIP scan1 is enabledSCAN VIP scan1 is running on node dantstpdb01SCAN VIP scan2 is enabledSCAN VIP scan2 is running on node dantstpdb02SCAN VIP scan3 is enabledSCAN VIP scan3 is running on node dantstpdb02
After that the TNSNAMES.ORA will look like this:
APP=  (DESCRIPTION=    (FAILOVER=on)    (LOAD_BALANCE=on)    (ADDRESS_LIST=      (ADDRESS=        (PROTOCOL=TCP)        (HOST=dantstp-scan)        (PORT=1521)      )    )    (CONNECT_DATA=      (FAILOVER_MODE=        (TYPE=select)        (METHOD=basic)        (RETRIES=120)      )      (SERVER=dedicated)      (SERVICE_NAME=APP)    )  )


注意,只有一个主机名(以粗体显示);而非之前的两个。该主机名是针对 SCAN 名称的。当客户端调用该主机名时,该主机名会以循环方式解析为 DNS 中为该条目定义的三个 IP 地址。相应的监听器接收这一请求并将其转发到其中一个数据库实例。向集群中添加新节点时,无需更改 TNSNAMES.ORA 文件,因为 SCAN 将不会更改。三个监听器中的一个将获取该文件并将其定向到负载最轻的节点。类似地,可以从集群中删除某个节点,而不必对 TNSNAMES.ORA 文件进行单独更改。SCAN 使您可以进行这种操作。

安装 Grid Infrastructure 时可配置 SCAN。如果您没有这样做,不要失望。可以使用以下命令稍后再添加 SCAN:

$ srvctl add scan -n dantstpdb01 


要添加 SCAN 监听器,可以使用

$ srvctl add scan_listener -l PROL –s –p 1521


“-s”选项指示不限制任何端口。“-l”选项是前缀。会将前缀应用到 SCAN 监听器名称。

ASM 上的 OCR 和表决

在先前版本的 Oracle Database 中,Oracle 集群信息库 (OCR) 和表决磁盘位于原始设备上。由于已不再推荐使用原始设备,因此现在要在集群文件系统和 ASM 磁盘组之间做出选择。OCR 和表决磁盘必须位于共享设备上,因此本地文件系统不适合。由于集群文件系统成本较高,因此您可能也不会选择它。其他“可能的”选择包含网络文件系统,但是通常速度较慢且不可靠。因此,ASM 仍然是最佳选择。OCR 和表决磁盘可位于任何可用的 ASM 磁盘组上;不需要专门为其创建 ASM 磁盘组。

但是切记,在集群系统中,必须先形成集群,然后 ASM 实例才能在所有实例上以集群模式启动。要形成集群,需要 OCR 和表决磁盘。这是一个经典的先有鸡还是先有蛋的问题?

在 Oracle Database 11g 第 2 版中,解决办法是进行一个特殊的 ASM 调用。在将 OCR 和表决磁盘放入磁盘组中时,Clusterware 将其放在底层磁盘上一个特殊的固定位置。集群启动时会检查该位置,以读取集群信息库和表决文件。没必要让整个 ASM 体系来读取文件。系统还会在磁盘组的所有底层磁盘之间复制 OCR;因此,某个磁盘的故障不会导致磁盘组故障。

我们来看一下它的工作原理。首先检查表决设备。以下命令显示表决磁盘。

# crsctl query css votedisk##  STATE    File Universal Id                File Name            Disk group--   -----      -----------------                          ---------                ---------1.  ONLINE   50afef59821b4f5ebfd5b7bd17321d8b (/dev/emcdiskpath21) [PROLTSTCRS1]2.  ONLINE   59216f51595d4fa9bf3aa71c502843b9 (/dev/emcdiskpath22) [PROLTSTCRS1]3.  ONLINE   60356b15ab2b4fd7bfad1b5c79f1444c (/dev/emcdiskpath23) [PROLTSTCRS1]4.  ONLINE   8fbd5815460b4fc4bf23fd96e01c3a72 (/dev/emcdiskpath24) [PROLTSTCRS1]5.  ONLINE   95392036391f4fb7bf90c8cfa09b203e (/dev/emcdiskpath25) [PROLTSTCRS1]Located 5 voting disk(s).


注意,有五个表决磁盘,都在磁盘组 PROLTSTCRS1 中。之所以有五个表决磁盘是因为磁盘组中有五个磁盘。每个磁盘获取一个表决磁盘。如果发生故障,所有节点都试图获取表决磁盘,拥有磁盘数最多的节点将获胜并成为主节点。

检查 OCR 文件:

# ocrcheckStatus of Oracle Cluster Registry is as follows :         Version                  :          3         Total space (kbytes)     :     262120         Used space (kbytes)      :       3444         Available space (kbytes) :     258676         ID                       :  984202808         Device/File Name         : +PROLTSTCRS1                                    Device/File integrity check succeeded         Device/File Name         : +PROLTSTCRS2                                    Device/File integrity check succeeded                                    Device/File not configured                                    Device/File not configured                                    Device/File not configured         Cluster registry integrity check succeeded         Logical corruption check bypassed due to non-privileged user


注意,OCR 文件位于磁盘组 ISAQACRS1 上。其镜像位于 ISAQACRS2 磁盘组中。Oracle 将 OCR 和表决设备写入到底层磁盘的预先指定位置,因此在集群启动时不难获取这些文件的内容。

我们来看一个实际示例。我们看一下来自 CSS 和 CRS 的日志。它们分别位于 $ORACLE_HOME/log/<Hostname>/cssd 和 ORACLE_HOME/log/<Hostname>/crsd 中。以下是其中一个日志的节选。该行表明在其中一个磁盘 (/dev/emcdiskpath25) 上找到了一个“潜在的”表决文件。

2010-12-19 17:46:36.517: [    CSSD][1286]clssnmvDiskVerify: discovered a potential voting file2010-12-19 17:46:36.519: [   SKGFD][1286]Handle 1115de4f0 from lib :UFS:: for disk :/dev/emcdiskpath25:2010-12-19 17:46:36.519: [    CSSD][1286]clssnmvDiskVerify: Successful discovery for disk /dev/emcdiskpath25,                                 UID 95392036-391f4fb7-bf90c8cf-a09b203e, Pending CIN 0:0:1, Committed CIN 0:0:12010-12-19 17:46:36.520: [   SKGFD][1286]Lib :UFS:: closing handle 1115de4f0 for disk :/dev/emcdiskpath25:2010-12-19 17:46:36.520: [    CSSD][1286]clssnmvDiskVerify: discovered a potential voting file2010-12-19 17:46:36.522: [   SKGFD][1286]Handle 1115de4f0 from lib :UFS:: for disk :/dev/emcdiskpath24:2010-12-19 17:46:36.524: [    CSSD][1286]clssnmvDiskVerify: Successful discovery for disk /dev/emcdiskpath24,                                UID 8fbd5815-460b4fc4-bf23fd96-e01c3a72, Pending CIN 0:0:1, Committed CIN 0:0:12010-12-19 17:46:36.525: [   SKGFD][1286]Lib :UFS:: closing handle 1115de4f0 for disk :/dev/emcdiskpath24:2010-12-19 17:46:36.525: [    CSSD][1286]clssnmvDiskVerify: discovered a potential voting file2010-12-19 17:46:36.526: [   SKGFD][1286]Handle 1115de4f0 from lib :UFS:: for disk :/dev/emcdiskpath23:2010-12-19 17:46:36.528: [    CSSD][1286]clssnmvDiskVerify: Successful discovery for disk /dev/emcdiskpath23,                                 UID 60356b15-ab2b4fd7-bfad1b5c-79f1444c, Pending CIN 0:0:1, Committed CIN 0:0:12010-12-19 17:46:36.529: [   SKGFD][1286]Lib :UFS:: closing handle 1115de4f0 for disk :/dev/emcdiskpath23:2010-12-19 17:46:36.529: [    CSSD][1286]clssnmvDiskVerify: discovered a potential voting file2010-12-19 17:46:36.530: [   SKGFD][1286]Handle 1115de4f0 from lib :UFS:: for disk :/dev/emcdiskpath22:2010-12-19 17:46:36.532: [    CSSD][1286]clssnmvDiskVerify: Successful discovery for disk /dev/emcdiskpath22,                                 UID 59216f51-595d4fa9-bf3aa71c-502843b9, Pending CIN 0:0:1, Committed CIN 0:0:12010-12-19 17:46:36.533: [   SKGFD][1286]Lib :UFS:: closing handle 1115de4f0 for disk :/dev/emcdiskpath22:2010-12-19 17:46:36.533: [    CSSD][1286]clssnmvDiskVerify: discovered a potential voting file2010-12-19 17:46:36.534: [   SKGFD][1286]Handle 1115de4f0 from lib :UFS:: for disk :/dev/emcdiskpath21:2010-12-19 17:46:36.536: [    CSSD][1286]clssnmvDiskVerify: Successful discovery for disk /dev/emcdiskpath21,                                  UID 50afef59-821b4f5e-bfd5b7bd-17321d8b, Pending CIN 0:0:1, Committed CIN 0:0:12010-12-19 17:46:36.537: [   SKGFD][1286]Lib :UFS:: closing handle 1115de4f0 for disk :/dev/emcdiskpath21:2010-12-19 17:46:36.537: [    CSSD][1286]clssnmvDiskVerify: Successful discovery of 5 disks2010-12-19 17:46:36.537: [    CSSD][1286]clssnmCompleteRmtDiscoveryReq: Completing voting file discovery requested by node dantstpdb01, number 12010-12-19 17:46:36.537: [    CSSD][1286]clssnmSendDiscoverAck: Discovery complete, notifying requestor node dantstpdb01

注意,已正确发现了表决文件,并且已通过标签(称为文件通用 ID,FUID)进行枚举。例如,表决文件 5 的 FUID 是 95392036-391f4fb7-bf90c8cf-a09b203e。如果您仔细观察,就会发现这是 crsctl query css votedisk 命令也会显示的内容。


ASM 磁盘组上表决磁盘的布局并非不可改变。要将表决磁盘的位置从一个磁盘组更改到另一个磁盘组,使用以下命令:

# crsctl replace votedisk +NEWVOTEDISKDG


另一种方法是添加新的表决文件并删除旧的表决文件。首先获取 FUID:

# crsctl query css votedisk##  STATE    File Universal Id                File Name            Disk group--   -----      -----------------                        ---------                ---------1.  ONLINE   50afef59821b4f5ebfd5b7bd17321d8b (/dev/emcdiskpath21) [PROLTSTCRS1]2.  ONLINE   59216f51595d4fa9bf3aa71c502843b9 (/dev/emcdiskpath22) [PROLTSTCRS1]3.  ONLINE   60356b15ab2b4fd7bfad1b5c79f1444c (/dev/emcdiskpath23) [PROLTSTCRS1]4.  ONLINE   8fbd5815460b4fc4bf23fd96e01c3a72 (/dev/emcdiskpath24) [PROLTSTCRS1]5.  ONLINE   95392036391f4fb7bf90c8cfa09b203e (/dev/emcdiskpath25) [PROLTSTCRS1]Located 5 voting disk(s).


使用表决文件的 FUID 删除表决文件:

$ crsctl delete css votedisk 95392036391f4fb7bf90c8cfa09b203e


在另一个磁盘组上添加一个新的表决文件。

$ crsctl add css votedisk +NEWVOTEDISKDG


相同方法也适用于添加新的 OCR 文件:

# ocrconfig -add +PROLTSTDATA1


之后您可以删除旧的 OCR 文件。

# ocrconfig -delete +PROLTSTCRS1


如果您将 Clusterware 从 11.2 之前的版本升级到 11.2,并且 OCR 和表决设备在原始设备上,那么这种方法也有效。升级后,可以使用上述命令将 OCR 文件和表决文件迁移到 ASM。

顺便说一下,您是否注意到为 OCR 文件的五个副本预留了位置?在此版本中,您可在五个不同磁盘组上最多创建五个副本以使其具有冗余功能。与先前版本中只有两个副本(一个主,一个镜像)相比,这是一个改进。

DST 补丁

夏令时补丁是强制应用的,但却很少令人赶到愉快。在此版本的 Oracle Database 中,DST 补丁是完全联机的;无需回收实例。

多个互连

这是一个非常受欢迎的特性激动人心的回归:如果您使用过 Oracle Parallel Server,曾经有一个工具(已不再支持)可为集群互连指定多个接口。在先前版本的 Clusterware 中,您不能为专用互连指定多个接口。如果实际上有多个物理接口(如 eth1、eth2 等),唯一选择是使用其中一个接口,或者将它们绑定在一起创建一个接口。

第一种选择不太理想;它会产生单点故障并对带宽有所限制。始终应优先选择第 2 种方法,但它需要使用特定于操作系统的工具来提供绑定,如 HPUX 中的 APA、Solaris 中的 Truncing、Linux 中的 MultiNIC 等。

在 Oracle Database 11g 第 2 版中,可以指定多个 NIC。但是,Clusterware 最多只能使用四个接口;并非全部。它将在所有四个接口之间进行负载平衡。定义四个以上的接口仍然是有意义的。当其中一个接口发生故障时,Clusterware 将移至其中一个可用(且尚未使用)接口。

集群时间服务

看上去,守时可能是 Clusterware 中最不用担心的。但绝非如此。集群由多台计算机组成,每台计算机都有自身的守时机制。时钟可能在某个服务器上运行地更快或更慢(或完全不存在)。这种时间差异可能会导致各种问题 — 从故障排除期间难以同步集群日志(相对不太严重),到危害巨大的集群节点逐出问题。

为避免此问题,大部分系统都配置了时间同步服务 — 称作网络时间协议 (NTP)。如果未配置 NTP,可能会存在上述潜在问题。因此,此版本的 Oracle Clusterware 安装了一种时间同步机制 — 集群时间同步服务 (CTSS)。CTSS 始终运行,但以“观察器”模式运行。下面是您检查是否存在该服务的方法:

# crsctl check ctss    CRS-4700: The Cluster Time Synchronization Service is in Observer mode.


如果节点之间存在时间差异,那么 CTSS 会接管并作为默认时间同步服务来开启,也就是转为“主动”模式。可使用以上命令来检查这一转换。该事件还将记录在警报日志中。

增强的 Cluster Verification Utility

在此版本中,ECVU 得到了显著增强,增加了许多不同的检查并与 Oracle 安装程序相集成。它还由 Clusterware 定期自动运行。要检查运行情况,使用以下命令:

# srvctl config cvu   CVU is configured to run once every 360 minutes


如果要检查其是否正在运行以及运行位置:

# srvctl status cvu                CVU is enabled and running on node dantstpdb02


可以修改时间间隔。要使其每 10 分钟(而非 6 小时)运行一次:

# srvctl modify cvu –t 10


CVU 有几个新选项。以下是 ACFS 检查的示例

$ cluvfy stage -pre acfscfg -n dantstpdb01,dantstpdb02 -asmdev /dev/rhdiskpwer*
Performing pre-checks for ACFS Configuration 
Checking node reachability...     … output truncated …
Task ACFS Drivers check started...   Task ACFS Drivers check passed
Pre-check for ACFS Configuration was successful.


以下是另一个检查 SCAN 组件安装(本文前面进行了介绍)的示例

# cluvfy comp scan
Verifying scan 
Checking Single Client Access Name (SCAN)...
Checking TCP connectivity to SCAN Listeners...   TCP connectivity to SCAN Listeners exists on all cluster nodes
Checking name resolution setup for "dantstp-scan"...
Verification of SCAN VIP and Listener setup passed
Verification of scan was successful.
原创粉丝点击