MySQLサーバのMyISAMテーブルをこわれた原因はなんでしょうか?

MySQLサーバのMyISAMテーブルをこわれた原因はなんでしょうか?

 

適用範囲:

MySQLサーバー – バージョン:4.0〜5.5 – リリース:5.5

MySQLサーバ – バージョン:4.0 – リリース:4.0

MySQLサーバー – バージョン:4.0〜5.5 – リリース:4.0〜5.5

すべてのプラットフォーム

目標

MyISAMテーブルがこわれた具体的な原因を説明する。

 

解決策

MyISAM ストレージエンジンは非常に頼りになる。もしMyISAMテーブルがよく壊れることがあれば、それについての原因を考えてください。データを検索するときに、以下のエラが現れたとはテーブルがこわれたと意味する:

Error 1034 Incorrect key file for table: ‘…’. Try to repair it

あるいは以下のエラ番号を含んだ情報:

Error 126 = Index file is crashed

Error 127 = Record-file is crashed

Error 134 = Record was already deleted (or record file crashed)

Error 144 / Error 1195 = Table is crashed and last repair failed

Error 145 / Error 1194 = Table was marked as crashed and should be repaired

 

当查询本该查找到在表中的行但没有找到,或当一个查询返回不完整的数据,也可以假定发生了损坏。你可以使用CHECK TABLE 语句来验证MyISAM 表是否损坏。テーブルにあるはずの行が検出されないときあるいは不完全なデータが返されたときに、こわれたと推定してもいいと思う。また、CHECK TABLE文でMyISAMテーブルがこわれたかを確認できる。

 

MyISAMをこわれた原因はいろいろあるが、可能性大きいから小さいまでの順で、以下の通り:

  1. サーバシャットダウンあるいはハードウェアエラによる損害:
  • 書き込む途中で、mysqldプロセスが閉められるあるいは壊れる。
  • 電源エラでMySQLを運用するサーバ閉められて、壊れるかもしれない。
  • ハードウェアエラによるもの可能性もある。例えば、サーバのトラブル。
  • RAMの損害;ディスクを再起動して解決できる。操作システムのメモリーに壊れたデータがあれば、時に再起動して解決できる。これは極めてレアなトラブルが、ハードウェアにトラブルがあれば、起こる頻度が上がる。

サーバが再起動するときに、自動リカバリがこのトラブルを解決するが、時にはREPAIR TABLE SQL文あるいはより高等なテストオプションを使う必要がある。テーブルが巨大で、サーバがアウトラインより早いリカバリオプションがある場合にmyisamchkを使ってください。いろんなCPUコールがあって、それにテーブルにインディクスがいっぱいある場合に、より速くなるために、myisamchkオプションででマルチスレッドを使ってください。このオプションが失敗するときに報告されるから、見つけ出したが、一つのスレッドを使っているという状況はあまりないです。

 

2.ほかのプログラムによる損害

  • Myisamchkのような外部プログラムを使うと、サーバが運用する途中に変更されるから、よくこわされる。
  • 一部のアンチウイルスソフトウェアも損害を及ぼす、ときに古いテーブルをリカバリしたあるいは必要なファイルをテストしたから、損害を及ぼした。

これらの状況を解決する根本的な策は、どんなファイルを変更されたかを見つけ出す。テーブルをリカバリするのは一時的な方法である。

  1. bugによる損害
  • 2007の夏前のバーションサーバ構造を使ってください。2006年から2007までMySQLはシステムテストを実行して、レアでコピしにくいMyISAM損害bugを探し出した・おおよそ2007の夏で、bugに関連するトラブルはほぼ全部は古いバーションにある。リカバリ機能が強いバーションはあまり影響されていないから、バーションをアップグレードしてください。
  • もしbugがまだ損害を及ぼすなら、まずは最近に導入したサーバ機能を確認してください。

最近再起動したmysqldを検索して、テーブルの損害はサーバシャットダウンによるものかを確認できる。何のエラ情報もない、それに損害が正常なオペレーション期間に起こっているであればbugが原因かもしれない。コピできるテストを作成してトラブルを探し出す。My Oracle SupportでSupport Requestを使って、トラブルを報告してください。Mysqldを運用されていない場合に、myisamchkコマンドでテーブルをテストしてリカバリできる。

 

 

If you cannot start the Oracle database,you do not have valid backups to restore,lost system tablespace data files,data files corrupted !

If you cannot start the Oracle database,you do not have valid backups to restore,lost system tablespace data files,data files corrupted !Is there a way to recover your data !

 

Yes,Still you have an option to extract your data using an Oracle tool Data Unloading (DUL).

Oracle DUL Data Unloader data recovery tool information summary

 

DUL is an offline operation.DUL is the processof extracting (unloading) data from Oracle data files directly.Its an offline tool and it bypasses the Oracle Kernel.There are similarother tools availble in the market e.g DUDE / jDUL,

PRM-DUL,

If you cannot recover the data by yourself, ask Parnassusdata, the professional ORACLE database recovery team for help.

Parnassusdata Software Database Recovery Team

Service Hotline:  +86 13764045638 E-mail: service@parnassusdata.com

ORACLE PRM-DUL Download: http://zcdn.parnassusdata.com/DUL5108.zip

 

AnySQL UnLoader (AUL),Oracle Salvage, Oracle Recovery , WisdomForce FastReader for Oracle,MyDUL,CLOUT,K2Tor Pro,FlashUnload

Oracle DUL & Desperation: The Trials and Tribulations of Corruption

What tools exist for DUL?
As mentioned before, there are very few utilities available for unloading Oracle data files. If you should run into a situation where you need this type of utility or service, I’ve compiled a comprehensive list below:

  • Bernard’s Data UnLoader
    Oracle’s official DUL utility was initially written by Bernard van Duijnen as a standalone C application for Oracle Support in the Netherlands. DUL services from Oracle are offered only as a consulting-based engagement and are rumored to be quite expensive.

 

  • Oracle Salvage
    Oracle Salvage is a SQLite-based data unloader written in C by former Oracle kernel developer Scott Martin of Terlingua Software. It is offered as a product.

 

  • OracleRecovery
    A MSVC++-based DUL utility from OfficeRecovery. It is offered only as a product.

 

  • Recovery for Oracle
    Recovery for Oracle is a Delphi-based DUL utility offered as both a service and a product from a guy in Poland.

 

  • WisdomForce FastReader for Oracle
    Another utility capable of performing parallel and selective data unload from Oracle.

 

  • MyDUL
    Different from AUL, MyDUL is a non-commercial utility written by Jerry Sun. I am not sure whether it is still publicly available.

 

  • CLOUT
    Clever Little Oracle Unloading Tool, my own proof-of-concept DUL utility, is not commercially available.

 

  • K2Tor Pro
    Available in both educational and real-life versions, K2Tor is able to describe the data file structures as well as perform data unloading.

 

  • FlashUnload
    Currently listed as an empty SourceForge project (with screenshots), I’m currently verifying that this utility was written by ex-Oracle RAC performance guru Stefan Roesch.

Oracle SQL优化 trace 应用程序跟踪

  • 配置 SQL 跟踪工具以收集会话统计信息
  • 使用 TRCSESS 实用程序合并 SQL 跟踪文件
  • 使用 tkprof 实用程序设置跟踪文件的格式
  • 解释 tkprof 命令的输出

端到端应用程序跟踪面临的挑战

  • 我要检索 CRM 服务的踪迹。
  • 我要检索客户机 C4 的踪迹。
  • 我要检索会话 6 的踪迹。

端到端应用程序跟踪面临的挑战

启用跟踪机制后,Oracle DB 通过为每个服务器进程生成跟踪文件来实施跟踪。

在专用服务器模型中,跟踪特定客户机通常不是问题,因为将由一个专用进程在会话生存期内负责会话跟踪。可以从属于负责会话跟踪的专用服务器的跟踪文件中查看该会话的所有跟踪信息。但是,在共享服务器配置中,通常由不同的进程交替为客户机提供服务。与用户会话有关的跟踪信息分散在属于不同进程的不同跟踪文件中,因此很难完整地了解会话在生存期内的踪迹。

而且,有时出于性能或调试目的需要合并特定服务的跟踪信息,又该怎么办呢?因为同时有几个客户机使用同一服务,而每个生成的跟踪文件都属于提供该服务的服务器进程,所以这也很困难。

 

 

端到端应用程序跟踪

  • 通过将应用程序工作量通知给以下项,可以简化在多层环境中诊断性能问题的过程:

–服务

–模块

–操作

–会话

–客户机

  • 端到端应用程序跟踪工具:

–Oracle Enterprise Manager

–DBMS_APPICATION_INFO、DBMS_SERVICE、DBMS_MONITOR、DBMS_SESSION

–SQL 跟踪和 TRCSESS 实用程序

–tkprof

端到端应用程序跟踪简化了在多层环境中诊断性能问题的过程。在多层环境中,来自最终客户机的请求通过中间层路由到不同的数据库会话,这使得跨不同数据库会话跟踪客户机变得较困难。端到端应用程序跟踪使用客户机标识符,经由所有层直到数据库服务器,唯一地跟踪一个特定最终客户机。

可以使用端到端应用程序跟踪确定超常工作量的来源,例如某条高负荷的 SQL 语句。并且,您还可以确定用户的会话在数据库级别所执行的活动,以解决用户性能问题。

端到端应用程序跟踪通过跟踪某项服务中的特定模块和操作,还简化了应用程序工作量的管理工作。端到端应用程序跟踪可以识别下列项的工作量问题:

  • 客户机标识符:基于登录 ID 指定一个最终用户,例如 HR。
  • 服务:指定一组具有共同属性、服务级别阈值和优先级的应用程序,或单个应用程序。
  • 模块:指定应用程序中的一个功能块。
  • 操作:指定模块中的一项操作,例如一项 INSERT 或 UPDATE 操作。
  • 会话:基于一个给定数据库会话标识符 (SID) 指定一个会话。

端到端应用程序跟踪的主要接口是 Oracle Enterprise Manager。幻灯片中列出的其它工具将在本课的后面部分中讨论。

 

诊断跟踪的位置

自动诊断资料档案库 (ADR) 是一个基于文件的资料档案库,用于存放数据库诊断数据(如跟踪、意外事件转储和程序包、预警日志、健康监视报告、核心转储等)。

从 Oracle Database 11gR1 开始,忽略传统的 …_DUMP_DEST 初始化参数。ADR 根目录又称为 ADR 基目录,其位置由 DIAGNOSTIC_DEST 初始化参数设置。幻灯片中显示的表说明了 Oracle Database 10g(以及先前版本)与 Oracle Database 11g 中驻留的不同类跟踪数据和转储。对于 Oracle Database 11g,前台和后台跟踪文件之间没有什么区别。这两种类型的文件都会放入 $ADR_HOME/trace 目录中。您可以使用 V$DIAG_INFO 列出一些重要的 ADR 位置。

所有非意外事件跟踪都存储在 TRACE 子目录中。以前的版本会将严重错误信息转储到相应的进程跟踪文件而不是意外事件转储,这就是新旧版本之间的主要区别。从 Oracle Database 11g 开始,意外事件转储将存放到独立于普通进程跟踪文件的文件中。

:跟踪和转储之间的主要区别在于,跟踪是较为连续的输出(如打开了 SQL 跟踪时),而转储是为了响应事件(如意外事件)而进行的一次性输出。另外,核心是特定于端口的二进制内存转储。

在幻灯片中,$ADR_HOME 表示由 DIAGNOSTIC_DEST 初始化参数定义的 ADR 主目录。但是,不存在名为 ADR_HOME 的正式环境变量。

 

诊断跟踪的位置

 

什么是服务

  • 是对执行同一种工作的会话进行分组的一种方式
  • 提供单一系统映像,而不提供多实例映像
  • 是一种常规管理任务,用于提供服务到实例的动态分配
  • 是实现高可用性的连接的基础
  • 提供了一个性能优化维度
  • 是一个用于捕获跟踪信息的句柄

服务的概念最早是在 Oracle8i 中引进的,当时它是监听程序在集群的节点和实例之间执行连接负载平衡的方式。现在,服务的概念、定义和实施都已经有了巨大的扩展。服务可在数据库内组织工作执行,以使其更便于管理、评估、优化和恢复。一个服务就是数据库内的一组相关任务,这些任务有共同的功能、质量预期值以及相对于其它服务的优先级。服务可提供单一系统映像,用于管理在单个实例内运行的竞争应用程序,以及跨多个实例和数据库运行的竞争应用程序。

使用标准接口、Oracle Enterprise Manager 和 SRVCTL,可将服务作为单个实体进行配置、管理、启用、禁用和度量。

服务提供可用性。服务中断时,会被快速恢复并自动定位到正常运行的实例。

服务提供了一个性能优化维度。有了服务,就可查看和评估工作量。在会话为匿名和共享的大多数系统中,按“服务和 SQL”优化取代了按“会话和 SQL”优化。

从跟踪角度来看,服务提供了一个句柄,无论会话为何,都允许按服务名称捕获跟踪信息。

 

将服务与客户机应用程序配合使用

ERP=(DESCRIPTION=

      (ADDRESS=(PROTOCOL=TCP)(HOST=mynode)(PORT=1521))  

    (CONNECT_DATA=(SERVICE_NAME=ERP)))

 

url=”jdbc:oracle:oci:@ERP”  

url=”jdbc:oracle:thin:@(DESCRIPTION=  

      (ADDRESS=(PROTOCOL=TCP)(HOST=mynode)(PORT=1521))  

    (CONNECT_DATA=(SERVICE_NAME=ERP)))”  

 

应用程序和中间层连接池将使用透明网络基础 (TNS) 连接描述符选择服务。

所选的服务必须与已创建的服务相匹配。

幻灯片中的第一个示例显示了可以用于访问 ERP 服务的 TNS 连接描述符。

第二个示例显示了使用以前定义的 TNS 连接描述符的胖 Java 数据库连接 (JDBC) 连接描述。

第三个示例显示了使用相同 TNS 连接描述符的瘦 JDBC 连接描述。

 

跟踪服务

  • 可以通过以下项进一步限定使用服务的应用程序:

–MODULE

–ACTION

–CLIENT_IDENTIFIER

  • 使用下列 PL/SQL 程序包进行设置:

–DBMS_APPLICATION_INFO

–DBMS_SESSION

  • 可以在所有级别上进行跟踪:

–CLIENT_IDENTIFIER

–SESSION_ID

–SERVICE_NAMES

–MODULE

–ACTION

–SERVICE_NAME、MODULE、ACTION 的组合

 

应用程序可以通过 MODULE 和 ACTION 名称限定服务,以标识该服务内的重要事务处理。这使您可以针对已归类的工作量定位性能较差的事务处理。使用连接池或事务处理监视程序监视系统中的性能时,这很重要。在这些系统中,会话是共享的,计算起来非常困难。SERVICE_NAME、MODULE、ACTION、CLIENT_IDENTIFIER 和 SESSION_ID 是 V$SESSION 中的实际列。SERVICE_NAME 是在用户登录时自动设置的。应用程序将使用 DBMS_APPLICATION_INFO PL/SQL 程序包或特殊 Oracle 调用接口 (OCI) 调用设置 MODULE 和 ACTION 的名称。应针对当前执行的程序将 MODULE 设置为用户可识别的名称。同样,应将 ACTION 设置为用户将在模块内执行的特定操作或任务,例如输入新

客户。

SESSION_ID 是在创建会话时由数据库自动设置的,而 CLIENT_IDENTIFIER 可使用 DBMS_SESSION.SET_IDENTIFIER 过程来设置。

 

跟踪各个会话的传统方法是使用 SQL 命令生成可跨越工作量执行的跟踪文件。这样,就可以通过确定是否命中的方法来诊断有问题的 SQL 了。利用您提供的条件(SERVICE_NAME、MODULE 或 ACTION),可以将特定的跟踪信息捕获到一组跟踪文件中,然后将它们合并到一个输出跟踪文件中。这样,生成的跟踪文件就包含了与特定工作量相关的 SQL。对于 CLIENT_ID 和 SESSION_ID 也可以执行相同的操作。

:DBA_ENABLED_TRACES 显示有关已启用的跟踪的信息。

 

使用 Oracle Enterprise Manager 来跟踪服务

 

在“Performance(性能)”页中,可以单击“Top Consumers(顶级使用者)”链接。此时将显示“Top Consumers(顶级使用者)”页。

“Top Consumers(顶级使用者)”页包含多个选项卡,将数据库显示为单一系统映像。“Overview(概览)”选项卡式页包含四个饼图:“Top Clients(顶级客户机)”、“Top Services(顶级服务)”、“Top Modules(顶级模块)”和“Top Actions(顶级操作)”。每个图都提供了有关数据库中顶级资源使用者的不同方面。

“Top Services(顶级服务)”选项卡式将显示数据库中定义的服务的性能有关信息。在此页中,您可以在服务级别启用或禁用跟踪。

 

使用 Oracle Enterprise Manager 来跟踪服务

服务跟踪:示例

  • 跟踪服务、模块和操作:

exec DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(‘AP’);

exec DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(-

     ‘AP’, ‘PAYMENTS’, ‘QUERY_DELINQUENT’);

  • 跟踪特定客户机标识符:

exec DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE 

   (client_id=>’C4′, waits => TRUE, binds => FALSE);

 

在第一个代码框中,将跟踪在 AP 服务下登录的所有会话。无论模块和操作如何变换,都只为使用该服务的每个会话创建一个跟踪文件。为了精确起见,可以只跟踪服务内的特定任务。第二个示例对此操作进行了介绍,该示例对 PAYMENTS 模块内执行 QUERY_DELINQUENT 操作的 AP 服务的所有会话进行跟踪。

通过按服务、模块和操作进行跟踪,可以将精力放在对特定 SQL 的优化上,而不是花费在从不同的程序中筛选包含 SQL 的跟踪文件上。只有定义此任务的 SQL 语句会被记录在跟踪文件中。这是对按服务、模块和操作收集统计信息的一种补充,因为这样可以识别某个操作的相关等待事件。

您还可以启动对某个特定客户机标识符的跟踪,如第三个示例所示。在此例中,C4 是将对其启用 SQL 跟踪的客户机标识符。TRUE 参数指示跟踪文件中存在等待信息。FALSE 参数指示跟踪文件中没有绑定信息。

尽管本幻灯片没有显示,但您可以使用 CLIENT_ID_TRACE_DISABLE 过程为数据库全局禁用对特定客户机标识符的跟踪。对于前面的示例来说,要禁用跟踪,请执行下列命令:

EXECUTE DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE(client_id => ‘C4’);

: 可以使用 DBMS_SESSION.SET_IDENTIFIER 过程设置 CLIENT_IDENTIFIER。

会话级跟踪:示例

 

  • 对于数据库中的所有会话:

EXEC dbms_monitor.DATABASE_TRACE_ENABLE(TRUE,TRUE);

EXEC dbms_monitor.DATABASE_TRACE_DISABLE();

  • 对于特定会话:

EXEC dbms_monitor.SESSION_TRACE_ENABLE(session_id=> 27, serial_num=>60, waits=>TRUE, binds=>FALSE);

EXEC dbms_monitor.SESSION_TRACE_DISABLE(session_id =>27, serial_num=>60);

 

可以使用跟踪来调试性能问题。启用跟踪的过程已实现为 DBMS_MONITOR 程序包的一部分。这些过程将为数据库启用全局跟踪。

可以使用 DATABASE_TRACE_ENABLE 过程启用整个实例的会话级别 SQL 跟踪。该过程包含下列参数:

  • WAITS:指定是否要跟踪等待信息
  • BINDS:指定是否要跟踪绑定信息
  • INSTANCE_NAME:指定要为其启用跟踪的实例。如果省略了 INSTANCE_NAME,则会为整个数据库启用会话级跟踪。

使用 DATABASE_TRACE_DISABLE 过程可为整个数据库或特定实例禁用 SQL 跟踪。

同样,您可以使用 SESSION_TRACE_ENABLE 过程在本地实例上对给定数据库会话标识符启用跟踪。可以在 V$SESSION 中找到 SERIAL# 和 SID。

使用 SESSION_TRACE_DISABLE 过程可对给定数据库会话标识符和序列号禁用跟踪。

:SQL 跟踪会产生一些开销,因此通常不倾向在实例级别启用 SQL 跟踪。

跟踪自己的会话

 

  • 启用跟踪:

EXEC DBMS_SESSION.SESSION_TRACE_ENABLE(waits => TRUE, binds => FALSE);

 

  • 禁用跟踪:

EXEC DBMS_SESSION.SESSION_TRACE_DISABLE();

 

  • 轻松标识您的跟踪文件:

alter session set tracefile_identifier=’mytraceid‘;

 

尽管仅具有 DBA 角色的用户才能调用 DBMS_MONITOR 程序包,但是任何用户都可以使用 DBMS_SESSION 程序包对自己的会话启用 SQL 跟踪。任何用户都可以通过调用 SESSION_TRACE_ENABLE 过程,对自己的会话启用会话级别的 SQL 跟踪。幻灯片中显示了一个示例。

可以使用 DBMS_SESSION.SESSION_TRACE_DISABLE 过程停止转储到跟踪文件。

TRACEFILE_IDENTIFIER 是一个初始化参数,用于指定将作为 Oracle 跟踪文件名称一部分的自定义标识符。使用这样的自定义标识符,您仅根据名称即可识别一个跟踪文件,而不必打开它或查看其内容。每次在会话级别动态修改此参数时,会将下一个跟踪转储写入一个跟踪文件,该文件名称中嵌入了新的参数值。此参数只能用于更改前台进程的跟踪文件的名称;后台进程继续使用以常规格式命名的跟踪文件。对于前台进程,V$PROCESS 视图的 TRACEID 列包含此参数的当前值。设置了此参数值后,跟踪文件名称具有下列格式:sid_ora_pid_traceid.trc

:SQL_TRACE 初始化参数从 Oracle Database 10g 起被废弃。您可以使用以下语句获取已废弃的参数的完整列表:
SELECT name FROM v$parameter WHERE isdeprecated = ‘TRUE’

 

trcsess 实用程序

 

trcsess 实用程序

 

trcsess 实用程序根据下列几个条件合并所选跟踪文件的跟踪输出:会话 ID、客户机标识符、服务名称、操作名称和模块名称。trcsess 将跟踪信息合并到一个输出文件中之后,可以通过 tkprof 处理该输出文件。

使用 DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE 过程时,跟踪信息存在于多个跟踪文件中,必须使用 trcsess 工具将这些信息收集到一个文件中。

出于性能或调试目的合并特定会话或服务的跟踪信息时,trcsess 实用程序非常有用。

在专用服务器模型中,跟踪特定会话通常不是问题,因为将由一个专用进程在会话生存期内负责会话跟踪。可以从属于负责会话跟踪的专用服务器的跟踪文件中查看该会话的所有跟踪信息。但是,即使在专用服务器模型中,跟踪服务也可能是一项复杂的任务。

更不用说在共享服务器配置中了,在该配置中,通常由不同的进程交替为用户会话提供服务。与用户会话有关的跟踪信息分散在属于不同进程的不同跟踪文件中,因此很难完整地了解会话在其生存期内的踪迹。

 

调用 trcsess 实用程序

trcsess  [output=output_file_name]

         [session=session_id]

         [clientid=client_identifier]

         [service=service_name]

         [action=action_name]

         [module=module_name]

         [<trace file names>]

 

trcsess [output=output_file_name]

幻灯片中显示了 trcsess 实用程序的语法,其中:

  • output 指定了生成输出的文件。如果没有指定此选项,则将标准输出用作输出。
  • session 合并指定会话的跟踪信息。会话标识符是会话索引和会话序列号的组合,例如 21.2371。可以在 V$SESSION 视图中找到这些值。
  • clientid 合并给定客户机标识符的跟踪信息。
  • service 合并给定服务名称的跟踪信息。
  • action 合并给定操作名称的跟踪信息。
  • module 合并给定模块名称的跟踪信息。
  • <trace file names> 是由空格分隔的所有跟踪文件名称的列表,trcsess 应在其中查找跟踪信息。指定跟踪文件名称时可以使用通配符“*”。如果没有指定跟踪文件,则会将当前目录中的所有文件输入到 trcsess 中。您可以在 ADR 中找到跟踪文件。

:必须指定 session、clientid、service、action 或 module 选项之一。如果指定了多个选项,则满足所有指定条件的跟踪文件会被合并到输出文件中。

 

trcsess 实用程序:示例

 

trcsess 实用程序:示例

 

幻灯片中的示例展示了 trcsess 实用程序的一种可能用法。此示例假设您有三个不同会话:其中有两个会话(左侧会话和右侧会话)被跟踪,另一个会话(中间的会话)可为前两个会话启用或禁用跟踪,并级联前两个会话的跟踪信息。

第一个会话和第二个会话将其客户机标识符设置成“HR session”值。这是使用 DBMS_SESSION 程序包实现的。然后,第三个会话使用 DBMS_MONITOR 程序包为前两个会话启用了跟踪。

此时,ADR 中会生成两个新的跟踪文件;一个会话一个跟踪文件,会话由

“HR session”客户机标识符标识。

现在每个受跟踪的会话都执行自己的 SQL 语句。每条语句都在 ADR 下自己的跟踪文件中生成跟踪信息。

然后,第三个会话使用 DBMS_MONITOR 程序包停止生成跟踪信息,并针对

“HR session”客户机标识符在 mytrace.trc 文件中合并跟踪信息。示例假设在 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace 目录下生成所有跟踪文件,在大多数情况下这是默认设置。

SQL 跟踪文件内容

  • 分析、执行和提取计数
  • CPU 和所用时间
  • 物理读取数和逻辑读取数
  • 处理的行数
  • 库高速缓存中的未命中数
  • 每次分析使用的用户名
  • 每次提交和回退
  • 每条 SQL 语句的等待事件和绑定数据
  • 显示每条 SQL 语句的实际执行计划的行操作
  • 一致读取数、物理读取数、物理写入数以及每个行操作所用时间

正如所看到的,SQL 跟踪文件提供有关各条 SQL 语句的性能信息。它为每条语句生成下列统计信息:

  • 分析、执行和提取计数
  • CPU 和所用时间
  • 物理读取数和逻辑读取数
  • 处理的行数
  • 库高速缓存中的未命中数
  • 每次分析使用的用户名
  • 每次提交和回退
  • 每条 SQL 语句的等待事件数据以及每个跟踪文件的摘要

如果 SQL 语句的游标已关闭,则 SQL 跟踪还提供行源信息,包括以下内容:

  • 显示每条 SQL 语句的实际执行计划的行操作
  • 行数量、一致读取数、物理读取数、物理写入数以及每项操作所用的时间。只有在 STATISTICS_LEVEL 初始化参数设置为 ALL 时,才可能显示这些信息。

:使用 SQL 跟踪工具会对性能产生严重影响,可能会增加系统开销和 CPU 使用率,导致磁盘空间不足。

 

SQL 跟踪文件内容:示例

 

*** [ Unix process pid: 19687 ] 
*** 2008-02-25 15:49:19.820 
*** 2008-02-25 15:49:19.820 
*** 2008-02-25 15:49:19.820 
*** 2008-02-25 15:49:19.820 
… 
==================== 
PARSING IN CURSOR #4 len=23 dep=0 uid=82 oct=3 lid=82 tim=1203929332521849 hv=4069246757 ad='34b6f730' sqlid='f34thrbt8rjt5' 
select * from employees 
END OF STMT 
PARSE #4:c=49993,e=67123,p=28,cr=403,cu=0,mis=1,r=0,dep=0,og=1,tim=1203929332521845 
EXEC #4:c=0,e=16,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1203929332521911 
FETCH #4:c=1000,e=581,p=6,cr=6,cu=0,mis=0,r=1,dep=0,og=1,tim=1203929332522553 
FETCH #4:c=0,e=45,p=0,cr=1,cu=0,mis=0,r=15,dep=0,og=1,tim=1203929332522936 
… 
FETCH #4:c=0,e=49,p=0,cr=1,cu=0,mis=0,r=1,dep=0,og=1,tim=1203929333649241 
STAT #4 id=1 cnt=107 pid=0 pos=1 obj=70272 op='TABLE ACCESS FULL EMPLOYEES (cr=15 pr=6 pw=6 time=0 us cost=3 size=7276 card=107)' 
*** [ Unix process pid: 19687 ] 
*** 2008-02-25 15:49:19.820 
*** 2008-02-25 15:49:19.820 
*** 2008-02-25 15:49:19.820 
*** 2008-02-25 15:49:19.820 
… 


 

