MySQL使用存储过程代替子查询

本文作者:东方龙马(广州)  骆伟豪


测试环境 x220 笔记本 , cpu: i5-2520 , 磁盘intel ssd sata2接口 , 就是这么搓的环境 :(

SQL源语句

select *
  from employees e
 inner join (select emp_no, count(*) from salaries group by emp_no) s
    on s.emp_no = e.emp_no
 where e.emp_no between 10001 and 10010;

+----+-------------+------------+------------+-------+----------------+-------------+---------+--------------------+---------+----------+-------------+
| id | select_type | table      | partitions | type  | possible_keys  | key         | key_len | ref                | rows    | filtered | Extra       |
+----+-------------+------------+------------+-------+----------------+-------------+---------+--------------------+---------+----------+-------------+
|  1 | PRIMARY     | e          | NULL       | range | PRIMARY        | PRIMARY     | 4       | NULL               |      10 |   100.00 | Using where |
|  1 | PRIMARY     | <derived2> | NULL       | ref   | <auto_key0>    | <auto_key0> | 4       | employees.e.emp_no |      10 |   100.00 | NULL        |
|  2 | DERIVED     | salaries   | NULL       | index | PRIMARY,emp_no | emp_no      | 4       | NULL               | 2694129 |   100.00 | Using index |
+----+-------------+------------+------------+-------+----------------+-------------+---------+--------------------+---------+----------+-------------+
+--------+------------+------------+-----------+--------+------------+--------+----------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  | emp_no | count(*) |
+--------+------------+------------+-----------+--------+------------+--------+----------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |  10001 |       17 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |  10002 |        6 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |  10003 |        7 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |  10004 |       16 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |  10005 |       13 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |  10006 |       12 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |  10007 |       14 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |  10008 |        3 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |  10009 |       18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |  10010 |        6 |
+--------+------------+------------+-----------+--------+------------+--------+----------+
10 rows in set (1.00 sec)

  • id=2开始就先执行salaries 表的子查询 , 可以看出红色字部分是临时索引,5.6开始就有这个功能,这个临时索引是在内存生成的,如果返回数据量大占用内存越多,表之间关联性能就下降,也有可能把内存涨满 , 最终用了1秒执行效率

  • 现在想把这个salaries表的子查询跟employees表同一时间执行,并且达到性能效率提升

  • 创建一个存储过程另外关联这个salaries,如下:

create FUNCTION t1(in_emp_no int ) RETURNS INT
BEGIN
DECLARE a1 int ;
select count(*) into a1 from salaries where emp_no = in_emp_no group by emp_no;
RETURN a1;
end;
mysql> explain select e.* , t1(e.emp_no) from employees e where e.emp_no BETWEEN 10001 and 10010 and t1(e.emp_no);
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | e     | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |   10 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

变成了只有一个表运行,而salaries 和 employees 关联在存储过程执行, 至于怎样从mysql核心看它执行这个稍后揭晓 , 最终使用了0.01秒执行 , 记住这是5年前的x220哦

+--------+------------+------------+-----------+--------+------------+--------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  | t1(e.emp_no) |
+--------+------------+------------+-----------+--------+------------+--------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |           17 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |            6 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |            7 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |           16 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |           13 |
|  10006 | 1953-04-20 | Anneke     | Preusig   | F      | 1989-06-02 |           12 |
|  10007 | 1957-05-23 | Tzvetan    | Zielinski | F      | 1989-02-10 |           14 |
|  10008 | 1958-02-19 | Saniya     | Kalloufi  | M      | 1994-09-15 |            3 |
|  10009 | 1952-04-19 | Sumant     | Peac      | F      | 1985-02-18 |           18 |
|  10010 | 1963-06-01 | Duangkaew  | Piveteau  | F      | 1989-08-24 |            6 |
+--------+------------+------------+-----------+--------+------------+--------------+
10 rows in set (0.01 sec)
发表在 MySQL | 留下评论

用DBLINK的注意:Mandatory Patching Requirement for Database Versions 11.2.0.3 or Earlier, Using DB Links (文档 ID 2335265.1)

APPLIES TO:

Oracle Database – Enterprise Edition – Version 11.1.0.7 to 12.2.0.1 [Release 11.1 to 12.2]
Oracle Database – Standard Edition – Version 11.1.0.7 to 12.2.0.1 [Release 11.1 to 12.2]
Information in this document applies to any platform.

PURPOSE

This support note provides additional info related to mandatory patching/upgrade of all supported releases of Oracle Databases to a minimum patchset/PSU level before April 2019. 

SCOPE

 The document is intended for all DBAs.

DETAILS

All supported releases of Oracle Databases need to be patched to a minimum patchset/PSU level before April 2019 to ensure proper functioning of database links. This note only applies to Database Server installations and the interoperability of database clients with database servers is not impacted by this patch.

1. What are the minimum recommended patchset/PSU/BP/RU levels?

For all database releases prior to 12.2.0.1, ensure that all interconnected databases are in the below mentioned patchset/ PSU/BP levels or above:

Mandatory patch levels

Patch Name

 

Release Data

 

Patch Number

 

12.1.0.2.0 PATCH SET FOR ORACLE DATABASE SERVER

09/01/15

 

Patch 17694377 

11.2.0.4.0 PATCH SET FOR ORACLE DATABASE SERVER

08/27/13

 

Patch 13390677 

DATABASE PATCH SET UPDATE 11.2.0.3.9 (INCLUDES   CPUJAN2014)

01/14/14

 

Patch 17540582

DATABASE PATCH SET UPDATE 11.1.0.7.20 (INCLUDES   CPUJUL2014)

07/14/14

 

Patch 18522513 

ORACLE 11G 11.2.0.3 PATCH 28 BUG FOR WINDOWS

**Patch 28 is withdrawn. Apply Patch 29 or above.

02/26/14

 

Patch 17906982 (Win   x64) | Patch 17906981 (Win   32-Bit)

 ** Patch 29 Patch 18075406 (Win   x64) | Patch 18075405 (Win   32-Bit)

ORACLE 11G 11.1.0.7 PATCH 57 BUG FOR WINDOWS

07/15/14

 

Patch 18944208 (Win   x64) | Patch 18944207 (Win   32-Bit)

QUARTERLY DATABASE PATCH FOR EXADATA (JAN 2014 –   11.2.0.3.22)

01/14/14

 

Patch 17747147 

In summary, 12.2.0.1 and higher releases, 11.2.0.4 and 12.1.0.2 patchsets have this fix included, while patches are available for 11.1.0.7 and 11.2.0.3 releases. If you have any other database server installations (e.g. 10.2.0.5, 11.2.0.2), you should upgrade such databases if you would like the older databases to continue using database links with newer versions of databases.

Patching the older versions is mandatory *only* if you want to have a db link connection to a latest release or patched database.


2. What is the timeline for moving to the minimum recommended patchset/PSU/BP mentioned?

All databases should be at the above mentioned release/patchset/ PSU/BP levels (or above) before April 2019.

 

3. What is the change introduced by the patches listed above?

The patches listed above make the older databases capable of supporting increased SCN soft limit (i.e. support transactions with higher SCN rate) though the increased SCN soft limit only becomes effective at a later time (after April 2019).


4. What happens if the mandatory PSU / patchset is not applied?

If either the source or target database using database links is not patched/upgraded to the right patchset/PSU level, you may get run-time errors during database link operations after April 2019. In order to resolve the errors, you would immediately need to patch/upgrade the databases. 


5. What about databases that are 10.2 or older, which are not listed in the table?

Please ensure that you don't have any database link (incoming or outgoing) between earlier versions of databases (e.g. 10.2) and the database releases/patches mentioned in this document (Under Sec 1. What are the minimum recommended patchset/PSU/BP/RU levels? ) as we don't plan to release patches for those unsupported versions of databases. If you continue to have such database links after April 2019, you may get run-time errors during database link operations and you would need to disconnect those database links at that time.


 6. How can I check the details regarding the dblinks to and from a database?

In order to identify database links, please review "Viewing Information About database Links" in Database Administrator's guide. 

Please note that outgoing db links from a database can be identified via DBA_DB_LINKS view for all database releases.

select * from dba_db_links;

For 12.1 and later releases, you can also find out about incoming database links via DBA_DB_LINK_SOURCES view.

select * from dba_db_link_sources;


7. Will there be any issues with the db links connecting two unpatched databases ? Or databases of older versions?

The dblink connections involving two unpatched databases or two older releases are not directly affected by this change. Having said that, we do recommend to apply the patches or upgrade the database as per the table above. The patches listed above are recommended inline with the features available in the future releases.


 8. Will the dblinks involving a patched and an unpatched database, stop working immediately after April 2019? 

DB Links won't become unusable immediately after April 2019. But might encounter errors (for some cases) at any point of time, after April 2019.

 

9. What should I do, if the dblink connection from an older version database to a latest (or patched) version database fails, after April 2019?

Upgrade the older version database to any patch level mentioned in the table – Mandatory patch levels.


10. What do we need to do for 11.2.0.4, 12.1.0.2 and 12.2.0.1 database releases?

No action is necessary. All the fixes needed are already included in these releases.


11. Support and Questions

If you have any queries please post them in the Database community page: https://community.oracle.com/message/14710245#14710245


发表在 Oracle, ORACLE基础与管理 | 留下评论

记一次由于BUG原因引发的性能故障分析与处理案例

本文作者:东方龙马(广州)  阮文强


一般情况下,对于ORACLE数据库来说,一说到性能问题,我们都是联想到是否SQL执行出现了性能问题?是否配置不合理?是否CPUIO等操作系统资源使用出现问题?但最近我们遇到了一个由于ORACLE BUG引发的数据库性能问题。

背景:用户反馈有一套系统运行很慢,包括所有的操作如一般的登录、查询、编辑、报表输出都突然变得很慢,开发人员和运维人员都做了相关的检查和一般分析,但都没发现任何可疑的地方,开发人员还对中间件tomcat服务器进行了重启,运维人员也对ORACLE数据库服务重启。重启后,系统仍然很慢,最终用户不断的抱怨。

根据技术人员的反映和之前的操作,我们第一分析就是检查分析当前系统资源使用情况,发现包括CpuIO、内存均使用正常,然后开始把焦点放在数据库本身。

首先,从数据库中抓取AWR报告,确认一下整体上的性能问题,整体数据库时间消耗如下

 

 

Snap Id

Snap Time

Sessions

Cursors/Session

Begin Snap:

21589

28-Dec-12 09:00:23

107

3.9

End Snap:

21590

28-Dec-12 10:00:25

131

4.0

Elapsed:

60.04 (mins)

DB Time:

532.21 (mins)

我们可以看到,一共收集了60分钟的报告,DB TIME即数据库实际运行时间占到了532分钟,即相当于差不多9个线程核的CPU满负载运行。根据我们对这套系统了解,业务量一般不大,数据库压力也不大,我们暂时确认是数据库整体上性能问题,并判断可能是锁(包括lock锁和Latch锁)资源等待问题,然后进一步看等待事件:

Event

Waits

Time(s)

Avg wait (ms)

% DB time

Wait Class

row cache lock

5,919

27,841

4704

87.19

Concurrency

DB CPU

754

2.36

cursor: pin S wait on X

268

510

1904

1.60

Concurrency

direct path read

46,380

39

1

0.12

User I/O

log file sync

9,699

12

1

0.04

Commit

参考:row cache lock 解释:

Row Cache Lock

When DDLs execute, it must acquire a row cache latch to lock the Data Dictionary information. The shared pool contains a cache of rows from the data dictionary that helps reduce physical I/O to the data dictionary tables.  This allows locking of individual data dictionary rows. 

我们根据后台等待事件发现,row cache lock等待事件占了87%以上,占了运行时间27841秒,相当于约450分钟以上,占了所有运行时间的约87%27841/(532*60)=87.2%)。理论上这个事件是不能出现在TOP 5事件中的,说明当前系统性能差、数据库运行时间消耗时间长都是由row cache lock等待事件引发起。我们再去看整体时间使用模型:

Time Model Statistics

Statistic Name

Time (s)

% of DB Time

parse time elapsed

25,552.00

80.02

hard parse elapsed time

24,988.46

78.25

sql execute elapsed time

6,906.29

21.63

根据时间模型数据,可以看到60分钟之内,用于SQLPLSQL解释的时间就占了80%以上,即25552秒,我们可以推测出由于与共享池相关的row cache lock等待事件导致了SQL解释出现问题,并最终大量的SQL运行变成缓慢,从于引发了系统的整体上性问题。

根据上面的分析数据,我们第一步就是先确认数据库配置是否存在问题,对于我们认为不合理的配置,就是调整到相对合理或我们认为合理的配置。对于当前的配置数据,我们主要对SGA和相关的内存组件进行了调整,调整配置如下:

*.pga_aggregate_target=2147483648

*.sga_max_size=9663676416

*.db_cache_size=6442450944

*.shared_pool_size=2147483648

*.java_pool_size=16777216

*.large_pool_size=33554432

同时,对操作系统内核的一些参数据进行了调整:

kernel.shmmax =34359738368   —-这个值一般为物理内存大小

kernel.shmall = 8388608 —这个值如果物理内存为32G,配置为8388608,如果为16G,配置为 4194304 

通过调整后,根据对数据库的监控,系统性能有一点提升,可没从实质上解决整体上系统慢的性能问题。

我们继续深入分析,通过hanganalyz level 3进行跟踪,得到相关TRACE文件,关键内容如下:

===============================================================================

HANG ANALYSIS DUMPS:

  oradebug_node_dump_level: 3

===============================================================================

 State of LOCAL nodes

([nodenum]/cnode/sid/sess_srno/session/ospid/state/[adjlist]):

[101]/1/102/269/0x29c6a57f0/942/NLEAF/[349]

[154]/1/155/56/0x2986f7ab0/1011/NLEAF/[349]

[156]/1/157/167/0x2906ca730/32565/NLEAF/[349]

[164]/1/165/1438/0x2906c4a50/32563/NLEAF/[349]

[204]/1/205/7/0x29871a7f0/32567/NLEAF/[349]

[215]/1/216/57/0x294754cb8/24614/NLEAF/[349]

[301]/1/302/4/0x29c730cf0/1008/NLEAF/[349]

[347]/1/348/810/0x29c7568a0/1006/NLEAF/[349]

[349]/1/350/3647/0x2947c8e38/29538/LEAF_NW/

[444]/1/445/809/0x2907a4200/30153/NLEAF/[349]

[492]/1/493/57/0x2987f42c0/19088/NLEAF/[204]

[542]/1/543/28/0x298817000/451/NLEAF/[349]

[548]/1/549/647/0x2907e6e10/20635/NLEAF/[349]

[589]/1/590/8/0x29c80a7c0/453/NLEAF/[349]

[691]/1/692/57/0x2948c27d8/1004/SINGLE_NODE/

[694]/1/695/2/0x290852440/32569/NLEAF/[349]

[705]/1/706/297/0x29c844880/1002/NLEAF/[349]

我们发现,当前大量的会话都是在等待nodenum=349(session id=350)的会话,然后再看具体会话TRACE信息,如下:

Chain 1:

——————————————————————————-

    Oracle session identified by:

    {

                instance: 1 (pdm.pdm)

                   os id: 942

              process id: 20, oracle@pdm-db (S018)

              session id: 102

        session serial #: 269

    }

    is waiting for 'row cache lock' with wait info: 当前会话在等待row cache lock 锁!

    {

                      p1: 'cache id'=0x7

                      p2: 'mode'=0x0

                      p3: 'request'=0x3

            time in wait: 1.388647 sec

           timeout after: never

                 wait id: 124340

                blocking: 0 sessions

             current sql: SELECT  cpcitem.itemid,cpcitem.invorgid,cpcitem.rev,cpcitem.revlabel,cpcitem.itemcode,cpcitem.itemcode2,cpcitem.keycid, cpcitem.ite

mname,cpcitem.itemtranflag,cpcitem.wfid,cpcitem.wfflag,cpcitem.stat,cpcitem.extwg, cpcitem.itemename,cpcitem.itemdesc,drawid,cpcitem.lifecycle,cpcitem.stat,c

pcitem.actived,cpcitem.firstuse

             short stack: ksedsts()+461<-ksdxfstk()+32<-ksdxcb()+1782<-sspuser()+112<-__restore_rt()<-semtimedop()+10<-skgpwwait()+156<-ksliwat()+1821<-kslwa

itctx()+162<-kqrget()+851<-kqrLockAndPinPo()+630<-kqrpre1()+765<-kkdlGetUserId()+391<-kkdlgui()+51<-qcdlSynonymTranslation()+295<-qcdlgbo()+2715<-qcdlgob()+7

47<-qcsfgob()+241<-qcsprfro()+515<-qcsprfro_tree()+325<-qcsprfro_tree()+394<-qcspafq()+107<-qcspqbDescendents()+261<-qcspqb()+200<-kkmdrv()+182<-opiSem()+162

4<-opiDeferredSem()+400<-opitca()+258<-kksFullTypeCheck()+34<-rpiswu2()+15

            wait history:

              * time between current wait and wait #1: 0.001613 sec

              1.       event: 'SQL*Net message from client'

                 time waited: 0.000013 sec

                     wait id: 124339          p1: 'driver id'=0x4d545300

                                              p2: '#bytes'=0x1

              * time between wait #1 and #2: 0.000008 sec

              2.       event: 'SQL*Net message from client'

                 time waited: 0.000919 sec

                     wait id: 124338          p1: 'driver id'=0x4d545300

                                              p2: '#bytes'=0x1

              * time between wait #2 and #3: 0.000537 sec

              3.       event: 'SQL*Net message to client'

                 time waited: 0.000004 sec

                     wait id: 124337          p1: 'driver id'=0x4d545300

                                              p2: '#bytes'=0x1

    }

    and is blocked by被SID=350的会话阻塞

 => Oracle session identified by:

    {

                instance: 1 (pdm.pdm)

                   os id: 29538

              process id: 44, oracle@pdm-db (S003)

              session id: 350

        session serial #: 3647

    }

    which is not in a wait: –350当前执行的会话为空,说明该会话在空等待.

    {

               last wait: 9.998092 sec ago

                blocking: 15 sessions

             current sql: <none>

             short stack: ksedsts()+461<-ksdxfstk()+32<-ksdxcb()+1782<-sspuser()+112<-__restore_rt()<-__poll()+47<-ntevpque()+100<-ntevque()+516<-nsevwait()+

10150<-ksnwait()+77<-ksliwat()+10630<-kslwaitctx()+162<-kslwait()+141<-kmcgms()+8312<-opitsk()+11293<-opiino()+958<-opiodr()+1149<-opirip()+1418<-opidrv()+60

3<-sou2o()+103<-opimai_real()+266<-ssthrdmain()+214<-main()+201<-__libc_start_main()+244<-_start()+36

            wait history:

              1.       event: 'SQL*Net message from client'

                 time waited: 0.000003 sec

                     wait id: 3               p1: 'driver id'=0x4d545300

                                              p2: '#bytes'=0x1

              * time between wait #1 and #2: 0.000023 sec

              2.       event: 'SQL*Net message from client'

                 time waited: 0.001727 sec

                     wait id: 2               p1: 'driver id'=0x4d545300

                                              p2: '#bytes'=0x1

              * time between wait #2 and #3: 0.000024 sec

              3.       event: 'SQL*Net message to client'

                 time waited: 0.000046 sec

                     wait id: 1               p1: 'driver id'=0x4d545300

                                              p2: '#bytes'=0x1

    }

 

Chain 1 Signature: <not in a wait><='row cache lock'

Chain 1 Signature Hash: 0xccefbfc0

从上面的信息我们发现,上面row cache lock 的引发主要是由于在执行常规SQL语句等待另一个会话(SID=350)释放相关资源,可我们发现SID=350的会话当前却未执行任何SQL,而且是空闲等待,这是非常不合理的。

这时,我们可以初步确认:当前的性能问题和相关的SQL执行并没有直接联系,很大概率是ORACLE的内部运行机制出现问题,即可能是BUG的问题!

我们通过METALINK发现该问题进一步确认是BUG方面的问题,如下:

Applies to:

Oracle Server – Enterprise Edition – Version: 11.2.0.1 to 11.2.0.1 – Release: 11.2 to 11.2
Information in this document applies to any platform.

Symptoms

Critical database slows down with 'row cache lock' as the highest event in the "Top 5 timed events" in the AWR report.

Cause

Bug 9875364: ROW CACHE LOCK AT DC_USERS DURING LOGIN
Base Bug 9720182: DUE TO ROW CACHE LOCK WAIT EVENTS IN DATABASE APPLICATION GOT HUNG.

System state dumps analysis:

PROCESS 241:
ksedsts()+644<-ksdxfstk()+44<-ksdxcb()+1612<-sspuser()+116<-44f0<-skgpwwait()+188<-ksliwat()+3816<-kslwaitctx()+536<-kqrget()+1648<-kqrLockAndPinPo()+644<-kqrpre1()+1716<-ktatminextsz()+568<-qerhjComputeFanoutAndBPS()+416<-qerhjComputeHjParameters()+844<-qerhjInitializeManagementComponents()+952<-qerhjFetch()+164<-opifch2()+6948<-opifch()+60<-opiodr()+3320<-ttcpip()+4628<-opitsk()+6932<-opiino()+2804<-opiodr()+3320<-opidrv()+1172<-sou2o()+192<-opimai_real()+428<-ssthrdmain()+324<-main()+216<-__start()+152
 SO: 0x7000005f2fa8870, type: 4, owner: 0x7000005f5b59868, flag: INIT/-/-/0x00 if: 0x3 c: 0x3
  proc=0x7000005f5b59868, name=session, file=ksu.h LINE:11467 ID:, pg=0
 (session) sid: 5258 ser: 1685 trans: 0x7000005d72a1980, creator: 0x7000005f5b59868
           flags: (0x100041) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
           flags2: (0x40008) -/-
           DID: , short-term DID:
           txn branch: 0x0
           oct: 3, prv: 0, sql: 0x7000005aac10970, psql: 0x7000005aac10970, user: 33/FIN_LEA
 ksuxds FALSE at location: 0
 service name: SYS$USERS
 client details:
   O/S info: user: SYSTEM, term: FASAPP001, ospid: 7704:13132
   machine: HBCTXDOM\FASAPP001 program: ifweb90.exe
   application name: ifweb90.exe, hash value=547528115
 Current Wait Stack:
  0: waiting for 'row cache lock'
     cache id=0x7, mode=0x0, request=0x3
     wait_id=4890 seq_num=4891 snap_id=1
     wait times: snap=0.203345 sec, exc=0.203345 sec, total=0.203345 sec
     wait times: max=6.000000 sec, heur=0.203345 sec
     wait counts: calls=2 os=2
     in_wait=1 iflags=0x15a2
    
Process 241 is executing sql: 0x7000005aac10970. The text of this statement is not dumped in the trace.
and is waiting for shared lock on object=7000005b7e310c8 which is actually a dc_users object:
    SO: 0x70000059786e2d0, type: 71, owner: 0x70000059c38a3c0, flag: INIT/-/-/0x00 if: 0x1 c: 0x1
     proc=0x7000005f5b59868, name=row cache enqueues, file=kqr.h LINE:2019 ID:, pg=0
    row cache enqueue: count=1 session=7000005f2fa8870 object=7000005b7e310c8, request=S
    savepoint=0x112f
    row cache parent object: address=7000005b7e310c8 cid=7(dc_users)
    hash=56118fed typ=11 transaction=7000005d6ed9120 flags=00000002
    own=7000005b7e31190[70000059b684b50,70000059b684b50] wat=7000005b7e311a0[7000005a2a1e5e0,7000005b5bc8d60] mode=X

It is not clear which process holds this object in an incompatible mode. This is most probably because it has been released quickly, so when we came to dump the holder process, it was no longer holding it but released it.

Looked into other processes which are waiting for 'row cache lock' and found that "seconds since wait started" is too short. As the above sample process 241 shows, this was only 0.203345 seconds.

The call stack of process 241 includes:
kslwaitctx kqrget kqrLockAndPinPo kqrpre1

This looks like Bug 9875364 which was marked by the development team as duplicate of Bug 9720182.

Solution

This bug is fixed in 11.2.0.2.
Fix of Base Bug 9720182 was superseeded by that of Bug 9776608.Please apply Patch 9776608 if database version is less then 11.2.0.2.

注:具体见METALINK DOC ID1162566.1     

从上面的信息我们发现,当前系统问题与BUG 9776608有一定的符合性:

Ø  当前版本都是11.2.0.0.1

Ø  出现大量row cache lock,而且都是短的大量的row cache lock等待。

Ø  通过进一步分析系统底层调用都是ksedsts()+644<- ksdxfstk() +44<- ksdxcb()……等函数开头。

根据文档要求,该问题可升级到11.2.0.2以上版本或安装补丁包patch9776608解决问题。

随后,我们配合运维人员进行系统ORACLE数据库基于PSU补丁升级:

1)   考虑到当前系统最新版本,我们直接把数据库升级到11.2.0.3.4版本。

2)   考虑到系统升级的安全性,我们先对测试环境进行PSU补丁的升级,然后再对正式环境进行升级。

完成升级后,对系统进行监控,确认性能问题得到彻底解决!

附录:问题解决后前后性能对比解释

Snap Id

Snap Time

Sessions

Cursors/Session

Begin Snap:

21828

07-Jan-13 09:00:17

81

2.7

End Snap:

21829

07-Jan-13 10:00:26

95

3.2

Elapsed:

60.15 (mins)

DB Time:

59.09 (mins)

       我们同样收集系统相对压力比较大的时间段1小时的工作日志,DBTIME 只运行 59分钟,为存在性能问题时间段(之前同一时间段DBTIME532分钟)的10分之一左右。

Event

Waits

Time(s)

Avg wait (ms)

% DB time

Wait Class

DB CPU

701

19.78

virtual circuit wait

51,595

37

1

1.03

Network

db file sequential   read

6,676

24

4

0.68

User I/O

db file scattered read

4,163

20

5

0.56

User I/O

library cache lock

9

17

1895

0.48

Concurrenc

TOP 5事件中,不再存在row cache lock等待事件!

Time Model Statistics

Statistic Name

Time (s)

% of DB Time

connection   management call elapsed time

2,802.13

79.04

DB CPU

701.34

19.78

sql   execute elapsed time

473.92

13.37

parse   time elapsed

218.52

6.16

hard   parse elapsed time

176.29

4.97

在整个系统时间模型中,解释的时间仅占到数据库运行时间的6.16%,比之前的80%以上下降了75%以上。

发表在 Oracle, ORACLE性能分析, 客户案例 | 留下评论

Linux系统静默安装Oracle11gR2 RAC操作手册

本文作者:东方龙马(上海)  张祺


1 静默安装grid软件

手动检测环境配置是否准备完毕

在grid安装目录中运行脚本,检测环境是否符合grid的安装标准

[grid@NODE1 grid]$ ./runcluvfy.sh stage -pre crsinst -n node1,node2 -verbose >/tmp/grid_check.log

查看日志more /tmp/grid_check.log

Check: Package existence for "pdksh"
  Node Name     Available                 Required                  Status
  ------------  ------------------------  ------------------------  ----------
  BCMSDBS01     missing                   pdksh-5.2.14              failed
  BCMSDBS02     missing                   pdksh-5.2.14              failed
Result: Package existence check failed for "pdksh"
......................
.....................
Checking consistency of file "/etc/resolv.conf" across nodes
File "/etc/resolv.conf" does not exist on any node of the cluster. Skipping further checks
File "/etc/resolv.conf" is consistent across nodes

除了以上两个错误外,其他的应该都是passed

手动建立grid用户的SSH用户等效性配置 

节点1:
# su - grid
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ ssh-keygen -t rsa
enter
enter
enter
$ ssh-keygen -t dsa
enter
enter
enter
节点2:
# su - grid
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ ssh-keygen -t rsa
enter
enter
enter
$ ssh-keygen -t dsa
enter
enter
enter
节点1:
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 
$ ssh BCMSDBS02 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
yes
BCMSDBS02的密码
$ ssh BCMSDBS02 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
BCMSDBS02的密码
$ scp ~/.ssh/authorized_keys BCMSDBS02:~/.ssh/authorized_keys
验证ssh用户等效性(在2个节点都要执行)
ssh BCMSDBS01 date
ssh BCMSDBS02 date

准备GI安装的模板响应文件

响应文件模板: 