Oracle DB 可以生成多种类型的跟踪文件。本课提到的跟踪文件通常被称为 SQL 跟踪文件。
幻灯片显示了摘自由前面示例生成的 mytrace.trc SQL 跟踪文件的一段示例输出。
在这种类型的跟踪文件中,针对每条被跟踪的语句,您可以找到语句自身以及一些相应的游标详细资料。可以查看语句的以下各个执行阶段的详细统计信息:PARSE、EXEC 和 FETCH。正如您所看到的,取决于查询返回的行数,一个 EXEC 可以有多个 FETCH。
跟踪的最后一部分是包含每个行源的累积统计信息的执行计划。
取决于启用跟踪的方式,您还可以在生成的跟踪文件中获得有关等待事件和绑定变量的
信息。
通常情况下,您不要尝试解释跟踪文件本身。这是因为您对会话执行的操作并没有一个整体概念。例如,一个会话可能在不同时间执行相同语句多次。因此相应跟踪分散在整个跟踪文件中,很难找到它们。
您可以改而使用其它工具(例如 tkprof)来解释原始跟踪信息的内容。

 

设置 SQL 跟踪文件的格式:概览

使用 tkprof 实用程序设置 SQL 跟踪文件的格式:

  • 对原始跟踪文件进行排序以显示顶级 SQL 语句
  • 筛选字典语句

使用 tkprof 实用程序设置 SQL 跟踪文件的格式

 

tkprof 是一个可执行文件,它分析 SQL 跟踪文件以生成可读性更好的输出。请记住,可以从原始跟踪文件中获取 tkprof 中的所有信息。可以使用 tkprof 调用许多排序函数。通过在命令提示符下输入 tkprof 可以访问大量排序选项。一个有用的起点是 fchela 排序选项,该选项可按所用的提取时间排序输出。生成的 .prf 文件将最费时的 SQL 语句列在文件的开头。另一个有用的参数是 sys。这可以用于防止显示以 SYS 用户身份运行的 SQL 语句。这会使输出文件变得更短且更易于管理。

在生成一定数量的 SQL 跟踪文件后,可以执行以下操作:

  • 对各个跟踪文件运行 tkprof,生成一定数量的已格式化的输出文件,一个会话一个输出文件。
  • 级联这些跟踪文件,然后对结果运行 tkprof,以针对整个实例生成一个已格式化的输出文件。
  • 运行 trcsess 命令行实用程序,以合并几个跟踪文件的跟踪信息,然后对结果运行 tkprof。

tkprof 不报告跟踪文件中记录的 COMMIT 和 ROLLBACK。

:跟踪会话时,请将 TIMED_STATISTICS 参数设置为 TRUE,因为不这样做就不能
执行基于时间的比较。在 Oracle Database 11g 中 TRUE 是默认值。

 

调用 tkprof 实用程序

tkprof inputfile outputfile [waits=yes|no]

                            [sort=option]

                            [print=n]

                            [aggregate=yes|no]

                            [insert=sqlscritfile]

                            [sys=yes|no]

                            [table=schema.table]

                            [explain=user/password]

                            [record=statementfile]

                            [width=n]

 

输入没有任何参数的 tkprof 命令时,它会生成一个用法消息,以及所有 tkprof 选项的说明。本幻灯片显示了各种参数:

  • inputfile:指定 SQL 跟踪输入文件
  • outputfile:指定 tkprof 将其已格式化输出写入到的文件
  • waits:指定是否为跟踪文件中的任何等待事件记录摘要。值为 YES 或 NO。默认值为 YES。
  • sorts:按指定排序选项的降序对跟踪 SQL 语句进行排序,然后将其列到输出文件中。如果指定了多个选项,则输出按排序选项中指定值的总和的降序排序。如果省略此参数,则 tkprof 会按第一次使用的顺序将语句列在输出文件中。
  • print:仅列出输出文件中第一批按整数排序的 SQL 语句。如果省略此参数,tkprof 会列出所有受跟踪的 SQL 语句。此参数不影响可选的 SQL 脚本。SQL 脚本始终为所有受跟踪的 SQL 语句生成插入数据。
  • aggregate:如果设置为 NO,tkprof 不会对相同 SQL 文本的多个用户进行累计。
  • insert:创建一个 SQL 脚本以在数据库中存储跟踪文件统计信息。tkprof 使用您为 sqlscritfile 指定的名称创建此脚本。此脚本会创建一个表,并在此表中为每条受跟踪的 SQL 语句插入一个统计信息行。
  • sys:允许或禁止在输出文件中列出由 SYS 用户发出的 SQL 语句,或递归 SQL 语句。默认值为 YES,此值会让 tkprof 列出这些语句。NO 值会让 tkprof 省略这些语句。此参数不影响可选的 SQL 脚本。SQL 脚本始终为所有受跟踪的语句(包括递归 SQL 语句)插入统计信息。
  • table:指定在将执行计划写入到输出文件之前,tkprof 在其中临时存放执行计划的方案和表名称。如果指定的表已存在,tkprof 会删除表中的所有行,将该表用于 EXPLAIN PLAN 语句(会在表中写入更多的行),然后删除这些行。如果此表不存在,tkprof 会创建并使用该表,然后删除它。指定的用户必须能够对表发出 INSERT、SELECT 和 DELETE 语句。如果表已不存在,用户也必须能够发出 CREATE TABLE 和 DROP TABLE 语句。此选项允许多个实例在 EXPLAIN 值中使用相同用户同时运行 tkprof。这些实例可以指定不同的 TABLE 值,避免破坏性地干扰彼此之间对临时计划表的处理。如果在没有 TABLE 参数的情况下使用 EXPLAIN 参数,则 tkprof 会使用 EXPLAIN 参数指定的用户方案中的 PROF$PLAN_TABLE 表。如果在没有 EXPLAIN 参数的情况下使用 TABLE 参数,则 tkprof 会忽略 TABLE 参数。如果计划表不存在,tkprof 会创建 PROF$PLAN_TABLE 表,然后在结束时删除它。
  • explain:确定跟踪文件中每条 SQL 语句的执行计划,并将这些执行计划写入到输出文件。tkprof 在使用此参数中指定的用户和口令连接到系统后,通过发出 EXPLAIN PLAN 语句确定执行计划。指定的用户必须具有 CREATE SESSION 系统权限。如果使用了 EXPLAIN 选项,则 tkprof 在处理大型跟踪文件时会花费较长的时间。
  • record:以指定文件名 statementfile 创建一个 SQL 脚本,使其包含跟踪文件中的所有非递归 SQL 语句。这可以用来重放跟踪文件中的用户事件。
  • width:一个整数,用于控制某些 tkprof 输出(例如解释计划)的输出行宽度。此参数对于 tkprof 输出的后处理很有用。

输入和输出文件是唯一的必需参数。

tkprof 排序选项

tkprof 排序选项

 

上表列出了可以与 tkprof 的排序参数一起使用的所有排序选项。

 

tkprof 排序选项2

 

tkprof 命令的输出

  • SQL 语句的文本
  • 划分为三个 SQL 处理步骤的跟踪统计信息(针对语句和递归调用):

 

tkrpof命令的输出

 

tkprof 命令输出按 SQL 处理步骤列出 SQL 语句的统计信息。
包含统计信息的每个行的步骤由调用列的值标识。

:PARSE 值包括硬分析和软分析。硬分析是指执行计划的制定(包括优化);它随后会存储在库高速缓存中。软分析意味着向数据库发送 SQL 语句以进行分析,但数据库会在库高速缓存中查找语句,并且仅需要验证一些事项,例如访问权限。硬分析的开销很高,特别是优化。软分析主要在库高速缓存活动方面开销较大。

 

 

跟踪统计信息有七种类别:

跟踪统计信息有七种类别

 

下一页对输出进行了解释。

示例输出如下所示:

call     count       cpu    elapsed       disk      query    current rows
——- ——  ——– ———- ———- ———- ———-  —

Parse        1      0.03       0.06          0          0          0    0
Execute      1      0.06       0.30          1          3          0    0
Fetch        2      0.00       0.46          0          0          0    1
——- ——  ——– ———- ———- ———- ———-  —

total        4      0.09       0.83          1          3          0    1

 

在 CALL 列旁边,tkprof 为每条语句显示下列统计信息:

  • Count:语句的分析次数、执行次数或提取次数(先检查此列的值是否大于 1,然后解释其它列中的统计信息。除非使用了 AGGREGATE = NO 选项,否则 tkprof 会将相同的语句执行累计到一个摘要表中。)
  • CPU:所有分析、执行或提取调用花费的总 CPU 时间,以秒为单位
  • Elapsed:所有分析、执行或提取调用的所用时间总计,以秒为单位
  • Disk:所有分析、执行或提取调用从磁盘的数据文件中物理读取的数据块总数
  • Query:所有分析、执行或提取调用在一致模式下检索的缓冲区总数(对于查询,通常在一致模式下检索缓冲区。)
  • Current:在当前模式下检索的缓冲区总数(对于数据操纵语言语句,通常在当前模式下检索缓冲区。但是,始终在当前模式下检索段标头块。)
  • Rows:SQL 语句处理的行数总计(此总数不包括 SQL 语句的子查询处理的行。对于 SELECT 语句,显示在提取步骤中返回的行数。对于 UPDATE、DELETE 和 INSERT 语句,显示在执行步骤中处理的行数。)

附注

  • DISK 等同于 v$sysstat 或 AUTOTRACE 中的 physical reads。
  • QUERY 等同于 v$sysstat 或 AUTOTRACE 中的 consistent gets。
  • CURRENT 等同于 v$sysstat 或 AUTOTRACE 中的 db block gets。

tkprof 命令的输出

 

tkprof 输出还包括下列内容:

  • 递归 SQL 语句
  • 库高速缓存未命中数
  • 分析用户 ID
  • 执行计划
  • 优化程序模式或提示
  • 行源操作

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 61 

Rows     Row Source Operation
——-  —————————————————
     24  TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=9 pr=0 pw=0 time=129 us)
     24   INDEX RANGE SCAN SAL_IDX (cr=3 pr=0 pw=0 time=1554 us)(object id
 

 

递归调用

要执行用户发出的 SQL 语句,Oracle 服务器有时必须发出其它语句。这样的语句称为递归 SQL 语句。例如,如果要在某个表中插入一行,但该表没有足够空间容纳该行,Oracle 服务器就进行递归调用以动态分配空间。当数据字典高速缓存中不包含数据字典信息,必须从磁盘检索时,也会生成递归调用。

如果在 SQL 跟踪工具处于启用状态下发生了递归调用,tkprof 会在输出文件中清晰地将其标记为递归 SQL 语句。通过设置 SYS=NO 命令行参数可以在输出文件中隐藏递归调用列表。请注意,递归 SQL 语句的统计信息始终包括在导致递归调用的 SQL 语句列表中。

库高速缓存未命中数

tkprof 还列出由每条 SQL 语句的分析和执行步骤产生的库高速缓存未命中数。这些统计信息显示在单独的行中,在表格式统计信息之后。

 

行源运算

提供对行和其它行源信息执行的每个操作处理的行数,例如物理读取数和写入数;

cr = 一致读取数,w = 实际写入数,r = 实际读取数,time = 时间(微秒)。

分析用户 ID

这是最后一位分析语句的用户的 ID。

行源操作

行源操作为 SQL 语句的执行显示数据源。只有在跟踪期间已关闭了游标的情况下才包含此项信息。如果跟踪文件中没有显示行源操作,则可能需要查看 EXPLAIN PLAN。

执行计划

如果在 tkprof 命令行中指定 EXPLAIN 参数,tkprof 使用 EXPLAINPLAN 命令为每条受跟踪的 SQL 语句生成执行计划。tkprof 还显示执行计划的每个步骤所处理的行数。

:请注意,执行计划是在运行 tkprof 命令时生成的,而不是在生成跟踪文件时生成的。例如,如果自跟踪语句后创建或删除了索引,则可能产生影响。

优化程序模式或提示

指明在执行语句期间使用的优化程序提示。如果没有提示,则显示使用的优化程序模式

 

无索引时的 tkprof 输出:示例

 

... 
select max(cust_credit_limit)from customerswhere cust_city ='Paris'call     count       cpu    elapsed       disk      query    current     rows 
------- ------  -------- ---------- ---------- ---------- ----------  ------- 
Parse        1      0.02       0.02          0          0          0        0 
Execute      1      0.00       0.00          0          0          0        0 
Fetch        2      0.10       0.09       1408       1459          0        1 
------- ------  -------- ---------- ---------- ---------- ----------  ------- 
total        4      0.12       0.11       1408       1459          0        1 
 
Misses in library cache during parse: 1 
Optimizer mode: ALL_ROWS 
Parsing user id: 61   
 
Rows     Row Source Operation 
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=1459 pr=1408 pw=0 time=93463 us) 
     77   TABLE ACCESS FULL CUSTOMERS (cr=1459 pr=1408 pw=0 time=31483 us) 
 
 



幻灯片中的示例显示了从 CUSTOMERS 表提取的几个执行(行)的累积结果。这需要 0.12 秒的 CPU 提取时间。该语句通过对 CUSTOMERS 表进行全表扫描来执行,在输出的行源操作中可以看到此信息。
必须对此语句进行优化。
注:如果 CPU 或 elapsed 值为 0,则没有设置 timed_statistics。

 

有索引时的 tkprof 输出:示例

 

 

... 
select max(cust_credit_limit) from customerswhere cust_city ='Paris'call     count       cpu    elapsed       disk      query    current        rows 
------- ------  -------- ---------- ---------- ---------- ----------  --------- 
Parse        1      0.01       0.00          0          0          0          0 
Execute      1      0.00       0.00          0          0          0          0 
Fetch        2      0.00       0.00          0         77          0          1 
------- ------  -------- ---------- ---------- ---------- ----------  ---------total        4      0.01       0.00          0         77          0          1 
 
Misses in library cache during parse: 1 
Optimizer mode: ALL_ROWS 
Parsing user id: 61   
 
Rows     Row Source Operation 
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=77 pr=0 pw=0 time=732 us) 
     77   TABLE ACCESS BY INDEX ROWID CUSTOMERS (cr=77 pr=0 pw=0 time=1760 us) 
     77    INDEX RANGE SCAN CUST_CUST_CITY_IDX (cr=2 pr=0 pw=0 time=100                                                             us)(object id 55097) 
 
 

幻灯片中显示的结果表明,针对 CUST_CITY 列创建了索引时,CPU 时间减少到 0.01 秒。这些结果可能已实现,因为该语句使用索引来检索数据。另外,由于此示例重复执行相同语句,大多数据块已在内存中。您可以通过有效地编制索引来显著改善性能。使用 SQL 跟踪工具确定需改善的区域。
注:除非必须使用,否则不要构建索引。因为使用索引必须添加、更改或删除对行的引用,因此会减慢 INSERT、UPDATE 和 DELETE 命令的处理速度。未使用的索引应删除。但是,不需要通过 EXPLAIN PLAN 处理所有应用 SQL,您可以使用索引监控来识别和删除任何未使用的索引。

 

 

Oracle SQL 使用绑定变量bind variable

  • 列出使用绑定变量的优点
  • 使用绑定扫视
  • 使用自适应游标共享

Cursor Sharing 游标共享和不同的文字值

 

如果在您使用的 SQL 语句中,为 WHERE 子句条件提供了不同的文字值,则会在库高速缓存中存储许多版本的几乎完全相同的 SQL 语句。因为每条 SQL 语句是使用不同值提交的,不能在库高速缓存中找到此语句,因此您必须执行所有步骤来处理新的 SQL 语句。这样不仅常常会导致不必要的语句分析,还会导致库高速缓存很快被填满,因为所有不同的语句都存储在其中。

在以此方式进行编码时,您没有利用游标共享。

但是,根据提供的文字值,优化程序可能会生成不同的执行计划。例如,可能存在大量 JOBS,其中 MIN_SALARY 大于 12000。另一方面,可能只有很少的 JOBS,其中 MIN_SALARY 大于 18000。数据分布上的差异可能表明需要添加一个索引,以便可以根据查询中提供的值使用不同的计划。本幻灯片展示了这样的情况。正如您所看到的,第一个查询和第三个查询使用相同的执行计划,但第二个查询使用了另一个执行计划。

从性能角度看,有独立游标时性能较好。但是,这不是很经济,因为您可以为本例中的第一个查询和最后一个查询实现共享游标。

注:在幻灯片示例中,第一个查询和第三个查询的 V$SQL.PLAN_HASH_VALUE 是
相同的。

 

 

游标共享和不同的文字值

 

Curosr Sharing 游标共享和绑定变量

 

 

游标共享和绑定变量1

如果使用绑定变量,而不是针对不同文字值发出不同语句,则可避免额外的分析活动(在理论上)。这是因为优化程序会认识到该语句已经过分析,因此决定重用相同的执行计划,即便在下次重新执行相同的语句时您指定了不同的绑定值,也是如此。

在幻灯片的示例中,绑定变量名为 min_sal。它将与 JOBS 表的 MIN_SALARY 列进行比较。不必发出三条不同的语句,发出使用绑定变量的一条语句即可。在执行时,会使用相同的执行计划,用特定值替换变量。

但是,从性能角度看,这不是最佳方案,因为在三次执行中,只有两次您获得了最佳性能。从另一方面看,这样做非常经济,因为您只需要在库高速缓存中存储一个共享游标便可执行全部三条语句。

 

SQL*Plus 中的绑定变量

 

 

SQL> variable job_id varchar2(10) 
SQL> exec :job_id := 'SA_REP'; 
 
PL/SQL procedure successfully completed. 
 
SQL> select count(*) from employees where job_id = :job_id; 
 
  COUNT(*) 
---------- 
        30 
 
SQL> exec :job_id := 'AD_VP'; 
 
PL/SQL procedure successfully completed. 
 
SQL> select count(*) from employees where job_id = :job_id; 
 
  COUNT(*) 
---------- 
         2 


可以在 SQL*Plus 会话中使用绑定变量。在 SQL*Plus 中,使用 VARIABLE 命令定义绑定变量。然后,通过使用 EXEC[UTE] 命令执行赋值语句可以为变量赋值。自此以后,对该变量的任何引用都使用您赋予的值。
在幻灯片的示例中,将 SA_REP 赋给变量后执行了第一个 Select Count 操作。结果是 30。然后,将 AD_VP 赋给变量,得到的计数是 2。

 

 

Oracle Enterprise Manager 中的绑定变量

 

Oracle Enterprise Manager 中的绑定变量

 

在 Oracle Enterprise Manager 的“SQL Worksheet(SQL 工作表)”页中(请参见“Database Home(数据库主页)”的“Related Links(相关链接)”区域中的“SQL Worksheet(SQL 工作表)”链接),可以指定某条 SQL 语句应当使用绑定变量。可以通过选中“Use bind variables for execution(在执行中使用绑定变量)”复选框完成此任务。选中此复选框后,会生成几个字段,您可以在其中输入绑定变量值。可在 SQL 语句中使用以冒号开头的变量名称引用这些值。变量的引用顺序定义了哪个变量获得哪个值。第一个被引用的变量将获得第一个值,第二个变量获得第二个值,依此类推。如果更改了语句中变量的引用顺序,则可能需要更改值列表以与此顺序一致。

 

 

绑定变量扫视

 

绑定变量扫视

 

如果查询中使用文字,优化程序可以使用这些文字值来确定最佳计划。但是,如果使用绑定变量,优化程序仍需要基于查询中条件的值选择最佳计划,但在 SQL 文本中无法方便地查看这些值。这意味着,分析 SQL 语句时,系统需要能够查看绑定变量的值,以确保选择适合于这些值的有效计划。优化程序通过扫视绑定变量中的值来完成此操作。在硬分析 SQL 语句时,优化程序估算每个绑定变量的值,并将其用作输入值来确定最佳计划。在第一次分析该查询确定好执行计划后,以后只要执行相同的语句,不管所用的绑定值为何,都会重用该计划。

此功能是在 Oracle9i Database R2 中引入的。Oracle Database 11g 更改了此行为。

 

 

绑定变量扫视

 

绑定变量扫视2

 

在某些情况下,绑定变量扫视会导致优化程序选择不太理想的计划。之所以发生这种情况,是因为在为查询的所有后续执行确定计划时使用的都是绑定变量的第一个值。所以,即使后续执行提供不同的绑定值,也使用同一计划。对于具有不同绑定变量值的执行,也许其它计划更合适。例如,当一个特定索引的选择性随列值有非常大的变化时。对于较低的选择性,全表扫描可能更快。对于较高的选择性,索引范围扫描可能更适合。如幻灯片所示,计划 A 可能适合于 min_sal 的第一个值和第三个值,但可能不是第二个值的最佳选择。假设只有很少高于 18000 的 MIN_SALARY 值,且计划 A 为全表扫描。在此情况下,对于第二个执行,全表扫描可能不是一个好计划。

因此绑定变量是有利的,因为它们可实现更多的游标共享,从而减少了 SQL 分析。但是,在这种情况下,对于某些绑定变量值而言,游标共享可能会导致选择不太理想的计划。对于决策支持系统 (DSS) 环境而言,这是一个不使用绑定变量的有效理由。在决策支持系统环境中,查询的分析只占提交查询时需做工作的一个很小百分比。分析也许一转眼的工夫就会完成,但执行可能会花费几分钟或几小时。使用较慢的计划执行时,不值得花费成本来节省分析时间。

 

游标共享增强

 

  • Oracle8i 引入了仅其中的文字值不同的 SQL 语句的共享。
  • Oracle9i 扩展了此功能,仅将共享语句界定为相似语句,而不是强制执行。
  • 相似:不管文字值为何,都使用同一执行计划

 

SQL> SELECT * FROM employees
  2  WHERE employee_id = 153;

 

  • 不相似:对于不同的文字值可能使用不同的执行计划

SQL> SELECT * FROM employees
  2  WHERE department_id = 50;

 

Oracle8i 引入了仅其中的文字值不同的 SQL 语句的共享。优化程序并不是在每次执行具有不同文字值的相同语句时制定一个执行计划,而是生成一个通用的执行计划,将其用于此语句的所有后续执行。

由于仅使用一个执行计划,而不是许多个,所以您应针对您的应用程序测试此功能,然后再确定是否启用它。这就是 Oracle9i 扩展此功能,仅将语句作为相似语句来共享的原因。换句话说,就是只有在优化程序确信执行计划独立于所使用的文字值时才使用该执行计划。例如,请考虑一个查询,其中 EMPLOYEE_ID 是主键:

SQL> SELECT * FROM employees WHERE employee_id = 153;

用任何值进行替代都会生产相同的执行计划。因此,对于多次出现的使用不同文字值执行的相同语句,优化程序只生成一个计划是安全的。

另一方面,假设在相同 EMPLOYEES 表中 DEPARTMENT_ID 列值的范围很广。例如,部门 50 包含的员工数可能超过员工总数的三分之一,而部门 70 可能只包含一两个员工。

 

请参见两个查询:

SQL> SELECT * FROM employees WHERE department_id = 50;

SQL> SELECT * FROM employees WHERE department_id = 70;

如果针对 DEPARTMENT_ID 列具有直方图统计信息,并且该列包含的数据存在偏差,则仅使用一个执行计划共享同一游标将是不安全的。在这种情况下,根据先执行哪条语句,执行计划可能包含全表(或索引快速完全)扫描,或者使用简单的索引范围扫描。

 

CURSOR_SHARING 参数

 

  • CURSOR_SHARING 参数值:

–FORCE

–EXACT(默认值)

–SIMILAR

  • 可以使用下列项更改 CURSOR_SHARING:

–ALTER SYSTEM

–ALTER SESSION

–初始化参数文件

  • CURSOR_SHARING_EXACT 提示

CURSOR_SHARING 初始化参数的值决定优化程序如何使用绑定变量处理语句:

  • EXACT:完全禁用文字值替换
  • FORCE:对所有文字值都执行共享
  • SIMILAR:仅对安全的文字值执行共享

在以前的版本中,您可能仅选择 EXACT 或 FORCE 选项。这会导致优化程序对语句进行检查,以确保仅对安全文字值执行替换。在执行此操作时,它可以使用有关任何可用索引的性质的信息(唯一或非唯一),以及在索引或基表(包括直方图)上收集的统计信息。

可以使用 ALTER SYSTEM SET CURSOR_SHARING 或 ALTER SESSION SET CURSOR_SHARING 命令覆盖初始化文件中的 CURSOR_SHARING 值。

CURSOR_SHARING_EXACT 提示会导致系统执行 SQL 语句,而不尝试用绑定变量替换文字值。

 

强制游标共享:示例

 

SQL> alter session set cursor_sharing = FORCE;

SELECT * FROM jobs WHERE min_salary > 12000;

SELECT * FROM jobs WHERE min_salary > 18000;

SELECT * FROM jobs WHERE min_salary > 7500;

 

SELECT * FROM jobs WHERE min_salary > :”SYS_B_0″

 

 

强制游标共享:示例

 

在幻灯片的示例中,由于使用 ALTER SESSION 命令强制游标共享,所有仅文字值不同的查询会被自动覆盖,从而使用名为 SYS_B_0 的、由系统生成的同一绑定变量。结果,您最后会具有一个子游标,而不是三个。

注:自适应游标共享也可能适用,在这种情况下可能会生成另一个子游标。

 

自适应游标共享:概览

 

  • 自适应游标共享:
  • 仅允许针对使用绑定变量的语句智能地共享游标
  • 用于在游标共享和优化之间找到一个平衡点
  • 具有以下优点:

–自动检测各种不同的执行什么情况下能从不同的执行计划受益

–将生成的子游标数限制到最少

–是自动机制,无法关闭

 

设计绑定变量,是为了使 Oracle DB 可以针对多条 SQL 语句共享单个游标,以减少分析 SQL 语句所使用的共享内存量。然而,游标共享和 SQL 优化是两个相互冲突的目标。编写带文字值的 SQL 语句可为优化程序提供更多的信息,无疑,这有利于生成更好的执行计划,但大量的硬分析会导致内存和 CPU 开销增加。Oracle9i Database 首次尝试推出了一个折衷的解决方案 — 允许共享使用不同文字值的相似 SQL 语句。对于使用绑定变量的语句,Oracle9i 还引入了绑定扫视概念。为了从绑定扫视中受益,假定使用游标共享,且假定语句的不同调用使用相同的执行计划。若使用不同的执行计划时语句的不同调用受益显著,则绑定扫视对生成有效的执行计划就不再有用。

为了尽可能解决此问题,Oracle Database 11g 引入了自适应游标共享。此功能是一项更复杂的策略,它不会盲目地共享游标,如果与分析时间和内存使用量开销相比,使用多个执行计划所带来的收益更大,则会为使用绑定变量的每条 SQL 语句生成多个执行计划。然而,由于使用绑定变量的目的是共享内存中的游标,因此在确定需要生成的子游标数目时必须采取一种折衷的方法。

 

自适应游标共享:体系结构

 

自适应游标共享:体系结构

 

使用自适应游标共享时,在此幻灯片中所示的方案中将执行下列步骤:

  1. 游标照常会先开始进行硬分析。如果发生绑定扫视,且使用直方图计算包含绑定变量的谓词的选择性,则该游标将被标记为对绑定敏感的游标。此外,还会存储一些有关包含绑定变量的谓词的信息,包括谓词选择性。在该幻灯片的示例中,所存储的谓词选择性是一个以 (0.15,0.0025) 为中心的立方体。由于进行了初始硬分析,将使用已扫视的绑定确定初始执行计划。执行游标后,绑定值和游标的执行统计信息存储在该游标中。

在下次使用一组新的绑定值执行该语句时,系统会执行常规软分析,并查找供执行使用的匹配游标。执行结束时,会将执行统计信息与当前存储在游标中的执行统计信息进行比较。然后,系统观察所有先前运行的统计信息模式(请参阅下一张幻灯片中的 V$SQL_CS_… 视图),并确定是否将游标标记为能识别绑定的游标。

 

  1. 下一次对此查询进行软分析时,如果游标已是能够识别绑定的,则会使用能识别绑定的游标匹配。假设具有新的一组绑定值的谓词选择性现在是 (0.18,0.003)。由于选择性用作能识别绑定的游标匹配的一部分,并且该选择性在现有立方体内,因此该语句使用现有子游标的执行计划运行。
  2. 下一次对此查询进行软分析时,假设具有一组新绑定值的谓词选择性现在是 (0.3,0.009)。由于该选择性不在现有立方体内,所以找不到子游标匹配项。因此,系统会执行硬分析,在本例中生成了一个具有另一个执行计划的新子游标。此外,新选择性立方体将存储为该新子游标的一部分。执行该新子游标后,系统会将绑定值和执行统计信息存储在该游标中。
  3. 下一次对此查询进行软分析时,假设具有一组新绑定值的谓词选择性现在是 (0.28,0.004)。由于该选择性不在现有的某个立方体内,系统将执行硬分析。假设此时硬分析生成与第一个执行计划相同的执行计划。因为该计划与第一个子游标相同,所以将合并这两个子游标。也就是说,这两个立方体将合并为一个较大的新立方体,并删除其中一个子游标。下次执行软分析时,如果选择性位于该新立方体内,子游标将匹配。

 

自适应游标共享:视图

下列视图提供有关自适应游标共享使用情况的信息:

下列视图提供有关自适应游标共享使用情况的信息

 

这些视图确定查询是否是能识别绑定的查询,是否为自动处理的,无需用户输入。但是,有关所发生的操作的信息显示在 V$ 视图中,这样在遇到问题时,您可以进行诊断。V$SQL 中新增了几列:

  • IS_BIND_SENSITIVE:指示游标是否是对绑定敏感的,值为 YES | NO。符合以下情况的查询称为对绑定敏感的查询:计算谓词选择性时优化程序为其扫视绑定变量值,并且绑定变量值的更改可能导致不同的计划。
  • IS_BIND_AWARE:指示游标是否为能识别绑定的游标,值为 YES | NO。位于游标高速缓存中、已标记为使用能识别绑定的游标共享的游标称为识别绑定的游标。
  • V$SQL_CS_HISTOGRAM:显示跨三个存储桶执行历史记录直方图的执行计数的分布情况。
  • V$SQL_CS_SELECTIVITY:显示为包含绑定变量且在游标共享检查中使用了其选择性的每个谓词存储在游标中的选择性立方体或范围。它包含谓词文本和选择性范围的下限值和上限值。
  • V$SQL_CS_STATISTICS:自适应游标共享监视查询的执行,在一段时间内收集相关的信息,并使用此信息确定是否切换为对该查询使用能识别绑定的游标。该视图汇总了它收集的用于做出该决定的信息。对于许多执行来说,它跟踪已处理的行数、缓冲区获取数和 CPU 时间。如果构建游标时使用了绑定集,则 PEEKED 列的值为 YES,否则为 NO。

自适应游标共享:示例

 

自适应游标共享:示例

 

请考虑该幻灯片中的数据。JOB_ID 列具有相应的直方图统计信息,这些统计信息表示 SA_REP 比 AD_ASST 多出现数千次。在这种情况下,如果使用文字值而不使用绑定变量,查询优化程序会发现 AD_ASST 值出现在不足 1% 的行中,而 SA_REP 值出现在近三分之一的行中。如果表包含一百万以上的行,则针对每个值的查询执行计划是不同的。AD_ASST 查询会导致索引范围扫描,因为具有该值的行很少。SA_REP 查询会导致全表扫描,因为具有该值的行很多,这样可以更高效地读取整个表。但是,实际上,起初使用绑定变量会导致对这两个值使用相同的执行计划。因此,即使对于其中每个值存在更好的不同计划,也使用相同的计划。

在使用绑定变量执行几次此查询后,系统会考虑查询的绑定识别,此时系统会基于绑定值更改计划。这意味着基于绑定变量值对查询使用最佳计划。

 

 

与自适应游标共享交互

  • CURSOR_SHARING:

–如果 CURSOR_SHARING <> EXACT,则可能会使用绑定变量重写包含文字的语句。

–如果语句被重写,则可能会对其应用自适应游标共享。

  • SQL 计划管理 (SPM):

–如果将 OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES 设置为 TRUE,则仅使用生成的第一个计划。

–一种解决方法是:将此参数设置为 FALSE,然后运行您的应用程序,直到将所有计划都加载到游标高速缓存中。

–手动将游标高速缓存加载到相应的计划基线中。

 

  • 自适应游标共享与 CURSOR_SHARING 参数无关。此参数的设置决定是否用系统生成的绑定变量替换文字。如果替换,则自适应游标共享的行为跟用户在开始时已提供绑定一样。
  • 如果使用 SPM 自动计划捕获,则将为使用绑定变量的 SQL 语句捕获的第一个计划标记为相应的 SQL 计划基线。如果同一 SQL 语句存在其它计划(自适应游标共享可能就是这种情况),则该计划将添加到 SQL 语句计划历史记录中,并对其进行标记以便验证:不会立即使用该计划。因此,即使自适应游标共享提供了基于一组新绑定值的新计划,在该计划得到验证前 SPM 也不允许使用它。这样就退回到了 10g 的行为,该语句的所有后续执行仅使用基于第一组绑定值生成的计划。一种可能的解决方法是:将自动计划捕获设置为 False,然后将系统运行一段时间,在使用具有绑定的 SQL 语句拥有的所有计划填充游标高速缓存后,将整个计划直接从游标高速缓存加载到相应的 SQL 计划基线。通过执行此操作,默认情况下,单个 SQL 语句的所有计划都将被标记为 SQL 基线计划。此课程不介绍 SQL 计划管理。请参阅《SQL 性能优化》课程或《面向管理员的新增功能》课程。

 

Oracle SQL CBO 优化器/优化程序 统计信息

  • 收集优化程序统计信息
  • 收集系统统计信息
  • 设置统计信息首选项
  • 使用动态采样
  • 处理优化程序统计信息

 

SQL CBO 优化器/优化程序 统计信息

 

优化程序统计信息描述有关数据库及其中对象的详细资料。查询优化程序使用这些统计信息,为每个 SQL 语句选择最佳的执行计划。

由于数据库中的对象经常发生更改,所以必须定期更新统计信息,以使它们能够准确地描述这些数据库对象。统计信息由 Oracle DB 自动进行维护,您也可以使用 DBMS_STATS 程序包手动维护优化程序统计信息。

  • 描述数据库以及数据库中的对象
  • 查询优化程序使用以下信息进行评估:

–谓词的选择性

–每个执行计划的成本

–访问方法、联接顺序和联接方法

–CPU 和输入/输出 (I/O) 成本

  • 与收集优化程序统计信息相比,对过时的统计信息进行刷新同样重要。

–由系统自动收集

–用户使用 DBMS_STATS 手动收集

 

优化程序统计信息的类型

  • 表统计信息:

–行数

–块数

–平均行长度

  • 索引统计信息:

–B* 树级别

–唯一键

–叶块数量

–聚簇因子

  • 系统统计信息:

–I/O 性能及利用率

–CPU 性能及利用率

  • 列统计信息:

–基本统计信息:相异值数量、空值数量、平均长度、最小值、最大值

–直方图(列数据有偏差时的数据分布)

–扩展的统计信息

幻灯片中列出了大多数优化程序统计信息。

自 Oracle Database 10g 开始,在创建或重建索引时会自动收集索引统计信息。

注:此幻灯片提及的统计信息是优化程序统计信息,是为查询优化创建的,存储在数据字典中。不应将此类统计信息与 V$ 视图中显示的性能统计信息相混淆。

 

 

表统计信息 (DBA_TAB_STATISTICS)

NUM_ROWS
这是基数计算的基础。如果表是嵌套循环联接的驱动表,则行计数尤为重要,因为它定义了内部表被探测多少次。

BLOCKS
已使用数据块的数量。块计数与 DB_FILE_MULTIBLOCK_READ_COUNT 组合在一起给出了基表访问成本。

EMPTY_BLOCKS
表中空的(从未使用的)数据块数量。这是已使用数据块和高水位标记之间的块。

AVG_SPACE
分配给表的数据块中空闲空间的平均数量(以字节为单位)。

CHAIN_CNT
这是表中从一个数据块链接到另一个数据块、或者移植到了新块,且需要用链接来保留原有 ROWID 的行的数量。

AVG_ROW_LEN
表中行的平均长度(以字节为单位)。

STALE_STATS

指明统计信息在相应表中是否有效。

 

  • 用于确定以下项:

–表访问成本

–联接基数

–联接顺序

  • 收集的一些统计信息包括:

–行计数 (NUM_ROWS)

–块计数 (BLOCKS) 精确值

–空块数 (EMPTY_BLOCKS) 精确值

–每个块的平均空闲空间 (AVG_SPACE)

–链接行的数量 (CHAIN_CNT)

–平均行长度 (AVG_ROW_LEN)

–统计信息状态 (STALE_STATS)

 

索引统计信息 (DBA_IND_STATISTICS)

 

  • 用于确定以下项:

–全表扫描与索引扫描

  • 收集的统计信息包括:

–B* 树级别 (BLEVEL) 精确值

–叶块计数 (LEAF_BLOCKS)

–聚簇因子 (CLUSTERING_FACTOR)

–唯一键 (DISTINCT_KEYS)

–它指明索引中的每个相异值平均出现在多少个叶块中 (AVG_LEAF_BLOCKS_PER_KEY)

–索引中的每个相异值所指向的表数据块的平均数量 (AVG_DATA_BLOCKS_PER_KEY)

–索引中的行数 (NUM_ROWS)

 

一般来说,要选择索引访问,优化程序要求针对索引列的前缀使用一个谓词。但是,如果没有谓词,并且查询中引用的所有列都存在于索引中,则优化程序会考虑使用完全索引扫描,而不是全表扫描。

BLEVEL
该信息用于计算叶块查找成本。它指明索引从根块到叶块的深度。深度为“0”表明根块和叶块是相同的。

LEAF_BLOCKS
该信息用于计算完全索引扫描成本。

CLUSTERING_FACTOR
它基于索引的值测量表中行的顺序。如果该值接近块数量,则表明表的顺序良好。在这种情况下,一个叶块中的索引项通常指向同一数据块中的行。如果该值接近行数量,则表明表的顺序是随机的。在这种情况下,同一叶块中的索引项可能没有指向同一数据块中的行。

STALE_STATS

指明统计信息在相应索引中是否有效。

 

DISTINCT_KEYS
相异索引值的数量。对于强制执行 UNIQUE 和 PRIMARY KEY 约束条件的索引,此值等于表行数。

AVG_LEAF_BLOCKS_PER_KEY
它指明索引中的每个相异值平均出现在几个叶块中,该值舍入到最近的整数。对于强制执行 UNIQUE 和 PRIMARY KEY 约束条件的索引,此值始终等于一 (1)。

AVG_DATA_BLOCKS_PER_KEY
索引中的每个相异值所指向的表数据块的平均数量,舍入到最近的整数。对于每个给定的索引列值,该统计信息表示其行中包含该值的数据块的平均数量。

NUM_ROWS
索引中的行数。

索引聚簇因子

 

系统按块执行输入/输出 (I/O)。所以,优化程序是否使用全表扫描取决于所访问的块的百分比,而不是行百分比。这称作索引聚簇因子。如果每个块都包含单个行,则访问的行数和访问的块数是相同的。

但是,大多数表在每个块中都包含多个行。因此,所需数量的行可能聚集在几个块中,也可能散布在大量块中。除 B* 树级别,叶块数量以及索引选择性之类的信息之外,索引范围扫描的成本公式还包括聚簇因子。这是因为较小的聚簇因子表示行集中在表中的少量块中。较大的聚簇因子表示行随机分布在表中各个块之间。所以,较大的聚簇因子意味着使用索引范围扫描按 ROWID 获取行会花费较多的成本,因为需要访问表中较多的块才能返回数据。在实际环境中,因为叶块数量和 B* 树高度与聚簇因子和表选择性相比,相对较小,所以聚簇因子在决定索引范围扫描的成本方面似乎起着重要作用。

注:如果某个表有多个索引,则一个索引的聚簇因子可能较小,而同时另一个索引的聚簇因子可能较大。如果尝试重新组织此表以改进一个索引的聚簇因子,则可能会导致另一个索引的聚簇因子性能降低。

index_clustering_1

 

在收集索引的统计信息时,系统会在 DBA_INDEXES 视图的 CLUSTERING_FACTOR 列中计算聚簇因子。计算方式相对来讲比较简单。从左到右读取索引,对于每个索引项,如果相应行所在的块不同于上一行所在的块,将聚簇因子加一。基于此算法,聚簇因子最小可能值是块数量,最大可能值是行数量。

幻灯片中的示例说明了聚簇因子如何影响成本。假设存在下列情况:有一个表包含 9 行,在此表的 col1 上有一个非唯一索引,c1 列当前存储的值为 A、B 和 C,此表仅有三个 Oracle 块。

  • 情形 1:如果组织表中的行,使索引值分散在各个表块中(而不是并列排置),则索引聚簇因子较高。
  • 情形 2:如果将具有相同值的行并列排置在相同的块中,则这些行的索引聚簇因子
    较低。

注:对于位图索引,聚簇因子不适用,因而不会使用。

 

列统计信息 (DBA_TAB_COL_STATISTICS)

  • 列的相异值计数 (NUM_DISTINCT)
  • 下限值 (LOW_VALUE) 精确值
  • 上限值 (HIGH_VALUE) 精确值
  • 空值数量 (NUM_NULLS)
  • 非常用值的选择性估计 (DENSITY)
  • 直方图存储桶数量 (NUM_BUCKETS)
  • 直方图类型 (HISTOGRAM)

NUM_DISTINCT 用在选择性计算中,例如,1/NDV

LOW_VALUEHIGH_VALUE:基于成本的优化程序 (CBO) 假定所有数据类型的值在下限值和上限值之间是均匀分布的。这些值用于确定范围选择性。

NUM_NULLS 对可为空值的列以及 IS NULL 和 IS NOT NULL 谓词的选择性很有帮助。

DENSITY 仅与直方图相关。它可用作非常用值的选择性估计。可以将其视为在此列中发现某个特殊值的概率。它的计算取决于列是否有一个直方图以及直方图的类型。

NUM_BUCKETS 是列直方图中存储桶的数量。

HISTOGRAM 表明直方图是否存在或直方图类型:NONE、FREQUENCY、HEIGHT BALANCED

 

直方图

  • 优化程序假定数据均匀分布;当数据有偏差时,这可能会导致访问计划不太理想。
  • 直方图:

–存储其它列分布信息

–在数据分布不均匀的情况下给出更准确的选择性估计。

  • 使用无限的资源,您可以存储每个不同的值以及与该值对应的行数量。
  • 如果相异值很多,这会变得难以管理,此时应使用其它
    方法:

–频率直方图(#相异值 ≤ #存储桶)

–高度平衡直方图(#存储桶 < #相异值)

  • 它们存储在 DBA_TAB_HISTOGRAMS 中。

直方图捕获列中不同值的分布情况,因此会生成更准确的选择性估计。如果列包含有偏差的数据,或包含在重复数量上有很大变化的值,则针对这类列创建直方图可以帮助查询优化程序生成准确的选择性估计,并针对索引使用、联接顺序、联接方法等等做出更好的
决定。

如果没有直方图,则假定数据均匀分布。如果某个列的直方图可用,则评估人员会使用该图,而不使用相异值数量。

创建直方图时,Oracle DB 使用两种不同类型的直方图表示方法,具体取决于在相应列中找到的相异值数量。如果您的数据集包含的相异值少于 254 个,并且没有指定直方图存储桶数量,则系统会创建频率直方图。如果相异值数量大于所需的直方图存储桶数量,则系统会创建高度平衡直方图。

在以下字典视图中可以找到有关直方图的信息:DBA_TAB_HISTOGRAMS、DBA_PART_HISTOGRAMS 和 DBA_SUBPART_HISTOGRAMS

注: 在统计信息收集方面,收集直方图统计信息是一项最耗费资源的操作。

 

频率直方图

频率直方图在幻灯片的示例中,假定您有一个包含 40,001 个数字的列,但相异值只有 10 个:1、3、5、7、10、16、27、32、39 和 49。值 10 是最常用的值,出现了 16,293 次。

当请求的存储桶数量等于(或大于)相异值数量时,您可以存储每个不同的值并记录精确的基数统计信息。在这种情况下,在 DBA_TAB_HISTOGRAMS 中,ENDPOINT_VALUE 列存储列值,ENDPOINT_NUMBER 列存储该列值的行计数。

该行计数以累积形式进行存储,这样范围扫描可以减少一些计算。为了清楚起见,幻灯片中使用曲线显示行计数的实际数量;仅 ENDPOINT_VALUE 和 ENDPOINT_NUMBER 列存储在数据字典中。

histogramz1

 

查看频率直方图

幻灯片中的示例显示了查看频率直方图的方法。由于 INVENTORIES 表的 WAREHOUSE_ID 列中相异值的数量为 9,并且请求的存储桶数量为 20,所以系统会自动创建一个具有 9 个存储桶的频率直方图。可以在 USER_TAB_COL_STATISTICS 视图中查看此信息。

要查看直方图本身,可以查询 USER_HISTOGRAMS 视图。您可以看到 ENDPOINT_NUMBER 和 ENDPOINT_VALUE,前者对应着相应 ENDPOINT_VALUE 的累积频率,后者在本例中代表列数据的实际值。

注:本课稍后将对 DBMS_STATS 程序包进行介绍。

 

 

BEGIN DBMS_STATS.gather_table_STATS (OWNNAME=>'OE', TABNAME=>'INVENTORIES', 
       METHOD_OPT => 'FOR COLUMNS SIZE 20 warehouse_id'); 
END; 




SELECT column_name, num_distinct, num_buckets, histogram 
FROM   USER_TAB_COL_STATISTICS 
WHERE  table_name = 'INVENTORIES' AND 
       column_name = 'WAREHOUSE_ID'; 
 
COLUMN_NAME  NUM_DISTINCT NUM_BUCKETS HISTOGRAM 
------------ ------------ ----------- --------- 
WAREHOUSE_ID            9           9 FREQUENCY 

SELECT endpoint_number, endpoint_value 
FROM   USER_HISTOGRAMS 
WHERE  table_name = 'INVENTORIES' and column_name = 'WAREHOUSE_ID' 
ORDER BY endpoint_number; 
 
ENDPOINT_NUMBER ENDPOINT_VALUE 
--------------- -------------- 
36                           1 
213                          2 
261                          3 
… 


高度平衡直方图

 

在高度平衡直方图中,列值被分成若干段,每个段包含的行数几乎相同。直方图可表明在值范围中端点终止的位置。在幻灯片示例中,假定您有一个包含 40,001 个数字的列。但相异值只有 10 个:1、3、5、7、10、16、27、32、39 和 49。值 10 是最常用的值,出现了 16,293 次。如果存储桶数量少于相异值数量,则 ENDPOINT_NUMBER 记录存储桶数量,而 ENDPOINT_VALUE 记录与此端点对应的列值。在示例中,每个存储桶包含的行数是总行数的五分之一,即 8000。

根据此假设,值 10 的出现次数在 8000 和 24000 之间。因此您确定值 10 是一个常用值。

此类型的直方图适用于常用值的等式谓词和范围谓词。

不记录每个存储桶的行数,因为这可以从值的总数以及所有存储桶都包含相同数量的值这一事实推导出来。在本例中,值 10 是一个常用值,因为它跨越了多个端点值。为了节约空间,直方图不实际存储重复的存储桶。由于此原因,在幻灯片的示例中,不会在 DBA_TAB_HISTOGRAMS 中记录存储桶 2(端点值为 10)。

注:本例中的密度统计值将为 1/9 x 4/5 = 0.088 或 8.8%(9=#NPV 和 4=#NPB)。此值将用于非常用值的选择性计算。

 

histogramz2

幻灯片中的示例显示了查看高度平衡直方图的方法。由于 INVENTORIES 表的 QUANTITY_ON_HAND 列中相异值的数量为 237,并且请求的存储桶数量为 10,所以系统会自动创建一个具有 10 个存储桶的高度平衡直方图。可以在 USER_TAB_COL_STATISTICS 视图中查看此信息。

要查看直方图本身,可以查询 USER_HISTOGRAMS 视图。您可以看到与存储桶数量对应的 ENDPOINT_NUMBER,以及与端点的末端值对应的 ENDPOINT_VALUE。

注:本课稍后将对 DBMS_STATS 程序包进行介绍。

 

 

BEGIN 
  DBMS_STATS.gather_table_STATS(OWNNAME =>'OE', TABNAME=>'INVENTORIES',  
  METHOD_OPT => 'FOR COLUMNS SIZE 10 quantity_on_hand'); 
END; 


SELECT column_name, num_distinct, num_buckets, histogram  
  FROM USER_TAB_COL_STATISTICS 
 WHERE table_name = 'INVENTORIES' AND column_name = 'QUANTITY_ON_HAND'; 
 
COLUMN_NAME                    NUM_DISTINCT NUM_BUCKETS HISTOGRAM 
------------------------------ ------------ ----------- --------------- 
QUANTITY_ON_HAND                        237          10 HEIGHT BALANCED 


SELECT endpoint_number, endpoint_value  
FROM USER_HISTOGRAMS 
WHERE table_name = 'INVENTORIES' and column_name = 'QUANTITY_ON_HAND' 
ORDER BY endpoint_number; 
 
ENDPOINT_NUMBER ENDPOINT_VALUE 
--------------- -------------- 
              0              0 
              1             27 
              2             42 
              3             57 
… 


 

直方图注意事项

  • 如果列的数据分布有大幅偏差,则直方图很有用。
  • 对于以下情况,直方图没有太大用处:

–列没有出现在 WHERE 或 JOIN 子句中

–列的数据分布较均匀

–对唯一性列使用了等式谓词

  • 存储桶的最大数量等于 254 和相异值数量这两者之中的最小值。
  • 除非直方图能够显著改善性能,否则不要使用直方图。

直方图只有在能够反映给定列的当前数据分布时才是有用的。在数据分布保持不变的情况下,列中的数据可能会更改。如果列的数据分布频繁发生变化,您必须频繁地重新计算其直方图。

如果您要为其创建直方图的列包含有高度偏差的数据,则直方图很有用。

然而,对于没有出现在 SQL 语句的 WHERE 子句中的列,没有必要为其创建直方图。同样,也没有必要为数据分布较均匀的列创建直方图。

另外,直方图对声明为 UNIQUE 的列也没有用处,因为此时选择性是显而易见的。此外,存储桶的最大数量为 254,可能更低,具体取决于相异列值的实际数量。直方图会影响性能,只有在直方图能够显著改善查询计划时,才应使用它们。如果数据分布很均匀,则优化程序不使用直方图就可以相当准确地估算出执行一个特殊语句所需的成本。

注:字符列有一些不同的行为,因为对于任何字符串只有前 32 个字节被存储为直方图
数据。

 

多列统计信息:概览

 

使用 Oracle Database 10g,在以下有限的情况下,查询优化程序在计算多个谓词的选择性时,将考虑列之间的相互关系:

  • 如果连接谓词的所有列与级联索引关键字的所有列匹配,并且谓词是等值联接中使用的等式,则优化程序将使用索引中的唯一键 (NDK) 的数量来估计选择性 (1/NDK)。
  • 如果将 DYNAMIC_SAMPLING 设置为级别 4,则查询优化程序将使用动态采样来评估涉及同一个表中多个列的复杂谓词的选择性。但是,样本的大小很小,并且分析时间有所增加。因此,从统计学的角度来看样本可能不准确,并且可能会弊大于利。

在其它所有情况下,优化程序将假定复杂谓词中所用的列的值互不相关。优化程序会通过将各个谓词的选择性相乘来估计连接谓词的选择性。如果列之间存在相关性,则此方法会低估选择性。为了避免此问题,Oracle Database 11g 允许您收集、存储并使用以下统计信息来捕获两个或更多列(也称为列组)之间的功能相关性:相异值的数量、空值的数量、频率直方图和密度。

 

extended_statistics1

例如,假定有一个 VEHICLE 表,其中存储了有关汽车的信息。MAKE 和 MODEL 列是高度相关的,因为 MODEL 决定 MAKE。这是一种强依赖关系,优化程序应将这两个列看成是高度相关的两个列。可以使用 CREATE_EXTENDED_STATS 函数将该关系传送给优化程序(如幻灯片上的示例所示),然后计算所有列的统计信息(包括创建的相关组的统计
数据)。

优化程序仅对等式谓词使用多列统计信息。

附注

  • CREATE_EXTENDED_STATS 函数会返回一个虚拟的隐藏列名称,如 SYS_STUW_5RHLX443AN1ZCLPE_GLE4。
  • 根据幻灯片中的示例,可以使用以下 SQL 确定名称:
    select dbms_stats.show_extended_stats_name(‘jfv’,’vehicle’,'(make,model)’) from dual
  • 创建统计信息扩展名之后,可以通过使用 ALL|DBA|USER_STAT_EXTENSIONS 视图检索它们。

 

表达式统计信息:概览

 

与列表达式相关的谓词是查询优化程序的一个重要的问题。计算 function(Column) = constant 形式的谓词的选择性时,优化程序将假定静态选择性值为 1%。此方法是错误的,因为这会导致优化程序生成不太理想的计划。

查询优化程序已得到了扩展,可以在有限的几种情况下更好地处理此类谓词。在这些情况下,函数保留列的数据分布特征,因而允许优化程序使用列统计信息。例如,TO_NUMBER 就是此类函数之一。

此外,还对相应功能做了进一步增强,可在查询优化过程中对内置函数求值,以便使用动态采样来获得更高的选择性。最后,优化程序收集所创建的虚拟列的统计信息以支持基于函数的索引。

但是,这些解决方案或者局限于特定的函数类,或者仅适合于用于创建基于函数的索引的表达式。通过使用 Oracle Database 11g 中的表达式统计信息,您可以使用更加通用的解决方案;这些解决方案包括了用户定义的任意函数,并且与是否存在基于函数的索引无关。如幻灯片中的示例所示,此功能将依靠虚拟列基础结构来创建列表达式的统计信息。

 

express_statistics1

 

收集系统统计信息

 

  • 通过系统统计信息,CBO 可以使用 CPU 和 I/O 特征。
  • 必须定期收集系统统计信息;这不会使所缓存的计划失效。
  • 收集系统统计信息等同于分析一个指定期间内的系统活动:
  • 过程:

–DBMS_STATS.GATHER_SYSTEM_STATS

–DBMS_STATS.SET_SYSTEM_STATS

–DBMS_STATS.GET_SYSTEM_STATS

  • GATHERING_MODE:

–NOWORKLOAD|INTERVAL

–START|STOP

 

使用系统统计信息,优化程序可以考虑系统的 I/O 和 CPU 性能以及利用情况。针对每个候选计划,优化程序计算 I/O 和 CPU 成本的估计值。要选择最高效的、I/O 和 CPU 成本达到最佳比例的计划,需要了解系统特征,这一点很重要。系统 CPU 和 I/O 特征并不总是保持不变,它们与许多因素相关。使用系统统计信息管理例程,可以捕获系统在最常见工作量下运行时一定时间间隔内的统计信息。例如,数据库应用程序可以在白天处理联机事务处理 (OLTP) 事务,在晚上运行 OLAP 报表。这两种状态的统计信息您都可以收集,并且可以根据需要激活适当的 OLTP 或 OLAP 统计信息。这样优化程序便可以针对可用的系统资源计划生成相关的成本。系统生成系统统计信息时,会分析指定期间内的系统活动。与表、索引或列统计信息不同,系统统计信息更新后,系统不会使已分析的 SQL 语句失效。所有新的 SQL 语句都使用新的统计信息进行解析。

我们强烈建议您收集系统统计信息。可以使用 DBMS_STATS.GATHER_SYSTEM_STATS 例程在用户定义的时间段内收集系统统计信息。也可以使用 DBMS_STATS.SET_SYSTEM_STATS 显式设置系统统计信息值。可使用 DBMS_STATS.GET_SYSTEM_STATS 验证系统统计信息。

 

使用 GATHER_SYSTEM_STATS 过程时,应指定 GATHERING_MODE 参数:

  • NOWORKLOAD:这是默认设置。此模式可捕获 I/O 系统的特征。收集统计信息可能会花费几分钟的时间,具体取决于数据库大小。在此期间系统会估算 I/O 系统的平均读取寻道时间和传输速度。此模式适用于所有工作量。建议您在创建数据库和表空间后运行 GATHER_SYSTEM_STATS (‘noworkload’)。
  • INTERVAL:捕获指定间隔内的系统活动。此参数与指定捕获时间量的 interval 参数组合在一起发挥作用。您应提供一个以分钟为单位的间隔值,之后系统会在字典或登台表中创建或更新系统统计信息。可以使用 GATHER_SYSTEM_STATS (gathering_mode=>’STOP’) 提前停止收集信息。
  • START | STOP:获取指定开始时间和停止时间之间的系统活动,用该过去时间段内的统计信息刷新字典或登台表。

注:自 Oracle Database 10gR2 开始,系统会在启动时自动收集重要的系统统计信息。

 

收集系统统计信息:示例

 

gather_statistics1

 

幻灯片中的示例显示了在白天处理 OLTP 事务、在晚上运行报表的数据库应用程序。

首先,必须在白天收集系统统计信息。在本例中,收集过程在 120 分钟后结束,统计信息存储在 mystats 表中。

然后在晚上收集系统统计信息。收集过程在 120 分钟后结束,统计信息存储在 mystats 表中。

通常,收集系统统计信息时使用幻灯片中的语法。在调用指定了 INTERVAL 参数的 GATHER_SYSTEM_STATS 过程之前,必须使用 SQL> alter system set job_queue_processes = 1; 之类的命令激活作业进程。也可以调用具有不同参数的相同过程来启用手动收集,而不使用作业。

适当的时候,可以在收集的统计信息之间进行切换。请注意,可以通过提交一个作业用正确的统计信息更新字典,使此过程自动化。在白天,可使用一个作业导入 OLTP 统计信息用于白天的运行,在晚上,可使用另一个作业导入联机分析处理 (OLAP) 统计信息用于晚上的运行。

 

 

  • 手动在数据字典中启动系统统计信息收集:

SQL> EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( –

  2  gathering_mode => ‘START’);

 

  • 生成工作量。
  • 结束收集系统统计信息:

SQL> EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( –

  2  gathering_mode => ‘STOP’);

上一幻灯片中的示例显示了如何通过 DBMS_STATS.GATHER_SYSTEM_STATS 过程的内部参数使用作业收集系统统计信息。要手动收集系统统计信息,可以使用此过程的另一个参数,如幻灯片中所示。

首先,必须启动系统统计信息的收集过程,在确定实例中已生成了具有代表性的工作量后,可以随时结束收集过程。

本示例直接在数据字典中收集系统统计信息。

 

 

用于收集统计信息的机制

  • 自动统计信息收集

–gather_stats_prog 自动化任务

  • 手动统计信息收集

–DBMS_STATS 程序包

  • 动态采样
  • 缺少统计信息时:

gather_stats_prog

 

Oracle DB 提供了几种机制来收集统计信息。这些机制将在后面的幻灯片中详细讲述。建议您为对象使用自动统计信息收集功能。

注:当系统发现表缺少统计信息时,它会动态收集优化程序所需要的必需统计信息。但是,对于某些类型的表,它不会执行动态采样,其中包括远程表和外部表。在这些情况下以及动态采样被禁用时,优化程序将使用默认的统计信息值。

 

统计信息首选项:概览

自动统计信息收集功能是在 Oracle Database 10gR1 中引入的,用于减轻优化程序统计信息的维护工作。但是,在有些情况下,必须禁用该功能,并运行自己的脚本。其中的一个原因是缺少对象级别的控制。只要发现一小部分对象的默认收集统计信息选项的效果不佳,就必须锁定统计信息,并使用您自己的选项单独对其进行分析。例如,如果列包含频率偏差很大的数据,则尝试针对这些列自动确定合适样本大小的功能 (ESTIMATE_PERCENT=AUTO_SAMPLE_SIZE) 不会有很好的效果。解决此问题的唯一方法就是用自己的脚本手动指定样本大小。

Oracle Database 11g 中的统计信息首选项功能具有一定的灵活性,因此,在有些对象需要不同于数据库默认设置的设置时,也可以较灵活地使用自动统计信息收集功能来维护优化程序统计信息。

通过此功能,您可以在对象级别或方案级别,将覆盖 GATHER_*_STATS 过程的默认行为的统计信息收集选项与自动优化程序统计信息收集任务关联起来。可以使用 DBMS_STATS 程序包管理幻灯片中显示的收集统计信息选项。

 

gather_statistics_profile

 

可以在表级、方案级、数据库级和全局级设置、获取、删除、导出和导入这些首选项。全局首选项用于没有首选项的表,而数据库首选项则用于设置针对所有表的首选项。以各种方式指定的首选项值的优先顺序为从外圈到内圈(如幻灯片中所示)。

在幻灯片的图形中,最后三个突出显示的选项是 Oracle Database 11gR1 中新增的选项:

  • CASCADE 还收集索引统计信息。索引统计信息收集不是一个并行化操作。
  • ESTIMATE_PERCENT 是用于计算统计信息的行的估计百分比(空值代表所有行):有效范围是 [0.000001,100]。使用常量 DBMS_STATS.AUTO_SAMPLE_SIZE 可让系统自己决定适当的采样范围以获得准确的统计信息。这是推荐的默认值。
  • NO_INVALIDATE 可能会使也可能不会使从属游标失效。如果将其设置为 TRUE,则不会使从属游标失效。如果将其设置为 FALSE,则此过程会立即使从属游标失效。使用 DBMS_STATS.AUTO_INVALIDATE 可让系统自己决定何时使从属游标失效。这是默认设置。
  • PUBLISH 用于确定是将统计信息发布到字典还是先将其存储在临时等待区中。
  • STALE_PERCENT 用于确定阈值级别,达到该级别时将认为对象具有过时统计信息。该值是上次收集统计信息以来修改过的行数的百分比。示例仅将 SH.SALES 的值从默认值 10% 更改为 13%。
  • DEGREE 决定用于计算统计信息的并行度。并行度的默认值为空值,这表示使用由 CREATE TABLE 或 ALTER TABLE 语句的 DEGREE 子句指定的表默认值。使用常量 DBMS_STATS.DEFAULT_DEGREE 将基于初始化参数指定默认值。AUTO_DEGREE 值可自动决定并行度。此值可能是 1(串行执行),也可能是 DEFAULT_DEGREE(基于 CPU 数量和初始化参数的系统默认值),具体取决于对象大小。
  • METHOD_OPT 是一个 SQL 字符串,用于收集直方图统计信息。默认值为 FOR ALL COLUMNS SIZE AUTO。
  • GRANULARITY 是用于为分区表收集统计信息的粒度。
  • INCREMENTAL 用于以增量方式收集分区表中的全局统计信息。

请注意,您可以使用 DBMS_STATS.SET_PARAM 过程更改上述参数的默认值,这一点很重要。

注:可以使用 DBA_TAB_STAT_PREFS 视图说明所有相关表的全部有效统计信息首选项设置。

 

何时手动收集统计信息

  • 主要依赖自动统计信息收集:

–更改自动统计信息收集频率来满足您的需要。

–请记住,应将 STATISTICS_LEVEL 设置为 TYPICAL 或 ALL,自动统计信息收集功能才能正常运行。

  • 对于下列对象,请手动收集统计信息:

–易失对象

–在批处理操作中修改的对象

–外部表、系统统计信息、修复的对象

–在批处理操作中修改的对象:在批处理操作过程中收集统计信息。

–新建对象:在对象创建之后收集统计信息。

 

自动统计信息收集机制可使所有统计信息保持为最新。确定新统计信息的收集时间和收集频率非常重要。默认的收集间隔是晚上,但是您可以更改此间隔以适应您的业务需要。可以通过更改维护窗口的特征来达到此目的。但是,在某些情况下可能需要手动收集统计信息。例如,如果白天对表进行了大幅修改,则表的统计信息可能会过时。这样的对象一般有两种类型:

  • 在白天受到大幅修改的易失表
  • 经过大型批量装载的对象,在两个统计信息收集间隔之间该对象的总大小增加了 10% 或更多

对于外部表,系统不会在 GATHER_SCHEMA_STATS、GATHER_DATABASE_STATS 和自动优化程序统计信息收集处理期间收集其统计信息。但是,您可以使用 GATHER_TABLE_STATS 收集单个外部表的统计信息。不支持对外部表进行采样,因此应显式将 ESTIMATE_PERCENT 选项设置为空值。因为不允许对外部表执行数据处理,所以只在相应文件发生更改时分析外部表就足够了。需要手动收集其中统计信息的其它区域是系统统计信息和修复的对象,如动态性能表。系统不会自动收集这些统计信息。

 

手动统计信息收集 

可以使用 Oracle Enterprise Manager 和 DBMS_STATS 程序包来完成以下任务:

  • 生成并管理统计信息,以供优化程序使用:

–收集/修改

–查看/命名

–导出/导入

–删除/锁定

  • 收集下列项的统计信息:

–索引、表、列、分区

–对象、方案或数据库

  • 串行或并行收集统计信息
  • 收集/设置系统统计信息(当前在 EM 中尚无法实现)

使用 Oracle Enterprise Manager 和 DBMS_STATS 程序包,都可以为优化程序手动生成和管理统计信息。可以使用 DBMS_STATS 程序包收集、修改、查看、导出、导入、锁定和删除统计信息。还可以使用此程序包标识(或命名)收集的统计信息。您可以按多种粒度收集索引、表、列和分区的统计信息:对象、方案和数据库级别。

DBMS_STATS 仅收集优化所需的统计信息,而不收集其它统计信息。例如,DBMS_STATS 收集的表统计信息包括行数、当前包含数据的块数量和平均行长度,但不包括链接行数、平均空闲空间或未使用的数据块数量。

注:不要使用 ANALYZE 语句的 COMPUTE 和 ESTIMATE 子句收集优化程序统计信息。仅仅是为了实现向后兼容才支持这些子句,在以后的版本中可能会将其删除。DBMS_STATS 程序包可收集更广泛、更准确的统计信息集,并且收集效率更高。对于与优化程序统计信息收集无关的其它用途,您可以继续使用 ANALYZE 语句:

  • 使用 VALIDATE 或 LIST CHAINED ROWS 子句
  • 收集空闲列表块的信息

 

手动统计信息收集:因素

  • 监控 DML 的对象。
  • 确定正确的样本大小。
  • 确定并行度。
  • 确定是否应使用直方图。
  • 确定索引的级联影响。
  • 在 DBMS_STATS 中使用的过程:

–GATHER_INDEX_STATS

–GATHER_TABLE_STATS

–GATHER_SCHEMA_STATS

–GATHER_DICTIONARY_STATS

–GATHER_DATABASE_STATS

–GATHER_SYSTEM_STATS

 

手动收集优化程序统计信息时,必须特别注意下列因素:

  • 监控成批数据操纵语言 (DML) 操作的对象,必要时收集统计信息
  • 确定正确的样本大小
  • 确定并行度以加快对大型对象的查询速度
  • 确定是否对包含有偏差数据的列创建直方图
  • 确定对象的更改是否级联到任何从属索引

 

管理统计信息收集:示例

 

 

dbms_stats.gather_table_stats 
('sh'              -- schema 
,'customers'       -- table 
, null             -- partition 
, 20               -- sample size(%) 
, false            -- block sample? 
,'for all columns' -- column spec 
, 4                -- degree of parallelism 
,'default'       -- granularity  
, true );          -- cascade to indexes 


dbms_stats.set_param('CASCADE',                  'DBMS_STATS.AUTO_CASCADE'); 
dbms_stats.set_param('ESTIMATE_PERCENT','5'); 
dbms_stats.set_param('DEGREE','NULL');  


第一个示例使用 DBMS_STATS 程序包收集 SH 方案的 CUSTOMERS 表的统计信息。它使用前面幻灯片中讨论的某些选项。

设置参数默认值

可以使用 DBMS_STATS 中的 SET_PARAM 过程为所有 DBMS_STATS 过程的参数设置默认值。幻灯片中的第二个示例演示了这种用法。也可以使用 GET_PARAM 函数获取参数的当前默认值。

注:只有表是分区表时,才需要考虑要收集的统计信息的粒度。此参数决定应在哪一级别收集统计信息。级别可以是分区、子分区或表。

 

优化程序动态采样:概览

 

  • 对于符合以下特征的表和索引,可以执行动态采样:

–没有统计信息

–其统计信息不可信

  • 在评估时用于确定更准确的统计信息:

–表基数

–谓词选择性

  • 此功能由以下项控制:

–OPTIMIZER_DYNAMIC_SAMPLING 参数

–OPTIMIZER_FEATURES_ENABLE 参数

–DYNAMIC_SAMPLING 提示

–DYNAMIC_SAMPLING_EST_CDN 提示

 

动态采样可确定更准确的选择性和基数估计值,这样优化程序便可生成更有效的执行计划,因而提高了服务器性能。例如,虽然建议您收集所有表的统计信息以供 CBO 使用,但您可能不会收集临时表和用于临时数据处理的工作表的统计信息。在此类情况下,CBO 通过一个简单算法提供一个值,这可能会导致不太理想的执行计划。可以使用动态采样完成下列任务:

  • 当收集到的统计信息无法使用或可能会导致重大估计错误时,估计单表的谓词选择性
  • 为没有统计信息的表和相关索引,或者其统计信息太旧已不再可信的表估计表基数

可以使用 OPTIMIZER_DYNAMIC_SAMPLING 初始化参数控制动态采样。可使用 DYNAMIC_SAMPLING 和 DYNAMIC_SAMPLING_EST_CDN 提示进一步控制动态采样。

注:如果设置为 9.2 之前的版本,OPTIMIZER_FEATURES_ENABLE 初始化参数将关闭动态采样。

 

优化程序动态采样的工作方式

  • 采样在编译时完成。
  • 如果查询受益于动态采样:

–执行递归 SQL 语句对数据进行采样

–被采样的块数量取决于 OPTIMIZER_DYNAMIC_SAMPLING 初始化参数

  • 在动态采样期间,将对样本应用谓词,以确定选择性。
  • 在以下情况下使用动态采样:

–采样时间只占执行时间的一小部分

–查询被执行多次

–您认为会找到更好的计划

 

主要的性能属性是编译时间。系统在编译时将确定查询是否会从动态采样受益。如果能从动态采样受益,则发出递归 SQL 语句扫描表块的一个小型随机样本,并应用相关的单个表谓词估计谓词选择性。

动态采样查询会读取一定数量的块,具体数量取决于 OPTIMIZER_DYNAMIC_SAMPLING 初始化参数的值。

对于通常可快速完成的查询(在不到几秒钟的时间内即可完成),您不需要费力地去执行动态采样。但是,动态采样在下列任一条件下是有益的:

  • 使用动态采样可找到更好的计划。
  • 采样时间只占查询总执行时间的一小部分。
  • 查询被执行多次。

注:动态采样可以应用于单个表的谓词子集,并可与未执行动态采样的谓词标准选择性估计值组合在一起。

 

OPTIMIZER_DYNAMIC_SAMPLING

 

  • 动态会话或系统参数
  • 可以设置为 0 到 10 之间的值
  • 值为 0 时会关闭动态采样
  • 值为 1 时对所有未分析的表进行采样,前提是未分析的表满足下列条件:

–联接至另一个表,或出现在子查询或不可合并的视图中

–没有索引

–包含的块超过 32 个

  • 值为 2 时对所有未分析的表进行采样
  • 值越高,就越积极地应用采样
  • 如果没有更新活动,动态采样可重复进行

可通过将 OPTIMIZER_DYNAMIC_SAMPLING 参数设置为 0 到 10 之间的值来控制动态采样。值为 0 时表示不执行动态采样。

值为 1(默认值)时表示对所有满足下列条件的未分析的表执行动态采样:

  • 查询中至少有一个未分析的表。
  • 此未分析的表联接至另一个表,或出现在子查询或不可合并的视图中。
  • 此未分析的表没有索引。
  • 此未分析的表包含的块数多于对此表进行动态采样可使用的默认块数。此默认数量
    是 32。

如果 OPTIMIZER_FEATURES_ENABLE 设置为 10.0.0 或更高,则默认值为 2。在此级别,系统会对所有未分析的表应用动态采样。采样的块数量是动态采样的默认块数量 (32) 的两倍。

提高该参数值会导致更积极地应用动态采样,这表现在采样的表类型(分析或未分析)以及在采样上花费的 I/O 量这两方面。

注:如果自上次采样操作后没有在进行采样的表中插入、删除或更新任何行,则动态采样可重复进行。

 

锁定统计信息

 

  • 防止自动收集
  • 主要用于易失表:

–不带统计信息锁定意味着要进行动态抽样。

BEGIN 

  DBMS_STATS.DELETE_TABLE_STATS(‘OE’,’ORDERS’); 

  DBMS_STATS.LOCK_TABLE_STATS(‘OE’,’ORDERS’);

END;

 

 

–带统计信息锁定可获得典型值。

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(‘OE’,’ORDERS’);
  DBMS_STATS.LOCK_TABLE_STATS(‘OE’,’ORDERS’);
END;

  • FORCE 参数可覆盖统计信息锁定。

SELECT stattype_locked FROM dba_tab_statistics;

 

自 Oracle Database 10g 开始,您可以使用 DBMS_STATS 程序包的 LOCK_TABLE_STATS 过程锁定指定表的统计信息。可以锁定没有统计信息的表的统计信息,或使用 DELETE_*_STATS 过程将其设置为 NULL,以防止自动收集统计信息,这样便可以对没有统计信息的易失表使用动态采样。易失表填满时,可以锁定该表的统计信息,这样该表的统计信息就会成为具有代表性的表填充。

也可以通过使用 LOCK_SCHEMA_STATS 过程在方案级别锁定统计信息。可以查询 {USER | ALL | DBA}_TAB_STATISTICS 视图中的 STATTYPE_LOCKED 列,以确定表的统计信息是否已锁定。

可以使用 UNLOCK_TABLE_STATS 过程取消对指定表统计信息的锁定。

即使统计信息处于锁定状态,也可以将 FORCE 参数的值设置为 TRUE 来覆盖它们。FORCE 参数在下列 DBMS_STATS 过程中:DELETE_*_STATS、IMPORT_*_STATS、RESTORE_*_STATS 和 SET_*_STATS。

注:锁定表的统计信息后,所有从属统计信息都被认为处于锁定状态。这包括表统计信息、列统计信息、直方图和从属索引统计信息。

 

 

Oracle 用户组年轻专家项目

Oracle 用户组汇聚了最活跃的 Oracle 忠实用户。为了更紧密和 Oracle 用户组合作,Oracle 认证团队将支持 Oracle 用户组年轻专家项目。

Oracle 用户组年轻专家项目旨在鼓励用户组成员学习和分享 Oracle 技术,并成为 Oracle 认证的技术专家。为此,Oracle 认证团队将在中国发放数量有限的免费考试券给符合条件的用户组候选人。这些考试券将可以用于 Oracle 认证考试包括 Beta 考试。

了解更多关于 Oracle 认证的信息,请参考 Oracle 认证网站

本次活动面向 ACOUGSHOUG 的用户组成员开放。有意参加者请联系 ACOUG 的仇实 (marshall@acoug.org) 和 SHOUG 的胡章扬 (hzy@shoug.info)。

如何获取免费优惠券

 

用户组成员参与本项目并获取免费考试券必须满足以下条件:

1. 是 ACOUG 或 SHOUG 的活跃会员

2. 符合下列条件之一:

  • 发布博客或撰写关于 Oracle 数据库技术的文章(需要提供文章主题和链接)。
  • 在社交媒体发布的有关 Oracle 公司数据库技术的信息,被甲骨文中国的新浪微博或微信引用或转发(需要提供截图或链接)。
  • 在各种技术活动中发表 Oracle 数据库技术的演讲(需要提供演讲主题和幻灯片的链接)。

请注意:

  • 发放的免费考试券总数是 60 张。免费考试券发放完毕则项目结束。
  • 考试券不可转让,仅限获得批准的年轻专家本人使用。
  • 候选人在博客、微博或微信上发布内容或发表演讲的时间须在以下时间段:2014 年 12 月至 2015 年 5 月 31 日。
  • 鼓励发表数据库选件 (DBO) 相关的内容。
  • 候选人可以用于除了 Oracle Database Administrator Master 考试之外的任何考试。
  • 关于如何向 OTN 投稿,请参见在 Oracle 技术网上发表技术文章

用户组年轻专家列表

 

详细信息,敬请期待。

非常感谢您抽出宝贵时间来参与本项目。如有任何问题,请联系蒋健 (jim.jiang@oracle.com)。

ORAchk 用户使用手册 orachk Oracle配置审计工具

目的

 

本文件为用户提供了ORAchk(Oracle配置审计工具)运行和维护的信息。该工具的目的是在Oracle系统中的审计各种重要的配置设置。

注:在2.2.4版本中RACcheck已更名为ORAchk以反映其检查Oracle越来越多产品的健康的不断扩展的作用。请参考RACcheck配置审计工具的声明更名为ORAchk(文件编号1591208.1,了解更多详细信息。版本12.1.0.2.3将是raccheck脚本与ORAchk一起发行的最后一个版本。客户应该转化过来,使用任何自动化或环境配置中的orachk脚本。

 

在以下分类中工具审计配置的设置:

  1. OS内核参数
  2. OS包
  3. 许多其他OS配置设置
  4. CRS/Grid Infrastructure
  5. RDBMS
  6. ASM
  7. 数据库参数和配置设置
  8. 为目标版本2.0.3及以上升级准备评估

 

范围

 

ORAchk健康评估工具的范围是Oracle数据库服务器,Grid Infrastructure,Oracle数据库,硬件,操作系统和RAC软件。从ORAchk2.2.0开始,ORAchk功能扩展到Oracle单实例数据库,Oracle Restrat System以及RAC单节点配置

 

支持的平台

 

现在,该工具受以下UNIX平台支持:

  • Intel Linux* (Oracle Linux/RedHat 5, 6, 7 and SuSE 9,10, 11, 12)
  • Linux on System Z (RedHat 6, 7 and SuSE 12)
  • Oracle Solaris SPARC (Solaris 10 and 11)
  • Oracle Solaris x86-64 (Solaris 10 and 11)
  • AIX **
  • HPUX**
  • MS Windows (2008 and 2012)***

*对Linux Itanium没有计划支持

 

* 32位平台只通过命令“./orachk-ebs32bit”受32位EBS环境支持

**需要bash shell3.2或更高版本要安装在系统

***需要Cygwin(详情见附录O)

 

 

 

支持的数据库版本

 

现在,该工具受以下数据库版本支持:

  • 10gR2
  • 11gR1
  • 11gR2
  • 12cR1

 

组件

 

该工具包含一个脚本和两个驱动文件(以及其他一些文件)。

  1. orachk (以及向后兼容性的raccheck)
  2. dat
  3. dat

 

功能

 

  1. ORAchk是非侵入的且不会改变环境中的任何东西,除非详情如下:
  • 假设SSH用户等效性的RDBMS软件所有者将所有被审计,以便它在遥控器上执行命令的数据库服务器中配置的 – 数据库服务器节点。如果工具确定该用户等效不成立,将提供给暂时或永久设置它在用户的选项。如果用户选择临时设置SSH用户等效那么脚本会做这样的工具执行的时间,但是,它可以将系统恢复到它发现SSH用户等效原来的状态。对于那些希望配置SSH用户等效性的工具外(如果尚未配置),请参阅My Oracle Support说明:1。

注:SSH用户等效只对于为支持集群运行Grid Infrastructure的这些系统是必须的, 这对单实例数据库或Oracle重启配置不是必需的。

–  ORAchk创建许多小的输出文件到有需要进行评估的数据被采集

–  ORAchk动态创建并执行一些脚本来完成一些数据收集

–  ORAchk在本身后清理创建的,且不需要作为集合的一部分的任何临时文件。

 

  1. ORAchk询问系统以确定Oracle栈组件的状态(即,Grid Infrastructure,RDBMS,RAC等)以及它们是否被安装且/或运行。根据每个组件的状态,该工具运行适当的计划和审计检查。如果由于本地环境的配置,工具无法正确地确定所需的环境信息,请参阅故障排除部分。

 

  1. 监视的守护程序 – ORAchk自动在后台运行监视命令执行进展情况的守护程序。如果由于某种原因,该工具运行的其中一个命令应挂起或需要比预期更长的时间,该监视守护程序会在可配置的超时后杀掉挂起命令,以便主要的执行能进行。如果出现这种情况,那么集合或被挂起的命令被跳过,且在最后的输出报告中会有标记。如果默认的超时时间太短,请参阅有关RAT_TIMEOUT,并RAT_ROOT_TIMEOUT参数调整的故障排除部分。

 

  1. 如果ORAchk的驱动程序文件都超过90天,那驱动程序文件被认为是“陈旧”,并且脚本会告知用户这些文件。该工具及其驱动程序文件(套件)的新版本必须从My Oracle Support Note: 1268927.1中获得。

 

  1. 当ORAchk完成收集并分析它而产生了一个详细的HTML格式的报告,同时生成了一个输出.zip文件。此输出.zip文件可提供给Oracle Support,以便在SR需要被记录时作进一步分析。详细的报告将包含优势/影响,风险和行为/修复信息。在许多情况下,它也将参考公共文件,包含问题相关的其他信息,以及如何解决它。

 

  1. 审计检查的结果可以选择上传到数据库表用于报告。下面有这个问题的更多细节。

 

  1. 在某些情况下,客户可能希望在共享文件系统上对ORAchk暂存,以便它可以从各种系统进行访问,但保持在单一的位置,而不是被复制到每个可以用到的集群上。该工具的默认行为是在工具被暂存的位置创建一个子目录及其输出文件。如果暂存区域是一个只读文件系统,或者如果出于任何原因,用户想要在别处创建输出,那就有可用于这一目的环境变量。RAT_OUTPUT参数可被设置为任何有效的可写位置且输出将在那里被创建。

 

使用注意事项

 

  • 默认的临时工作目录位置是启动ORAchk的用户ID的主目录。例如,如果“oracle”用户ID被用于启动ORAchk且“oracle”用户ID的主目录为“/home/oracle”,那么默认的临时工作

目录位于“/home/oracle”。有可能在执行ORAchk之前,通过设置“RAT_TMPDIR”环境变量(如export RAT_TMPDIR=/ tmp)来改变默认位置。

 

:如果你在使用root的SUDO权限(见附录M),你想改变默认的临时工作目录位置,必须在“/ etc/ sudoers” 文件中体现你选择的位置。在这种配置下,在个服务器的“/ etc/ sudoers” 文件必须包含以下行:

oracle ALL=(root) NOPASSWD:/tmp/root_exachk.sh

 

  • 建议暂存工具包并在单个数据库的本地文件系统操作以获得性能最优。

 

  • 为了获得最大效用,当Grid Infrastructure和至少一个数据库启动和运行时执行ORAchk。

 

  • 尽管ORAchk是影响最小的工具,但在系统上的负载达到最小时执行它是最佳做法。

 

  • 为了避免在网络连接的工作站或笔记本电脑上的终端会话运行工具可能出现的问题,考虑在运行使用VNC,这样如果有一个网络中断,工具将继续处理并完成。

 

  • 如果工具由于某种原因应执行失败,它可以从开始被重新运行,但该工具从故障点“不可恢复”。

 

  • 在2.2.1版本中,ORAchk有在所有节点上并行执行的能力。为了利用ROOT专项检查的优势,同时仍然允许并行执行,你要在安装系统上EXPECT工具或配置SUDO供ORAchk使用,在附录M有描述。

 

  • 从ORAchk版本2.2.5开始,数据库集合开始并行执行。要选择数据库集合slave进程的非默认的最大数量(默认为自动计算),使用-dbparallel [n]。例如,要将默认计算的值更改为30,你要执行“./orachk -dbparallel 30”。如果由于某种原因,你想禁用并行的数据库集合,使用-dbserial选项。

:并行度越高,资源被消耗越多,但所用的时间被减少。除了能将并行slave的数量设置高于默认值,还可以将并行slave的数量设置低于默认值。这些做法是有原因的。例如,在整个系统被维护并启动后,在实际的用户被允许登陆系统之前,你可能需要使用大量的并行slave完成ORAchk,越快越好。再比如,在一个繁忙的生产系统中,可以使用比默认值更少的数目,但比以串行方式运行更多,以更快地运行,又对运行系统产生较少的影响。

 

  • 从12.1.0.2.1开始,有可用于ORAchk的两种基本执行模型
  • 以“root”用户ID执行- 在这种模式下,“root”用户ID用来启动一个完整的ORAchk运行。以“root”用户ID运行的ORAchk过程将使用“su”命令作为RDBMS或grid home权限的较低的所有者之一来执行命令。较低的权限帐户不会有提升权限以执行“root”级检查的能力。这种方法在角色分离的环境,或有更严格的安全模型的环境有优势。

 

  • 作为RDBMS home所有者执行 – 在此方法中,ORAchk从RDBMS或Grid home所有者用户ID启动。启动ORAchk 的用户ID必须有提高“root”用户ID的权限的能力来运行“root”级检查。这可以通过提供的“root”用户ID的密码,设置“sudo”(如附录中描述),或无密码的SSH连接来完成。这意味着一个较低的权限帐户必须设置为能够切换到“root”用户ID。该方法可能需要在角色分离环境中的多次运行,且更严格的安全要求可能不允许提高权限。

 

什么时候运行ORAchk

  1. 初始Oracle RAC部署之后
  2. 在计划的系统维护之前
  3. 在计划的系统维护之后
  4. 每3个月至少一次

 

使用

 

如果安装了Oracle软件,仅作为Oracle RDBMS软件所有者(oracle)在数据库服务器上运行该工具。

该工具可以使用下列参数运行:

 

 

 

 

Compare two different Exalogic rack and see if both are from the same release.Pass directory name or zip file as

<Exalogic collection1> & <Exalogic collection2>(applicable for Exalogic only)

 

-merge [-force]

Pass comma separated collection names(directory or zip files) to merge collections and prepare single report. eg:- ./orachk -merge orachk_hostname1_db1_120213_163405.zip,orachk_hostname2_db2_120213_164826.zip

 

 

-force

 

Merge collections from dom0 and domu or global and local zones.

eg:- ./orachk -merge orachk_hostname1_db1_120213_163405.zip,orachk_hostname2_db2_120213_164826.zip -force

 

 

-tag <tagname>

Appends <tagname> to Report Name. <Tagname> must contain only alphanumeric characters. for eg: ./orachk -tag newtag123 will append ‘newtag123’ to report name like

‘orachk_hostname1_db1_100914_123456_newtag123.html’

 

 

Auto Restart Options:

-auto_restart -h: Prints help for this option

-<initsetup|initrmsetup|initcheck|initpresetup>

initsetup      : Setup auto restart. Auto restart functionality automatically brings up orachk daemon when node starts initrmsetup : Remove auto restart functionality

initcheck      : Check if auto restart functionality is setup or not

initpresetup   : Sets root user equivalency for COMPUTE, STORAGE and IBSWITCHES.(root equivalency for COMPUTE nodes is mandatory for setting up auto restart functionality)

 

 

 

Daemon Options:

 

 

-d <start|start_debug|stop|status|info|stop_client|nextautorun|-h> start              : Start the orachk daemon start_debug      : Start the orachk daemon in debug mode stop             : Stop the orachk daemon

status                : Check if the orachk daemon is running

info                  : Print information about running orachk daemon

stop_client           : Stop the orachk daemon client

 

 

 

 

schedule ID

nextautorun [-id <ID>]  : print the next auto run time

if ‘-id <ID>’ is specified, it will print the next auto run time for specified autorun

 

 

-h                      : Prints help for this option

 

-daemon

run orachk only if daemon is running

-nodaemon

Do not use daemon to run orachk [-id <ID>] -set

configure orachk daemon parameter like ‘param1=value1;param2=value2… ‘

if ‘-id <ID>’ is specified, it will configure orachk daemon parameter(s) for specified autorun schedule ID Supported parameters are:-

(Deprecated) – AUTORUN_INTERVAL <n[d|h]> :- Automatic rerun interval in daemon mode.Set it zero to disable automatic rerun which is zero.

 

 

AUTORUN_SCHEDULE * * * *     :- Automatic run at specific time in daemon mode. AUTORUN_INTERVAL will be ignored when AUTORUN_SCHEDULE is used.

– – – –

? ? ? ?

? ? ? +—– day of week (0 – 6) (0 to 6 are Sunday to Saturday)

? ? +———- month (1 – 12)

? +————— day of month (1 – 31)

+——————– hour (0 – 23)

 

example: orachk -set ‘AUTORUN_SCHEDULE=8,20 * * 2,5’ will schedule runs on Tuesday and Friday at 8 and 20 hour.

 

AUTORUN_FLAGS <flags> : orachk flags to use for auto runs.

 

example: orachk -set ‘AUTORUN_INTERVAL=12h;AUTORUN_FLAGS=-profile sysadmin’ to run sysadmin profile every 12 hours orachk -set ‘AUTORUN_INTERVAL=2d;AUTORUN_FLAGS=-profile dba’ to run dba profile once every 2 days.

NOTIFICATION_EMAIL : Comma separated list of email addresses used for notifications by daemon if mail server is

configured.

 

PASSWORD_CHECK_INTERVAL <number of hours> : Interval to verify passwords in daemon mode

COLLECTION_RETENTION <number of days> : Purge orachk collection directories and zip files older than specified days. [-id <ID>] -unset <parameter | all>

unset the parameter

if ‘-id <ID>’ is specified, it will unset the parameter for specified autorun schedule ID example: orachk -unset AUTORUN_SCHEDULE

 

[-id <ID>] -get <parameter | all> Print the value of parameter.

if ‘-id <ID>’ is specified,  it will print the value of parameter for specified autorun schedule ID

 

-vmguest

Pass comma separated filenames containing exalogic guest VM list(applicable for Exalogic only)

 

 

-hybrid [-phy]

phy      :Pass comma separated physical compute nodes(applicable for Exalogic only) eg:- ./orachk -hybrid -phy phy_node1,phy_node2

 

 

Profile Run Options:

-profile

Pass specific profile. With -h prints help.

List of supported profiles:

 

 

-excludeprofile

Pass specific profile.

List of supported profiles is same as for -profile.

 

 

-check

To execute specific set of checks, pass check_ids at command prompt With -h prints help.

 

 

-excludecheck

To exclude specific set of checks, pass check_ids at command prompt With -h prints help.

 

 

acchk options:

  • -acchk

Env variables to be set: RAT_AC_ASMJAR=path to asm-all-5.0.3.jar RAT_JAVA_HOME=path to jdk8

RAT_AC_JARDIR=Directory where jar files are present for concrete class RAT_AC_TRCDIR=Directory where trace files are present for coverage class

Runs acchk. Expects env variables to be set

  • Run orachk without any

If the above env variables are set, orachk can be run without any parameter to run acchk.

  • Passing values in command line instead of env

./orachk -acchk -javahome <path to jdk8> -asmhome <path to asm-all-5.0.3.jar > -appjar <directory where jar files are present for concrete class > -apptrc <directory where trace files are present for coverage class>

 

Optional variable RAT_ACTRACEFILE_WINDOW variable can be set to <number of days> . Based on this value, files older than the RAT_ACTRACEFILE_WINDOW days are ignored.

 

With -h prints help.

 

-cells

Pass comma separated storage server names to run orachk only on selected storage servers.

 

-ibswitches

Pass comma separated infiniband switch names to run orachk only on selected infiniband switches.

 

-zfsnodes

Pass comma separated ZFS storage appliance names to run orachk only on selected storage appliances.

-zfssa

Pass comma separated ZFS storage appliance names to run orachk.

 

-dbserial

Run SQL, SQL_COLLECT and OS Checks in serial

 

-dbparallel [n]

Run SQL, SQL_COLLECT and OS Checks in parallel.

n       : Specified number of Child processes. Default is 25% of CPUs.

 

Identity Management Options:

-idm -h: Prints help for Identity Management

– [<idmpreinstall|idmpostinstall|idmruntime|idmdbpreinstall|idmdbpostinstall|idmdbruntime>] [-idm_config <IDMCONFIG>] [- idmdiscargs <IDMDISCARGS>] [-idmhcargs <IDMHCARGS>]

idmpreinstall         : Run all preinstall checks on Identity Management System idmpostinstall   : Run all postinstall checks on Identity Management System idmruntime       : Run all runtime checks on Identity Management System idmdbpreinstall : Run preinstall database checks on Identity Management System idmpdbostinstall: Run postinstall database checks on Identity Management System idmdbruntime        : Run runtime database checks on Identity Management System idm_config : Pass OAM, OIM and one of the OUD host from clusters.

idmdiscargs    : Pass arguments to Identity Management Discovery Tool. idmhcargs : Pass arguments to Identity Management Healthcheck Tool.

 

example    :

 

Run preinstall checks

orachk -idmpreinstall -idm_config “OUD_HOST=h1,h2;OIM_HOST=h3,h4;OAM_HOST=h5,h6,h7;OHS_HOST=h8,h9”

 

Run preinstall database checks orachk -idmdbpreinstall

 

Run postinstall checks on single node Identity Management setup orachk -idmpostinstall -idm_config “singlenode”

 

Run runtime checks on multinode Identity Management setup

orachk -idmruntime -idm_config “OUD_HOST=host1,host2;OAM_HOST=host3;OIM_HOST=host4”

 

Run OIM runtime checks on multinode Identity Management setup

orachk -idmruntime -idm_config “OUD_HOST=host1,host2;OAM_HOST=host3;OIM_HOST=host4” -profile “OIM”

 

Run OIM & OAM postinstall checks on single node Identity Management setup orachk -idmpostinstall -idm_config “singlenode” -profile “OIM,OAM”

 

 

细粒度检查控制

 

从版本12.1.0.2.5开始,细粒度检查控制语法就出现了。这些控件可以被用于限制检查并向一个或多个检查报告。以类似的方式,一个或多个检查可以被排除,而无需创建一个排除文件。

 

要将报告限制到一个或多个特定检查,通过单击在报告总结部分,靠近报告上方的“Show Check Ids” 的链接,check_ids可以从ORAchk html报告获得。

 

./orachk –check <check_id1> <check_id2> Similarly to exclude one or more checks

./orachk –exclude_check <check_id1> <check_id2>

 

缓存和重新使用发现信息

 

从12.1.0.2.5版本开始,缓存数据库信息的支持被增加。此功能是一种性能优化设计,用于减少运行时间。如果环境数据库配置是稳定的,不会经常变化,那么数据库的信息可以被缓存,使得ORAchk不必每次动态运行来获得信息。命令行语法如下:

 

./orachk –create_cache

./orachk –use_cache

./orachk –refresh_cache

 

-create_cache可以在守护进程模式启动时指定。 -use_cache可用于后续的守护程序客户端运行。如有在系统上的数据库阵容的更改,-应使用refresh_cache,例如,增加了新的数据库或数据库被删除。

 

 

运行ORAchk指南

  1. 如果oracle用户在系统上存在,且所有的Oracle组件被安装或运行(CRS,RDBMS,ASM),建议运行ORAchk作为oracle(或RDBMS软件安装)用户。该工具将需要执行一些需要root权限的集合,在这种情况下,它会显示以下输出(或类似):

 

 

:     建议以数据库软件所有者(如oracle)运行该工具。用户可能以Grid Infrastructure软件所有者(如grid)运行该工具,它会收集相同的数据,但数据库凭据必须手动提供以执行数据库相关的审计检查。通常情况下,当以oracle运行时,客户会有为Oracle数据库软件所有者设置的OS验证,且不再需要数据库的登录认证。如果集群和数据库被安装并运行,最好以oracle(或拥有oracle数据库软件安装的任何用户)运行此工具。如果由于某种原因,你要以其他用户运行工具,参考在故障排除部分的验证数据库认证,了解在运行该工具前如何验证数据库认证的其他信息。

 

 

  1. 用户只能使用由工具包分配的驱动程序文件,且驱动程序文件不应被手动编辑。该工具的新版本需要新的驱动程序文件。

 

 

如何交互运行 ORAchk

 

  1. Oracle RDBMS 软件安装所有者(如果安装了Oracle产品,否则以root登录) 登录到系统 – 详情参见使用注意事项

 

  1. 将正确的zip 包暂存到它自己的目录,节点在工具将被执行的位置

 

  1. 解压zip包,将脚本和驱动程序文件留在同一个目录下

 

  1. 验证orachk的权限是755(-rwxr-xr-x)。如果权限当前没有设置为755,将orachk的权限设置为如下:

 

  1. 调用工具,如下:

 

在阅读和理解所有的消息时按照提示操作。ORAchk的Q&A过程将类似于下图所示:

 

Note: If you chose option 1, to provide root password when prompted, you will be prompted once for each node during the data collection phase for the nodes (unless the EXPECT utility is installed, in which case you will only be prompted once). If you do not enter the root password in a timely way (within RACCHECK_TIMEOUT) then the root privileged collections and audit checks for that node will be skipped.

 

Starting with ORAchk 2.2.2, the sysadmin profile may be run independently as the root user allowing for the root checks to be performed independently of the non-root checks (./orachk -profile sysadmin).

 

  1. 完成后,如下(或类似的)将被显示:

 

 

  1. 此时你可以查看以上输出中显示的HTML报告。如果ORAchk有被推荐为解决方案一部分的动态SR,上传orachk_ *.zip包到该SR。

 

 

如何静默运行ORAchk

:     只有当客户不需要使用orachk守护功能时才需要进行以下配置。参见“ORAchk守护模式操作”一节,了解orachk守护进程的更多细节。

 

 

ORAchk可以选择在“静默”或“非交互”模式运行来启用调度和自动控制。在静默模式执行ORAchk必须要满足一些特定条件。出于这个原因,本节被分成几个小节,ORAchk静默条件和静默运行ORAchk。

 

前提条件

 

  1. 为了静默执行ORAchk,SSH用户等效性是强制性的。这就是说,你必须为系统之间的RDBMS软件所有者(如oracle)配置SSH用户等效性,用于ORAchk和其他所有集群节点的实际执行。有关配置用户等效说明,请参阅My Oracle Support Note: 372795.1。配置完成后,通过执行以下命令,用适当的远程群集节点替换“<dbServerName>”来验证作为RDBMS软件所有者(如oracle)的SSH用户等效性配置的正确配置:

 

If the result of the above command is similar to “Permission denied (publickey,gssapi-with- mic,password)” then the SSH user equivalence is not properly configured. Consult My Oracle Support Note: 372795.1 for details on configuring SSH user equivalence. 如果上述命令的结果与“权限被拒绝(公钥,gssapi-with- mic,password)”类似,那么SSH用户等效性没有正确配置。参见My Oracle SupportNote: 372795.1 ,了解配置SSH用户等效性的详情。

 

注:       SSH用户等效仅对于运行Grid Infrastructure来支持集群的这些系统是必须的,对于单实例数据库或Oracle重新启动配置来说不需要。

 

  1. 如之前提到的,为了利用ORAchk的完整功能的优势,需要root权限来运行root特定检查。为了便于在静默模式下的这些检查,我们必须配置无密码的SUDO和利用-s选项(之后会更详细)来执行ORAchk。有关配置SUDO用于ORAchk的教程参见附录M。

: 如果sudo在你的环境中不允许,这一步可以省略。在这种情况下,你仍然可以使用-S选项(之后会更详细)静默执行ORAchk而无需root特定检查。消除root特定检查会限制ORAchk的功能,所以不是建议执行ORAchk的方法。

 

 

静默/非交互运行ORAchk

 

  1. 以Oracle RDBMS软件安装所有者(如果安装了Oracle的产品,否则以root身份登录)登录到系统 — 参阅使用注意事项的详细信息。

 

  1. 将正确的zip 包暂存到它自己的目录,节点在工具将被执行的位置

 

  1. 解压zip包,将脚本和驱动程序文件留在同一个目录下

 

  1. 验证orachk的权限是755(-rwxr-xr-x)。如果权限当前没有设置为755,将orachk的权限设置为如下:

 

  1. 要静默运行ORAchk ,你需要根据配置指定以下参数之一:

-s – 当Oracle用户可以无需密码,SUDO来root时,无人参与模式执行

-S – 无需root密码和root权限集合/审计, 无人参与模式执行

 

注:    强烈建议执行无密码SUDO来为/$HOME/root_orachk.sh root以获得ORAchk工具的全部功能。请参阅附录M了解如何为ORAchk配置SUDO的细节。

 

假设SUDO已经被正确配置,ORAchk(见附录M)现在可以被静默执行如下:

 

:  如果SUDO尚未配置,必须指定-S选项代替-s选项。

 

根据ORAchk从集群拉出的信息,ORAchk现在会在静默模式下执行。在静默模式下,在本地节点上运行的被定义为集群资源的所有数据库都会执行采集数据和审计检查。

 

  1. 完成后,以下(或类似)ORAchk输出可供查看:

 

:     如果ORAchk有被推荐为解决方案一部分的动态SR,将由工具最近运行产生的orachk_ *.zip上传到SR。

 

 

ORAchk守护模式操作

交互启动ORAchk 守护模式

 

ORAchk 2.2.2版本引入了守护进程的功能,允许在一定间隔内的非交互式(批处理或静默模式)执行。

 

注:  当在守护进程模式运行ORAchk,最近和下一个最新的(如果有的话)集合报告被自动对比。如果NOTIFICATION_EMAIL地址被配置,一个摘要及报告的附件和对比报告将通过电子邮件被发送。

 

在守护模式下运行 ORAchk之前,建议自定义守护参数(使用- set 标识):

 

  • AUTORUN_INTERVAL – 定义了ORAchk将被执行的时间间隔,具体为天或小时数((<d|h>)。
  • PASSWORD_CHECK_INTERVAL – 定义了当守护进程启动时,运行的守护进程验证输入密码的频率(以小时为单位)。如果一个无效的密码被发现(由于密码更改),守护程序将停止,通知将通过守护程序日志(log)和电子邮件提供(如果已配置)。
  • NOTIFICATION_EMAIL – 允许ORAchk守护进程的邮件通知。可以设置多个邮箱,用逗号分隔。
  • AUTORUN_FLAGS – 允许ORAchk自动运行的执行参数的设置 。可用参数在本文的使用章节中列出。
  • COLLECTION_RETENTION:- 如果由orachk守护程序创建的文件比collection_retention 数更早几天,通过执行定期的orachk可以清除这些文件。
  • INFO:- orachk –d info 命令会显示关于orachk守护进程的信息,例如,它从哪里从何时开始运行等。
  • STOP_CLIENT:- 当你停止orachk守护程序,而一个orachk客户端仍在运行,orachk守护进程也将继续运行。使用带有-d标志的stop_client选项能停止当前在进行的客户端,然后停止orachk守护程序,使用户不必等到客户端运行结束。

 

 

将每个参数填入以分号分隔的列表,使多个参数可以在单一执行中被设置。要设置守护程序每天运行,在详细模式下,为守护进程通知指定电子邮件地址并每小时检查更改的密码,作为将启动守护模式下的ORAchk(全部在一行)的用户ID,执行以下命令:

 

 

要查看当前ORAchk守护值,作为启动守护进程的用户ID,执行“./ORAchk – get <parameter_name> | all”:

 

ORAchk 2.2.3版本引入了在特定时间运行ORAchk的能力,使用“AUTORUN_SCHEDULE”功能。在此关键字后,预计有四个字段。首先是一天中的小时,0-23为有效值。第二个是一个月的天,1-31为有效值。三是月,以1-12为有效值。第四是一周中的某一天,以0-6为有效值。该字段可以是单个值或逗号分隔。例如,要设置ORAchk守护进程在每月的周二的15,16,17小时运行:

 

该参数也能在ORAchk守护进程启动后被设置或更改。

 

注: 强烈建议将NOTIFICATION_EMAIL 和PASSWORD_CHECK_INTERVAL 配置为最小值。

 

在正确ORAchk后,守护进程参数被设置来配置守护进程,启动ORAchk守护进程:

 

ORAchk将显示标准的交互式图形用户界面来收集所需信息并启动守护进程。当输入收集过程完成后,你会看到类似的输出:

 

ORAchk守护进程的当前状态可以通过执行以下来查看:

 

通过执行以下,ORAchk守护进程能在任何时间停止:

 

一旦ORAchk守护进程正在运行,ORAchk会自动按照指定的AUTORUN_INTERVAL运行。接下来的收集时间可以从守护进程查询,如下所示:

 

 

ORAchk也可以通过守护程序按需(用户初始的)执行,只要执行不带任何参数的 “orachk”,作为从该ORAchk守护进程启动的同一目录启动该守护进程的用户。这个执行是非交互式的(守护进程将参数发生到所有提示符),但会在屏幕上显示类似标准执行的输出:

 

:     如果你的ORAchk守护进程在运行,你想在标准的交互模式下执行ORAchk,可以指定“-nodaemon”标识。

 

由给定用户启动的ORAchk守护程序无法被不同的用户使用来运行ORAchk,比如,如果用户1启动守护进程,那用户2不能使用ORAchk守护进程在非交互模式下运行ORAchk。其实,要使用ORAchk守护程序,你必须是相同的用户,必须在启动守护进程的同一个目录下按需启动运行。

 

一旦ORAchk守护进程被启动,它将继续在后台运行,直到守护进程的显示停止(orachk –d stop)或发生以下任何一个条件:

 

    在该守护程序运行的服务器被重启或发生故障。

    如果密码在任何节点上被更改,守护进程将停止,一个条目将被添加到ORAchk_daemon.log,同时被发送电子邮件至NOTIFICATION_EMAIL。PASSWORD_CHECK_INTERVAL参数可以调整,以保证所要求的密码的有效性。

    如果ORAchk脚本被更改或由于你启动守护程序而更换了新的脚本,进一步需求以及自动运行将不会成功。你需要重启守护进程和新的脚本来进一步运行。

 

:  如果系统配置被更改 (如,添加/删除节点,添加/删除实例等),你需要重启ORAchk 守护进程使配置更改被识别。

 

自动启动非交互ORAchk 守护进程模式

 

在orachk 2.2.4中,可以选择守护进程模式自动启动功能。此功能需要与root等效的无密码ssh用户配置为用户配置自动启动功能(例如,root或oracle)。如果找不到运行orachk用户的无密码的ssh等效用户,orachk将能够在用户选项中配置。只要orachk自动启动功能被配置,无密码的ssh用户等效性留在原处。解除配置orachk守护进程模式自动启动功能将ssh配置恢复到自动启动功能被配置之前的状态。如果在节点由于任何原因被重启后,有要求orachk在守护模式非交互启动,这个功能会非常有用。

 

 

orachk守护程序自动启动配置有三个新的选项:

 

  1. -initcheck:- 检查orachk守护程序是否在节点重启时被配置为自动启动或者守护程序是否因某种原因出现故障

 

  1. -initsetup:-通过orachk脚本与init集成,配置orachk守护程序自动启动模式

 

  1. -initrmsetup:-删除orachk守护程序自动启动模式和init集成与orachk脚本

 

在守护进程中配置多个运行

 

ORAchk2.2.5引入在ORAchk守护进程中定义多个运行的能力。例如,在一定时间运行“sysadmin”配置文件的配置,以及在不同时间运行“dba”配置文件的设置,两者都在相同的守护进程中。

 

为了保持配置的分离,2.2.5版本引入了“-id<ID>”命令行限定符。当使用多个配置时这是必需的,且它识别出分离的配置。

 

在这个例子中,我们将在同一守护进程中创建两个配置,一个运行系统管理员sysadmin配置文件,而另一个运行dba配置文件。

 

ORAchk已被安装,我们cd到安装目录。这不是作用分隔的环境,“oracle”用户ID同时拥有grid和RDBMS home。

 

验证守护程序未被配置或运行:

 

  1. 配置第一个 “ID”:

 

  1. 配置第二个 “ID”

 

  1. 查看配置:

通过指定–id <ID> 选项,每个配置文件都能被单独查看。

 

  1. 最终启动守护进程:

 

使用配置文件运行检查的子集

在ORAchk 中使用配置文件有三个原因

  1. 运行检查的子集: – 如果用户只想执行集群软件相关的检查,而不是运行完整的健康检查,并忽视其余检查,你可以使用像./orachk-profile集群软件的clusteware集群软件配置文件,它只会执行集群软件相关的检查。
  2. 以root运行orachk: – 即使Oracle数据库在运行,只要使用像./orachk-profilesysadmin一样的syadmin配置文件,还是可以以root用户运行orachk。
  3. 支持基于角色的健康检查: – 可能有不同的人对操作系统和数据库进行管理,并可能执行分离的健康检查。使用系统管理员配置文件可以进行OS健康检查,且DBA可以使用DBA的资料做数据库健康检查。

 

用ORAchk执行报告比较

 

在2.2.1版本中,ORAchk有在两个 ORAchk报告之间执行报告比较的功能。这使得成功因素和最佳实践,规划后的维护等在一个用户友好的HTML报告之内随着时间的推移而变化。这么做的前提条件是为了维持那些ORAchk运行的会被用于报告对比的ORAchk输出目录,.zip输出文件或ORAchk HTML 报告。下面的步骤提供执行ORAchk报告对比的例子:

 

  1. 确定在报告比较中使用的报告(新的和旧的):

: 本例使用输出目录,但是,HTML报告或输出.zip文件也可用于比较功能。

 

  1. 我们要使用二月八号和二月27号的报告进行报告比较:

 

 

:    当在守护进程模式运行ORAchk时,最新和下一个最新的(如果有的话)集合报告被自动对比。如果配置了NOTIFICATION_EMAIL地址,一份带报告和比较报告的附件的摘要会通过电子邮件被发送。

 

合并ORAchk报告

 

有些时候,当你有orachk的多个报告,你可能希望将它们合并成单个的报告来看。例如,

 

  1. 由于客户的安全策略,集群节点之间的无密码ssh用户等效性不能使每个集群节点必须本地运行orachk。每个节点的报告可以合并成单个报告。
  2. 如果数据库管理员不知道root密码并使用DBA配置文件运行orachk,以及系统管理员知道root密码并使用系统管理员配置文件作为root运行orachk。这两份报告可以合并成一个报告。

 

要合并报告。只要将包含需要合并的报告的orachk zip文件或orachk输出目录的列表发送,orachk会将这些独立报告合并为单个的报告。

 

Eg., $ ./orachk –merge <zipfile 1> <zip file 2> > <zip file 3> > <zip file …>

 

 

 

在升级准备模式下运行ORAchk

 

从2.1.5版本开始,ORAchk(Oracle配置审计工具)可以用来获得一个自动11.2.0.3(或更高版本)升级准备评估。在ORAchk升级准备评估的目标是使针对版本11.2.0.3及以上的Oracle RAC和Oracle集群软件升级规划过程尽可能顺利,即通过自动完成许多在升级相关的文件中详述的手动前后检查。

 

ORAchk Upgrade Readiness has 2 modes, a pre-upgrade check and a post-upgrade check. The pre- upgrade check is to be executed during the planning phase of the upgrade process; this will ensure that enough time is available to rectify potential issues prior to the upgrade itself. The post-upgrademode ensures the health of GI and Database (from an Upgrade perspective). Below is a summary list of what to expect from ORAchk Upgrade Readiness: ORAchk升级准备有2种模式,升级前检查和升级后的检查。升级前检查是在升级过程中的规划阶段执行;这将确保有足够的时间可用来纠正在升级之前本身的潜在问题。升级后模式确保(从一个升级的角度)GI和数据库的健康。下面是ORAchk升级准备的摘要列表:

  • 目标集群软件和数据库版本必须为11.2.0.3以上
  • 在升级前模式中,工具会检测在集群软件中自动注册的所有数据库,并显示要在其上进行升级前检查的数据库列表。
  • 在升级后模式中,工具会检测在集群软件中自动注册的所有数据库,并显示要在其上进行升级后检查的数据库列表。如果任何在11.2.0.3版本前的数据库被选择时,升级后检查将跳过它们。
  • 在这两种模式中,工具将适当检查集群软件和操作系统。
  • 当工具完成,用户将被引用到HTML格式的报告,它将包含结果以及更多的细节和信息的链接。

 

下面的步骤提供执行ORAchk升级准备评估的一个例子:

 

  1. 在你的未决RAC升级的升级规划阶段,在升级前模式中,作为Oracle RDBMS软件所有者执行ORAchk,然后按照屏幕上的提示:

:   强烈建议升级前检查在升级的规划阶段执行。这将使规划和实施的结果由ORAchk强调。

 

  1. 当你已经成功升级到2.0.3或更高(GI和/或RDBMS),在升级后模式作为Oracle RDBMS软件所有者执行ORAchk,然后按照屏幕上的提示:

 

 

其他有用的选项

 

  • dbnone:- 在版本2.2.4中引入,此选项不接受任何值。如果在运行orachk时,在命令提示符下指定了此选项,用户不会被提示选择任何运行中的数据库,且没有数据库检查将被运行。
  • dball:- 在2.2.4版本中引入,此选项也不接受任何价值。如果运行orachk时,在命令提示符下指定了此选项,用户将不会被提示,但所有正在运行的数据库将被检查。
  • dbnames:- 在2.2.4版本中引入,这个选项需要在命令提示符下传送数据库列表。用户不会被提示选择任何其他运行中的数据库。此选项实际上类似于在地方环境问题章节讲到的RAT_DBNAMES environemt变量,但它在命令行而不是在环境中指定。
  • nopass:- 在2.2.4版本中引入,这个选项也没有任何参数。如果使用此选项,发生的检查将不会被包含在HTML报告中,也不会被上传到数据库。如果数据库上传功能根据附录F配置 – ORAchk结果和数据库的修补程序会被上传进行报告。
  • noscore:- 在2.2.4版中引入的noscore选项允许用户省略出现在ORAchk HTML报告顶部的健康评分。

 

附录A – 故障排除

 

调试ORAchk

 

要生成ORAchk的调试输出,用“-debug”命令行选项执行ORAchk。 ORAchk将创建一个调试文件,其名称基于一个时间戳,其中包括:

  1. 在本地节点的程序的bash -x
  2. 在所有远程节点的程序的bash –x
  3. 所有动态生成的,在orachk中称为脚本的bash -x

 

调试ORAchk守护进程

 

:     每个客户端运行将在工作目录中生成一个日志。在客户端运行日志中的信息量取决于守护进程在调试还是非调试模式下运行。

 

  1. Start_debug:-要解决守护进程问题,用户可以使用-d标志和start_debug选项在调试模式下启动orachk守护程序。守护程序的调试信息将被写入在orachk工作目录下生成的log。如果守护进程在调试模式下启动,则客户端日志将包含:
    1. 在本地节点的程序的‘bash –x’
    2. 在所有远程节点的程序的‘bash –x’
    3. 所有动态生成的,在orachk中称为脚本的bash -x

 

  1. 如果守护进程在非调试模式(orachk -d启动)被启动,则客户端日志将包含正常程序的执行。这将有利于在调试守护程序有关的问题,特别是密码检查问题和客户端运行提交和客户端运行有关的问题(本地节点,远程节点和中间脚本)。

 

控制行为的环境变量

 

  1. 运行时命令超时:

 

RAT_TIMEOUT –默认为90秒,如果任何非root权限的命令默认超时时间不够长,则看门狗守护进程会杀掉子进程,且所需的数据将丢失。如果发生了这个情况,可以通过在脚本执行环境中的设置环境变量增加超时时间:

 

RAT_ROOT_TIMEOUT -默认为300秒,该工具将为在集群中的每个节点执行一次root权限的数据集。如果root权限的数据集的默认超时时间不够长。则看门狗守护进程会杀掉子进程,且该节点所需的数据将丢失。如果发生了这个情况,可以通过设置在脚本执行环境中设置这个环境变量增加超时时间:

 

:   如果遇到了任何超时的情况,最好确定延迟的原因并进行纠正。在系统上负荷最少的时间运行该工具。丢失的数据集合将限制工具的值。

 

  1. log 有错误:

 

当为工具检查orachk_error.log,一些错误将很可能被列入。有些是预期的错误,不表示任何问题。这些错误会被重定向并“吸纳”进error.log中,以防止它们被报告到屏幕并杂乱地显示。所以不要报告任何下列错误来支持。

 

例如,类似如下的错误可能会被多次报告(每次对应每个节点的每个Oracle软件home):

 

这些错误类型发生在角色分离的环境中,当作为RDBMS软件所有者运行的工具尝试使用opatch列出其他用户(grid,或其他数据库的home所有者)home下的补丁。所以当opatch被调用为这些其他用户列出补丁时会出现错误,因为当前用户不具有对其他home的权限。在这些情况下,opatch错误被忽略,且这些home的补丁通过其他方式收集。

 

此外,类似于下面的错误是可忽略的:

 

行号可能随时间而改变,但这个错误只表示我们期待一个整数返回值,而没有找到值(即空),所以shell返回该错误,试图作比较。相同的命令能重复多次产生此错误,每个节点一次。

 

  1. 远程root登录问题

 

如果远程root登录不被SSH允许,具有root权限的命令将不会在如上所述的选项2的情况下工作。为了验证oracle软件所有者(如oracle),用户需要在不工作的节点手动执行下面的命令,并确保它得到如下输出。如果远程root登录不工作,则该工具将无法检查远程节点。如果要对于运行该工具只是暂时的,请让系统管理员来进行更正。

 

如果由SSH配置了远程root登录,如何验证预期的输出:

 

如果远程root登录可配置,编辑/ etc/ ssh / sshd_config文件,如下所示:

 

现在,在集群的所有节点上以root执行以下命令。

 

  1. 本地环境问题

 

该工具尝试从环境(操作系统和OCR)获取所有数据,但由于本地系统偏差,有时该工具并不如预期工作是可能的,且预期和测试每一个可能的方案是很难的。因此,一些环境变量的支持被列入为用户重写工具的默认行为,或给它所需的信息使其按预期工作提供了一种方法。变量及其使用情况如下:

 

RAT_INV_LOC – 如果oraInst.loc文件不在预期的位置,如: /u01/app/oraInventory,用户可能需要指定oraInventory目录的确切位置。

 

RAT_CRS_HOME -如果工具无法取得正确的CRS_HOME路径,设置此变量。如果用户知道安装了集群软件,但工具认为没有,他/她可以判断是不是需要这个变量。

 

RAT_ORACLE_HOME -如果工具无法获得在集群中注册的数据库的正确ORACLE_HOME路径,设置这个变量。如果用户知道安装了数据库软件但在工具显示信息为软件没有安装,他们将能够决定是否需要该变量。该工具将为在RAT_ORACLE_HOME指定的home运行的数据库执行最佳实践和建议的修补程序检查。

 

RAT_ASM_HOME – 如果工具无法从集群软件获取正确的ASM_HOME路径。如果用户知道ASM软件被安装在单独的home,但工具显示信息为软件没有安装,他们将能够决定是否需要该变量。

 

RAT_OS -如果工具不当获取所需的平台。该工具会提示用户由于不正确检测和不支持的平台,获取的平台需要的数据不能找到。

RAT_DB -如果工具不当生成了不正确的数据库版本

RAT_DBNAMES – 如果工具没有从集群软件获得有效的数据库名称,可以指定由空格分隔的数据库列表,则该工具会使用该类别而不是从集群软件得到的,例如,导出RAT_DBNAMES=”ORCL ORADB PROD”。如果要指定多个数据库,只使用双引号。注意,如果你配置RAT_DBNAMES作为在集群软件注册的数据库的子集,且在集群软件中发现被注册的所有数据库的补丁库检查了建议的补丁,那你也应该配置RAT_DBHOMES。

 

RAT_DBHOMES – 如果RAT_DBNAMES被设置,那么默认下建议的补丁分析将仅限于在RAT_DBNAMES中指定的数据库列表的home。如果对其他数据库home执行推荐的补丁分析比对在RAT_DBNAMES指定的home更可取,那么对推荐补丁需要检查home的数据库指定其由空格分隔的列表,例如假设导出RAT_DBNAMES =”ORCL ORADB”,但即使PROD数据库关闭,你也想要PROD数据库home,以进行检查,然后导出RAT_DBHOMES =“”ORCL ORADB PROD”。这样的话,ORCL和ORADB数据库的最佳实践将被检查,但对于ORCL,ORADB和PROD的home,推荐的补丁将被检查。要指定多个数据库,使用双引号。

 

RAT_SSHELL – 覆盖默认安全shell的位置,以防SSH不在预期的位置(即,/usr/bin/ssh)。如果ssh命令返回错误“-bash:在”-bash: /usr/bin/ssh -q: No such file or directory “,那么​​可能是因为ssh不在预期位置,且这个变量可以将工具重定向到正确的位置。

 

RAT_SCOPY – 覆盖默认安全副本位置,以防scp不在预期的位置(即,在/usr/bin/scp)。如果scp命令将返回错误“usr/bin/scp -q: No such file or directory”,那么它​​可能是因为scp不在预期的位置,且这个变量可以将工具重定向到正确的位置。

 

  1. Linux “预期” 工具故障排除

 

ORAchk使用“预期”工具来回答的密码提示以连接到远程节点进行密码验证,以及执行root集合,无需默认下记录实际的连接过程。有两个ORAchk环境变量能被设置来帮助调试远程目标连接的问题。

 

RAT_EXPECT_DEBUG -如果这个变量设置为“-d”(破折号d,不是下划线d),预期命令跟踪将被激活,且跟踪信息被写入标准输出。例如,“export RAT_EXPECT_DEBUG=-d”。

 

RAT_EXPECT_STRACE_DEBUG –如果这个变量设置为“strace”,strace调用预期命令,且跟踪信息被写入标准输出。例如,“export RAT_EXPECT_STRACE_DEBUG=strace”。

 

通过改变这两个变量的组合,可使用三种级别的预期连接跟踪。

 

:   这两个变量只应设置在甲骨文支持或发展的方向。它们通常用于与其它变量和用户界面选项的组合来限制跟踪期间收集的数据量,以及捕获标准输出的“脚本”命令。它们不应该被设为一个完整orachk运行,因为这将产生大量的数据,且如果不使用“脚本”命令,跟踪数据将简单地在屏幕上滚动并丢失!

 

  1. 数据库登录问题:

 

核查数据库认证 – 如果你打算作为用户而非数据库软件安装所有者(root或grid)运行该工具,且如果你在连接到数据库时遇到问题,那么执行以下步骤:

 

如果连接到数据库的这种方法行不通,那么该工具也将无法连接。考虑以Oracle数据库软件的安装所有者运行该工具。

 

  1. 用户配置文件:

 

在用户配置文件中出现提示符(读-p)或陷阱会导致在执行期间工具挂起作为在运行时的.profile文件。出于这个原因,该工具检查在这些语句环境中的.profile文件,并显示一条消息,告诉用户暂时在所有节点的语句注释这些语句。

ORAchk 在SuSe 报告 “-bash: ./orachk: /bin/env: bad interpreter: No such file or directory” 在 SuSe, 执行 ORAchk 之前,你必须软链接 /usr/bin/env 到所有节点上的 /bin/env (在 -s/usr/bin/env /bin/env ) 。

 

 

附录 B – 如何获取支持

 

If problems are encountered either at runtime or if there are questions about the content of the findings of the tool, please post your issues/questions/concerns to the ORAchk thread within the ORAchk                                                                                                                                             Thread of the Scalability RAC My Oracle Support Community. 无论在运行时遇到问题或者有关于该工具的结果有问题,请将你的情况/问题/顾虑发表到在可扩展性RAC My Oracle Support社区的ORAchk主题中的ORAchk主题。

 

附录 C – 运行ORAchk应该要多久

 

The time it takes to run the tool will vary based on the number of nodes in a cluster, CPU load, network latency, etc.  Normally the entire process takes only a few minutes per node (i.e., less than 5 minutes per node).  This is just a general guideline but if it takes substantially more time than this then there may be some other problem that needs to be investigated. Experience in the field has been that it normally takes about an hour for a 10 node cluster. It normally takes about 10 minutes for a two node system. In both cases those times include the tool environmental discovery phase and the entry of passwords.  Adjust expectations accordingly for different sized systems or very busy systems. 运行工具需要的时间将根据集群中节点的数量,CPU负载,网络延迟,等等而变化。通常,整个过程只需每节点几分钟(即,每个节点少于5分钟)。这只是一般的指南,但如果比这个时间需要更多的时间,那么可能有其他一些问题需要调查。在该领域的经验是,10个节点的集群通常需要大约一个小时。它通常用于两个节点的系统需要大约10分钟。在这两种情况下,这些时间包括工具环境发现阶段和密码的输入。根据实际情况对不同规模的系统或非常繁忙的系统调整预期。

 

附录 D – 由ORAchk处理密码

该工具不储存或保存任何密码,无论是操作系统还是数据库。对于root​​密码,密码的处理将取决于预期的工具是否被安装。

 

当预期没有显示(除OEL5的所有平台为默认),root密码提示符被延迟,且用户必须密切监视工具执行并根据提示交互输入密码,在集群一个节点一次。

 

The tool leverages the EXPECT utility which is shipped by default as part of the OEL5 distribution for interactive password automation (see http://expect.sourceforge.org). Expect can be installed on other Linux distributions in order to automate interactive password handling. 该工具利用默认为分布交互式密码自动化(见http://expect.sourceforge.org) 的OEL5发行版的一部分的EXPECT工具。Expect可安装在其他Linux发行版,来自动化交互密码的处理。

 

当发现EXPECT时,root密码在过程的开头被 “收集”且expect会在节点需要root密码提示符时提供它们。这样工具可以继续,而无需来自用户的进一步输入。用户会被提问集群的所有数据库服务器的root密码是否相同。如果用户回答“是”(默认),则root密码会被提示输入并确认一次,然后该密码将用于集群中的所有节点。如果用户回答集群的所有节点的root密码是不一样的,则该工具会提示并对集群的每个节点验证root密码。

 

同样地,当发现EXPECT,在验证root密码时用户将有三次机会输入正确的密码。如果用户在三次尝试之后没有输入正确的密码,该工具将移动到下一个节点,并显示一个消息,说明该密码仍然是不正确的,然后取决于从该节点收集的数据的检查将被跳过。此时,用户可以取消工具执行并解决问题,或继续但理解有价值的数据可能从报告中消失。解决此问题并重新开始比丢失数据好多了。

 

When EXPECT is utilized it is also possible that between the time that the root passwords are entered and validated and nodes for those passwords are reached that the passwords could have been changed. In that case a message will appear in the on-screen output stating that the password must have been changed and that the collections for that node will be skipped which means the checks for that node will also be skipped. The user can either allow the tool to continue to completion knowing that data and checks will be skipped or cancel tool execution (Control-C) and resolve the problem and try again.   It is better to resolve the problem and start over than to be missing data. 当使用EXPECT时,在root密码输入和验证与达到这些密码的节点的时间内密码可以被更改。在这种情况下,消息会显示在屏幕上的输出,指出该密码已被更改,并且集合该节点将被跳过,这意味着该检查该节点也将被跳过。用户既可以让工具继续完成(了解数据和检查将被跳过)或关闭工具执行(Control -C)并解决问题,然后重试。解决问题并重新开始比丢失数据更好。

 

In any case, any checks that are skipped (for any reason) will be logged and the reports listed at the end of tool execution will list any checks that were skipped and on which nodes. 在任何情况下,(因任何原因)被跳过的检查都将被记录,而列在工具执行最后的报告将列出所有被跳过的检查和在哪个节点。

 

“-debug” 选项和密码

 

Because of the nature of debug operations within the bash shell, the “-debug” output file (and possibly others) will contain the strings that were entered in response to the prompts for operating system user passwords, and optionally the database login username and password when operating system authentication is not configured. 由于在bash shell中调试操作的特性,当操作系统验证未被配置时,“-debug”输出文件(也可能是其他)将包含被输入以对应操作系统用户密码提示的字符串,以及可选的数据库的登录用户名和密码。

 

With 12.1.0.2.1, unless an ORAchk execution is abnormally terminated (kill -9, database server crash, etc), the ORAchk utility removes these strings by default. 在12.1.0.2.1中,除非ORAchk执行异常终止(kill-9,数据库服务器崩溃,等等),ORAchk工具会默认删除这些字符串。

 

If you do not wish to remove the password strings for some reason, use the following environment variable to preserve the original “-debug” output file and make a second file without the password strings: 如果出于某种原因你不想删除密码字符串,使用下面的环境变量,保留原有的“-debug”输出文件并创建第二个没有密码字符串的文件:

 

 

 

After using the RAT_KEEP_ORIG_DEBUG_FILE environment variable, you will see two files similar to these shown: 使用RAT_KEEP_ORIG_DEBUG_FILE环境变量后,你会看到两个文件类似于如下所示:

 

The “.orig” file contains the password strings. “.orig”文件包含密码字符串。

 

:    如果使用“-debug”选项的ORAchk运行异常终止,建议手动验证ORAchk被启动的目录,包含对应提示的密码字符串的文件的时间戳输出目录,并编辑返回的文件来替换发现的带一个随机字符串的密码字符串。

 

例如 (密码字符串 guest1 和tooeasy, ORAchk 从/home/oracle/121021 /password_test启动):

 

 

附录 E 多个数据库支持

 

The ORAchk tool is designed for multiple database support. The tool will present a list of running databases which are registered in the Grid Infrastructure. The user may choose one, all or enter a comma separated list of numbers which designate the databases listed. It is not necessary to stage the tool on multiple nodes in order to check database instances running on other nodes of the cluster. 该ORAchk工具是专为多数据库支持设计的。该工具将展示登记在Grid Infrastructure的运行中数据库的列表。用户可以选择一个,全部或输入以逗号分隔的指定列出的数据库号码的列表。这对于多个节点上工具的暂存以检查在集群的其他节点上运行的数据库实例是不必要的。

 

All database logins are accomplished by the use of local bequeath connections and assume the existence of OS authentication in the database for the user executing the tool.  In some configurations there could be multiple database homes all owned by the same OS user (e.g., oracle) or in others there could be any number of database homes all owned by different OS users. In the former case, run the tool as “oracle”. In the latter case, stage and run the tool as the OS user which owns the RDBMS home which has the largest number of database instances running from that home as that user will not be able to login into database instances running from homes which it does not own. In order to scan the other databases the tool needs to be staged and run under each database home user account. 所有的数据库登录通过使用本地遗留的连接完成,假设在数据库中有为用户执行工具的OS认证。在某些配置中可能有由同一个操作系统的用户(例如,oracle)拥有的多个数据库home,或在其他可能有由不同操作系统用户拥有的个数据库home。在前一个情况下,以“oracle”运行工具。在后一种情况下,暂存并运行该工具作为拥有RDBMS home,其拥有从该home运行的数据库实例的最大数目,因为用户无法从它不拥有的home登录到数据库实例中。为了扫描其他数据库,该工具需要被暂存并在每个数据库home用户帐户下运行。

 

附录 F –上传ORAchk结果和补丁到数据库以进行报告Uploading ORAchk Results and Patches to a Database for Reporting

 

For customers who have a large number of systems and databases it would be useful to upload the results of the audit checks done by the tool and/or the list of installed patches into database tables for use as a source of data for reporting. 对于拥有大量的系统和数据库的用户来说,上传由工具和/或安装的补丁列表到数据库表中以用作数据源进行报告的审计检查结果是有用的。

 

Starting with ORAchk 2.2.4 Oracle now provides the ORAchk Collection Manager application. Collection Manager is Application Express (APEX) which provides an enterprise wide central repository for ALL ORAchk (and Exachk) collections. The APEX frontend provides an easy to use dashboard interface which users can track, trend, compare and report upon ORAchk findings. ORAchk Collection manager is the preferred approach to reporting on ORAchk collections. The Collection Manager application is bundled with ORAchk (CollectionManager_App.sql). For more information on ORAchk Collection Manager please see the Collection Manager Users Guide found in MOS Note: 1268927.2. 从ORAchk 2.2.4开始,甲骨文现在提供了ORAchk集合管理器应用。集合管理器是快捷应用(APEX),为所有ORAchk(和Exachk)集合提供了一个企业范围的中央存储库。 APEX的前端提供了一个易于使用的仪表板界面,用户可以跟踪,查看趋势,比较并根据ORAchk调查结果报告。 ORAchk集合管理器是对ORAchk集合报告的首选方法。集合管理器应用与ORAchk(CollectionManager_App.sql)捆绑在一起。有关ORAchk集合管理器的详细信息,请参见MOS注释中的集合管理器用户指南:1268927.2。

 

In order to support this feature a number of environment variables need to be set in the execution environment and three tables need to be created to receive the data, one for the audit check results, one for the patches installed on the systems and one to store the zipped archives that result from the collections: 为了支持此功能,一些环境变量需要在执行环境中设置,且需要出具三个表以接收数据,一个用于审计检查结果,一个用于安装在系统中的补丁,和一个用于存储由集合生成的压缩档案:

 

AUDITCHECK_RESULT AUDITCHECK_PATCH_RESULT RCA13_DOCS

 

Reporting Table Specifications报告表规范

 

注: If you plan on deploying ORAchk Collection manager, the reporting schema documented below will be created when deploying Collection Manager in APEX. 如果你计划部署ORAchk集合管理器,下面介绍的报告模式将在APEX中部署集合管理器时创建。

 

Results table specification结果表规范(e.g. auditcheck_result):

 

Version 2.2 added several additional columns to this table. Existing ORAchk users who are using the Database reporting features in ORAchk versions less than 2.2 MUST add these additional columns.

The DDL to add this column is as follows: 2.2版增加了几个附加列到此表。正在使用低于ORAchk2.2版本的数据库报告功能的现有ORAchk用户必须添加这些附加列。

加入此列的DDL如下:

 

Version 2.2.3 added 2 additional columns and constraints to the auditcheck_result table.  Again, existing ORAchk users who are using the Database reporting features in 2.2 MUST add these additional columns and constrains when upgrading to ORAchk 2.2.3: 版本2.2.3增加了2个额外的列和约束到auditcheck_result表。同样,在2.2版本使用数据库报告功能的现有ORAchk用户在升级到2.2.3 ORAchk时必须添加这些额外的列和约束:

 

Version 12.1.0.2.1 added another 2 additional columns and constraints to the auditcheck_result table. Again, existing ORAchk users who are using the Database reporting features in 12.1.0.2.1 MUST add these additional columns and constrains when upgrading to ORAchk 12.1.0.2.1: 版本12.1.0.2.1增加了2个额外的列和约束到auditcheck_result表。同样,正在使用12.1.0.2.1数据库报表功能的现有ORAchk用户在升级到ORAchk12.1.0.2.1时必须添加这些额外的列和约束:

 

Full DDL for the Results Table: 结果表的完整的DDL:

 

Patch table specification (e.g. auditcheck_patch_result): 补丁表规范(例如auditcheck_patch_result)

Version 12.1.0.2.3 added 1 additional the auditcheck_patch_result table. 版本12.1.0.2.3增加1个额外的auditcheck_patch_result表。

 

 

 

RCA13_DOCS表的DDL:

 

 

Environment variables (with example settings): 环境变量(示例的设置):

 

注: Use the fully qualified address (as in the example above) for the connect string rather than an alias from the tnsnames.ora file so that it is not necessary to rely on tnsnames.ora file name resolution on all the servers where the tool might be run. The double quotes should be included. 使用完全限定的地址(如以上示例),用于连接字符串而不是来自tnsnames.ora文件的别名,这样就不必依靠tnsnames.ora文件名称解析在工具可能运行的所有服务器上。双引号应包括在内。

 

When the first four above environment variables are set in the execution environment the tool will assume that the intent is to upload the data into the tables and at the end of the process it will attempt to upload the data. This process relies upon the environment being properly set, i.e. the connect string must be reachable, the username and password must be correct and the table name must be correct. If the tool is unable to connect to the database a message to that effect will be written to the log. If the RAT_UPLOAD_ORACLE_HOME variable is set the tool will invoke sqlplus from that home rather than attempting to invoke sqlplus from the current $ORACLE_HOME derived by the tool.  If any of the first four environment variables are not set then the tool will not attempt to upload the data. 当前四个以上的环境变量是在执行环境中设置的,该工具将假定意图是将数据上传到表,且在过程的最后,它会尝试上载数据。这个过程依赖于环境被正确设置,即连接字符串必须可访问,用户名和密码必须是正确的,且表名必须是正确的。如果工具无法连接到数据库,该效果的信息将被写入到日志中。如果RAT_UPLOAD_ORACLE_HOME变量被设置,该工具将从home调用sqlplus而不是试图从由工具导出的当前的$ ORACLE_HOME调用sqlplus中。如果前四个环境变量中任何一个未设置,那么工具将不会尝试上载数据。

 

附录 G 可选地排除审计检查

要在HTML报告生成前排除审计检查,建设中已经安装了ORAchk脚本和驱动程序文件所在的同一目录下名为“excluded_check_ids.txt”的文本文件。

 

“excluded_check_ids.txt”包含要被跳过的检查的识别号码,每行一个。每个检查被分配一个唯一检查标识号,一旦分配不会更改。有些检查将需要一个检查标识号被完全跳过,有的需要两个。如果一个检查,并在“exachk.log”文件中同时具有“COLLECTION_NAME”和“AUDIT CHECK NAME”,在“excluded_check_ids.txt”中需要有两个条目。如果检查在“exachk.log”文件中仅有一个“AUDIT CHECK NAME”,这将需要“excluded_check_ids.txt”中只有一个条目。

 

HTML报告确定检查ID Determining Check IDs from an HTML Report

 

从2.2.3版本开始,在HTML报告中有一个切换按钮,使检查识别号码可见或不可见。 “Show Check Ids”链接就在HTML报告的“Table of Contents”的部分下。

 

当点击“Show Check Ids”链接后,在报告表中的行展开以显示检查ID号:

Check Id Status Type Message Etc.
DCDB11F4CA7C5701E04313C0E50AB5D3 FAIL OS Check vm.min_free_kbytes should be set as recommended. Etc.

 

“Show Check Ids” 链接也更改为 “Hide Check Ids”。

 

当点击 “Hide Check Ids” 链接后,在报告表中的行收起,以隐藏检查ID号:

Status Type Message Status On Details
FAIL OS Check vm.min_free_kbytes should be set as recommended. All Database Servers View

 

要在下一个ORAchk运行期间排除特定的检查,主要 “Show Check Ids”,并将这些检查ID从HTML报告复制到ORAchk“包”被提取的目录中的“excluded_check_ids.txt”。

 

从日志文件确定检查ID

 

要找到需要排除的检查ID号,搜索你想从“orachk.log”文件的HTML报告排除的检查的名称。这需要使用之前完整ORAchk运行的“orachk.log”文件。在2.2.2版本中,你会发现在从运行的目录下创建了“log”子目录中的“orachk.log”文件。例如,如果在运行生成了名为“orachk_ratlnx01_mydb_052413_181326”的子目录,“orachk.log”文件将在:“orachk_ratlnx01_mydb_052413_181326/log/ orachk.log”。

 

要确定检查是否可以被排除以及它是否需要一个或两个检查ID号,可以grep通过“orachk.log”文件,从HTML报告中找到检查名称。一旦你找到了检查名称,在编辑器中打开“orachk.log”文件弄搜索检查名称字符串。每个检查在“orachk.log”文件中有与它相关联的文本块,通常之后跟着由“ – ”组成的一行。检查ID号将在虚线上方。对于某些检查,可以有一个COLLECTION_NAME以及一个AUDIT_CHECK_NAME。

 

要在下一个ORAchk运行时排除特定的检查,只要将orachk.log文件“CHECK_ID =”后的字符串复制到ORAchk“包”被提取的目录中的“excluded_check_ids.txt”。要完全排除检查和其收集的数据,你最好同时排除COLLECTION_NAME和AUDIT_CHECK_NAME检查ID(如适用)。

 

基于配置文件排除检查

 

用户可以使用orachk 2.2.4中引入的称为excludeprofile的新选项,根据一个配置文件来排除检查。当该工具在运行且被排除的配置文件将被列在报告头部时,excludeprofile后配置文件中的检查将不会被执行。

 

 

从现有的HTML报告中删除检查

 

从ORAchk 2.2.3开始,你现在有从现有的HTML报表中删除检查的功能。要做到这一点,点击目录表下的“Remove finding from report”链接。这将在HTML报告中每个审计检查的旁边显示X。要删除一个给定的检查,只需点击X。删除了检查后,你可以点击“Hide remove Buttons”链接,同样在目录表的下方,显示修改后的报告。

 

:     使用上述方法删除检查实际上并没有修改HTML报告。要回退更改,你只要重新加载浏览器中的报告。如果你想使更改永久在报告中,必须使用浏览器的“保存网页”功能。

 

:    当将结果上传到前面提到的ORAchk集合管理器应用时,它也支持基于业务单位,系统和独立集合,排除(忽略)在应用中的调查结果。详见ORAchk集合管理器安装和用户指南,但此功能为排除或忽略检查结果提供了灵活性。

 

 

 

附录 H –用户ID和密码的特殊注意事项

 

作为使用该工具时提供更高的安全性的方法,密码不被存储。该工具使用操作系统或标准的Oracle用户名和密码认证机制。

 

如果执行该工具的用户具有为Oracle的OS认证设置的账户,那么数据库登录不需要用户名和密码。但是,如果用户没有设置数据库访问权限的OS认证,那么用户将被标准Oracle数据库验证提示符提升。

 

附录 I –输出目录的特殊说明

 

要限制安全漏洞,该工具输出目录的权限应尽可能严格设置。输出目录可以包含敏感的配置信息,且当没有其他机制可用时,还能包含临时数据集合文件。

 

 

附录 J – 输出文件维护

 

每当ORAchk运行时它总会使用以“orachk”开头的格式创建一个子目录并包括日期和时间(例如,orachk_SIEBXL_072611_141001)和包含子目录的内容(例如,orachk_SIEBXL_072611_141001.zip)的.zip存档,其与工具本身在文件系统的同一层级。子目录和.zip文件的总大小在文件系统最好小于5M。确切的大小根据系统中有多少节点和多少数据库而异。尽管预计orachk有时会像在“什么时候运行ORAchk”章节中描述的,随着时间的推移,文件的数量堆积,而客户可能想要执行维护并清理旧文件和/或子目录。

 

每个客户可能有不同的要求,因此客户有责任来定义执行自己战略的流程,以维护这些子目录和文件。有些客户可能选择将文件归档到不同的系统。有些客户可能需要删除子目录并保存.zip文件。还有一些客户可能会选择同时删除旧的子目录和.zip文件

 

Oracle建议客户执行cron作业或其它调度工具(例如,Oracle企业管理器)来根据个人的需要执行这个任务的过程和程序。

 

 

附录 K –最高可用性结构记分卡 (MAA)

 

MMA计分卡是一组最高可用性架构的最佳实践和与它们相关的调查结果。其目的是提供客户一个记分卡为他们准备好各种在Oracle数据库环境中的可能发生的故障。现在MAA记分卡默认显示在orachk中,因为MAA被认为是一个非常重要的概念和功能。不过,有些客户可能没有实施Oracle Data Guard,实施了Oracle Data Guard备用数据库才能让MAA发挥最大功能,但即使Oracle Data Guard没有被实施,建议以MAA记分卡运行orachk。如果在分析中包含MAA记分卡是不理想的,通过运行orachk使用-m参数来压缩它,例如。

 

附录 L – 11.2.0.3及以上版本升级准备检查

 

有许多文档讨论了升级到Oracle RAC版本11.2.0.3-升级配套,升级指南,Oracle数据库文件,手动升级清单等等各方面。工具的升级准备模块将许多东西的检查例如最佳实践,补丁的前提条件,配置的前提条件等等自动化。其目的是简化和增强升级过程的可靠性。虽然我们试图覆盖尽可能多的点,但仍然建议客户查看升级文件,因为一些概念或单个项目不轻易让本身自动化。参见运行升级准备检查的语法的使用章节。

 

 

附录 M – 配置ORAchkSUDO权限

In order to take advantage of the full functionality of ORAchk, root access is required to run the root specific checks. To facilitate these checks in silent mode we MUST configure passwordless SUDO and utilize the -s (more on this later) option to execute ORAchk. Configuring SUDO will also allow for parallel ORAchk execution (new in 2.2.1) without having the EXPECT utility installed on the system.sudo configuration is not required if orachk deamon is configured with or without auto restarting daemon feature using init. To configure SUDO add the following line to the sudoers file on each of the cluster nodes using visudo command replacing “<oracle>” with the appropriate RDBMS software owner: 为了利用ORAchk的全部功能,需要root权限来运行root专项检查。为了便于在静默模式下执行这些检查,我们必须配置无密码SUDO并使用-s(之后会讲到更多)选项来执行ORAchk。配置SUDO也将允许并行ORAchk执行(2.2.1版本新功能),而无需Expect的工具安装在system.sudo,如果orachk守护程序使用init被配置带或不带自动重启守护进程的功能,配置是不是必需的。要配置SUDO,用visudo命令以相应的RDBMS软件所有者替换“<oracle>” 将以下行添加到每个集群节点的sudoers文件:

 

 

 

附录 N –平台明智的检查需要root权限

 

了解需要root权限的平台的完整检查列表,请参阅ORAchkPlatform wiseChecksthatRequireRoot.pdf, Note: 1268927.1.

 

 

附录 O – 升级 ORAchk

 

ORAchk的新版本将定期发布。经常检查MOSNote: 1268927.1 新版本和/或订阅ORAchk MOS社区获得最新资讯。

 

从 2.2.5版本升级ORAchk:

:  2.2.5之前的版本需要手动升级(重命名旧目录,并创建新的目录)

 

  1. 从MOS Note: 1268927.1 下载ORAchk的新版本到共享的网络临时目录(不要解压)
  2. 设置环境变量$ RAT_UPGRADE_LOC到临时目录
  3. 执行“orachk-upgrade”升级ORAchk

 

要升级ORAchk 12.1.0.2.1及以上的版本 :

 

在ORAchk 12.1.0.2.1中,默认下,当ORAchk启动时,如果指定的话,它会寻找$ ORACLE_HOME / suptools或$ RAT_UPGRADE_LOC中的新版本。如果有新的版本存在,ORAchk将自动升级到新版本。最好的做法是将orachk.zip暂存到能被运行ORAchk的所有环境访问的网络共享中,并将环境变量

$ RAT_UPGRADE_LOC设置到该位置。

 

:     要绕过自动升级,你可以执行“orachk -noupgrade”。如果ORAchk的版本在120天之前-noupgrade选项将不会生效。

 

  1. 从MOS Note: 1268927.1 下载ORAchk的新版本到共享的网络临时目录(不要解压)
  2. 设置环境变量$ RAT_UPGRADE_LOC到临时目录
  3. 执行 ORAchk,执行时 ORAchk 会提示确认升级

 

要升级ORAchk 12.1.0.2.4及以上的版本 :

 

当ORA​​chk版本在120天之前,且新版本本地不可用,ORAchk会自动连接到My Oracle Support(假定网络是可用的),下载并升级ORAchk。MOS的下载可以手动触发“./orachk–download”。

 

 

 

附录 P – Windows Cygwin 要求

 

Cygwin本质上是为Microsoft Windows主机提供类似Linux环境的工具。从技术上讲,它是一个DLL(cygwin1.dll),作为一个提供大量的Linux API功能的Linux API层。

 

为了使客户能够在Windows环境下使用ORAchk,Oracle建议在数据库服务器上安装Cygwin。 Cygwin提供与ORAchk兼容的bash脚本shell环境。一旦安装了Cygwin,你可以在主机上配置SSH服务且只有在Oracle RAC安装时需要SSH服务。

 

有关如何安装Cygwin供ORAchk使用的完整说明,请参阅MOS Note: 1268927.1 中的“支持的环境”选项卡以及向下搜索Windows支持。

 

 

附录 Q –身份管理支持

 

详见 – IAM Healthcheck tool using ORAchk.  以及 MOS Note: 1268927.1

 

附录 R – 用户定义的检查

 

在12.1.0.2.5版本中, ORAchk现在支持用户自定义检查。这些是客户根据具体环境编写,测试,验证和维护的检查。Oracle将支持这些用户定义检查的创建和运行框架,但不支持检查本身的逻辑。测试,验证,编写,维护和支持检查都是由客户来完成。该检查将在运行时由ORAchk脚本执行,且用户定义检查的结果将显示在HTML报告的用户定义检查部分。

 

ORAchk提供了特殊的内置配置文件,称为user_defined_checks,它可以在运行时作为命令行参数限制在那些用户定义检查的检查范围。使用内置的信息是测试用户定义检查的有效方法,因为只有客户的检查将被运行,这将加快了进程。

 

用户定义检查被存储在ORAchk集合管理器schema中,输出到之后与ORAchk脚本共同所属的XML文件。当ORA​​chk 12.1.0.2.5及以上在客户的系统上运行时,它会检查该XML文件名称是否存在,如果找到一个,默认下它会运行其中包含​​的检查,包括在标准HTML报告中的结果。如果在命令行中指定了user_defined_checks配置文件,那么只有包含在XML文件中的用户定义检查将被执行。

 

Oracle在用户定义检查选项卡下ORAchk集合管理器应用中提供了编写环境。基本概念是,用户在该环境中定义检查,当准备好时生成XML文件。所有已被编写的检查且未被搁置的检查在生成时将被包含在XML文件中。搁置检查相当于一个“逻辑删除”。如果检查时发现问题或逻辑尚未完善,就可以搁置它,以保持其不被包含在XML文件,直到它为生产环境作好了准备,那么搁置可以被移除,在下一次它被生成时包括在XML文件中。

 

支持操作系统和SQL命令。不支持以root运行用户自定义检查。在编写页中,可以点击每个字段标签以得到说明该字段使用的帮助文本。一个星号表示字段需要输入。根据检查的上下文的所有情况中,有一些字段是不需要的。比如,许多操作系统命令可能对数据库的相关信息没有任何依赖性。在这些情况下,如果是为了编写检查,字段可以被忽略。

 

If installing ORAchk Collection Manager is not an option the user defined checks can still be created and run using the sample user defined checks XML file provided with the distribution however this requires hand-editing an XML file which could be error prone and difficult to debug. For that reason it is highly recommended that if it would be useful for the customer to be able to include user defined checks that they use the ORAchk Collection Manager interface to do so. 如果不能安装ORAchk集合管理器,使用XML文件在发行版提供的示例用户定义检查,用户定义检查仍然可以被创建和运行。但这需要手动编辑XML文件,可能容易出错且难以调试。出于这个原因,强烈建议如果客户将能够包括用户定义的检查,那么他们使用ORAchk集合管理器界面是有用的。

 

运行时的用户定义检查

 

如果user_defined_checks.xml文件与orachk脚本在同一位置,那么默认下在XML文件中的用户定义检查将运行,且其结果将显示在题User Defined Checks的部分。在这种情况下,不需要特殊的参数或选项。

 

另外,如果运行完成的用户定义检查,在命令行使用user_defined_checks内置配置文件作为参数。当使用了此选项时,用户定义检查将是唯一的检查运行且User Defined Checks部分将是唯一在报告中有显示结果的。

 

./orachk –profile user_defined_checks

 

要省略运行时的用户定义检查,使用–excludeprofile参数来实现

 

./orachk –excludeprofile user_defined_checks

 

 

以下部分描述了用户定义检查的元素,这些包含在编辑工具中。它们与组成ORAchk内置检查的元素相同。

 

检查名称:

使用一个自我记录的名称,并尽可能简洁,以确定检查的目的。

 

版本:

列出的版本支持Grid Infrastructure和数据库。如果你的检查适用于多个支持的版本,则使用shuttle widget将它们包括在内。即,将其移动到右侧窗格中。你的检查将只在特定版本或指定的版本运行,有时检查的逻辑可以是版本特定的。在这些情况下,仅包括特定版本。指定不在你的环境中存在的版本不会造成任何损坏。不在你的环境中存在的版本只会被忽略。另一方面,如果检查是特定版本的话,你最好删除检查不适用的版本。

 

平台:

The listed platforms are supported for Grid Infrastructure and Database. If your check applies to multiple supported platforms then include them using the shuttle widget, ie., move them to the right pane. Your checks will only run for the platform or platforms that you specify and sometimes the logic for a check can be platform-specific. In those cases only include the specific platform. It doesn’t hurt anything to specify platforms that do not exist in your environment.

Platforms that do not exist in your environment will just be ignored. On the other hand, if a check is platform-specific then you would want to remove the platforms that the check does not apply to. 列出的平台支持Grid Infrastructure和数据库。如果你的检查适用于多个支持的版本,则使用shuttle widget将它们包括在内。即,将其移动到右侧窗格中。你的检查将只在特定版本或指定的版本运行,有时检查的逻辑可以是版本特定的。在这些情况下,仅包括特定版本。指定不在你的环境中存在的版本不会造成任何损坏。不在你的环境中存在的版本只会被忽略。另一方面,如果检查是特定版本的话,你最好删除检查不适用的版本。

 

Linux OELRHEL 指 Oracle Linux 或 Red Hat Linux

 

命令:

OS commands or inline programs and SQL commands should result in a single string or numeric return value that can be compared to a single comparison value using an appropriate string or numeric comparison operator. Typically this will be a boolean return value e.g.., 1 or 0. But it could be a count resulting from the use of a command like grep -c or select count(*) where the count is expected to be 0 or a non-zero number depending upon the logic required for your check. The important thing to remember though is that it should not result in a list or array. OS命令或内嵌程序和SQL命令应导致一个字符串或数值返回可与使用适当的字符串或数字比较操作符的单一比较值相比较。通常这会是一个布尔返回值,例如,1或0,但它可能是根据你的检查需要的逻辑,对预期是0或非零的计数使用如grep-c或select count(*)得到的计数。但重要的是,不应该得到列表或数组。

 

The best approach is to perfect your logic in a terminal shell or sqlplus and once perfected copy and paste it into the Command field of your check. Note that ORAchk populates two environment variables at runtime $CRS_HOME and

$ORACLE_HOME. So you can use those in your logic. $CRS_HOME will be static but $ORACLE_HOME will change according to the context of its usage for databases. 最好的办法就是在终端shell或sqlplus中完善你的逻辑,一旦被完善,将它复制并粘贴到你的检查的命令字段。注意ORAchk在运行时填充两个环境变量,$ CRS_HOME和 $ ORACLE_HOME。所以你可以在你的逻辑中使用那些。 $ CRS_HOME将是静态的,但$ ORACLE_HOME将根据其对数据库用途的情况而变化。

 

Note that when querying v$ views in Oracle using OS commands the dollar sign needs to be escaped as in v\$parameter.

Note also that it is possible to embed SQLPlus formatting directives in your command and that a newline character (\n) follows them. NOTE: DO NOT embed any tabs in multi-line programs as that may cause problems parsing or executing the commands. 注意当使用OS命令查询在Oracle查询v$ views时,美元符号需要被转义为v\$参数。

另外注意,可以在你的命令中嵌的SQLPlus格式化指令,后跟一个换行符(\ n)。注意:不要在多行程序中嵌入任何标签,因为这可能导致问题解析或执行命令。

 

下面是一个OS命令的例子:

 

afdest=$(echo -e “set heading off timing off feedback off lines 180\n select value from v\$parameter where name=’audit_file_dest’;”|$ORACLE_HOME/bin/sqlplus – s / as sysdba|grep -v ^$)

aud_files=$(find $afdest -name ‘*.*’ 2>/dev/null|wc -l) if [ $aud_files -gt 100000 ]

then echo 1

else echo 0 fi

 

注: SQL 命令应有一个终止分号。

 

Sample OS Check Commands:

 

注意此命令中嵌入了一个SQL命令,它被管道传送到sqlplus中。

 

afdest=$(echo -e “set heading off timing off feedback off lines 180\n select value from v\$parameter where name=’audit_file_dest’;”|$ORACLE_HOME/bin/sqlplus -s / as sysdba|grep -v ^$)

aud_files=$(find $afdest -name ‘*.*’ 2>/dev/null|wc -l) if [ $aud_files -gt 100000 ]

then echo 1

else echo 0 fi

 

ps -ef|grep -v grep|grep -c OSWatcher.sh

interval=$(ps -ef|grep -v grep|grep OSWatcher.sh|head -1|awk ‘{print

$10}’)

if [[ $interval -ge 30 && $interval -le 60 ]] then echo 1

else echo 0 fi

 

 

示例SQL命令

 

注意终止的分号。

 

select count(ts.segment_space_management) from dba_tables t, dba_tablespaces ts where ts.tablespace_name = t.tablespace_name and t.table_name in (‘AUD$’,’FGA_LOG$’) and upper(ts.segment_space_management) != upper(‘AUTO’);

 

select ‘force_logging_mode_enabled = ‘||force_logging from v$database;

 

 

 

 

报告命令:

报告命令是一个OS或SQL命令,它会得到格式化输出,易于审查报告的用户的阅读,且输出会便于用户验证它伴随的检查的结果。因此它会从运行时的系统得到格式化输出,与检查逻辑本身可包含多行数据的列表不同。

另一方面,你不希望打印出几百或几千的文本行。这将难以阅读并使报告的尺寸比必要的大出很多。

 

So in the report command example the number of audit files is output in a very readable and understandable format rather than listing of all the audit files and the user can clearly see if ether are more audit files than should be allowed to build up on the filesystem and there is action required to remediate the problem. Limit your output to a reasonable number of rows. If necessary refer users to a command they can run manually to derive the complete set of data needed for Action / Repair. 因此,在报告命令示例中,审计文件的数量是以非常易于阅读和理解的格式输出,而不是所有审计文件的列表。用户可以清楚地看到是否更多的审计文件应该被允许在文件系统中建立,而且还有修复问题所需的操作。将你的输出限制到合理的行数。如果有必要,让用户参考可以手动运行的命令,以获取行动/修复所需的完整数据。

 

ORACHK外测试你的逻辑,在将命令粘贴到这里之前验证格式。

 

示例报告命令:

echo -e “Number of audit files at $afdest = $aud_files”

 

示例 OS 报告命令:

 

注意此命令使用存储在上述OS命令中的输出变量。

 

echo -e “Number of audit files at $afdest = $aud_files” ps -ef|grep -v grep|grep OSWatcher.sh

echo -e OSW interval = $interval seconds

 

示例SQL报告命令:

 

注意终止分号。

 

select t.table_name,ts.segment_space_management from dba_tables t, dba_tablespaces ts where ts.tablespace_name = t.tablespace_name and t.table_name in (‘AUD$’,’FGA_LOG$’);

 

select ‘Database force logging mode = ‘||force_logging from v$database;

 

 

 

 

比较运算符:

The comparison operator is used in conjunction with the command’s actual return value and the comparison value, which is the expected return value. The comparison is evaluated and the check either passes or it fails. Valid comparison operators and their type, numeric or string, are listed in the Comparison Operator shuttle widget. 比较运算符与命令的实际返回值和比较值结合使用,这是预期的返回值。比较被评估,检查或者通过或者失败。有效的比较运算符和它们的类型,数值或字符串,列在比较运算符shuttle widget中。

 

比较值:

比较值是与比较运算符和实际的命令返回值结合使用来确定PASS/ FAIL的预期返回值。换句话说,如果预期与实际的返回值不同,这会导致警告或故障。如果都相同,一个pass会是结果。

 

候选系统:

如果ORAchk正在运行的系统是一个RAC或非RAC数据库系统,那么数据库或Grid Infrastructure checks检查可以被运行。然而,一些检查对于RAC系统是特定的,而其他可能只适用于非RAC系统。在许多情况下,一个检查可能同时适用于这两各。使用shuttle widget指定检查适用于RAC还是非RAC或两者都适用。

组件依赖性:

如果检查命令的成功运行需要的话,选择一个Oracle stack的组件。例如,如果一个检查命令在查询ASM实例,那么ASM实例必须运行起来才能成功被查询。如果不是,那么检查逻辑依赖的sqlplus命令会丢失一些输入。如果运行时没有满足组件依赖性,那么检查将被跳过。

 

如果在运行时不需要组件依赖性,则不需要进行选择。

 

数据库模式:

如果正在运行的命令包含一个依赖数据库模式以获取所需数据的SQL命令,那么在这里选择合适的模式 – nomount, mount, open。对数据库执行的大部分,但并非全部SQL命令将取决于Open模式运行的数据库。

 

如果在检查中没有数据库依赖性,则不需要进行选择。

 

数据库类型:

Database versions BEFORE 12.1 are referred to here as NORMAL (not multi- tenant).  Database versions 12.1 or greater could be NORMAL (not multi-tenant),

CDB (multi-tenant container DB), or PDB (multi-tenant pluggable DB). Select the appropriate Database Type(s) for your check depending upon version and multi-tenancy.  Your check will only run on the specified Database Type(s). 12.1之前的数据库版本在这里称为NORMAL(不是多租户)。数据库版本12.1或更高版本可以是NORMAL(不是多租户),CDB(多租户容器DB),或PDB(多租户可插拔DB)。根据版本和多租户技术为你的检查选择适当的(多个)数据库类型。你的检查只会在指定的数据库类型(S)运行。

 

如果完全没有数据库依赖性,那么不需要选择。

 

数据库角色:

数据库角色有PRIMARY, 物理 STANDBY, 逻辑 STANDBY。物理备用数据库可能在管理恢复(安装模式)或只读模式下运行,所以可运行的SQL检查可能不同。

同样的逻辑备用数据库可能在应用模式下运行,所以可运行的SQL检查可能不同。在数据库整合环境中,在给定的系统上可能有各种角色的数据库。角色是在运行时为每个数据库决定的。 ORAchk / EXAchk对适当的角色运行检查,而对不恰当的角色忽略检查。

 

如果完全没有数据库依赖性,那么不需要选择。

 

Oracle Home 类型:

Oracle Home类型控制在运行时的ORACLE_HOME环境变量的设置,例如在一个Oracle可执行文件需要从home运行的情况。可能从home运行的可执行文件的例子是sqlplus,srvctl, crsctl, oifcfg等。一般来说,如果你的逻辑使用Oracle可执行文件来获得数据,那么脚本需要知道从哪个home的bin目录中找到可执行文件。shuttle widget列出了有效的选择。

 

If your check logic has no dependencies on Oracle executables, i.e. just basic OS commands, then no selection is required. 如果你的检查逻辑对Oracle可执行文件没有依赖性,即只有基本的OS命令,则不需要选择。

 

警报级别:

从有效值的列表中选出警报级别。这些警报级别是有些主观的,但一般FAIL应留给潜在的最严重问题,而WARNING是严重的但没有上升到FAIL的水平。INFO是最不严重的,但评估和更正仍是重要的。

 

通过赋予INFO的警报级别并设计一个会失败的检查使纯粹的信息数据传递到报告也是可以的,即..,无操作检查。

 

注:通过的INFO不显示在报告中,因此一个INFO检查失败可以用来在报告中显示所需的信息。

 

通过信息:

如果你的检查通过了,这是你想要在报告中显示的文本。它应当限制在80 – 100个字符。它不是要发出冗长的消息,只是对发现结果的摘要。

 

失败信息:

如果你的检查没有通过,这是你想要在报告中显示的文本。它应当限制在80 – 100个字符。它不是要发出冗长的消息,只是对发现结果的摘要。

 

 

效果/影响:

The Benefit/Impact, Risk and Action/Repair together comprise the Rationale for the recommendation – why it is important (Benefit/Impact), what might happen if mis-configured (Risk), and how to mitigate the risk (Action/Repair). The three fields are concatenated together at runtime to form the entire rationale. 效果/影响,风险和行为/修复共同构成推荐的理由 – 为什么它是重要的(效果/影响),如果配置错误会发生什么(风险),以及如何降低风险(行为/修复) 。这三个方面在运行时结合,构成完整的理由。

 

效果/影响顾名思义解释了推荐的原因,以及它会如何影响系统。

 

 

风险:

Risk should explain what the negative impact might be if the recommendation is not followed. Examples are sub-optimal performance, instability, reduced availability, etc. 风险解释了如果不遵守建议,负面影响可能是什么。示例是次优性能,不稳定性,和降低的可用性等。

 

 

行为/修复:

Action/Repair should communicate how to deal with the problem if found to exist. This could be as simple as instructions about how to remediate or it could tell the user to reference an more comprehensive document in the References section. In that case it is better just to say “Please see the referenced documents for more details.”  Then the references from the References section will appear immediately below in the report.  Review an ORAchk report with built-in checks to see how these sections are displayed in the reports and take your queues from the weay those are formatted to better understand how your messaging will be transferred to the report. 行为/修复传达了如果发现问题,如何进行处理。这可以像如何修复的教程一样简单,或者可以告诉用户参考在参考部分的一个更全面的文档。在这种情况下,最好就说“请查看参考文档获取更多细节。”然后,参考部分的引用都将立即出现在报告中的正下方。用内置检查复核ORAchk报告,以查看这些部分是如何显示在报告中的,并把你的队列从weay那些被格式化到更好地了解你的信息是如何转变为报告。

 

参考:

You can specify references that back up or further explain the rationale or that explain in more detail the Action / Repair. These references can be MOS Notes, external product documentation websites, or even customer authored reference documents not otherwise accessible to other Oracle customers, eg., customer build or standards documents. These references will be converted to clickable HTML links. 你可以指定参考来验证或进一步解释理由或者指定它更详细地解释行为/修复。这些参考可以是MOS笔记,外部产品文档的网站,甚至是客户撰写的参考文件,由其他Oracle客户无法访问,例如,客户构建或标准文档。这些参考文献将被转换为可点击的HTML链接。

 

For MOS Notes enter the note number and title. For other references enter the document title and URL. As references are added hey will be listed in the left panel of the shuttle widget and can be selected again later if applicable to other checks. If new references are added they will be applied to the current check, appear in the right shuttle pane for the current check, and also be added to the list of available references for future selection as appropriate. 对于MOS笔记,输入笔记号和标题。对于其他参考文献,输入文档标题和URL。当添加了文档,它们会被列在shuttle widget的左侧面板中,如果适用于其他检查,可以之后被选择。如果新的参考被添加,它们将被应用于当前检查,出现在右梭窗格用于当前检查,同时被添加到可用参考的列表,适当时用于之后的选择。

 

 

附录 S – 应用连续性支持

 

在版本12.1.0.2.5中,对应用连续性的支持被添加。

为Oracle具体类控制AC检查(在orachk称为acchk)的有三个值。它们可以在命令行或通过shell环境变量(或混合)设置。有以下几种。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

命令行参数 Shell 环境变量 使用
–asmhome jarfilename RAT_AC_ASMJAR 这必须指向asm-all-5.0.3.jar的一个版本,从http://asm.ow2.org/下载。
-javahome JDK8dirname RAT_JAVA_HOME 这必须指向JDK8安装的JAVA_HOME 目录。
-appjar dirname RAT_AC_JARDIR 为了分析引用Oracle具体类的应用代码,如oracle.sql.BLOB,这必须指向代码的th父目录名称。该计划将analy.class文件,并递归地.jar文件和目录。如果J2EE .ear或.war文件,你必须用外露的.class文件递归地显示这些目录结构。该测试适用于为Oracle 11或12编译的软件类。

 

J

 

 

当你运行AC检查时,对数据库服务器的额外检查等被关闭。在中间层运行具体类检查来分析访问Oracle驱动程序的软件是很常见的。

 

详见文章 – Using Orachk to Clean Up Concrete Classes for Application Continuity

 

 

附录 T – ZFS 存储应用支持

 

在版本 12.1.0.2.5 中,ZFSSA支持已经扩展到非工程体系。在支持的附带ZFSSA存储的客户端系统运行orachk,使用以下语法

 

./orachk -zfssa node1,node2

 

 

版本新功能

 

版本 12.1.0.2.5

 

  • 创建你自己的检查
  • Would you find it useful to easily run your own environment or business specific checks? 你是否发现它对轻松运行你自己的环境或业务特定检查很有用?
  • 使用ORAchk对自己的自定义用户定义检查进行编写,执行和报告。
  • 使用集合管理器界面来编写你的检查。
  • 使用ORAchk内置的电子邮件通知和差异报告
  • 在ORAchk html报告中的“用户自定义检查”部分查看检查结果
  • 使用ORAchk集合管理,收集并简易查看企业范围的所有结果

 

  • 扩展的Oracle产品支持
  • ORAchk 12.1.0.2.5 进一步扩展Oracle 产品栈的支持,通过以下新支持的Oracle产品:
    • Oracle身份管理器
    • Oracle电子商务套件客户关系管理
    • Oracle电子商务套件项目开票
    • Oracle ZFS存储设备
    • Oracle虚拟网络
    • OraclePeopleSoft应用程序
    • 应用连续性

 

  • 轻松运行或排除特定独立支票
  • 新的命令行开关已添加,所以你可以很容易地排除或只运行特定检查

 

  • 缩短ORAchk执行时间
  • ORAchk现在有缓存发现的数据库的功能,这意味着数据库重新发现被忽略且执行时间更快。如果数据库更改,你可以简单地发出一个命令使ORAchk刷新缓存。

 

  • 支持自定义EBS APPS用户

 

  • ORAchk现在将动态确定Apps用户,启用的所有EBS检查以供使用,即使你已经改变了Apps用户的名称。

 

  • 超过100个新健康检查
  • ORAchk的新版本带来了超过100个新的检查,在以下领域包含了一些Oracle客户支持已知的最具影响力的问题:
  • 补丁,性能,可扩展性和高可用性的数据库的最佳实践
  • Oracle身份管理预安装设置,安装后的配置和运行时环境
  • 人力资源和CRM(预测,支付表和服务合同)的电子商务套件最佳实践配置设置
  • 对项目开票中不兼容的配置电子商务套件的早期侦测
  • 对性能和弹性的Oracle ZFS存储应用的最佳实践配置
  • Oracle虚拟网络的最佳实践配置设置
  • PeopleSoft应用的数据库的最佳实践

 

版本 12.1.0.2.4

  • 当新版本时可用自动更新ORAchk
  • 当ORAchk未更新超过120天,较新的版本在本地不可用,它会查看在My Oracle Support是否有较新的版本可用并自动下载和升级。
  • 从My Oracle Support直接下载最新版本可以专门由“./orachk-download”触发。
  • 当在守护进程模式运行时,ORAchk会从下一个计划运行前,从由RAT_UPGRADE_LOC定义的本地位置进行自动升级时,电子邮件将发送升级通知。
  • ORAchk12.1.0.2.4现在给整个Oracle产品栈带来更广泛和更深入的支持,对下列产品领域有新增的支持:
  • 企业管理OMS
  • 电子商务套件的Oracle固定资产
  • 电子商务套件Oracle人力资源
  • 电子商务套件Oracle应收款
  • Siebel CRM应用
  • 超过60个新的健康检查
  • Bug 修复

 

版本 12.1.0.2.3

  • System Z (RHEL 6, RHEL 7, Suse 12)上的 Linux
  • Oracle企业级Linux7
  • 单实例ASM检查
  • 升级12.1.0.2的验证检查
  • 增强的金门检查
  • 企业管理器代理检查
  • 增强的报告,突出了ORAchk无法获得完整可见性的检查(需要手动验证的检查)

 

  • 改进的健康评分计算(现在可以达到100%)
  • 超过50个新的健康检查
  • Bug修复

 

版本 12.1.0.2.1

  • Windows 支持 (需要Cygwin,查看 附录 O 中 Cygwin 要求)
  • 支持作为“root”的执行,以简化角色分离环境中的执行
  • 将基准比较扩展到集合
  • 使用标签装用户定义的集合名称的功能
  • 从单一的共享位置自我升级
  • 对单实例环境启用ASM检查
  • 新的检查和bug修复

 

版本 2.2.5

  • 对多个数据库并行执行检查
  • 允许通过ORAchk守护进程的多次运行
  • Move away from /tmp as temporary destination, $HOME directory is the new temporary destination (allowed to be overridden by setting RAT_TMPDIR) 从/ tmp作为临时目的地移动,$ HOME目录是新的临时目的地(可以通过设置RAT_TMPDIR覆盖)
  • 对健康检查分数计算包括跳过的检查的增强
  • 对集群范围的检查增强的报告
  • ORAchk 现在通过新的”-upgrade” 选项升级
  • Granular help at the command line option level, for example在命令行选项级别的细粒度帮助,例如:./orachk –profile –h
  • 对预安装检查的新配置文件
  • 单实例升级前/后的最佳实践(升级准备)
  • 集合管理器现在已经与ORAchk (CollectionManager_App.sql)被捆绑
  • 新的检查和 bug 修复,包括

 

o o o

 

版本 2.2.4

数据库层的企业云控制最佳实践

超过40个对Oracle栈的新的健康检查

对电子商务套件的工作流程和Oracle采购的其他产品领域的扩展

 

  • 节点重启(init集成)后ORAchk守护进程自动启动模式
  • 合并多个ORAchk集合报告
  • 根据配置文件排除检查
  • 安装的数据库补丁的上传
  • ORAchk,RACcheck和Exachk 的集合管理器
  • 所有节点上的/ tmp中ORAchk签名文件以验证最后的ORAchk运行
  • 新的检查和bug修复,其中包括

 

o o o

 

版本 2.2.3

30 个Oracle 电子商务 AP模块升级完整性检查

12 个新的数据库检查

8 个新的Solaris系统检查

 

  • 的最佳实践检查(只适用于运行GoldenGate的数据库)
  • 记分卡中数据库整合最佳实践

 

ORAchk 守护进程增强功能,允许除了间隔选项外在特定的日期/时间执行enhancement allowing for execution at specific scheduled dates/times in addition to interval option

  • 如果发现差异,ORAchk守护差异检查的 current 和current-1 报告并邮件通知
  • 基于检查名称排除检查的功能
  • 排除的检查列在HTML报告中
  • 可视化进展的指标被添加以确认在关键点的脚本进展
  • 新的检查和bug修复

 

版本 2.2.2

  • 现在可以作为root用户执行系统管理员配置文件,例如, ./orachk-profile sysadmin
  • 在预定的时间段非交互式自动执行ORAchk 的ORAchk守护进程功能
  • 支持Solaris Sparc 11
  • 升级11.2.0.3,11.2.0.4(尚未发布)和12c(尚未发布)的最佳实践
  • ORAchk输出目录重组
  • 标准健康检查现在包括在升级后
  • 新的检查和bug修复

 

版本 2.2.1

  • 在所有节点并行的执行(对于root检查,需要OS预期工具或SUDO来启用此功能)
  • 使用配置文件来执行检查的子集,例如: DBA,Sysadmin,ASM
  • 比较两个ORAchk的功能
  • 新的检查和bug修复

 

版本 2.2.0

  • 单实例数据库支持(包括Oracle重启)
  • 高可用性检查
  • RAC单个节点支持
  • 添加到数据库报告表以提高灵活性(见附录F)的附加列
  • 新的检查和bug修复

 

版本 2.1.6

  • 新支持的平台:
  • OEL 和 RHEL 6
  • HP-UX (需要BASH shell 3.2 或更高)
  • AIX 7 (需要BASH shell 3.2 或更高)
  • HTML 报告 ADA 合规
  • 新的检查和bug修复

 

版本 2.1.5

 

  • 升级准备检查 (11.2.0.3 目标版本及以上)
  • MAA 记分卡现在默认显示 (使用 -m 参数来压缩)
  • Bug修复和其他一般改进

 

版本 2.1.4

  • 远程数据库支持。orachk将对在除了工具执行节点的节点上运行的数据库实例检查数据库最佳实践
  • Solaris x86-64支持
  • 提升多个数据库版本的支持的加强
  • 新的检查和bug修复

 

版本 2.1.3

  • 11.2.0.3 支持
  • Suse 11 支持
  • MAA 记分卡
  • Bug 修复

 

版本 2.1.2

  • 新的基于 HTML的报告

·       Bug 修复

Oracle Acs资深顾问罗敏 老罗技术核心感悟:失去了一次露脸机会

作者为: 

SHOUG成员 – ORACLE ACS高级顾问罗敏

 

 

某日与Oracle同事一同在某移动公司进行技术交流,涵盖12c、云技术、数据库整合、容灾、OEM等多个专题领域。临近中午时分,一直喷到了Oracle最适合于人工错误恢复的FLASHBACK技术。正在唾沫四溅之际,突然接到客户DBA电话:“罗工,能不能暂停一下技术交流,我们正好有三张表刚被人意外删除了,能不能过来帮忙用你刚刚介绍的FLASHBACK技术把这三张表抢救回来?”

世界上怎么还有这么巧合的事情?已经由不得我有半分迟疑,特别是任何私心杂念了。诸如:“罗工,这不正好让你展现Oracle技术特点,给你次露脸机会了。”。“罗工,你不挺能吹的吗?看你能不能展示真才实学了”… …。于是,我端起笔记本电脑,直奔现场,一边下楼,一边赶紧看FLASHBACK相关资料。俗话说:临阵磨枪,不快也光。呵呵。

销售同事也看出了情形的紧迫和老罗的“窘”态,想尽一切可能在帮忙:帮我拆笔记本电源线,帮我提着矿泉水,更恨不得搀扶着正阅读文档,步履有点蹒跚的老罗同志一同下楼,哈哈!

待我赶到机器旁边时,资料也已经看完了,心中也有底了。于是,在简单询问了问题现象之后,赶脚让第三方公司DBA输入如下命令:

SELECT original_name, object_name,

type, ts_name, droptime, related, space

FROM user_recyclebin

WHERE can_undrop = ‘YES’;

咦,怎么是空?再在sys用户下输入:

Select * from dba_recyclebin;

还是空!怎么回事?难道删除这三张表的客户不是意外操作,而是诚心搞破坏,用了“drop table … purge”命令,或者清空了回收站(Recycle Bin),从而彻底删除了这三张表?与客户进一步确认:这三张表的确是误删除的,没有使用上述命令。

既然如此,为什么回收站没有这三表表的数据呢?稍一思忖,想起来了!Oracle还有个初始化参数(RECYCLEBIN),可控制是否使用FLASHBACK DROP。一检查,果然如此!原来DBA把RECYCLEBIN设置成OFF,从而关闭了FLASHBACK DROP功能。唉!遗憾啊,老罗同志失去了一次露脸的机会,Oracle更失去一次展现技术特点的机会!

本来可以通过“flashback table <table_name> to before drop”一条简单命令,在数秒钟之内就能恢复被误删除表,结果害得客户从生产系统去重新抓取数据,同时恢复被删除的索引、Constraint等数据,整整折腾了一个多小时。客户庆幸的是:幸亏生产系统还有数据,否则叫天不应,喊地不灵。

 

待一切恢复正常了,我还是询问DBA了:“为什么要关闭FLASHBACK DROP功能呢?”回答是:“你们Oracle Flashback太消耗资源了,影响性能,我们不敢打开。”

哦,原来如此。这也是本文的主题:从技术上言,Flashback不是单一技术,而是一个技术家簇。以下就是各种Flashback技术的综合对比:

Flashback技术 主要目的 级别 配置方式 技术原理 恢复期限 适应场景
Flashback Database 快速恢复数据库 数据库级 基于存储在Flashback Recovery Area中的 Flashback log 取决于Flashback Recovery Area容量和db_flashback_retention_target参数
  • 大规模数据误操作
  • 应用测试
  • 与Data Guard综合使用
Flashback Table 整表恢复到指定时间 表级 缺省 基于Undo技术 取决于UNDO表空间大小,UNDO_retention参数
  • 各种DML错误的表级恢复

 

Flashback Query/ DBMS_FLASHBACK包 查询过去时间点的记录 记录级 缺省 基于Undo技术 取决于UNDO表空间大小,UNDO_retention参数
  • 恢复错误记录
  • 对历史记录进行分析、统计
Flashback Drop 快速恢复Drop Table操作 表级 缺省 Recyclebin(该表所在的表空间) 自动管理(FIFO算法)。由表空间的空闲空间确定
  • 错误Drop 表操作
Flashback Versions Query 访问事务历史情况 记录级 缺省 基于Undo技术 取决于UNDO表空间大小,UNDO_retention参数
  • 访问事务历史情况
  • 安全审计
Flashback Transaction Query 查询UNDO语句 记录级 缺省 基于Undo技术 取决于UNDO表空间大小,UNDO_retention参数
  • 查询事务详细情况
  • 查询UNDO_SQL语句
11g Total-Recall(Flashback Data Archive) 历史数据存储和利用 表级 需要配置 基于FDA区域 取决于FDA区域表空间大小
  • 历史数据长久存储
  • 对历史数据的分析、统计
  • 安全审计

各位看见了吗?上述表格中每种Flashback技术原理、目的、是否是缺省配置、适应场景等都是不一样的。没错,某些Flashback技术,特别是Flashback Database是需要进行专门配置的,例如创建Flashback Recovery Area,还会产生大量Flashback log,也的确对性能有一定影响的。但是,很多Flashback技术一方面是缺省配置的,另一方面是基于Undo技术的,并不额外产生资源开销的,对性能的影响也非常有限。例如Flashback Drop技术仅仅在删除表时才会有一定操作,难道我们的系统成天都有Drop Table操作?大家没事天天删表玩儿?不可能吧,呵呵。

唉,这就是国内IT行业的常态之一:不分青红皂白;技术运用简单化;动辄一刀切;缺乏对相关技术的深入研究;什么新特性都不敢用;想当然地自己吓自己……

我们时候才能真正做到严谨、科学、务实、专业、积极、进取,充分评估、大胆运用各种IT新技术、新特性啊?

唉…………………

 

Oracle Acs资深顾问罗敏 老罗技术核心感悟:又一次臭显摆之后的感悟

作者为: 

SHOUG成员 – ORACLE ACS高级顾问罗敏

 

 

  1. 现场直播救火过程

2014年8月初的某一天,突然接到东区服务销售经理电话:“老罗,你明天到上海出差,能否先到XX航空公司去一趟,他们一个重要系统宕机了。”据了解,该客户没有采购Oracle现场ACS服务,按Oracle公司先有鸡后有蛋的政策,我们是不能去现场做任何实质性的服务工作的。但从国情出发,更考虑客户感受和客户关系,作为ACS服务售前顾问去现场协助分析和解决问题,并进一步了解客户现状和需求,也是合情合理的,并不是趁火打劫哦,呵呵。于是,我决定调整行程,改签第二天头个航班,中午就飞到了上海。

在虹桥机场上了出租车之后,一个劲儿给师傅说抱歉的话,因为师傅可能等了几个小时,碰上我这个倒霉鬼,去机场附近的客户现场只需要起步价。师傅还是非常敬业,顶着中午火热的太阳,10分钟就把我拉到了该航空公司的信息中心大楼。

待我到达现场时,客户运维部门领导早已是翘首以待,把我热情引到会议室,更是把整个运维部门和开发单位的几十号人都召集到会议室,而且还有负责应用开发的印度专家。于是,在客户简短地介绍了系统概况和故障情况之后,就让我直接连入该系统,并把我电脑连接到大屏幕上,几十双眼睛开始齐刷刷地现场观摩Oracle顾问如何救火了,老罗同志又要开始一次臭显摆了,呵呵。

 

  1. 现场号脉

说实在的,尽管已经身经百战,但IT系统如此复杂,应用更是如此变化多端,IT新技术也是层出不穷,没有一个专家敢牛烘烘地说手到病除的。但是,分析诊断问题的思路和方式还是相通的,那就是先了解系统概况,然后再了解故障情况,特别是收集故障相关数据,再询问故障前是否有应用或环境的重大变更,再逐步分析和定位问题,并给出最终解决问题方式。以下就是与该系统和故障相关的上述几方面具体情况:

  • 平台及架构情况

运行在2节点的SUN Solaris平台;数据库版本为11.2.0.4 RAC;数据库容量达到1.6TB。

  • 故障现象分析

2014-08-01 14:14左右, 实例1重启;2014-08-01 14:28 实例2重启;2014-08-01 15:15:44 节点一被驱逐。故障发生之前,节点1的内存消耗非常高,达到了100%,并产生了大量SWAP操作。节点2的内存消耗也达到了90%。但客户没有安装OSWatcher,也就是没有采集到故障前后的操作系统数据。同时,RAC、GI的alert.log、crsd.log等日志文件也没有记录下明显的错误数据。

  • 故障前变更情况

经客户介绍,该系统在8月1日之前应用软件安装了新补丁,即新部署了一些应用软件。通过对宕机之前的13:00 – 14:00 AWR报告分析,这些新应用软件中的3条SQL语句非常消耗资源。RAC重启之后,新部署的应用软件进行了回退,目前RAC系统运行平稳。

可见,新应用软件问题可能是导致RAC宕机的重要因素!

  • 应用深入分析

由于新应用很可能是导致RAC宕机的重要原因,而且负责该应用模块开发的印度专家也在现场,于是我们首先对其中一条SQL语句共同进行了深入分析。限于篇幅,我们只摘取如下的主要部分:

首先,该语句非常消耗资源,Buffer Gets和Disk Reads都非常之高,运行时间更是长达555秒。通过对该语句执行计划的分析,我们发现该语句对三个大表进行全表扫描。而导致全表扫描的直接原因是语句中如下部分的UPPER函数的使用:

AND ((CUSDOCINF.DOCTYP = :2 AND UPPER(CUSDOCINF.DOCNUM) = UPPER(:3)) OR

(CUSDOCINF.DOCTYP = :4 AND UPPER(CUSDOCINF.DOCNUM) = UPPER(:5)))

事实上,当我们去掉UPPER函数,或者将OR操作修改为in操作之后,Oracle执行计划非常合理,语句效率非常之高。

可是,待我仔细观察,发现开发人员其实已经设计了UPPER函数索引,而且也采集了统计信息,但为什么Oracle不走函数索引呢?正纳闷之际,印度工程师主动告诉我Oracle Bug 14630247会导致Oracle优化器不选择函数索引,而是采用全表扫描。于是,我马上通过Oracle相关网站分析了Bug 14630247及相关的Bug 14828235 ,特别是阅读了《Bug 14828235 ORA-7445 [evaopn3] from query with Function based index and ORDER BY clause》之后,发现该Bug已经在11.2.0.4中修复,并且该Bug若爆发,应该有ORA-7445错误。但是,上述语句并没有导致ORA-7445错误,而且该系统已经是11.2.0.4版本,因此是否由于是Bug 14630247或Bug 14828235导致,我在现场尚无法判断。于是建议针对该问题,请客户再创建一个SR,由 Oracle GCS和研发部门确认这些Bug是否已经在11.2.0.4 for Solaris平台修复,或者是Bug再次爆发。但作为ACS现场服务团队,我建议在应用层面采取一些Workaround措施来规避该问题,例如是否取消upper函数,或者取消or运算。

好了,与应用相关的问题在现场只能暂时分析到此了。但这是否是导致上述故障的唯一因素呢?即是不是因为这些语句消耗了太多资源,而导致宕机呢?由于客户没有安装OSWatcher,也就是无法获取系统宕机时的操作系统数据,特别是内存和进程数据,因此,尚无法做出准确判断。

 

  1. 发现了更严重问题

除了上述不良应用可能导致内存消耗殆尽的问题之外,RAC环境本身是否有问题呢?于是,我接下来通过Oracle的cluvfy工具对RAC环境进行检查,很快就发现更严重问题了!部分细节如下:

grid@ffpdb01:-bash:~$cluvfy comp sys -n all -p crs -verbose

 

Verifying system requirement

 

Check: Total memory

Node Name     Available                 Required                  Status

————  ————————  ————————  ———-

ffpdb02       96GB (1.00663296E8KB)     2GB (2097152.0KB)         passed

ffpdb01       96GB (1.00663296E8KB)     2GB (2097152.0KB)         passed

Result: Total memory check passed

 

… …

Check: Hard limits for “maximum open file descriptors”

Node Name         Type          Available     Required      Status

—————-  ————  ————  ————  —————-

ffpdb02           hard          8192          65536         failed

ffpdb01           hard          8192          65536         failed

Result: Hard limits check failed for “maximum open file descriptors”

 

… …

Check: Kernel parameter for “tcp_smallest_anon_port”

Node Name     Current                   Required                  Status

————  ————————  ————————  ———-

ffpdb02       32768                     9000                      failed (ignorable)

ffpdb01       32768                     9000                      failed (ignorable)

Result: Kernel parameter check failed for “tcp_smallest_anon_port”

 

Check: Kernel parameter for “tcp_largest_anon_port”

Node Name     Current                   Required                  Status

————  ————————  ————————  ———-

ffpdb02       65535                     65500                     failed (ignorable)

ffpdb01       65535                     65500                     failed (ignorable)

Result: Kernel parameter check failed for “tcp_largest_anon_port”

 

Check: Kernel parameter for “udp_smallest_anon_port”

Node Name     Current                   Required                  Status

————  ————————  ————————  ———-

ffpdb02       32768                     9000                      failed (ignorable)

ffpdb01       32768                     9000                      failed (ignorable)

Result: Kernel parameter check failed for “udp_smallest_anon_port”

 

Check: Kernel parameter for “udp_largest_anon_port”

Node Name     Current                   Required                  Status

————  ————————  ————————  ———-

ffpdb02       65535                     65500                     failed (ignorable)

ffpdb01       65535                     65500                     failed (ignorable)

Result: Kernel parameter check failed for “udp_largest_anon_port”

 

… …

 

Verification of system requirement was unsuccessful on all the specified nodes.

grid@ffpdb01:-bash:~$

 

我的妈呀,原来这个系统的操作系统核心参数和网络参数都没有满足Oracle RAC安装需求,这将严重导致Oracle GI和RAC运行不正常!这很可能是导致RAC宕机的更重要原因。当然,准确而言,应该是外部应用压力陡增,与RAC环境的上述内部存在问题共同导致了宕机故障。

 

  1. 客户的纠结和痛苦

连环境参数都没有配置好,就强行把11g RAC给安装上去了,并带病开始工作了。真牛啊,谁做的?客户领导的回答有点支支吾吾,一会儿说是Oracle公司产品售前部门做的,一会儿又说是Oracle公司硬件部门做的。好了,别深究了,别让领导难堪了。我猜想很可能是找一个第三方本地公司做的安装,而该公司技术人员很可能连Oracle安装文档都没有仔细阅读,具体就是《Oracle® Grid Infrastructure Installation Guide11g Release 2 (11.2) for Oracle Solaris》,更具体就是该文档中的“2.10 Verifying UDP and TCP Kernel Parameters”、“2.11 Checking Resource Limits for Solaris”等小节。唉,很可能是第三方公司技术人员在百度、Google中随便找了篇简洁版的RAC安装短文,就在航空公司这么重要的系统上开练了。

这就是非专业服务团队和原厂专业服务团队的差别,原厂技术人员起码会仔细阅读Oracle官方安装文档,更会以Oracle RAC实施方法论为指导,结合Oracle若干最佳实践经验,在RAC软件和补丁安装、高可用性配置、应用部署等方面展开全面深入的实施,确保数据库RAC实施的高质量。

现在怎么办?是否直接修改几个内存unlimited参数和TCP、UDP参数就能解决问题,确保RAC不宕机了吗?作为现场工程师,毕竟不是产品直接研发者,我无法给出这种承诺。于是,建议客户通过SR进一步寻求Oracle后台服务团队和产品研发部门的确认。但是基于个人以往类似经验,最好的办法是把环境参数重新配置好之后,把RAC系统重新安装一遍。

于是,一方面我提出了重新安装的建议,另一方面为降低对生产系统停机的影响,进一步提出了先安装一个Data Guard 环境,将现有生产系统数据切换到Data Guard环境,再重新安装现有生产系统的11g RAC,并切换回11g RAC的建议。但我这些重新安装建议一出口,立马引来客户领导一阵叹息和苦衷:“系统刚上线还不到一个月,重新安装如何给领导解释?”“唉,你们要是早来一个月,上线前就发现环境问题就好了,那时候重新安装没问题。”

还有更纠结、更痛苦的问题:“罗工,你们Oracle公司能提供这种证据吗?证明我们这次RAC宕机,就是因为环境参数配置不合理导致的?”。这如何证明啊?OSWatcher也没有安装,其它日志文件也没有捕获到有价值的信息。更重要的是,根据以往经验,若发现Oracle软件安装都有问题,Oracle后台根本不会继续进行进一步的分析和诊断,一定会建议客户重新安装软件之后再说。是啊,若A本身就错了,基于A的B也跟着出错了。那Oracle停止分析B,要求先纠正A,再看B的运行情况,太符合逻辑了。

 

  1. 更多的感和悟

除了上述对原厂和第三方厂商在RAC安装和实施方面的专业性和非专业性感慨之外,更多的感悟还有:

  • 千万别小看Oracle软件安装,特别是集群和RAC安装,这的确是一项非常专业化的工作。一个环境参数配置不合理,很可能给系统埋下深深的隐患。
  • 遇到问题和故障的时候,还是应该求真务实,尊重客观规律。不应该过多考虑面子,尤其是领导的评价。把一个事情做得扎扎实实、完完美美,虽然可能付出很大的代价,但最终还是很有面子,领导也会满意的,呵呵。
  • 为Oracle服务部门再做个推销,呵呵。Oracle各种专业化的服务部门,无论是后台提供标准服务的PS部门,还是前台提供现场服务的ACS部门,都是专业化的团队,既相互合作,又相互补充,对客户都是有价值的,都是不可或缺的。以该案例为例,后台PS部门可以充分发挥产品实施分析和与研发部门沟通的优势,而前台ACS部门则通过现场与客户沟通,了解更多系统和应用背景,并帮助客户与PS部门沟通,共同推进问题的分析和解决。
  • 更多的感和悟留给大家… …

 

 

2014年10月6日

沪ICP备14014813号-2

沪公网安备 31010802001379号