# Do not change the following system generated value. 
#------------------------------------------------------------------------------
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v11_2_0
ORACLE_HOSTNAME=BCMSDBS01
INVENTORY_LOCATION=/oraapp/grid/oraInventory
SELECTED_LANGUAGES=en,zh_CN,zh_TW
oracle.install.option=CRS_CONFIG
ORACLE_BASE=/oraapp/grid/gridbase
ORACLE_HOME=/oraapp/grid/gridhome
oracle.install.asm.OSDBA=asmdba
oracle.install.asm.OSOPER=asmoper
oracle.install.asm.OSASM=asmadmin
oracle.install.crs.config.gpnp.scanName=BCMSDBS-SCAN
oracle.install.crs.config.gpnp.scanPort=1521
oracle.install.crs.config.clusterName=BCMSDBS-cluster
oracle.install.crs.config.gpnp.configureGNS=false
oracle.install.crs.config.gpnp.gnsSubDomain=
oracle.install.crs.config.gpnp.gnsVIPAddress=
oracle.install.crs.config.autoConfigureClusterNodeVIP=false
oracle.install.crs.config.clusterNodes=BCMSDBS01:BCMSDBS01-vip,BCMSDBS02:BCMSDBS02-vip
oracle.install.crs.config.networkInterfaceList=bond0:200.31.43.0:1,bond1:10.0.0.0:2
oracle.install.crs.config.storageOption=ASM_STORAGE
oracle.install.crs.config.sharedFileSystemStorage.diskDriveMapping=
oracle.install.crs.config.sharedFileSystemStorage.votingDiskLocations=
oracle.install.crs.config.sharedFileSystemStorage.votingDiskRedundancy=NORMAL
oracle.install.crs.config.sharedFileSystemStorage.ocrLocations=
oracle.install.crs.config.sharedFileSystemStorage.ocrRedundancy=NORMAL
oracle.install.crs.config.useIPMI=false
oracle.install.crs.config.ipmi.bmcUsername=
oracle.install.crs.config.ipmi.bmcPassword=
oracle.install.asm.SYSASMPassword=grid
oracle.install.asm.diskGroup.name=OCRDG
oracle.install.asm.diskGroup.redundancy=NORMAL
oracle.install.asm.diskGroup.AUSize=1
oracle.install.asm.diskGroup.disks=/dev/mapper/mpathcp1,/dev/mapper/mpathdp1,/dev/mapper/mpathfp1
oracle.install.asm.diskGroup.diskDiscoveryString=/dev/mapper/*
oracle.install.asm.monitorPassword=grid
oracle.install.crs.upgrade.clusterNodes=
oracle.install.asm.upgradeASM=false
oracle.installer.autoupdates.option=SKIP_UPDATES
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=
PROXY_HOST=
PROXY_PORT=0
PROXY_USER=
PROXY_PWD=

模板中以下参数需要根据实际情况修改:

Scan IP 需要根据实际情况修改

oracle.install.crs.config.gpnp.scanName=NODE-SCAN
oracle.install.crs.config.clusterName= NODE-cluster

Cluster 的名称需要根据实际的情况,指定vip和网卡信息

oracle.install.crs.config.clusterNodes=node1:node1-vip,node2:node2-vip
oracle.install.crs.config.networkInterfaceList=bond0:200.31.43.0:1,bond1:10.0.0.0:2

ASM需要根据实际情况设置相对应的磁盘

oracle.install.asm.diskGroup.AUSize=1
oracle.install.asm.diskGroup.disks=/dev/mapper/mpathcp1,/dev/mapper/mpathdp1,/dev/mapper/mpathfp1
oracle.install.asm.diskGroup.diskDiscoveryString=/dev/mapper/*

密码设置:(可以设置的复杂一点,否则后续安装的时候会有警告信息)

oracle.install.asm.SYSASMPassword=grid_123
oracle.install.asm.monitorPassword=grid_123

通过模板安装GI

请使用grid用户在1号节点上执行以下命令

./runInstaller -ignorePrereq -silent -force -responseFile /home/grid/grid.rsp -showProgress
Starting Oracle Universal Installer...
 
Checking Temp space: must be greater than 120 MB.   Actual 17127 MB    Passed
Checking swap space: must be greater than 150 MB.   Actual 7951 MB    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2015-06-12_10-56-07AM. Please wait ...
You can find the log of this install session at:
 /oraapp/grid/oraInventory/logs/installActions2015-05-22_03-48-54PM.log
The installation of Oracle Grid Infrastructure was successful.
Please check '/oraapp/grid/oraInventory/logs/silentInstall2015-05-22_03-48-54PM.log' for more details.
 
As a root user, execute the following script(s):
        1. /oraapp/grid/oraInventory/orainstRoot.sh
        2. /oraapp/grid/gridhome/root.sh
 
Execute /oraapp/grid/oraInventory/orainstRoot.sh on the following nodes:
[node1, node2]
Execute /oraapp/grid/gridhome/root.sh on the following nodes:
[node1, node2]
 
As install user, execute the following script to complete the configuration.
        1. /oraapp/grid/gridhome/cfgtoollogs/configToolAllCommands
 
        Note:
        1. This script must be run on the same system from where installer was run. 
        2. This script needs a small password properties file for configuration assistants that require passwords (refer to install guide documentation).

在输出内容的最后会先要求在两个节点中运行分别运行脚本

        1. /oraapp/grid/oraInventory/orainstRoot.sh
        2. /oraapp/grid/gridhome/root.sh

一定要先在本地节点运行完两个脚本之后,再在另外一个节点运行两个脚本。

Node1上运行脚本结果:

[root@node1 ~]# /oraapp/grid/oraInventory/orainstRoot.sh
Changing permissions of /oraapp/grid/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /oraapp/grid/oraInventory to oinstall.
The execution of the script is complete.

[root@NODE1 ~]# /oraapp/grid/gridhome/root.sh
Check /oraapp/grid/gridhome/install/root_node1_2015-05-22_16-00-41.log for the output of root script

脚本内容不会直接输出在控制台上,可以通过日志跟踪运行结果:

[root@node1~]#tail -f /oraapp/grid/gridhome/install/root_node1_2015-05-22_16-00-41.log
Performing root user operation for Oracle 11g
The following environment variables are set as:
    ORACLE_OWNER= grid
    ORACLE_HOME=  /oraapp/grid/gridhome
Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
Using configuration parameter file: /oraapp/grid/gridhome/crs/install/crsconfig_params
Creating trace directory
User ignored Prerequisites during installation
OLR initialization - successful
  root wallet
  root wallet cert
  root cert export
  peer wallet
  profile reader wallet
  pa wallet
  peer wallet keys
  pa wallet keys
  peer cert request
  pa cert request
  peer cert
  pa cert
  peer root cert TP
  profile reader root cert TP
  pa root cert TP
  peer pa cert TP
  pa peer cert TP
  profile reader pa cert TP
  profile reader peer cert TP
  peer user cert
  pa user cert
Adding Clusterware entries to upstart
CRS-2672: Attempting to start 'ora.mdnsd' on 'node1'
CRS-2676: Start of 'ora.mdnsd' on node1 succeeded
CRS-2672: Attempting to start 'ora.gpnpd' on 'node1'
CRS-2676: Start of 'ora.gpnpd' on node1 succeeded
CRS-2672: Attempting to start 'ora.cssdmonitor' on 'node1'
CRS-2672: Attempting to start 'ora.gipcd' on 'node1'
CRS-2676: Start of 'ora.cssdmonitor' on 'node1' succeeded
CRS-2676: Start of 'ora.gipcd' on 'node1' succeeded
CRS-2672: Attempting to start 'ora.cssd' on 'node1'
CRS-2672: Attempting to start 'ora.diskmon' on 'node1'
CRS-2676: Start of 'ora.diskmon' on 'node1' succeeded
CRS-2676: Start of 'ora.cssd' on 'node1' succeeded
ASM created and started successfully.
Disk Group OCRDG created successfully.
clscfg: -install mode specified
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
CRS-4256: Updating the profile
Successful addition of voting disk 77ccfaf092f24f95bf932bee81082720.
Successful addition of voting disk 79c900a0e5264f6cbfa05b7f0287ec07.
Successful addition of voting disk 8d8a3b1a18b84f6abfb6bcde5083940c.
Successfully replaced voting disk group with +OCRDG.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   77ccfaf092f24f95bf932bee81082720 (/dev/mapper/mpathcp1) [OCRDG]
 2. ONLINE   79c900a0e5264f6cbfa05b7f0287ec07 (/dev/mapper/mpathdp1) [OCRDG]
 3. ONLINE   8d8a3b1a18b84f6abfb6bcde5083940c (/dev/mapper/mpathfp1) [OCRDG]
Located 3 voting disk(s).
CRS-2672: Attempting to start 'ora.asm' on 'node1'
CRS-2676: Start of 'ora.asm' on 'node1' succeeded
CRS-2672: Attempting to start 'ora.OCRDG.dg' on 'node1'
CRS-2676: Start of 'ora.OCRDG.dg' on 'node1' succeeded
Preparing packages for installation...
cvuqdisk-1.0.9-1
Configure Oracle Grid Infrastructure for a Cluster ... Succeeded

NODE2上运行脚本结果:

[root@NODE2 ~]# /oraapp/grid/oraInventory/orainstRoot.sh
Changing permissions of /oraapp/grid/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.
Changing groupname of /oraapp/grid/oraInventory to oinstall.
The execution of the script is complete.
[root@NODE2 ~]# 
[root@NODE2 ~]# 
[root@NODE2 ~]# /oraapp/grid/gridhome/root.sh
Check /oraapp/grid/gridhome/install/root_NODE2_2015-05-22_16-31-25.log for the output of root script

同样的脚本内容不会直接输出在控制台上,可以通过日志跟踪运行结果:

[root@NODE2~]#tail -f /oraapp/grid/gridhome/install/root_NODE2_2015-05-22_16-31-25.log
Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
Using configuration parameter file: /oraapp/grid/gridhome/crs/install/crsconfig_params
Creating trace directory
User ignored Prerequisites during installation
OLR initialization - successful
Adding Clusterware entries to upstart
 CRS-4402: The CSS daemon was started in exclusive mode but found an active CSS daemon on node node1, number 1, and is terminating
An active cluster was found during exclusive startup, restarting to join the cluster
 Preparing packages for installation...
cvuqdisk-1.0.9-1
Configure Oracle Grid Infrastructure for a Cluster ... succeeded

根据输出的提示:

This script needs a small password properties file for configuration assistants that require passwords (refer to install guide documentation).

需要建立一个password 文件来完成最后的配置,具体密码请根据实际情况配置

[grid@NODE1~]$ cd $ORACLE_HOME/cfgtoollogs
[grid@NODE1cfgtoollogs]$ touch cfgrsp.properties

然后填写口令内容

[grid@NODE1cfgtoollogs]$ cat cfgrsp.properties 
oracle.assistants.asm|S_ASMPASSWORD=grid_123
oracle.assistants.asm|S_ASMMONITORPASSWORD=grid_123

修改文件权限

[grid@NODE1 cfgtoollogs]$ chmod 600 cfgrsp.properties

最后执行这个脚本,完成配置

[grid@NODE1 cfgtoollogs]$ /oraapp/grid/gridhome/cfgtoollogs/configToolAllCommands RESPONSE_FILE=./cfgrsp.properties
Setting the invPtrLoc to /oraapp/grid/gridhome/oraInst.loc
perform - mode is starting for action: configure
May 25, 2015 9:21:03 AM oracle.install.driver.oui.config.GenericInternalPlugIn invoke
INFO: Executing ASMCA
May 25, 2015 9:21:03 AM oracle.install.driver.oui.config.GenericInternalPlugIn invoke
INFO: Command /oraapp/grid/gridhome/bin/asmca -silent -postConfigureASM -oui_internal  
May 25, 2015 9:21:03 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: ... GenericInternalPlugIn.handleProcess() entered.
May 25, 2015 9:21:03 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: ... GenericInternalPlugIn: getting configAssistantParmas.
May 25, 2015 9:21:03 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: ... GenericInternalPlugIn: checking secretArguments.
May 25, 2015 9:21:03 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: ... GenericInternalPlugIn: starting read loop.
May 25, 2015 9:21:08 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: Read: SYS_PASSWORD_PROMPT
May 25, 2015 9:21:08 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: Processing: SYS_PASSWORD_PROMPT for argument tag -sysAsmPassword
May 25, 2015 9:21:08 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: Read: ASMSNMP_PASSWORD_PROMPT
May 25, 2015 9:21:08 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: Processing: ASMSNMP_PASSWORD_PROMPT for argument tag -asmMonitorPassword
May 25, 2015 9:21:08 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: End of argument passing to stdin
May 25, 2015 9:21:09 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: Read: 
May 25, 2015 9:21:09 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: Read: PostConfiguration completed successfully
May 25, 2015 9:21:09 AM oracle.install.driver.oui.config.GenericInternalPlugIn handleProcess
INFO: Read: 
 
perform - mode finished for action: configure
You can see the log file: /oraapp/grid/gridhome/cfgtoollogs/oui/configActions2015-05-25_09-20-05-AM.log

查看日志

[grid@NODE1cfgtoollogs]$more /oraapp/grid/gridhome/cfgtoollogs/oui/configActions2015-05-25_09-20-05-AM.log

检查输出日志中除了SCAN-IP的错误可以忽略以外,其他的应该都是passed

ERROR: 
PRVG-1101 : SCAN name "BCMSDBS-SCAN" failed to resolve
ERROR: 
PRVF-4657 : Name resolution setup check for "BCMSDBS-SCAN" (IP address: 200.31.43.45) failed
ERROR: 
PRVF-4664 : Found inconsistent name resolution entries for SCAN name "BCMSDBS-SCAN"

 简单检测CRS是否安装成功:

查看集群状态除了ora.gsd 以外其他都应该是出于online的状态

[root@BCMSDBS01 gridhome]# /oraapp/grid/gridhome/bin/crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
ora.OCRDG.dg
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
ora.asm
               ONLINE  ONLINE       bcmsdbs01                Started             
               ONLINE  ONLINE       bcmsdbs02                Started             
ora.gsd
               OFFLINE OFFLINE      bcmsdbs01                                    
               OFFLINE OFFLINE      bcmsdbs02                                    
ora.net1.network
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
ora.ons
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       bcmsdbs01                                    
ora.bcmsdbs01.vip
      1        ONLINE  ONLINE       bcmsdbs01                                    
ora.bcmsdbs02.vip
      1        ONLINE  ONLINE       bcmsdbs02                                    
ora.cvu
      1        ONLINE  ONLINE       bcmsdbs01                                    
ora.oc4j
      1        ONLINE  ONLINE       bcmsdbs01                                    
ora.scan1.vip
      1        ONLINE  ONLINE       bcmsdbs01

检查OCR磁盘是否正常

[root@BCMSDBS01 gridhome]# /oraapp/grid/gridhome/bin/ocrcheck
Status of Oracle Cluster Registry is as follows :
         Version                  :          3
         Total space (kbytes)     :     262120
         Used space (kbytes)      :       2524
         Available space (kbytes) :     259596
         ID                       : 1618251275
         Device/File Name         :     +OCRDG
                                    Device/File integrity check succeeded
                                    Device/File not configured
                                    Device/File not configured
                                    Device/File not configured
                                    Device/File not configured
         Cluster registry integrity check succeeded
         Logical corruption check succeeded

 

Grid安装成功后,用如下命令可以确认ASM进程已经在两个节点上都已经启动了:

ps –ef | grep pmon

 2 静默安装oracle软件

手动检测环境配置是否准备完毕

在grid安装目录中运行脚本,检测环境是否符合grid的安装标准

[grid@NODE1 grid]$  ./runcluvfy.sh stage -pre dbinst -n NODE1,NODE2 -r 11gR2 -verbose > /tmp/db_check.log

查看日志more /tmp/db_check.log

Check: Package existence for "pdksh"
  Node Name     Available                 Required                  Status
  ------------  ------------------------  ------------------------  ----------
  BCMSDBS01     missing                   pdksh-5.2.14              failed
  BCMSDBS02     missing                   pdksh-5.2.14              failed
Result: Package existence check failed for "pdksh"
ERROR:
PRVG-1101 : SCAN name "BCMSDBS-SCAN" failed to resolve
  SCAN Name     IP Address                Status                    Comment
  ------------  ------------------------  ------------------------  ----------
  BCMSDBS-SCAN  200.31.43.45              failed                    NIS Entry
ERROR:
PRVF-4657 : Name resolution setup check for "BCMSDBS-SCAN" (IP address: 200.31.43.45) failed
ERROR:
PRVF-4664 : Found inconsistent name resolution entries for SCAN name "BCMSDBS-SCAN"
Verification of SCAN VIP and Listener setup failed

除了以上两个错误外,其他的应该都是passed

手动建立oracle用户的SSH用户等效性配置

节点1:
# su - oracle
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ ssh-keygen -t rsa
enter
enter
enter
$ ssh-keygen -t dsa
enter
enter
enter
节点2:
# su - oracle
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ ssh-keygen -t rsa
enter
enter
enter
$ ssh-keygen -t dsa
enter
enter
enter
节点1:
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys 
$ ssh BCMSDBS02 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
yes
BCMSDBS02的密码
$ ssh BCMSDBS02 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
BCMSDBS02的密码
$ scp ~/.ssh/authorized_keys BCMSDBS02:~/.ssh/authorized_keys
验证ssh用户等效性(在2个节点都要执行)
ssh BCMSDBS01 date
ssh BCMSDBS02 date

准备DB安装的模板响应文件 

#-------------------------------------------------------------------------------
# Do not change the following system generated value. 
#-------------------------------------------------------------------------------
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0
oracle.install.option=INSTALL_DB_SWONLY
ORACLE_HOSTNAME=BCMSDBS01
UNIX_GROUP_NAME=oinstall
INVENTORY_LOCATION=/oraapp/grid/oraInventory
SELECTED_LANGUAGES=en,zh_CN,zh_TW
ORACLE_HOME=/oraapp/oracle/product/11.2.0/dbhome_1
ORACLE_BASE=/oraapp/oracle
oracle.install.db.InstallEdition=EE
oracle.install.db.EEOptionsSelection=false
oracle.install.db.optionalComponents=
oracle.install.db.DBA_GROUP=dba
oracle.install.db.OPER_GROUP=oper
oracle.install.db.CLUSTER_NODES=bcmsdbs01,bcmsdbs02
oracle.install.db.isRACOneInstall=false
oracle.install.db.racOneServiceName=
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE
oracle.install.db.config.starterdb.globalDBName=CMSDB
oracle.install.db.config.starterdb.SID=CMSDB1
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.memoryOption=false
oracle.install.db.config.starterdb.memoryLimit=
oracle.install.db.config.starterdb.installExampleSchemas=false
oracle.install.db.config.starterdb.enableSecuritySettings=false
oracle.install.db.config.starterdb.password.ALL=oracle
oracle.install.db.config.starterdb.password.SYS=
oracle.install.db.config.starterdb.password.SYSTEM=
oracle.install.db.config.starterdb.password.SYSMAN=
oracle.install.db.config.starterdb.password.DBSNMP=
oracle.install.db.config.starterdb.control=DB_CONTROL
oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=
oracle.install.db.config.starterdb.automatedBackup.enable=false
oracle.install.db.config.starterdb.automatedBackup.osuid=
oracle.install.db.config.starterdb.automatedBackup.ospwd=
oracle.install.db.config.starterdb.storageType=
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=
oracle.install.db.config.asm.diskGroup=
oracle.install.db.config.asm.ASMSNMPPassword=grid
MYORACLESUPPORT_USERNAME=
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=false
DECLINE_SECURITY_UPDATES=true
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
PROXY_REALM=
COLLECTOR_SUPPORTHUB_URL=
oracle.installer.autoupdates.option=SKIP_UPDATES
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=

以下模板参数请根据实际情况修改,其他参数请参考上面的模板

ORACLE_HOSTNAME=node1
oracle.install.db.CLUSTER_NODES=node1,node2
oracle.install.db.config.starterdb.globalDBName=testdb
oracle.install.db.config.starterdb.SID=testdb1
oracle.install.db.config.starterdb.characterSet=AL32UTF8
oracle.install.db.config.starterdb.password.ALL=oracle
oracle.install.db.config.asm.ASMSNMPPassword=grid_123
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.3.0,oracle.oraolap:11.2.0.3.0,oracle.rdbms.dm:11.2.0.3.0,oracle.rdbms.dv:11.2.0.3.0,oracle.rdbms.lbac:11.2.0.3.0,oracle.rdbms.rat:11.2.0.3.0

 如果安装的是11.2.0.4 请根据安装介质中的默认response文件中的内容来替换oracle.install.db.optionalComponents中的内容。

另外ORACLE_HOME我们需要注意一下,我们在图形方式安装的时候只要创建ORACLE_BASE目录即可,ORACLE_HOME目录会自动创建,但静默方式不可以。

检查并创建ORACLE_HOME目录(所有节点都要执行)

[oracle@BCMSDBS01 ~]$ cd $ORACLE_HOME
-bash: cd: /oraapp/oracle/product/11.2.0/dbhome_1: No such file or directory
[oracle@BCMSDBS01 ~]$ mkdir -p /oraapp/oracle/product/11.2.0/dbhome_1

 通过模板安装数据库软件

以下命令使用oracle用户在1个节点上执行

./runInstaller -ignorePrereq -silent -force -responseFile /home/oracle/db.rsp  -showProgress
Starting Oracle Universal Installer...
Checking Temp space: must be greater than 120 MB.   Actual 17799 MB    Passed
Checking swap space: must be greater than 150 MB.   Actual 7982 MB    Passed
Preparing to launch Oracle Universal Installer from /tmp/OraInstall2015-05-25_02-27-53PM. Please wait ...
You can find the log of this install session at:
/oraapp/grid/oraInventory/logs/installActions2015-05-25_02-27-53PM.log 
The installation of Oracle Database 11g was successful.
Please check '/oraapp/grid/oraInventory/logs/silentInstall2015-05-25_02-27-53PM.log' for more details.
As a root user, execute the following script(s):
        1. /oraapp/oracle/product/11.2.0/dbhome_1/root.sh
Execute /oraapp/oracle/product/11.2.0/dbhome_1/root.sh on the following nodes: 
[bcmsdbs01, bcmsdbs02]
Successfully Setup Software.

节点1执行脚本

[root@NODE1 ~]# /oraapp/oracle/product/11.2.0/dbhome_1/root.sh
Check /oraapp/oracle/product/11.2.0/dbhome_1/install/root_NODE1_2015-05-25_14-41-55.log for the output of root script
[root@NODE1~]#cat /oraapp/oracle/product/11.2.0/dbhome_1/install/root_NODE1_2015-05-25_14-41-55.log 
Performing root user operation for Oracle 11g 
The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /oraapp/oracle/product/11.2.0/dbhome_1
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
Finished product-specific root actions.

节点2执行脚本

[root@NODE2 ~]# /oraapp/oracle/product/11.2.0/dbhome_1/root.sh
Check /oraapp/oracle/product/11.2.0/dbhome_1/install/root_NODE2_2015-05-25_14-42-39.log for the output of root script
[root@NODE2 ~]# 
[root@NODE2 ~]# 
[root@NODE2~]#cat /oraapp/oracle/product/11.2.0/dbhome_1/install/root_NODE2_2015-05-25_14-42-39.log
Performing root user operation for Oracle 11g 
The following environment variables are set as:
    ORACLE_OWNER= oracle
    ORACLE_HOME=  /oraapp/oracle/product/11.2.0/dbhome_1
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
Finished product-specific root actions.

至此Oracle数据库软件安装完成

3 手动创建数据磁盘组

查看目前的ASM磁盘,以及磁盘组的信息

SQL> select name , state , type  from v$asm_diskgroup;
NAME                           STATE       TYPE
------------------------------ ----------- ------
OCRDG                          MOUNTED     NORMAL
SQL> set linesize 10000
SQL> set pagesize 5000
SQL> col name for a10
SQL> col path for a20
SQL> col failgroup for a20
SQL> select group_number , disk_number , name , path , state , header_status , mount_status , failgroup from v$asm_disk;
GROUP_NUMBER DISK_NUMBER NAME       PATH                 STATE    HEADER_STATU MOUNT_S FAILGROUP
------------ ----------- ---------- -------------------- -------- ------------ ------- --------------------
           0           1            /dev/mapper/mpathhp1 NORMAL   CANDIDATE    CLOSED
           0           2            /dev/mapper/mpathbp1 NORMAL   CANDIDATE    CLOSED
           0           3            /dev/mapper/mpathep1 NORMAL   CANDIDATE    CLOSED
           0           5            /dev/mapper/mpathgp1 NORMAL   CANDIDATE    CLOSED
           1           0 OCRDG_0000 /dev/mapper/mpathcp1 NORMAL   MEMBER       CACHED  OCRDG_0000
           1           2 OCRDG_0002 /dev/mapper/mpathfp1 NORMAL   MEMBER       CACHED  OCRDG_0002
           1           1 OCRDG_0001 /dev/mapper/mpathdp1 NORMAL   MEMBER       CACHED  OCRDG_0001

使用multipath 命令确认需要添加的磁盘的大小和名称

root@BCMSDBS01 ~]# multipath -ll | grep -1  dm- 
mpathe (360060e8005949f000000949f00003704) dm-8 HITACHI,OPEN-V
size=100G features='1 queue_if_no_path' hwhandler='0' wp=rw
--
  `- 2:0:0:4 sdm 8:192 active ready running
mpathd (360060e8005949f000000949f00003702) dm-6 HITACHI,OPEN-V
size=5.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
--
  `- 2:0:0:2 sdk 8:160 active ready running
mpathc (360060e8005949f000000949f00003701) dm-16 HITACHI,OPEN-V
size=5.0G features='1 queue_if_no_path' hwhandler='0' wp=rw
--
  `- 2:0:0:1 sdj 8:144 active ready running
mpathb (360060e8005949f000000949f00003700) dm-10 HITACHI,OPEN-V
size=200G features='1 queue_if_no_path' hwhandler='0' wp=rw
--
  `- 2:0:0:0 sdi 8:128 active ready running
mpatha (36782bcb03db3cf0015e11c6c04a35300) dm-0 DELL,PERC 6/i
size=279G features='1 queue_if_no_path' hwhandler='0' wp=rw
--
  `- 0:2:0:0 sda 8:0   active ready running
mpathh (360060e8005949f000000949f00004704) dm-12 HITACHI,OPEN-V
size=100G features='1 queue_if_no_path' hwhandler='0' wp=rw
--
  `- 2:0:0:6 sdo 8:224 active ready running
mpathg (360060e8005949f000000949f00004700) dm-7 HITACHI,OPEN-V
size=200G features='1 queue_if_no_path' hwhandler='0' wp=rw
--
  `- 2:0:0:5 sdn 8:208 active ready running
mpathf (360060e8005949f000000949f00003703) dm-9 HITACHI,OPEN-V
size=5.0G features='1 queue_if_no_path' hwhandler='0' wp=rw

使用sqlplus 手动创建磁盘组(以下操作在一个节点运行)

sqlplus / as sysasm
SQL> create diskgroup DATADG external redundancy
  2  disk '/dev/mapper/mpathbp1','/dev/mapper/mpathgp1'
  3  attribute 'compatible.asm'='11.2','compatible.rdbms'='11.2',
  4  'AU_SIZE'='1M'
  5  /
Diskgroup created.
SQL> create diskgroup FLASHDG external redundancy
  2  disk '/dev/mapper/mpathep1','/dev/mapper/mpathhp1'
  3  attribute 'compatible.asm'='11.2','compatible.rdbms'='11.2',
  4  'AU_SIZE'='1M'
  5  /
Diskgroup created.
SQL> select name , state , type from v$asm_diskgroup;
NAME                           STATE       TYPE
------------------------------ ----------- ------
OCRDG                          MOUNTED     NORMAL
DATADG                         MOUNTED     EXTERN
FLASHDG                        MOUNTED     EXTERN

确认ASM磁盘组正常mount

以下操作在所有节点都要确认

[grid@BCMSDBS01 ~]$ kfod op=groups
--------------------------------------------------------------------------------
Group          Size          Free Redundancy Name           
================================================================================
   1:      15357 Mb      14431 Mb     NORMAL OCRDG          
   2:     204798 Mb     204744 Mb     EXTERN FLASHDG        
   3:     409598 Mb     409542 Mb     EXTERN DATADG 
[grid@BCMSDBS01 ~]$ crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATADG.dg
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
ora.FLASHDG.dg
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                   
ora.LISTENER.lsnr
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
ora.OCRDG.dg
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
ora.asm
               ONLINE  ONLINE       bcmsdbs01                Started             
               ONLINE  ONLINE       bcmsdbs02                Started             
ora.gsd
               OFFLINE OFFLINE      bcmsdbs01                                    
               OFFLINE OFFLINE      bcmsdbs02                                    
ora.net1.network
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
ora.ons
               ONLINE  ONLINE       bcmsdbs01                                    
               ONLINE  ONLINE       bcmsdbs02                                    
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       bcmsdbs01                                    
ora.bcmsdbs01.vip
      1        ONLINE  ONLINE       bcmsdbs01                                    
ora.bcmsdbs02.vip
      1        ONLINE  ONLINE       bcmsdbs02                                    
ora.cvu
      1        ONLINE  ONLINE       bcmsdbs01                                    
ora.oc4j
      1        ONLINE  ONLINE       bcmsdbs01                                    
ora.scan1.vip
      1        ONLINE  ONLINE       bcmsdbs01

 注意:如果出现在另个一个节点是OFFLINE,或者出于dismount的状态,可以手动在第二个节点进行mount

alter diskgroup datadg mount;
alter diskgroup flashdg mount;

4 创建RAC数据库实例

准备DB 模板文件 

<DatabaseTemplate name="11gR2DB" description=" " version="11.1.0.0.0">
   <CommonAttributes>
      <option name="OMS" value="false"/>
      <option name="JSERVER" value="false"/>
      <option name="SPATIAL" value="false"/>
      <option name="IMEDIA" value="false"/>
      <option name="XDB_PROTOCOLS" value="false">
         <tablespace id="SYSAUX"/>
      </option>
      <option name="ORACLE_TEXT" value="false">
         <tablespace id="SYSAUX"/>
      </option>
      <option name="SAMPLE_SCHEMA" value="false"/>
      <option name="CWMLITE" value="false">
         <tablespace id="SYSAUX"/>
      </option>
      <option name="EM_REPOSITORY" value="false">
         <tablespace id="SYSAUX"/>
      </option>
      <option name="APEX" value="false"/>
      <option name="OWB" value="false"/>
      <option name="DV" value="false"/>
   </CommonAttributes>
   <Variables/>
   <CustomScripts Execute="false"/>
   <InitParamAttributes>
      <InitParams>
         <initParam name="db_create_file_dest" value="+DATADG"/>
         <initParam name="db_name" value=""/>
         <initParam name="db_domain" value=""/>
         <initParam name="audit_file_dest" value="{ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/adump"/>
         <initParam name="compatible" value="11.2.0.0.0"/>
         <initParam name="remote_login_passwordfile" value="exclusive"/>
         <initParam name="log_archive_dest_1" value="'LOCATION=+FLASHDG'"/>
         <initParam name="sga_target" value="4096" unit="MB"/>
         <initParam name="processes" value="300"/>
         <initParam name="diagnostic_dest" value="{ORACLE_BASE}"/>
         <initParam name="audit_trail" value="db"/>
         <initParam name="log_archive_format" value="%t_%s_%r.dbf"/>
         <initParam name="sessions" value="335"/>
         <initParam name="db_block_size" value="8" unit="KB"/>
         <initParam name="open_cursors" value="300"/>
         <initParam name="pga_aggregate_target" value="2048" unit="MB"/>
         <initParam name="undo_tablespace" value="UNDOTBS2"/>
      </InitParams>
      <MiscParams>
         <databaseType>MULTIPURPOSE</databaseType>
         <maxUserConn>20</maxUserConn>
         <percentageMemTOSGA>40</percentageMemTOSGA>
         <customSGA>true</customSGA>
         <characterSet>AL32UTF8</characterSet>
         <nationalCharacterSet>AL16UTF16</nationalCharacterSet>
         <archiveLogMode>true</archiveLogMode>
         <initParamFileName>{ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/pfile/init.ora</initParamFileName>
      </MiscParams>
      <SPfile useSPFile="true">+DATADG/{DB_UNIQUE_NAME}/spfileCMDSDB.ora</SPfile>
   </InitParamAttributes>
   <StorageAttributes>
      <ControlfileAttributes id="Controlfile">
         <maxDatafiles>1024</maxDatafiles>
         <maxLogfiles>192</maxLogfiles>
         <maxLogMembers>3</maxLogMembers>
         <maxLogHistory>1</maxLogHistory>
         <maxInstances>32</maxInstances>
         <image name="&lt;OMF_CONTROL_0>" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
         <image name="&lt;OMF_CONTROL_1>" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </ControlfileAttributes>
      <DatafileAttributes id="+DATADG">
         <tablespace>SYSAUX</tablespace>
         <temporary>false</temporary>
         <online>true</online>
         <status>0</status>
         <size unit="MB">600</size>
         <reuse>false</reuse>
         <autoExtend>true</autoExtend>
         <increment unit="KB">10240</increment>
         <maxSize unit="MB">-1</maxSize>
      </DatafileAttributes>
      <DatafileAttributes id="+DATADG">
         <tablespace>SYSTEM</tablespace>
         <temporary>false</temporary>
         <online>true</online>
         <status>0</status>
         <size unit="MB">700</size>
         <reuse>false</reuse>
         <autoExtend>true</autoExtend>
         <increment unit="KB">10240</increment>
         <maxSize unit="MB">-1</maxSize>
      </DatafileAttributes>
      <DatafileAttributes id="+DATADG">
         <tablespace>TEMP</tablespace>
         <temporary>false</temporary>
         <online>true</online>
         <status>0</status>
         <size unit="MB">20</size>
         <reuse>false</reuse>
         <autoExtend>true</autoExtend>
         <increment unit="KB">640</increment>
         <maxSize unit="MB">-1</maxSize>
      </DatafileAttributes>
      <DatafileAttributes id="+DATADG">
         <tablespace>UNDOTBS1</tablespace>
         <temporary>false</temporary>
         <online>true</online>
         <status>0</status>
         <size unit="MB">200</size>
         <reuse>false</reuse>
         <autoExtend>true</autoExtend>
         <increment unit="KB">5120</increment>
         <maxSize unit="MB">-1</maxSize>
      </DatafileAttributes>
      <DatafileAttributes id="+DATADG">
         <tablespace>UNDOTBS2</tablespace>
         <temporary>false</temporary>
         <online>true</online>
         <status>0</status>
         <size unit="MB">200</size>
         <reuse>false</reuse>
         <autoExtend>true</autoExtend>
         <increment unit="KB">5120</increment>
         <maxSize unit="MB">-1</maxSize>
      </DatafileAttributes>
      <DatafileAttributes id="+DATADG">
         <tablespace>USERS</tablespace>
         <temporary>false</temporary>
         <online>true</online>
         <status>0</status>
         <size unit="MB">5</size>
         <reuse>false</reuse>
         <autoExtend>true</autoExtend>
         <increment unit="KB">1280</increment>
         <maxSize unit="MB">-1</maxSize>
      </DatafileAttributes>
      <TablespaceAttributes id="SYSAUX">
         <online>true</online>
         <offlineMode>1</offlineMode>
         <readOnly>false</readOnly>
         <temporary>false</temporary>
         <defaultTemp>false</defaultTemp>
         <undo>false</undo>
         <local>true</local>
         <blockSize>-1</blockSize>
         <allocation>1</allocation>
         <uniAllocSize unit="KB">-1</uniAllocSize>
         <initSize unit="KB">64</initSize>
         <increment unit="KB">64</increment>
         <incrementPercent>50</incrementPercent>
         <minExtends>1</minExtends>
         <maxExtends>4096</maxExtends>
         <minExtendsSize unit="KB">64</minExtendsSize>
         <logging>true</logging>
         <recoverable>false</recoverable>
         <maxFreeSpace>0</maxFreeSpace>
         <autoSegmentMgmt>true</autoSegmentMgmt>
         <bigfile>false</bigfile>
         <datafilesList>
            <TablespaceDatafileAttributes id="+DATADG">
               <id>-1</id>
            </TablespaceDatafileAttributes>
         </datafilesList>
      </TablespaceAttributes>
      <TablespaceAttributes id="SYSTEM">
         <online>true</online>
         <offlineMode>1</offlineMode>
         <readOnly>false</readOnly>
         <temporary>false</temporary>
         <defaultTemp>false</defaultTemp>
         <undo>false</undo>
         <local>true</local>
         <blockSize>-1</blockSize>
         <allocation>3</allocation>
         <uniAllocSize unit="KB">-1</uniAllocSize>
         <initSize unit="KB">64</initSize>
         <increment unit="KB">64</increment>
         <incrementPercent>50</incrementPercent>
         <minExtends>1</minExtends>
         <maxExtends>-1</maxExtends>
         <minExtendsSize unit="KB">64</minExtendsSize>
         <logging>true</logging>
         <recoverable>false</recoverable>
         <maxFreeSpace>0</maxFreeSpace>
         <autoSegmentMgmt>true</autoSegmentMgmt>
         <bigfile>false</bigfile>
         <datafilesList>
            <TablespaceDatafileAttributes id="+DATADG">
               <id>-1</id>
            </TablespaceDatafileAttributes>
         </datafilesList>
      </TablespaceAttributes>
      <TablespaceAttributes id="TEMP">
         <online>true</online>
         <offlineMode>1</offlineMode>
         <readOnly>false</readOnly>
         <temporary>true</temporary>
         <defaultTemp>true</defaultTemp>
         <undo>false</undo>
         <local>true</local>
         <blockSize>-1</blockSize>
         <allocation>1</allocation>
         <uniAllocSize unit="KB">-1</uniAllocSize>
         <initSize unit="KB">64</initSize>
         <increment unit="KB">64</increment>
         <incrementPercent>0</incrementPercent>
         <minExtends>1</minExtends>
         <maxExtends>0</maxExtends>
         <minExtendsSize unit="KB">64</minExtendsSize>
         <logging>true</logging>
         <recoverable>false</recoverable>
         <maxFreeSpace>0</maxFreeSpace>
         <autoSegmentMgmt>true</autoSegmentMgmt>
         <bigfile>false</bigfile>
         <datafilesList>
            <TablespaceDatafileAttributes id="+DATADG">
               <id>-1</id>
            </TablespaceDatafileAttributes>
         </datafilesList>
      </TablespaceAttributes>
      <TablespaceAttributes id="UNDOTBS1">
         <online>true</online>
         <offlineMode>1</offlineMode>
         <readOnly>false</readOnly>
         <temporary>false</temporary>
         <defaultTemp>false</defaultTemp>
         <undo>true</undo>
         <local>true</local>
         <blockSize>-1</blockSize>
         <allocation>1</allocation>
         <uniAllocSize unit="KB">-1</uniAllocSize>
         <initSize unit="KB">512</initSize>
         <increment unit="KB">512</increment>
         <incrementPercent>50</incrementPercent>
         <minExtends>8</minExtends>
         <maxExtends>4096</maxExtends>
         <minExtendsSize unit="KB">512</minExtendsSize>
         <logging>true</logging>
         <recoverable>false</recoverable>
         <maxFreeSpace>0</maxFreeSpace>
         <autoSegmentMgmt>true</autoSegmentMgmt>
         <bigfile>false</bigfile>
         <datafilesList>
            <TablespaceDatafileAttributes id="+DATADG">
               <id>-1</id>
            </TablespaceDatafileAttributes>
         </datafilesList>
      </TablespaceAttributes>
      <TablespaceAttributes id="UNDOTBS2">
         <online>true</online>
         <offlineMode>1</offlineMode>
         <readOnly>false</readOnly>
         <temporary>false</temporary>
         <defaultTemp>false</defaultTemp>
         <undo>true</undo>
         <local>true</local>
         <blockSize>-1</blockSize>
         <allocation>1</allocation>
         <uniAllocSize unit="KB">-1</uniAllocSize>
         <initSize unit="KB">512</initSize>
         <increment unit="KB">512</increment>
         <incrementPercent>50</incrementPercent>
         <minExtends>8</minExtends>
         <maxExtends>4096</maxExtends>
         <minExtendsSize unit="KB">512</minExtendsSize>
         <logging>true</logging>
         <recoverable>false</recoverable>
         <maxFreeSpace>0</maxFreeSpace>
         <autoSegmentMgmt>true</autoSegmentMgmt>
         <bigfile>false</bigfile>
         <datafilesList>
            <TablespaceDatafileAttributes id="+DATADG">
               <id>-1</id>
            </TablespaceDatafileAttributes>
         </datafilesList>
      </TablespaceAttributes>
      <TablespaceAttributes id="USERS">
         <online>true</online>
         <offlineMode>1</offlineMode>
         <readOnly>false</readOnly>
         <temporary>false</temporary>
         <defaultTemp>false</defaultTemp>
         <undo>false</undo>
         <local>true</local>
         <blockSize>-1</blockSize>
         <allocation>1</allocation>
         <uniAllocSize unit="KB">-1</uniAllocSize>
         <initSize unit="KB">128</initSize>
         <increment unit="KB">128</increment>
         <incrementPercent>0</incrementPercent>
         <minExtends>1</minExtends>
         <maxExtends>4096</maxExtends>
         <minExtendsSize unit="KB">128</minExtendsSize>
         <logging>true</logging>
         <recoverable>false</recoverable>
         <maxFreeSpace>0</maxFreeSpace>
         <autoSegmentMgmt>true</autoSegmentMgmt>
         <bigfile>false</bigfile>
         <datafilesList>
            <TablespaceDatafileAttributes id="+DATADG">
               <id>-1</id>
            </TablespaceDatafileAttributes>
         </datafilesList>
      </TablespaceAttributes>
      <RedoLogGroupAttributes id="1">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>1</Thread>
         <member ordinal="0" memberName="redo01.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="2">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>1</Thread>
         <member ordinal="0" memberName="redo02.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="3">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>1</Thread>
         <member ordinal="0" memberName="redo03.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="4">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>1</Thread>
         <member ordinal="0" memberName="redo04.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="5">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>1</Thread>
         <member ordinal="1" memberName="redo05.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="6">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>2</Thread>
         <member ordinal="1" memberName="redo06.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="7">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>2</Thread>
         <member ordinal="1" memberName="redo07.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="8">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>2</Thread>
         <member ordinal="1" memberName="redo08.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="9">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>2</Thread>
         <member ordinal="1" memberName="redo09.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="10">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>2</Thread>
         <member ordinal="1" memberName="redo10.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
   </StorageAttributes>
</DatabaseTemplate>

以下是一些自定义设置的模板信息可以根据实际情况进行修改

      <InitParams>
         <initParam name="db_create_file_dest" value="+DATADG"/>
         <initParam name="db_name" value=""/>
         <initParam name="db_domain" value=""/>
         <initParam name="compatible" value="11.2.0.0.0"/>
         <initParam name="remote_login_passwordfile" value="exclusive"/>
         <initParam name="log_archive_dest_1" value="'LOCATION=+FLASHDG'"/>
         <initParam name="sga_target" value="4096" unit="MB"/>
         <initParam name="processes" value="300"/>
         <initParam name="diagnostic_dest" value="{ORACLE_BASE}"/>
         <initParam name="audit_trail" value="db"/>
         <initParam name="log_archive_format" value="%t_%s_%r.dbf"/>
         <initParam name="sessions" value="335"/>
         <initParam name="db_block_size" value="8" unit="KB"/>
         <initParam name="open_cursors" value="300"/>
         <initParam name="pga_aggregate_target" value="2048" unit="MB"/>
         <initParam name="undo_tablespace" value="UNDOTBS2"/>
      </InitParams>
      <MiscParams>
         <databaseType>MULTIPURPOSE</databaseType>
         <maxUserConn>20</maxUserConn>
         <percentageMemTOSGA>40</percentageMemTOSGA>
         <customSGA>true</customSGA>
         <characterSet>AL32UTF8</characterSet>
         <nationalCharacterSet>AL16UTF16</nationalCharacterSet>
         <archiveLogMode>true</archiveLogMode>
         <initParamFileName>{ORACLE_BASE}/admin/{DB_UNIQUE_NAME}/pfile/init.ora</initParamFileName>
      </MiscParams>
      <SPfile useSPFile="true">+DATADG/{DB_UNIQUE_NAME}/spfiletestdb.ora</SPfile>
      <RedoLogGroupAttributes id="1">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>1</Thread>
         <member ordinal="0" memberName="redo01.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
      <RedoLogGroupAttributes id="2">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>1</Thread>
         <member ordinal="0" memberName="redo02.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>
.......
......
      <RedoLogGroupAttributes id="10">
         <reuse>false</reuse>
         <fileSize unit="KB">204800</fileSize>
         <Thread>2</Thread>
         <member ordinal="1" memberName="redo10.log" filepath="+DATADG/{DB_UNIQUE_NAME}/"/>
      </RedoLogGroupAttributes>

对于8G的内存,一般选择SGA为3-4G,PGA为1-3G。

对于64G的内存,初始化选择SGA为25-32G,PGA为4-8G。

所有日志文件大小为200M,5个Thread为1,5个Thread为2。

 

通过模板安装数据库

请使用oracle用户在1号节点上执行以下命令:

$ORACLE_HOME/bin/dbca -silent -createDatabase -templateName /home/oracle/11gR2DB.dbt  \
-gdbName testdb -sid testdb -sysPassword oracle \
-systemPassword  oracle -storageType ASM -diskGroupName DATADG \
-datafileJarLocation $ORACLE_HOME/assistants/dbca/templates -nodelist NODE1,NODE2 \
-obfuscatedPasswords false -asmSysPassword grid
Creating and starting Oracle instance
DBCA_PROGRESS : 2%
DBCA_PROGRESS : 3%
DBCA_PROGRESS : 4%
DBCA_PROGRESS : 10%
Creating database files
DBCA_PROGRESS : 11%
DBCA_PROGRESS : 12%
DBCA_PROGRESS : 20%
Creating data dictionary views
DBCA_PROGRESS : 23%
DBCA_PROGRESS : 26%
DBCA_PROGRESS : 29%
DBCA_PROGRESS : 30%
DBCA_PROGRESS : 31%
DBCA_PROGRESS : 32%
DBCA_PROGRESS : 33%
DBCA_PROGRESS : 34%
DBCA_PROGRESS : 35%
DBCA_PROGRESS : 36%
DBCA_PROGRESS : 37%
DBCA_PROGRESS : 38%
DBCA_PROGRESS : 44%
DBCA_PROGRESS : 47%
DBCA_PROGRESS : 50%
DBCA_PROGRESS : 53%
Creating cluster database views
DBCA_PROGRESS : 55%
DBCA_PROGRESS : 73%
Completing Database Creation
DBCA_PROGRESS : 76%
DBCA_PROGRESS : 79%
DBCA_PROGRESS : 88%
DBCA_PROGRESS : 97%
DBCA_PROGRESS : 100%
Database creation complete. For details check the logfiles at:
 /oraapp/oracle/cfgtoollogs/dbca/TESTDB.
Database Information:
Global Database Name:CMDSDB
System Identifier(SID) Prefix:CMDSDB

数据库安装后的一些配置

增加online redo log(只在一个节点操作即可)

alter database add logfile member '+FLASHDG' to group 1;
alter database add logfile member '+FLASHDG' to group 2;
alter database add logfile member '+FLASHDG' to group 3;
alter database add logfile member '+FLASHDG' to group 4;
alter database add logfile member '+FLASHDG' to group 5;
alter database add logfile member '+FLASHDG' to group 6;
alter database add logfile member '+FLASHDG' to group 7;
alter database add logfile member '+FLASHDG' to group 8;
alter database add logfile member '+FLASHDG' to group 9;
alter database add logfile member '+FLASHDG' to group 10;

注:以上的命令可编辑/home/oracle/add_redo.sql并执行。

设置snapshot controfile路径为存储,否则NBU备份会报备份control file失败:(只在一个节点操作即可)

rman target /
RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME TO '+FLASHDG/CDISDB/CONTROLFILE/snapcf_TESTDB.f';
RMAN > show all; //确认修改成功

以oracle在主节点执行如下操作(不需要在备节点操作):

cd
sqlplus / as sysdba
@add_redo.sql
--确认每个组都有2个MEMBER
SQL> select group#,thread#,members from v$log; 
    GROUP#    THREAD#    MEMBERS
---------- ---------- ----------
         1          1          2
         2          1          2
         3          1          2
         4          1          2
         5          1          2
         6          2          2
         7          2          2
         8          2          2
         9          2          2
        10          2          2
SQL> set lines 200
SQL> col member for a50
--确认有10个DATADG下的redo logfile,10个FLASHDG下的redolog file
SQL> select group#,member from v$logfile

确认数据库安装配置是否正确

请在sqlplus中执行以下命令,确认数据库是否安装配置是否正确(在任意一个节点执行即可)

Select open_mode from v$database;
Show parameter sga
Show parameter pga
Select name from v$dbfile;
Select name from v$tempfile;
Select name from v$controlfile;
Select member from v$logfile;
Archive log list
[grid@NODE1 ~]$ crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATADG.dg
               ONLINE  ONLINE       node1                                    
               ONLINE  ONLINE       node2                                    
ora.FLASHDG.dg
               ONLINE  ONLINE       node1                                    
               ONLINE  ONLINE       node2                                    
ora.LISTENER.lsnr
               ONLINE  ONLINE       node1                                    
               ONLINE  ONLINE       node2                                    
ora.OCRDG.dg
               ONLINE  ONLINE       node1                                    
               ONLINE  ONLINE       node2                                    
ora.asm
               ONLINE  ONLINE       node1                Started             
               ONLINE  ONLINE       node2                Started             
ora.gsd
               OFFLINE OFFLINE      node1                                    
               OFFLINE OFFLINE      node2                                    
ora.net1.network
               ONLINE  ONLINE       node1                                    
               ONLINE  ONLINE       node2                                    
ora.ons
               ONLINE  ONLINE       node1                                    
               ONLINE  ONLINE       node2                                    
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       node1                                    
ora.node1.vip
      1        ONLINE  ONLINE       node1                                    
ora.node2.vip
      1        ONLINE  ONLINE       node2                                    
ora.testdb.db
      1        ONLINE  ONLINE       node1                Open                
      2        ONLINE  ONLINE       node2                Open                
ora.cvu
      1        ONLINE  ONLINE       node1                                    
ora.oc4j
      1        ONLINE  ONLINE       node1                                    
ora.scan1.vip
      1        ONLINE  ONLINE       node1

正常情况下,除了ora.gsd 这个资源以外,其他的都应该是出于online状态的。

并且ora.testdb.db资源在两个节点都出于open状态。


5 数据库监听配置

使用grid用户登录

安装grid时定义了默认的监听端口1521

查看系统的监听状态:

[grid@node1 ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 10-APR-2013 14:38:08
Copyright (c) 1991, 2011, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date                10-APR-2013 11:29:42
Uptime                    0 days 3 hr. 8 min. 26 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oraapp/grid/gridhome/network/admin/listener.ora
Listener Log File         /oraapp/grid/gridbase/diag/tnslsnr/node1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=200.31.43.41)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=200.31.43.43)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "testdb" has 1 instance(s).
  Instance "testdb1", status READY, has 1 handler(s) for this service...
Service "testdbXDB" has 1 instance(s).
  Instance "testdb1", status READY, has 1 handler(s) for this service...
The command completed successfully

我们看到,ORACLE自动创建了服务testdb,该服务在两个结点上分别各有一个实例。

 使用srvctl命令添加监听 

1)检查默认的network的network number 

[grid@NODE1 ~]$ srvctl config network
Network exists: 1/200.31.43.0/255.255.255.0/bond0, type static

2)使用以下命令添加监听

[grid@NODE1 ~]$ srvctl add listener -l TESTDB_LISTENER -o $ORACLE_HOME -p 1522 -k 1
命令说明:
-k 就是上面获得的network number 
-p 监听端口
-l 监听名称
-o GI HOME

3)启动监听

[grid@NODE1 ~]$ srvctl start listener -l TESTDB_LISTENER

注意:在启动监听之后会在listener.ora和endpoints_listener.ora 自动添加记录

4)确认监听是否启动

[grid@NODE1 ~]$ crsctl status res -t | grep -2 TESTDB_LISTENER
Local Resources
--------------------------------------------------------------------------------
ora.TESTDB_LISTENER.lsnr
               ONLINE  ONLINE       node1                                    
               ONLINE  ONLINE       node2

查看建立的新监听TESTDB_LISTENER,端口1522:

lsnrctl status TESTDB_LISTENER

注意:11gR2以后的的LISTENER监听配置默认受到11.2新引入的endpoints_listener.ora配置文件的管理。在使用endpoints_listener.ora的情况下,请不要使用lsnrctl 来启动和停止LISTENER,而需要使用srvctl或者crsctl工具进行管理,否则lsnrctl 将不会识别endpoints_listener.ora的配置信息,造成监听没有在必要的地址,端口上工作。

 5)绑定数据库到监听:

此时LISTENER1不会注册数据库,需要修改LOCAL_LISTENER参数。

在两个节点上修改local listener: 

[oracle@node1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Wed Apr 10 14:42:54 2013
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SQL> show parameter listener
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks     string
local_listener     string (DESCRIPTION=(ADDRESS_LIST=(AD
 DRESS=(PROTOCOL=TCP)(HOST=200.
 31.43.41)(PORT=1521))))
remote_listener      string SCANIP:1521
SQL> alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=200.31.43.43)(PORT=1522))))' scope=both sid='testdb1';
System altered.
SQL> show parameter listener
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks     string
local_listener     string (DESCRIPTION=(ADDRESS_LIST=(AD
 DRESS=(PROTOCOL=TCP)(HOST=200.
 31.43.43)(PORT=1522))))
remote_listener      string SCANIP:1521

在两个节点上修改tnsnames.ora如下:

# tnsnames.ora Network Configuration File: /oracle/app/oracle/product/11.2.0/dbhome_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
# Remote Listener
TESTDB_LISTENERS =
  (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1522))
      (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1522))
  )
 
# Local Listener
TESTDB1_LISTENERS =
  (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1522))
  )
 
TESTDB =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 200.31.43.43)(PORT = 1522))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 200.31.43.44)(PORT = 1522))
      (LOAD_BALANCE = yes)
      (CONNECT_DATA =
          (SERVICE_NAME = TESTDB)
          (FAILOVER_MODE =
              (TYPE = SELECT)
              (METHOD = BASIC)
              (RETRIES = 200)
              (DELAY = 5)
          )
      )
  )
TESTDB1 =
(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 200.31.43.43)(PORT = 1522))
    (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = TESTDB)
        (INSTANCE_NAME = TESTDB1)
    )
)
 
TESTDB2 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 200.31.43.44)(PORT = 1522))
      (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = TESTDB)
          (INSTANCE_NAME = TESTDB2)
      )
)

在主节点上修改remote listener:

[oracle@node1 admin]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Wed Apr 10 15:04:29 2013
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SQL> show parameter listener
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks     string
local_listener     string (DESCRIPTION=(ADDRESS_LIST=(AD
 DRESS=(PROTOCOL=TCP)(HOST=200.31.43.43)(PORT=1522))))
remote_listener      string SCANIP:1521
SQL> alter system set remote_listener=TESTDB_LISTENERS;
System altered.
SQL> show parameter listener
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks     string
local_listener     string (DESCRIPTION=(ADDRESS_LIST=(AD
 DRESS=(PROTOCOL=TCP)(HOST=200.
 31.157.218)(PORT=1522))))
remote_listener      string TESTDB_LISTENERS

这样就将数据库orcltest的监听端口换成了1522

注意!监听必须绑定到VIP的端口上,因为VIP才是真正的业务IP,是可以在集群内部漂移的IP,而物理IP一旦机器宕机就不能访问了,而SCANIP只是一个转接IP,根据load_balance的设置将访问请求转接到各个实例的VIP的端口上,所以VIP才是真正的服务IP!

 

使用grid用户查看集群正常状态:

crs_stat –t//只有gsd为OFFLINE,其他全为ONLINE,即为正常状态。
Name           Type           Target    State     Host        
------------------------------------------------------------
ora.DATADG.dg  ora....up.type ONLINE    ONLINE    node1   
ora.FLASHDG.dg ora....up.type ONLINE    ONLINE    node1   
ora....ER.lsnr ora....er.type ONLINE    ONLINE    node1   
ora....ER.lsnr ora....er.type ONLINE    ONLINE    node1   
ora....N1.lsnr ora....er.type ONLINE    ONLINE    node2   
ora.OCRDG.dg   ora....up.type ONLINE    ONLINE    node1   
ora.asm        ora.asm.type   ONLINE    ONLINE    node1   
ora.cvu        ora.cvu.type   ONLINE    ONLINE    node2   
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE               
ora.testdb.db   ora....se.type ONLINE    ONLINE    node2   
ora....network ora....rk.type ONLINE    ONLINE    node1   
ora.oc4j       ora.oc4j.type  ONLINE    ONLINE    node2   
ora.ons        ora.ons.type   ONLINE    ONLINE    node1   
ora....SM2.asm application    ONLINE    ONLINE    node1   
ora....B3.lsnr application    ONLINE    ONLINE    node1   
ora....B3.lsnr application    ONLINE    ONLINE    node1   
ora....db3.gsd application    OFFLINE   OFFLINE               
ora....db3.ons application    ONLINE    ONLINE    node1   
ora....db3.vip ora....t1.type ONLINE    ONLINE    node1   
ora....SM1.asm application    ONLINE    ONLINE    node2   
ora....B4.lsnr application    ONLINE    ONLINE    node2   
ora....B4.lsnr application    ONLINE    ONLINE    node2   
ora....db4.gsd application    OFFLINE   OFFLINE               
ora....db4.ons application    ONLINE    ONLINE    node2   
ora....db4.vip ora....t1.type ONLINE    ONLINE    node2   
ora....ry.acfs ora....fs.type ONLINE    ONLINE    node1   
ora.scan1.vip  ora....ip.type ONLINE    ONLINE    node2

6 部署oswatcher

以oracle用户登录两个节点

1) 上传oswbb601.tar到/home/oracle目录

2)tar -xvf oswbb601.tar

3)编辑文件/home/oracle/oswbb/private.net:

traceroute -r -F node1-priv
traceroute -r -F node2-priv

其中 XXX-PRIV代表/etc/hosts中心跳网络的别名

4) chmod u+x /home/oracle/oswbb/private.net

5)cd /home/oracle/oswbb

6) ./startOSWbb.sh

7) su – root

8) 在/etc/rc.d/rc.local增加如下行:

# added for oracle oswatcher

su – oracle -c /home/oracle/oswbb/startOSWbb.sh

7 HugePage设置

在内存较大的数据库服务器(大于12G)上,需要设置HugePage,以提高内存页管理效率。

以root用户在/etc/security/limits.conf文件中增加如下内容(两个节点都要操作):

*  soft  memlock   60397977
*  hard  memlock 60397977

以oracle用户重新登陆,执行ulimit -l,确认输出为60397977

sqlplus / as sysdba
show parameter memory

–确认MEMORY_TARGET和MEMORY_MAX_TARGET均设置为0,代表没有使用AMM(Automatic Memory Management)

 执行hugepages_settings.sh(执行之前需要确认数据库和ASM实例均处于运行状态),得到推荐的hugepage数量。(此处假设为1496)

以root用户编辑/etc/sysctl.conf,增加如下行:

vm.nr_hugepages=1496

grep AnonHugePages /proc/meminfo 如果输出为“AnonHugePages: xxx kB”,xxx表示大于0的值,则表示内核在使用透明大页。

在RHEL6中透明大页会导致数据库异常重启。因此如果内核在使用透明大页,则需要在/etc/grub.conf的启动选项中,加入如下选项:

transparent_hugepage=never

加完以后的配置文件类似如下:

kernel /vmlinuz-2.6.32-300.25.1.el6uek.x86_64 ro root=LABLE=/ transparent_hugepage=never

重启数据库主机,并且重启数据库。

grep HugePages /proc/meminfo,确认HugePages_Total为1496
grep AnonHugePages /proc/meminfo,确认没有在使用Transparent HugePages

8 测试

1)拔掉主机1的一根业务网线,确认数据库状态正常。

2)将主机1的网线插回,等待大约2分钟,拔掉主机2的一根业务网线,确认数据库状态正常。

3) 将主机2的网线插回。拔掉一根心跳,确认数据库状态正常。

4) 拔掉另一根心跳,确认fencing后数据库资源正常

5) 将心跳线插回,拔掉一台主机的两根网线,确认一个数据库实例关闭,另外一个数据库实例资源状态正常。

 

发表在 Oracle, ORACLE基础与管理 | 留下评论

GoldenGate在Oracle数据库复制环境下aftercsn与atcsn的选取测试研究

本文作者:东方龙马(上海)  谢金融

实验说明:

熟悉Ogg实施过程的伙伴们都应了解,实施步骤中初始化的步骤尤为关键,通常可以使用rman或者exp两种方式,而开启复制进程时也有atcsn(大于或等于该scn的事务将被apply),aftercsn(大于该scn的事务将被apply)参数进行选择。

结论:当使用rman初始化时使用atcsn,使用exp初始化时使用aftercsn。
真假:真
说法:以上结论正确,但存在特例:当rman方式初始化时,如果until 的scn正好是一个事务的commit消息,则需要使用aftercsn;因为此时rman恢复包含了该事务。
真假:假

下面的实验同时验证说法的不正确以及结论的正确性。

实验环境:

数据库版本:oracle 11.2.0.4

操作系统:redhat 5.5

实验步骤:

一、 创建表xt

Create table xt (i int);
插入数据并提交
insert into xt select current_scn from v$database;
commit;

二、 使用logminer查看该事务的scn

1) 找出正在使用的日志文件

SQL> select l.group#, l.thread#, l.status, lf.member
  from v$log l, v$logfile lf
 where l.status = 'CURRENT'
   and l.group# = lf.group#;
   
    GROUP#    THREAD# STATUS       MEMBER
---------- ---------- ---------------- -----------------------------
 1    1 CURRENT       +DATADG/sprac/onlinelog/group_1.257.897514033

2) 将日志文件加入挖掘队列

SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE('+DATADG/sprac/onlinelog/group_1.257.897514033',
                                  DBMS_LOGMNR.NEW);
                                  
PL/SQL procedure successfully completed.

3) 使用联机目录数据字典

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

PL/SQL procedure successfully completed.

4) 查看事务的commi scn,commit scn 为17597245

SQL> select scn, start_scn, commit_scn, operation, table_name, sql_redo
  from v$logmnr_contents
 where scn between 17597237 and 17597245;
 
SCN         START_SCN COMMIT_SCN OPERATION  TABLE_NAME SQL_REDO 
---------- ------------- ----------------- ---------- ------------- --------------------------  
17597238                         START                 set transaction read write;   
17597238                         INSERT     XT         insert into "SYS"."XT"("I") values ('17597237');   
17597245   17597238 17597245     COMMIT                commit;

使用闪回查询,在17597245点可以看到该事务,在17597244点是没有该事务的

SQL> select * from xt as of scn 17597245;
 I
----------
  17597237
  
SQL> select * from xt as of scn 17597244;

no rows selected

三、 使用exp闪回导出数据,导出一行说明可以导出该事务

[oracle@sprac1 ~]$ exp system/oracle file=/tmp/xt tables=sys.xt flashback_scn=17597245
Export: Release 11.2.0.4.0 - Production on Mon Dec 7 11:30:08 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Tes
Export done in ZHS16GBK character set and AL16UTF16 NCHAR character set
About to export specified tables via Conventional Path ...
Current user changed to SYS
. . exporting table                             XT          1 rows exported
Export terminated successfully without warnings.

四、 使用rman恢复

1) 关闭数据库

SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

2) 使用rman打开到mount

[oracle@sprac1 ~]$ rman target /
Recovery Manager: Release 11.2.0.4.0 - Production on Mon Dec 7 11:35:35 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
connected to target database (not started)
RMAN> startup mount;
Oracle instance started
database mounted
Total System Global Area     818401280 bytes
Fixed Size                     2257680 bytes
Variable Size                645926128 bytes
Database Buffers             167772160 bytes
Redo Buffers                   2445312 bytes

3) 使用已经做好的全备Restore数据库

RMAN> restore database;
Starting restore at 07-DEC-15
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=34 instance=sprac1 device type=DISK
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to +DATADG/sprac/datafile/system.259.885043239
channel ORA_DISK_1: restoring datafile 00002 to +DATADG/sprac/datafile/sysaux.260.885043267
channel ORA_DISK_1: restoring datafile 00003 to +DATADG/sprac/datafile/undotbs1.261.885043287
channel ORA_DISK_1: restoring datafile 00004 to +DATADG/sprac/datafile/undotbs2.266.887480495
channel ORA_DISK_1: restoring datafile 00005 to +DATADG/sprac/datafile/users.264.885043319
channel ORA_DISK_1: restoring datafile 00006 to +DATADG/sprac/datafile/xjruser.dbf
channel ORA_DISK_1: restoring datafile 00007 to +DATADG/sprac/datafile/ogg.473.886860363
channel ORA_DISK_1: restoring datafile 00008 to +DATADG/sprac/datafile/sh.606.892830263
channel ORA_DISK_1: reading from backup piece /disk/full_sprac1.full
channel ORA_DISK_1: piece handle=/disk/full_sprac1.full tag=TAG20151201T195635
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:02:57
Finished restore at 07-DEC-15

4) 恢复数据库until scn 17597245

RMAN> recover database until scn 17597245;
Starting recover at 07-DEC-15
using channel ORA_DISK_1
starting media recovery
...
...
...
archived log file name=/u01/app/oracle/arch/sprac/1_20_897514028.dbf thread=1 sequence=20
archived log file name=/u01/app/oracle/arch/sprac/1_21_897514028.dbf thread=1 sequence=21
archived log file name=/u01/app/oracle/arch/sprac/1_1_897773893.dbf thread=1 sequence=1
media recovery complete, elapsed time: 00:02:16
Finished recover at 07-DEC-15

5) 进入sqlplus,以read only模式打开

[oracle@sprac1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Mon Dec 7 11:43:27 2015
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
SQL> alter database open read only;
alter database open read only
*
ERROR at line 1:
ORA-16005: database requires recovery------------此处由于控制文件scn新于数据文件,执行下面语句即可
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 17597245 generated at 12/07/2015 11:18:21 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/arch/sprac/1_3_897773893.dbf
ORA-00280: change 17597245 for thread 1 is in sequence #3
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
Media recovery cancelled.
SQL> alter database open read only;
Database altered.

6) 查看数据文件头scn

SQL> select checkpoint_change# from v$datafile_header;
CHECKPOINT_CHANGE#
------------------
  17597245
  17597245
  17597245
  17597245
  17597245
  17597245
  17597245
  17597245
8 rows selected.

7) 查看current scn,说明数据库只包含到17597244

SQL> select current_scn from v$database;
CURRENT_SCN
-----------
   17597244

8) 查看xt表的事务存不存在

SQL> select * from xt;
no rows selected

试验总结:

rman recover until scn 17597245是不包含这个scn,所以ogg复制进程需要使用atcsn 17597245;

Exp flashback_scn 17597245是包含这个scn的,所以复制进程使用aftercsn 17597245

Tips:同理 splex的reconcile操作,

 Rman 方式初始化————》reconcile scn xxx

 Exp 方式初始化—————》reconcile scn xxx+1

发表在 Oracle, ORACLE基础与管理 | 留下评论

测试io性能的工具-oracle orion介绍

Oracle orion介绍

orion,一款由Oracle公司提供,专门用于模拟数据库运行机制来测试存储的优秀IO存储测试软件,可以在不运行oracle数据库的情况下,仿真OLTP随机操作(测试IOPS)或者是OLAP连续性操作(测试吞吐量)。

从oracle 11g R2起,orion被整合进RDBMS中了,命令可以从$ORACLE_HOME/bin中找到。

IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。

Mbps (MB per Second)传输速率是指集线器的数据交换能力,也叫“带宽”,单位是Mbps(兆位/秒)。

测试命令示例

注:我的配置文件为my_disk.lun,内容如下:

[root@ora11gdb1 orion]# more my_disk.lun 
/dev/sdb1
/dev/sdc1
/dev/sdd1
/dev/sde1

1、数据库OLTP类型,假定IO类型全部是8K随机操作,压力类型,自动加压,从小到大,一直到存储压力极限 

$$ORACLE_HOME/bin/orion -run advanced -testname my_disk \
-num_disks 4 -size_small 8 -size_large 8 -type rand

2、数据库OLAP类型,吞吐量测试,假定IO全部是1M的序列性IO

$$ORACLE_HOME/bin/orion -run advanced -testname my_disk  \
-num_disks 4 -size_small 1024 -size_large 1024 -type seq

必选输入参数:(run、testname、num_disks)

run:测试运行的层次,这个选项提供simple,normal,advanced的层次。

Simple:简单的测试小的随机的IO(默认8k)以及大IO的连续的IO(默认1024K)。在这个选项中,小的随机的IO和大的连续的IO是分开测试的。这个参数对应下列的Orion调用:

$ORACLE_HOME/bin/orion -run advanced -testname my_disk \
-num_disks 4 -size_small 8 -size_large 1024 -type rand \
-simulate concat -write 0 -duration 60 -matrix basic
或
$ORACLE_HOME/bin/orion -run advanced -testname my_disk -num_disks 4

Normal:除了simple的功能外,还会产生小的随机的IO和大的连续的IO的结合。这个参数对应下列的Orion调用:

$ORACLE_HOME/bin/orion -run advanced -testname my_disk \
-num_disks 4 -size_small 8 -size_large 1024 -type rand \
-simulate concat -write 0 -duration 60 -matrix detailed
或
$ORACLE_HOME/bin/orion -run advanced -testname my_disk -num_disks 4

Advanced:用这个选项,用户需要指定可选的参数。

testname: 输入文件必须是<testname>.lun。在这里只需要输入<testname>,不需要文件的后缀名,输入了反而会报错。

num_disks: 实际测试的物理磁盘的数目。

可选的输入参数:

size_small: 小的随机工作量的IO的大小(KB)。

size_large: 大的随机的或者连续工作量的大小(KB)。

type:大的IO的工作类型(默认是rand):

    — rand:大的随机的IO。

   — seq:大的连续的IO。

write: 和读相比的写的百分比,这个参数在小的随机的和大的连续的IO工作量下适用。在大的连续的IO,每个读写流要么是读要么是写。这个参数是指只是写百分比。写的数据都是垃圾数据。 写的测试将破坏的指定的lun。

num_streamIO: 每个大的连续读写流的IO数目。只是在-type seq下使用。

simulate:大的连续的IO工作量小的数据分布。

  — contact:串联指定的luns成一个虚拟的卷。在虚拟的卷上的连续的测试从某个点到一个lun的结束点。然后再到下一个lun。

  — raid0:在指定的luns上条带化成一个虚拟的卷。条带的大小是1M(和asm的条带大小一致),可以通过参数-stripe来更改。

cache_size: 存储阵列的读写缓存大小(MB)。针对大的连续的IO工作量,Orion将在每个测试点之前warm的cache。使用缓存大小来决定缓存操作。如果没有指定,将有个默认值。如果是0的话,将没有warm缓存。

duration: 每个测试点的时间。(默认是60)

matrix: 混合工作量测试的类型

  — basic:没有混合的工作量,小的随机的IO和大的连续的IO分开测试。

  — detailed:小的随机的IO和大的连续的IO结合起来测试。

  — point: 单个测试点,S代表小的随机的IO,L代表大的随机/连续的IO。S -num_small L -num_large

  — col: 大的随机/连续的IO

  — row: 小的随机的IO

  — max:和detailed一样,只是在最大的负载下测试工作量。可以用-num_small和 -num_large参数指定。

num_small: 小的随机的IO的最大数目。

num_large: 大的随机的IO或者一个读写流的并发数目。

verbose:打印进度和状态到控制台。

结果返回:

该软件的运行只需要一个配置文件,<testname>.lun,配置了测试所需要用到的磁盘信息,而分别返回如下信息:

<testname>_iops.csv:不同压力类型的IOPS值

<testname>_mbps.csv:不同压力类型的吞吐量

<testname>_lat.csv:不同压力类型下的响应时间

<testname>_summary.txt:测试结果的汇总信息

注:如果你的数据库IO请求主要是单个块,那就关注IOPS,如果数据库IO请求主要是多个块,那就关注MBPS。

发表在 Oracle, ORACLE基础与管理 | 留下评论

TPCC-MySQL使用参考

一、 Tpcc-mysql介绍

Tpcc-mysql是percona基于tpcc衍生出来的产品,专用于mysql基准测试,其源码放在bazaar(Bazaar是一个分布式的版本控制系统,采用 GPL 许可协议,可运行于 Windows、GNU/Linux、UNIX 以及 Mac OS 系统之上。Bazaar 由 Canonical 公司(Ubuntu母公司)赞助)上,因此还需要先安装bazaar客户端。

二、编译安装

编译非常简单

cd /mysql_soft/tpcc-mysql/src
make

然后就会在 /mysql_soft/tpcc-mysql 下生成 tpcc 命令行工具 tpcc_load 、 tpcc_start

三、开始加载测试数据

初始化测试库环境

cd /mysql_soft/tpcc-mysql
mysql -uroot -ppassword -e 'create database tpcc'  
mysql -uroot -ppassword tpcc < create_table.sql
mysql -uroot -ppassword tpcc < add_fkey_idx.sql

初始化完毕后,就可以开始加载测试数据了

四、tpcc_load使用

# ./tpcc_load --help
tpcc_load [server] [DB] [user] [pass] [warehouse]
Server:服务器名
DB:数据库名
user:用户名
pass: 密码
Warehouse: 仓库的数量

注:Warehouse是代表几个仓库,仓库越大,数据量越大。耗费的时间越长,数据最好模拟你真实的数据量,或者至少大于你的buffer pool。

如下:

./tpcc_load localhost tpcc root password 20

在这里,需要注意的是 tpcc 默认会读取 /var/lib/mysql/mysql.sock 这个socket位置,因此如果你的socket不在相应路径的话,就需要做个软连接,或者通过TCP/IP的方式连接测试服务器。

注:加载测试数据时长视仓库数量而定,可能会比较久。

五、进行测试

#./tpcc_start --help
tpcc_start -h server_host -P port -d database_name -u mysql_user -p mysql_password -w warehouses -c connections -r warmup_time -l running_time -i report_interval -f report_file
介绍一下各个参数的用法
-h server_host:服务器名
-P port :端口号,默认为3306
-d database_name:数据库名
-u mysql_user :用户名
-p mysql_password :密码
-w warehouses:仓库的数量
-c connections :线程数,默认为1
-r warmup_time :热身时间,单位:s,默认为10s ,热身是为了将数据加载到内存。
-l running_time:测试时间,单位:s,默认为20s
-i report_interval:指定生成报告间隔时长
-f report_file:测试结果输出文件

现在我们来开启一个测试案例

[root@mysql-serv tpcc-mysql]# ./tpcc_start -hmysql-serv -d tpcc -utpcc -ppassword -w20 -c20 -r60 -l600
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
option h with value 'mysql-serv'
option d with value 'tpcc'
option u with value 'tpcc'
option p with value 'password'
option w with value '20'
option c with value '20'
option r with value '60'
option l with value '600'
<Parameters>
     [server]: mysql-serv
     [port]: 3306
     [DBname]: tpcc
       [user]: tpcc
       [pass]: password
  [warehouse]: 20
 [connection]: 20
     [rampup]: 60 (sec.)
    [measure]: 600 (sec.)
RAMP-UP TIME.(60 sec.)
MEASURING START.
  10, 732(1):2.810|6.593, 736(0):0.752|7.129, 73(0):0.474|0.883, 74(0):3.980|5.132, 74(0):8.365|9.973
  20, 723(0):2.825|4.055, 712(0):0.888|1.624, 71(0):0.247|0.350, 70(0):3.633|7.875, 72(0):7.817|8.062
  30, 679(0):2.766|3.760, 693(0):0.745|1.082, 69(0):0.363|0.757, 69(0):3.482|3.762, 69(0):7.932|9.848
  40, 686(1):3.218|5.785, 683(0):0.764|1.132, 69(0):0.353|0.372, 70(0):3.863|6.717, 68(0):8.790|10.432
  50, 724(1):2.890|8.127, 717(0):0.766|1.636, 72(0):0.321|0.368, 71(0):3.156|3.846, 73(0):8.129|13.869
......
 580, 683(0):2.397|3.596, 684(0):0.697|1.083, 68(0):0.271|0.319, 69(0):3.099|3.107, 69(0):7.353|8.127
 590, 671(1):2.398|6.198, 663(0):0.608|1.371, 67(0):0.462|0.489, 67(0):2.750|2.982, 66(0):6.954|7.055
 600, 661(1):2.758|5.095, 662(0):0.707|1.082, 66(0):0.295|0.443, 66(0):3.238|3.289, 66(0):7.298|7.411
STOPPING THREADS....................
<Raw Results>
  [0] sc:40389  lt:35  rt:0  fl:0 
  [1] sc:40419  lt:2  rt:0  fl:0 
  [2] sc:4043  lt:0  rt:0  fl:0 
  [3] sc:4044  lt:0  rt:0  fl:0 
  [4] sc:4042  lt:2  rt:0  fl:0 
 in 600 sec.
<Raw Results2(sum ver.)>
  [0] sc:40397  lt:35  rt:0  fl:0 
  [1] sc:40428  lt:2  rt:0  fl:0 
  [2] sc:4043  lt:0  rt:0  fl:0 
  [3] sc:4044  lt:0  rt:0  fl:0 
  [4] sc:4042  lt:2  rt:0  fl:0 
<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.47% (>=43.0%) [OK]
   Order-Status: 4.35% (>= 4.0%) [OK]
       Delivery: 4.35% (>= 4.0%) [OK]
    Stock-Level: 4.35% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 99.91%  [OK]
        Payment: 100.00%  [OK]
   Order-Status: 100.00%  [OK]
       Delivery: 100.00%  [OK]
    Stock-Level: 99.95%  [OK]
<TpmC>
                 4042.400 TpmC

注:TpmC是我们最为关注的值!

发表在 MySQL | 留下评论

Linux性能测试UnixBench

UnixBench是什么

UnixBench 是一款开源的测试 unix 系统基本性能的工具,是比较通用的测试VPS性能的工具.。UnixBench会执行一系列的测试,包括2D和3D图形系统的性能衡量,测试的结果不仅仅只是CPU,内存,或者磁盘为基准,还取决于硬件,操作系统版本,编译器.。测试系统各个方面一系列的性能,然后将每个测试结果和一个基准值进行比较,得到一个索引值,所有测试项目的索引值结合在一起形成一个测试分数值.

UnixBench 下载地址:

http://lamp.teddysun.com/files/

UnixBench安装运行:

1)解压目录到:/soft/UnixBench

2) 在安装配置了gcc的环境下直接运行:make

3)在/soft/UnixBench目录下运行:./Run

UnixBench测试说明:

Dhrystone 2 using register variables

此项用于测试 string handling,因为没有浮点操作,所以深受软件和硬件设计(hardware and software design)、编译和链接(compiler and linker options)、代码优化(code optimazaton)、对内存的cache(cache memory)、等待状态(wait states)、整数数据类型(integer data types)的影响。

Double-Precision Whetstone

这一项测试浮点数操作的速度和效率。这一测试包括几个模块,每个模块都包括一组用于科学计算的操作。覆盖面很广的一系列 c 函数:sin,cos,sqrt,exp,log 被用于整数和浮点数的数学运算、数组访问、条件分支(conditional branch)和程序调用。此测试同时测试了整数和浮点数算术运算。

Execl Throughput

此测试考察每秒钟可以执行的 execl 系统调用的次数。 execl 系统调用是 exec 函数族的一员。它和其他一些与之相似的命令一样是 execve() 函数的前端。

File copy

测试从一个文件向另外一个文件传输数据的速率。每次测试使用不同大小的缓冲区。这一针对文件 read、write、copy 操作的测试统计规定时间(默认是 10s)内的文件 read、write、copy 操作次数。

Pipe Throughput

管道(pipe)是进程间交流的最简单方式,这里的 Pipe throughtput 指的是一秒钟内一个进程可以向一个管道写 512 字节数据然后再读回的次数。需要注意的是,pipe throughtput 在实际编程中没有对应的真实存在。

Pipe-based Context Switching

这个测试两个进程(每秒钟)通过一个管道交换一个不断增长的整数的次数。这一点很向现实编程中的一些应用,这个测试程序首先创建一个子进程,再和这个子进程进行双向的管道传输。

Process Creation

测试每秒钟一个进程可以创建子进程然后收回子进程的次数(子进程一定立即退出)。process creation 的关注点是新进程进程控制块(process control block)的创建和内存分配,即一针见血地关注内存带宽。一般说来,这个测试被用于对操作系统进程创建这一系统调用的不同实现的比较。

System Call Overhead

测试进入和离开操作系统内核的代价,即一次系统调用的代价。它利用一个反复地调用 getpid 函数的小程序达到此目的。

Shell Scripts

测试一秒钟内一个进程可以并发地开始一个 shell 脚本的 n 个拷贝的次数,n 一般取值 1,2,4,8。(我在测试时取 1, 8)。这个脚本对一个数据文件进行一系列的变形操作(transformation)。

以下为我的测试结果:

1449071064185188.jpg

发表在 OS | 留下评论

部分常用SQL脚本

— 查找前N条性能差的sql.

set linesize 130
set pagesize 500
col sql_text format a60
 SELECT * FROM 
(
SELECT 
sql_text,BUFFER_GETS/decode(EXECUTIONS,0,1,executions) as p_buffer_gets,executions
  EXECUTIONS,cpu_time/1000000 as cpu_time,ELAPSED_TIME/1000000 as p_elapsed_time,HASH_VALUE
FROM v$sqlarea
ORDER BY BUFFER_GETS/(1+EXECUTIONS) DESC 
) 
WHERE ROWNUM<&sql_rownum ;

— 根据进程找当前运行的SQL

col username format a20
col sql_text format a60
set linesize 120
SELECT a.username,
a.sid,
a.serial#,
c.sql_text
    FROM v$session a,
v$process b,
v$sqlarea c
WHERE b.spid in (&1)
AND b.addr=a.paddr
AND a.sql_address=c.address
-- 根据会话ID找当前运行的SQL
col username format a20
col sql_text format a60
set linesize 120
SELECT a.username,
a.sid,
a.serial#,
b.spid,
c.sql_text
    FROM v$session a,
v$process b,
v$sqlarea c
WHERE a.sid in (&1)
AND b.addr=a.paddr
AND a.sql_address=c.address

— 统计归档日志:

set linesize 200
set pagesize 200
col "Total" format 99999
col THREAD# format 99
col h0 format 9999
col h1 format 9999
col h2 format 9999
col h3 format 9999
col h4 format 9999
col h5 format 9999
col h6 format 9999
col h7 format 9999
col h8 format 9999
col h9 format 9999
col h10 format 9999
col h11 format 9999
col h12 format 9999
col h13 format 9999
col h14 format 9999
col h15 format 9999
col h16 format 9999
col h17 format 9999
col h18 format 9999
col h19 format 9999
col h20 format 9999
col h21 format 9999
col h22 format 9999
col h23 format 9999
col h24 format 9999
SELECT trunc(first_time) "Date",
to_char(first_time, 'Dy') "Day",
    THREAD#,
count(1) "Total",
SUM(decode(to_char(first_time, 'hh24'),'00',1,0)) "h0",
SUM(decode(to_char(first_time, 'hh24'),'01',1,0)) "h1",
SUM(decode(to_char(first_time, 'hh24'),'02',1,0)) "h2",
SUM(decode(to_char(first_time, 'hh24'),'03',1,0)) "h3",
SUM(decode(to_char(first_time, 'hh24'),'04',1,0)) "h4",
SUM(decode(to_char(first_time, 'hh24'),'05',1,0)) "h5",
SUM(decode(to_char(first_time, 'hh24'),'06',1,0)) "h6",
SUM(decode(to_char(first_time, 'hh24'),'07',1,0)) "h7",
SUM(decode(to_char(first_time, 'hh24'),'08',1,0)) "h8",
SUM(decode(to_char(first_time, 'hh24'),'09',1,0)) "h9",
SUM(decode(to_char(first_time, 'hh24'),'10',1,0)) "h10",
SUM(decode(to_char(first_time, 'hh24'),'11',1,0)) "h11",
SUM(decode(to_char(first_time, 'hh24'),'12',1,0)) "h12",
SUM(decode(to_char(first_time, 'hh24'),'13',1,0)) "h13",
SUM(decode(to_char(first_time, 'hh24'),'14',1,0)) "h14",
SUM(decode(to_char(first_time, 'hh24'),'15',1,0)) "h15",
SUM(decode(to_char(first_time, 'hh24'),'16',1,0)) "h16",
SUM(decode(to_char(first_time, 'hh24'),'17',1,0)) "h17",
SUM(decode(to_char(first_time, 'hh24'),'18',1,0)) "h18",
SUM(decode(to_char(first_time, 'hh24'),'19',1,0)) "h19",
SUM(decode(to_char(first_time, 'hh24'),'20',1,0)) "h20",
SUM(decode(to_char(first_time, 'hh24'),'21',1,0)) "h21",
SUM(decode(to_char(first_time, 'hh24'),'22',1,0)) "h22",
SUM(decode(to_char(first_time, 'hh24'),'23',1,0)) "h23"
FROM V$log_history
group by trunc(first_time), to_char(first_time, 'Dy'),THREAD#
Order by 1;

— 空间使用情况:

set linesize 120
col "Name" format a20
col "Used (M)" format a20
col "Used %" format a20
col "Size (M)" format a20
SELECT d.status "Status", d.tablespace_name "Name", d.contents "Type", d.extent_management "Extent Management", TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99,999,990.90') "Size (M)", 
TO_CHAR(NVL(a.bytes - NVL(f.bytes, 0), 0)/1024/1024,'99999999.99') 
"Used (M)", TO_CHAR(NVL((a.bytes - 
NVL(f.bytes, 0)) / a.bytes * 100, 0), '990.00') "Used %" 
FROM sys.dba_tablespaces d, (select 
tablespace_name, sum(bytes) bytes from dba_data_files group by tablespace_name) a, (select 
tablespace_name, sum(bytes) bytes from dba_free_space group by tablespace_name) f 
WHERE 
d.tablespace_name = a.tablespace_name(+) AND d.tablespace_name = f.tablespace_name(+) AND NOT 
(d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY') 
UNION ALL
SELECT d.status 
"Status", d.tablespace_name "Name", d.contents "Type", d.extent_management "Extent Management", 
TO_CHAR(NVL(a.bytes / 1024 / 1024, 0),'99,999,990.90') "Size (M)", TO_CHAR(NVL(t.bytes, 
0)/1024/1024,'99999999.99')  "Used (M)", 
TO_CHAR(NVL(t.bytes / a.bytes * 100, 0), '990.00') "Used %" 
FROM sys.dba_tablespaces d, (select 
tablespace_name, sum(bytes) bytes from dba_temp_files group by tablespace_name) a, (select 
tablespace_name, sum(bytes_cached) bytes from v$temp_extent_pool group by tablespace_name) t 
WHERE 
d.tablespace_name = a.tablespace_name(+) AND d.tablespace_name = t.tablespace_name(+) AND 
d.extent_management like 'LOCAL' AND d.contents like 'TEMPORARY' order by "Name";

— 当前锁等待情况

- for rac:
set linesize 150
col sess format a30
col username format a20
select username,
decode(request, 0, 'holder:', 'waiter:') || gv$lock.sid sess,gv$lock.inst_id,
       id1,
   decode(gv$lock.type,'TX',trunc(id1/power(2,16)),null) rbs,                 
       decode(gv$lock.type,'TX',bitand(id1,to_number('ffff','xxxx'))+0,null) slot,
   id2,
       lmode,
       request,
       gv$lock.type
  from gv$lock,gv$session
 where (id1, id2, gv$lock.type) in
       (select id1, id2, type from gv$lock where request > 0)
   and gv$lock.sid=gv$session.sid and gv$lock.inst_id=gv$session.inst_id
 order by id1, request;

 –for no rac:

set linesize 150
col sess format a30
col username format a20
select username,
decode(request, 0, 'holder:', 'waiter:') || v$lock.sid sess,
       id1,
   decode(v$lock.type,'TX',trunc(id1/power(2,16)),null) rbs,                 
       decode(v$lock.type,'TX',bitand(id1,to_number('ffff','xxxx'))+0,null) slot,
   id2,
       lmode,
       request,
       v$lock.type
  from v$lock,v$session
 where (id1, id2, v$lock.type) in
       (select id1, id2, type from v$lock where request > 0)
   and v$lock.sid=v$session.sid 
 order by id1, request;

— 查看当前被锁的对象

— for no rac:

set linesize 140
col username format a15
col res format a18
col tab format a20
col owner format a15
col lmode format a15    
col request format a15
select  l.sid,s.username,
        decode(l.type,'RW','RW - Row Wait Enqueue',
                      'TM','TM - DML Enqueue', 
                      'TX','TX - Trans Enqueue',
                      'UL','UL - User',l.type||'System') res, 
        substr(t.name,1,10) tab,u.name owner, 
        l.id1,l.id2, 
        decode(l.lmode,1,'No Lock', 
                2,'Row Share', 
                3,'Row Exclusive', 
                4,'Share', 
                5,'Shr Row Excl', 
                6,'Exclusive',null) lmode, 
        decode(l.request,1,'No Lock', 
                2,'Row Share', 
                3,'Row Excl', 
                4,'Share', 
                5,'Shr Row Excl', 
                6,'Exclusive',null) request 
from v$lock l, v$session s, 
sys.user$ u,sys.obj$ t 
where l.sid = s.sid 
and s.type != 'BACKGROUND' 
and t.obj# = l.id1 
and u.user# = t.owner#;

for rac:

set linesize 160
col username format a15
col res format a18
col tab format a20
col owner format a15
col lmode format a15    
col request format a15
select  l.inst_id,l.sid,s.username,
        decode(l.type,'RW','RW - Row Wait Enqueue',
                      'TM','TM - DML Enqueue', 
                      'TX','TX - Trans Enqueue',
                      'UL','UL - User',l.type||'System') res, 
        substr(t.name,1,10) tab,u.name owner, 
        l.id1,l.id2, 
        decode(l.lmode,1,'No Lock', 
                2,'Row Share', 
                3,'Row Exclusive', 
                4,'Share', 
                5,'Shr Row Excl', 
                6,'Exclusive',null) lmode, 
        decode(l.request,1,'No Lock', 
                2,'Row Share', 
                3,'Row Excl', 
                4,'Share', 
                5,'Shr Row Excl', 
                6,'Exclusive',null) request 
from gv$lock l, gv$session s, 
sys.user$ u,sys.obj$ t 
where l.sid = s.sid 
and s.type != 'BACKGROUND' 
and s.username != 'SYS'
and t.obj# = l.id1 
and u.user# = t.owner#;

— shared pool 使用情况

set linesize 120
select '0 (<140)' BUCKET,
       KSMCHCLS,
       KSMCHIDX,
       10 * trunc(KSMCHSIZ / 10) "From",
       count(*) "Count",
       max(KSMCHSIZ) "Biggest",
       trunc(avg(KSMCHSIZ)) "AvgSize",
       trunc(sum(KSMCHSIZ)) "Total"
  from x$ksmsp
 where KSMCHSIZ < 140
   and KSMCHCLS = 'free'
 group by KSMCHCLS, KSMCHIDX, 10 * trunc(KSMCHSIZ / 10)
UNION ALL
select '1 (140-267)' BUCKET,
       KSMCHCLS,
       KSMCHIDX,
       20 * trunc(KSMCHSIZ / 20),
       count(*),
       max(KSMCHSIZ),
       trunc(avg(KSMCHSIZ)) "AvgSize",
       trunc(sum(KSMCHSIZ)) "Total"
  from x$ksmsp
 where KSMCHSIZ between 140 and 267
   and KSMCHCLS = 'free'
 group by KSMCHCLS, KSMCHIDX, 20 * trunc(KSMCHSIZ / 20)
UNION ALL
select '2 (268-523)' BUCKET,
       KSMCHCLS,
       KSMCHIDX,
       50 * trunc(KSMCHSIZ / 50),
       count(*),
       max(KSMCHSIZ),
       trunc(avg(KSMCHSIZ)) "AvgSize",
       trunc(sum(KSMCHSIZ)) "Total"
  from x$ksmsp
 where KSMCHSIZ between 268 and 523
   and KSMCHCLS = 'free'
 group by KSMCHCLS, KSMCHIDX, 50 * trunc(KSMCHSIZ / 50)
UNION ALL
select '3-5 (524-4107)' BUCKET,
       KSMCHCLS,
       KSMCHIDX,
       500 * trunc(KSMCHSIZ / 500),
       count(*),
       max(KSMCHSIZ),
       trunc(avg(KSMCHSIZ)) "AvgSize",
       trunc(sum(KSMCHSIZ)) "Total"
  from x$ksmsp
 where KSMCHSIZ between 524 and 4107
   and KSMCHCLS = 'free'
 group by KSMCHCLS, KSMCHIDX, 500 * trunc(KSMCHSIZ / 500)
UNION ALL
select '6+ (4108+)' BUCKET,
       KSMCHCLS,
       KSMCHIDX,
       1000 * trunc(KSMCHSIZ / 1000),
       count(*),
       max(KSMCHSIZ),
       trunc(avg(KSMCHSIZ)) "AvgSize",
       trunc(sum(KSMCHSIZ)) "Total"
  from x$ksmsp
 where KSMCHSIZ >= 4108
   and KSMCHCLS = 'free'
 group by KSMCHCLS, KSMCHIDX, 1000 * trunc(KSMCHSIZ / 1000);
 set linesize 120;
 SELECT KSMCHCLS CLASS,
       COUNT(KSMCHCLS) NUM,
       SUM(KSMCHSIZ) SIZ,
       To_char(((SUM(KSMCHSIZ) / COUNT(KSMCHCLS) / 1024)), '999,999.00') || 'k' "AVG SIZE"
  FROM X$KSMSP
 GROUP BY KSMCHCLS;

— 找到对外键没有创建索引的表字段

set linesize 160
column columns format a35 word_wrapped
column tablename format a30 word_wrapped
column constraint_name format a30 word_wrapped
select table_name,
       constraint_name,
       cname1 || nvl2(cname2, ',' || cname2, null) ||
       nvl2(cname3, ',' || cname3, null) ||
       nvl2(cname4, ',' || cname4, null) ||
       nvl2(cname5, ',' || cname5, null) ||
       nvl2(cname6, ',' || cname6, null) ||
       nvl2(cname7, ',' || cname7, null) ||
       nvl2(cname8, ',' || cname8, null) columns
  from (select b.table_name,
               b.constraint_name,
               max(decode(position, 1, column_name, null)) cname1,
               max(decode(position, 2, column_name, null)) cname2,
               max(decode(position, 3, column_name, null)) cname3,
               max(decode(position, 4, column_name, null)) cname4,
               max(decode(position, 5, column_name, null)) cname5,
               max(decode(position, 6, column_name, null)) cname6,
               max(decode(position, 7, column_name, null)) cname7,
               max(decode(position, 8, column_name, null)) cname8,
               count(*) col_cnt
          from (select substr(table_name, 1, 30) table_name,
                       substr(constraint_name, 1, 30) constraint_name,
                       substr(column_name, 1, 30) column_name,
                       position
                  from dba_cons_columns
                 where owner = 'OAT') a,
               dba_constraints b
         where b.owner = 'OAT'
           and a.constraint_name = b.constraint_name
           and b.constraint_type = 'R'
         group by b.table_name, b.constraint_name) cons
 where col_cnt > ALL (select count(*)
          from dba_ind_columns i
         where i.table_owner = 'OAT'
           and i.table_name = cons.table_name
           and i.column_name in (cname1,
                                 cname2,
                                 cname3,
                                 cname4,
                                 cname5,
                                 cname6,
                                 cname7,
                                 cname8)
           and i.column_position <= cons.col_cnt
         group by i.index_name);

–查询绑定变量:

select plan_table_output
  from table(dbms_xplan.display_awr('9zaarvmhhy7mw',
                                    null,
                                    null,
                                    'ADVANCED +PEEKED_BINDS'));
select plan_table_output
  from table(dbms_xplan.display_cursor('8jwra6ygq2s16',
                                       0,
                                       'ADVANCED +PEEKED_BINDS'));

–回滚段,找到有问题(如ORA-01555)的部分:

set pagesize 72
set linesize 120
column UNXPSTEALCNT heading "# Unexpired|Stolen"
column EXPSTEALCNT heading "# Expired|Reused"
column SSOLDERRCNT heading "ORA-1555|Error"
column NOSPACEERRCNT heading "Out-Of-space|Error"
column MAXQUERYLEN heading "Max Query|Length"
select inst_id,
       to_char(begin_time, 'MM/DD/YYYY HH24:MI') begin_time,
       UNXPSTEALCNT,
       EXPSTEALCNT,
       SSOLDERRCNT,
       NOSPACEERRCNT,
       MAXQUERYLEN,
       TUNED_UNDORETENTION
  from gv$undostat
 where UNXPSTEALCNT > 0
    or EXPSTEALCNT > 0
    or SSOLDERRCNT > 0
    or NOSPACEERRCNT > 0
 order by begin_time, inst_id;
发表在 Oracle, ORACLE基础与管理 | 留下评论

某客户删除/tmp目录相关文件引的数据库挂起的故障处理

本文作者:东方龙马(广州)  李侠

环境说明

OS操作系统:AIX

数据库版 本:ORACLE 11.2.0.4

故障问题描述

11月15日东方龙马技术工程师接到客户相关技术人员电话反映相关的交易系统出现有占表无法访问的问题,同时,也无法远程登录检查,数据库日志等信息。根据当时情况,基本无法判断确定具体是什么原因导致表无法访问。

东方龙马工程师到现场后经过同现场工程师沟通了解到在11月15日凌晨2点删除了 /tmp目录下临时文件。

经过分析确认这次数据库故障是删除 /tmp/.oracle目录导致故障。

故障分析

1、根据数据库报警日志确认问题:

Sun Nov 15 04:42:48 2015
WARNING: ASM communication error: op 11 state 0x50 (3113)
ERROR: slave communication error with ASM
Unable to create archive log file '+ARDATA/arch/1_15180_854962843.dbf'
ARC0:Error 19504 Creating archive log file to 
'+ARDATA/arch/1_15180_854962843.dbf'
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance szps1 - Archival Error
ORA-16038: log 3 sequence# 15180 cannot be archived
ORA-19504: failed to create file ""
ORA-00312: online log 3 thread 1: 
'+DATA/szonline/onlinelog/group_3.263.854962845'
Sun Nov 15 04:42:48 2015
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance szps1 - Archival Error
ORA-16014: log 3 sequence# 15180 not archived, no available destinations
ORA-00312: online log 3 thread 1: 
'+DATA/szonline/onlinelog/group_3.263.854962845'
Sun Nov 15 04:47:49 2015
WARNING: ASM communication error: op 11 state 0x50 (3113)
ERROR: slave communication error with ASM
Unable to create archive log file '+ARDATA/arch/1_15180_854962843.dbf'
ARC3: Error 19504 Creating archive log file to 
'+ARDATA/arch/1_15180_854962843.dbf'
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance szps1 - Archival Error
ORA-16038: log 3 sequence# 15180 cannot be archived
ORA-19504: failed to create file ""
ORA-00312: online log 3 thread 1: 
'+DATA/szonline/onlinelog/group_3.263.854962845'
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance szps1 - Archival Error
ORA-16014: log 3 sequence# 15180 not archived, no available destinations
ORA-00312: online log 3 thread 1: 
'+DATA/szonline/onlinelog/group_3.263.854962845'

从上面的信息,我们看到,从2015年11月15日凌晨4:42 开始到库被重启前一直都要报无法连接ASM实例,导致了无法写日志写归档错误 。

2. ASM 告警日志提示错误

Sun Nov 15 04:42:48 2015
ERROR: unrecoverable error ORA-29701 raised in ASM I/O path; terminating process 15204714 
Sun Nov 15 04:47:49 2015
ERROR: unrecoverable error ORA-29701 raised in ASM I/O path; terminating process 5832778 
Sun Nov 15 04:52:50 2015
ERROR: unrecoverable error ORA-29701 raised in ASM I/O path; terminating process 5701650 
Sun Nov 15 04:57:50 2015
ERROR: unrecoverable error ORA-29701 raised in ASM I/O path; terminating process 14221586 
Sun Nov 15 05:02:50 2015
ERROR: unrecoverable error ORA-29701 raised in ASM I/O path; terminating process 15204858

从上面的信息看到,ASM也从2015年11月15日开始报错,结合之前无法写日志写归档的报错,我们基本可以确认数据库不正常是由于ASM问题引发的。

3、grid 错误日志:

2015-11-15 02:00:51.685: 
[/oracle/grid/bin/oraagent.bin(4325770)]CRS-5016:Process "/oracle/grid/bin/lsnrctl" spawned by agent "/oracle/grid/bin/oraagent.bin" for action "check" failed: details at "(:CLSN00010:)" in 
"/oracle/grid/log/szdb01/agent/crsd/oraagent_grid/oraagent_grid.log"
2015-11-15 02:03:51.823: 
[/oracle/grid/bin/oraagent.bin(4325770)]CRS-5818:Aborted command 'start' for resource 'ora.LISTENER.lsnr'. Details at (:CRSAGF00113:) {0:1:8} in 
/oracle/grid/log/szdb01/agent/crsd/oraagent_grid/oraagent_grid.log.
2015-11-15 02:05:55.825: 
[/oracle/grid/bin/oraagent.bin(4325770)]CRS-5818:Aborted command 'check' for resource 'ora.LISTENER.lsnr'. Details at (:CRSAGF00113:) {0:1:8} in 
/oracle/grid/log/szdb01/agent/crsd/oraagent_grid/oraagent_grid.log.
2015-11-15 02:06:01.721: 
[/oracle/grid/bin/oraagent.bin(4325770)]CRS-5016:Process "/oracle/grid/bin/lsnrctl" spawned by agent "/oracle/grid/bin/oraagent.bin" for action "check" failed: details at "(:CLSN00010:)" in 
"/oracle/grid/log/szdb01/agent/crsd/oraagent_grid/oraagent_grid.log"
2015-11-15 02:15:37.519: 
[ctssd(5505096)]CRS-2409:The clock on host szdb01 is not synchronous with the mean cluster time. No action has been taken as the Cluster Time Synchronization Service is running in observer mode.
2015-11-15 02:27:12.538: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:12.621: 
[/oracle/grid/bin/orarootagent.bin(5374128)]CRS-5822:Agent '/oracle/grid/bin/orarootagent_root' disconnected from server. Details at (:CRSAGF00117:) {0:5:41827} in 
/oracle/grid/log/szdb01/agent/crsd/orarootagent_root/orarootagent_root.log.
2015-11-15 02:27:12.648: 
[/oracle/grid/bin/oraagent.bin(4325770)]CRS-5822:Agent '/oracle/grid/bin/oraagent_grid' disconnected from server. Details at (:CRSAGF00117:) {0:1:68} in 
/oracle/grid/log/szdb01/agent/crsd/oraagent_grid/oraagent_grid.log.
2015-11-15 02:27:12.649: 
[/oracle/grid/bin/oraagent.bin(6160520)]CRS-5822:Agent '/oracle/grid/bin/oraagent_oracle' disconnected from server. Details at (:CRSAGF00117:) {0:9:52067} in 
/oracle/grid/log/szdb01/agent/crsd/oraagent_oracle/oraagent_oracle.log.
2015-11-15 02:27:14.712: 
[crsd(7012528)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in
 /oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:15.718: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:16.818: 
[crsd(6160522)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in 
/oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:17.817: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:18.920: 
[crsd(15794626)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in 
/oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:19.922: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:21.009: 
[crsd(6094920)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in
 /oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:22.009: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:23.091: 
[crsd(6160526)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in
 /oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:24.099: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:25.196: 
[crsd(6160528)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in 
/oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:26.196: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:27.288: 
[crsd(6160530)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in 
/oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:28.291: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:29.366: 
[crsd(12779904)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in 
/oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:30.371: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:31.465: 
[crsd(5832832)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in 
/oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:32.466: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:33.545: 
[crsd(5832834)]CRS-0805:Cluster Ready Service aborted due to failure to communicate with Cluster Synchronization Service with error [3]. Details at (:CRSD00109:) in 
/oracle/grid/log/szdb01/crsd/crsd.log.
2015-11-15 02:27:34.548: 
[ohasd(5177356)]CRS-2765:Resource 'ora.crsd' has failed on server 'szdb01'.
2015-11-15 02:27:34.548: 
[ohasd(5177356)]CRS-2771:Maximum restart attempts reached for resource 'ora.crsd'; will not restart.
2015-11-15 02:27:34.555: 
[ohasd(5177356)]CRS-2769:Unable to failover resource 'ora.crsd'.

根据GRID的报何错信息,我们基本可以推出:

1)GRID 日志记录,在11月15日凌晨2:00出现监听故障,2:27出现 CRS故障,2:00删除了 /tmp/.oracle的文件夹,GRID 马上就出现了监听器故障,后续有出现了CRS故障;

2)ORACLE数据库实例通过监听器连接ASM实例,在监听器故障之前已经建立的连接,当监听器故障时仍然可以正常使用,而数据库实例的启动归档日志进程进行归档时需要与ASM 实例建立新的连接,这个时候因为监听器已经故障了,导致数据库实例新建的连接无法连接到ASM实例,导致归档失败;

3)由于数据库实例有多个日志组,刚开始的时候只有一个日志组被写满无法归档,后来随着时间推移所有的日志组都被写满,但所有的日志组都没有完成归档,导致无日志组可用来写入 redo 条目,阻塞了应用的SQL。

4、删除 /tmp/.oracle目录导致故障的案例(该案来源于ORALCE metalink文档 ID 370605.1)

Clusterware Intermittently Hangs And Commands Fail With CRS-184 as Network Socker Files in /tmp/.oracle or /var/tmp/.oracle Gets Deleted (文档 ID 370605.1)

APPLIES TO:

Oracle Database – Enterprise Edition – Version 10.1.0.2 to 11.1.0.7 [Release 10.1 to 11.1]

Information in this document applies to any platform.

SYMPTOMS

CRS hangs intermittently

crs_stat -t  returns

CRS-0184: Cannot communicate with the CRS daemon.

node1 [crs]> crsctl check crsd

Cannot communicate with CRS

node1 [crs]> crsctl check css

Failure 1 contacting CSS daemon

ps -ef |grep d.bin will give you the pid of the process 

for example

ps -ef |grep d.bin

oracle   19703 19281  0 Apr10 ?        00:01:03 /home/oracle/oracle/product/10.2.0/crs/bin/evmd.bin

oracle   19976 19950  0 Apr10 ?        00:06:47 /home/oracle/oracle/product/10.2.0/crs/bin/ocssd.bin

root     19323     1  0 Apr10 ?        00:08:47 /home/oracle/oracle/product/10.2.0/crs/bin/crsd.bin

CAUSE

This is caused by a cron job that cleans up the /tmp directory which also removes the Oracle socket files in /tmp/.oracle

SOLUTION

Do not remove /tmp/.oracle or /var/tmp/.oracle or its files while Oracle Clusterware is up.

发表在 Oracle, ORACLE基础与管理, 客户案例 | 留下评论