Roby's profileblue_princePhotosBlogListsMore Tools Help

Roby Xue

Photo 1 of 53

blue_prince

June 24

AIX下ASM配置出错处理

在配置AIX的ASM时,执行localconfig add报错,出错信息如下:
 
test:/@root>#/u01/oracle/product/10.2/bin/localconfig add
/etc/oracle does not exist. Creating it now.
exec(): 0509-036 Cannot load program crsctl.bin because of the following errors:
        0509-130 Symbol resolution failed for crsctl.bin because:
        0509-136   Symbol _Getctype__FPCc (number 102) is not exported from
                   dependent module /usr/lib/libC.a[ansi_64.o].
        0509-136   Symbol _Getnumpunct__FPCc (number 106) is not exported from
                   dependent module /usr/lib/libC.a[ansi_64.o].
        0509-136   Symbol __ct__Q2_3std8_LocinfoFPCci (number 176) is not exported from
                   dependent module /usr/lib/libC.a[ansi_64.o].
        0509-192 Examine .loader section symbols with the
                 'dump -Tv' command.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'system'..
Operation successful.
Configuration for local CSS has been initialized
Adding to inittab
A file or directory in the path name does not exist.
/etc/init.cssd[911]: /etc/oracle/scls_scr/test/root/cssrun: 0403-005 Cannot create the specified file.
Startup will be queued to init within 30 seconds.
Checking the status of new Oracle init process...
exec(): 0509-036 Cannot load program crsctl.bin because of the following errors:
        0509-130 Symbol resolution failed for crsctl.bin because:
        0509-136   Symbol _Getctype__FPCc (number 102) is not exported from
                   dependent module /usr/lib/libC.a[ansi_64.o].
        0509-136   Symbol _Getnumpunct__FPCc (number 106) is not exported from
                   dependent module /usr/lib/libC.a[ansi_64.o].
        0509-136   Symbol __ct__Q2_3std8_LocinfoFPCci (number 176) is not exported from
                   dependent module /usr/lib/libC.a[ansi_64.o].
        0509-192 Examine .loader section symbols with the
                 'dump -Tv' command.
Giving up: Oracle CSS stack appears NOT to be running.
Oracle CSS service would not start as installed
Automatic Storage Management(ASM) cannot be used until Oracle CSS service is started
 
出现这个错误是由于AIX5.3自带的xlC的版本太低所致,需要到IBM的网站上下个新版本的xlC(推荐版本9以后)安装好后再配置,就可以解决问题:
 
test:/xlc@root>#/u01/oracle/product/10.2/bin/localconfig reset /u01/oracle/product/10.2               
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'system'..
Operation successful.
Configuration for local CSS has been initialized
Adding to inittab
Startup will be queued to init within 30 seconds.
Checking the status of new Oracle init process...
Expecting the CRS daemons to be up within 600 seconds.
CSS is active on these nodes.
        test
CSS is active on all nodes.
Oracle CSS service is installed and running under init(1M)

配置基于ASM存储的STANDBY时日志文件的处理

在配置基于ASM存储的STANDBY时,由于控制文件里面记录的联机日志还是原来主库日志文件的信息,因此需要对其做进一步处理。就算是设置了log_file_name_convert这个参数,假如主库的联机日志有两组成员,那么只会有一组成员转换为log_file_name_convert设置的对应ASM目录,另外一个成员还会是原来的目录,另外STANDBY LOGFILE的联机日志目录也不会更改。比如日志文件配置如下,我们看一下整个操作过程:
 
Thread Group                       Member       Archived        Status         (MB)
------ ----- ---------------------------------- ---------- ---------------- -------
     1     1 /oradata/datafile/redo1_01.log     YES        CLEARING            1000
     1     1 +DATA/db/onlinelog/redo1_02.log    YES        CLEARING            1000
     1     2 /oradata/datafile/redo1_01.log     YES        CLEARING_CURRENT    1000
     1     2 +DATA/db/onlinelog/redo2_02.log    YES        CLEARING_CURRENT    1000
     1     3 /oradata/datafile/redo3_01.log     YES        CLEARING            1000
     1     3 +DATA/db/onlinelog/redo3_02.log    YES        CLEARING            1000
 
Group                       Member       Archived        Status         (MB)
----- --------------------------------   ---------- ---------------- -------
   11  /oradata/datafile/redo1_01.log        NO         UNASSIGNED          1000
   12  /oradata/datafile/redo1_01.log        YES        ACTIVE              1000
   13  /oradata/datafile/redo1_01.log        NO         UNASSIGNED          1000
   14  /oradata/datafile/redo1_01.log        YES        UNASSIGNED          1000
 
首先处理STANDBY LOGFILE,可以把所有的STANDBY LOGFILE GROUP都删除掉重建就行了:
 
alter database drop standby logfile group 11;
alter database drop standby logfile group 12;
alter database drop standby logfile group 13;
alter database drop standby logfile group 14;
alter database add standby logfile group 11 ('+data') size 1000M;
alter database add standby logfile group 12 ('+data') size 1000M;
alter database add standby logfile group 13 ('+data') size 1000M;
alter database add standby logfile group 14 ('+data') size 1000M;
 
对于联机日志,则需要先把各组日志里面不转换为ASM目录的那组成员先删除掉,但是STATUS为CLEARING_CURRENT那组日志成员是无法删除的,可以后续再处理:
 
alter database drop logfile member '/oradata/datafile/redo1_01.log';  
alter database drop logfile member '/oradata/datafile/redo3_01.log'; 
 
然后再将对应的日志组CLEAR掉再DROP,由于数据库至少需要两组联机日志,因此只能删除一组联机日志并重建好后才能再处理另一组:
 
alter database clear logfile group 1;
alter database drop logfile group 1;
alter database add logfile group 1 ('+data','+data') size 1000M;
alter database clear logfile group 3;
alter database drop logfile group 3;
alter database add logfile group 3 ('+data','+data') size 1000M;
 
等日志组2的状态从CLEARING_CURRENT变成其他状态后,再进一步处理就可以了:
 
alter database drop logfile member '/oradata/datafile/redo2_01.log';
alter database clear logfile group 2;
alter database drop logfile group 2;
alter database add logfile group 2 ('+data','+data') size 1000M;
June 23

RMAN restore时ORA-27067错误处理

今天在对一个数据库进行RESTORE时一直报ORA-27067,百思不得其解,后面查了下,得知要把备份集改成可读写才行。由于我的数据库备份是备份在NFS上面的,直接把备份集的权限改为666,问题解决。
March 24

机场大巴杀手

今年2次坐机场大巴去福州机场,两次大巴都在半路上抛锚了,实乃机场大巴杀手也。上一次是过年后从莆田坐机场大巴,结果在高速路上大巴抛锚,一大车人骂骂咧咧,我倒是不急,因为提前了2个小时,慢悠悠地等着再发一辆大巴过来。上次机场大巴事故后知道,假如因机场大巴问题无法及时登机的,机场方面会尽量帮你处理好,包括办好登机牌,推迟起飞时间等。昨天从福州市区去机场,结果是在出发后没多久大巴就坏了,这次我却是影响最大的两个受害者之一,飞机17:30起飞,到16:30调运的大巴还没过来,不过有了上次的经验,这次又是不急,我相信他们能够处理好。哈哈,17:10左右到达机场,听着广播里面让自己抓紧登机的声音,不免解恨起来:NND,从来都是我等飞机,这次终于轮到飞机等我了Open-mouthed
February 16

淘宝网招Oracle&MYSQL DBA、监控开发&值班工程师、数据仓库前端工程师

Oracle 产品DBA

技能要求

1、精通/熟悉Oracle数据库体系结构
2、精通/熟悉Data Guard/RAC等高可用技术,能顺利的配置和管理data Guard
3、精通/熟悉Oracle的备份与恢复技术
4、熟悉主机/存储等硬件环境者优先考虑
5、熟悉unix/linux操作系统的使用
6、熟悉shell&perl编程

Oracle 开发DBA

技能要求

1、熟悉Oracle数据库体系结构与性能优化
2、熟悉关系数据库原理与设计,有大型项目的数据库设计和支持经验优先
3、熟悉SQL和PL/SQL的优化
4、熟悉unix/linux操作系统的使用
5、熟悉shell&perl编程

MySQL DBA

技能要求

1、精通/熟悉MySQL数据库的运行机制和体系架构
2、精通/熟悉MySQL数据库的管理,经验丰富者优先
3、精通/熟悉MySQL复制,熟悉MySQL Cluster
4、精通/熟悉SQL
5、熟悉linux操作系统的使用
6、熟悉shell&perl编程

监控开发工程师

技能要求


1、精通/熟悉Nagios,cacti等开源监控软件
2、熟悉主机/存储等硬件环境者优先考虑
3、精通/熟悉unix/linux操作系统的使用
4、精通/熟悉shell&perl编程,熟悉PHP或其他web编程
5、熟悉Oracle体系架构者优先

监控值班工程师

技能要求


1、熟悉unix、linux操作系统的使用
2、能够吃苦耐劳,接受7*24的轮班制度
3、了解Apache,Jboss等web应用服务器的基本维护
4、学习能力强的应届毕业生亦可考虑


数据仓库前端工程师

职责描述:
1. 负责各类业务报表实现
2. 设计用户自助式查询系统
3. 参与设计和搭建面向主题的数据集市

岗位要求:
1.五年或以上数据仓库实施经验;
2.对用户的需求理解透彻,并且能提出建设性的意见;
3.能够承担数据仓库项目系统分析设计及数据建模工作;
4.精通ORACLE PL/SQL
5.精通ORACLE BIEE或MicroStrategy
6.精通ORACLE OLAP
7.有大型网站,电信,银行行业经验优先
8.性格积极乐观,诚信,有较强的语言表达能力
9.熟悉j2ee 框架,基础的java知识。


工作地点:杭州
有意者请将简历发送至:blueprince10@gmail.com

December 11

关于Exadata(下)

在Exadata中,每台Storage Server称为一个Exadata Cell。每个Exadata Cell配置一块具有512MB缓存带电池的RAID卡,一块双端口的Infiniband HCA卡,每个端口连接速度能够达到16Gb/s。如下图所示,一个标准的42U机柜最多可能容纳18台Exadata Cell,配置SAS硬盘的话存储容量能够达到65TB,如果配置SATA硬盘的话则容量为216TB。每个Exadata Cell上的HCA卡双端口分别接到两台不同的Infiniband交换机上以实现冗余。如果需要扩容的话,那么可以添加新的标准机柜,机柜之间的连接通过Infiniband相连。Oracle号称采用这种方式扩容以后,Exadata存储的容量和吞吐量都能够线性增长。

在Exadata中,存储的管理全部通过ASM进行,再也没有RAID的概念,所有数据的保护方式都基于ASM硬盘组的镜像和hot swappable Disk(相当于传统存储的hot spare磁盘的概念,防止单个硬盘的故障损坏)。ASM能够自动均匀地将数据条带分布不同的Exadata Cell中,使性能达到最佳。并且ASM的镜像方案能够访问Exadata中的单盘或者一台Exadata Cell的损坏而使数据不受丢失。每个Exadata Cell中的前两块硬盘都会划分出一个13GB的LUN供系统使用,这块空间称为System Area,用于存放Exadata的操作系统、软件及配置信息,这些信息会自动在这两块磁盘上进行镜像存放,防止单点故障。除去System Area,这两块盘剩余的空间都可以供用户使用。Exadata中的每块磁盘都自动划分为一个LUN。每块物理硬盘称为一个Cell Disk,每个Cell Disk可以划分为一个或者多个Grid Disk,每个Grid Disk对应一个ASM磁盘。划分如下图所示:

通常来说一个Grid Disk就对应一个Cell Disk,不过Oracle的方案中也可以把物理硬盘性能好的那部分空间划分为一个Cell Disk(具体怎么划分没有详细的信息,一般来说每块硬盘靠近外面扇面IO性能较好),性能较差的那部分空间划分为另外一个Cell Disk,然后可以把性能好的Cell Disk组成一个ASM磁盘组,性能差的Cell Disk组成一个ASM磁盘组,ASM磁盘组的镜像容灾方案可以再根据需求调整。整个方案如下图所示:

多个Exadata Cell组成给数据库使用的存储集合称为Realm,一个Realm可以供一个或者多个数据库使用。每台Exadata Cell的操作系统都是Oracle Enterprise Linux 5.1,可以供用户以受限模式访问,用户只能在上面做一些维护性的操作。正如之前所说,Oracle数据库和Exadata之间的通信协议通过iDB进行,iDB基于工业标准的RDSv3协议。iDB集成于Oracle数据库内核,能够将数据库的操作转换为iDB命令传递至Exadata端执行,传输的内容是结果集而不是传统意义上的数据块。当然像传统存储的传输协议一样,iDB在Smart Scan无法使用的情况下,能够直接读写磁盘上的数据。Exadata上的软件包含CELLSRV(Cell Services)、MS(Management Server)和RS(Restart Server)这三个部分。其中CELLSRV是最核心的部分,提供和Oracle实例的数据传输接口,数据传输都通过CELLSRV来进行的;MS主要用于日常管理维护Exadata及监控运行状态;RS的作用则是保障、监控Exadata服务的正常运行,如果哪个服务没有启动,它将会去重启这个服务。在OEM Grid Control中安装插件,OEM也可以方便地管理监控Exadata,在OEM中可以看到Exadata的配置信息、运行状况及性能信息,非常简单易用。

正如前面所说,一个Realm可以跟一台传统存储一样供多个数据库使用,但是传统存储无法控制不同数据库之间的IO消耗能力,有可能一个数据库把一台存储的IO使用完了,导致使用这个存储的其他数据库的IO性能受到影响。而在Exadata上则可以定制IORM(IO Resource Management),方便地将一个Realm中的IO资源分配给不同的数据库使用,比如一个Realm同时给A和B两个数据库使用,我们可以将40%的IO资源给A使用,剩余60%的IO资源给B使用,方便地解决了同一存储不同数据库的IO需求冲突。
Exadata提供的这些强大的功能,革命性更改了Oracle数据库和存储之间传输数据的模式,使得Oracle在数据仓库环境下性能有了极大的提升,让我们共同期待Exadata的早日量产。

December 04

关于Exadata(上)

Oracle在今年旧金山的OOW大会上发布了自己和HP合作的第一款硬件产品——Exadata。Exadata包含主机Database Machine和存储Exadata Storage Server两种产品,硬件产品由HP提供,Oracle提供软件支持。Oracle号称该款产品在数据仓库的环境下,相比传统的Oracle数据库有着数量级的性能提升。到底该产品有着怎样的改进和亮点才会让Oracle如此自信,下面我们就Exadata的配置和产品特性做一个简单的了解。
Exadata自带一个42U的标准机柜,一个机柜满配的情况下包含8台Database Machine服务器和14台Exadata Storare Server。以下是具体的硬件配置情况:

可以看到数据库服务器事实上就是HP的中端PC服务器-HP DL360 G5,配置2颗4核主频为2.66G Hz的Intel至强E5430 CPU,32GB内存,1块双卡口的Infiniband网卡,4块146G的本地SAS硬盘。而存储事实上就是一台插满12块本地硬盘的HP DL180 G5的PC服务器,配置为2颗4核主频为2.66G Hz的Intel至强E5430 CPU,8 GB内存,1块双卡口的Infiniband网卡,硬盘则为12块300G 15000转的SAS硬盘或者12块1TB 7200转的SATA硬盘。另外配置4个24口的Infiniband交换机,这4台交换机是互为冗余配置,分别给Database Machine之间的RAC内部互联使用,以及用于主机和存储的连接。当存储配置为SAS硬盘时,每台存储能够达到1GB/S的IO吞吐量,1TB用户可用空间(这个用户可用空间按Oracle的说法是指存储上面的盘经过镜像以后,并且排除日志文件、UNDO数据文件和TEMP临时文件占用空间后的的可用空间,不过这个指标应该是根据不同数据库的配置而异的,不具备通用的参考意义),整个机柜14台存储可以提供14GB/S的IO传输速度,14TB用户可用空间;存储配置为SATA硬盘时,能够提供750MB/S的IO吞吐量,3.3TB用户可用空间,整个机柜14台存储可以提供10.5GB/S的IO传输速度,46TB用户可用空间。软件部分,服务器和存储的OS都采用Oracle Enterprise Linux 5.1,数据库为了使用Exadata的一些特性,必须采用Oracle 11.1.0.7或者之后的版本。存储的软件则称为Oracle Exadata Storage Server Software 11g。
Exadata提供的最强大的功能便是Oracle宣称的Smart Scan的功能,这个功能Oracle能够在存储端直接进行SQL预处理。传统上我们对Oracle数据库进行查询时,整个过程如下图所示:

首先用户执行语句,Oracle确认该语句需要全表扫描并定位到哪些区间需要扫描,数据库向存储端发出把该表所有数据全部提取的请求,存储把该表高水位下的所有数据块全部返回给数据库(例子中该表有1TB之多,那么就需要把1TB的数据从存储返回给数据库),然后数据库再进行过滤,把用户需要的1000行数据返回给用户。事实上整个查询过程用户只需要1000行,2MB左右的数据,但是由于Oracle数据库的存储特性,决定了Oracle需要将整张表的数据从存储中提取出来返回数据库端,再在数据库端对数据进行过滤最终返回给用户。
而在Exadata中整个处理过程如下图所示:

用户执行完语句后,Oracle会将该语句转换成一句iDB(the Intelligent Database protocol,Oracle和Exadata存储通讯的协议,后续会详细介绍)命令语句发送给Exadata存储,Exadata中的每个单元智能地扫描该单元中表的数据块并将符合SQL语句条件所需要的行和列数据过滤出来返回给数据库,Oracle再把Exadata每个单元返回的数据汇合以后返回给用户。由于符合条件的结果集只有2MB之多,这样只需要从存储端返回2MB数据给数据库,再也不需要将1TB的全表数据返还,大大降低了存储到数据库的流量。由于存储具备了SQL预处理功能,存储到数据库的数据流量会有大量的减少,这样极大的减少了数据库的负荷,数据库的处理能力有了数量级的提升。这是Oracle革命性的改进,之前从来没有一个数据库能够在存储底层就对数据进行过滤,而Oracle开创性地做到了这点!
Exadata的Smart Scan提供了行、列过滤的功能,可以在存储级别直接提取出用户所需的行数据和列数据。除此以外,Smart Scan还具备表连接处理功能,在存储级别直接进行表连接处理,最终再把连接好的结果集返回给用户。另外Smart Scan还能加快增量备份和创建表空间或者添加数据文件的速度。常规增量备份块记录变更是以一组块为单位,而Exadata中则是以单独的数据块为块变量记录单位,这样备份时对IO消耗的带宽更小。而在我们创建表空间或者添加数据文件时,我们都需要把数据文件从存储读取到数据库的内存进行格式化处理后再写进存储,这样有多大的数据文件我们就需要从存储端读取多大的数据到数据库层面再写入。而在Exadata中,Exadata只需要简单地执行一条iDB命令就可以将表空间创建好或者数据文件添加好,而不需要将数据文件读取到数据库里面进行格式化,大大加快了创建表空间或者添加数据文件的进程。

Oracle RAC中的RDS内部互联

传统的RAC内部互联大部分都是基于普通网络实现的,目前最为普及的是百兆和千兆网络,最快的也就是尚不普及的万兆网。由于普通网络的速度限制,在需要频繁进行内部通信的多节点RAC数据库中性能就无法得到保证。正是基于这一点,Oracle和Qlogic在2006年2月24号共同发布了基于Infiniband高速互联网络的RDS for Oracle RAC内部互联方案。

如图所示,传统的RAC内部互联协议都是使用UDP协议,这样无论内部互联网络是用普通网络交换机还是Infiniband交换机,都需要先把UDP协议转换成IP协议才能通过网络传输,如果使用Infiniband交换机的话,那么还需要把IP协议转换成为IPoIB协议(IP over Infiniband),这样几经转换,内部互联传输显然效率不高。而使用RDS内部互联的话,那么,Oracle RAC数据库内核可以直接通过RDS协议传输信息,少了几层转换,性能会有质的提升。
不光如此,RDS还有如下优点:
1、高带宽。相比普通网络交换机现在最大带宽是10Gbps,Infiniband最快能够达到40Gbps。
2、低延迟。比起普通UDP内部互联,能够成倍的网络延迟。
3、低CPU利用率。内部互联的CPU开销只有原来的一半以下。
由于RDS高效传输的特性,从Oracle 11g开始众多硬件厂商也加入了对RDS的支持,不再仅仅是Oracle 10g时仅有Qlogic一家。而Oracle最新发布的硬件产品Exadata中,RDS已经成为RAC内部互联的默认选项。目前业界使用RDS内部互联方案的案例相对较少,只有YAHOO、DELL等部分企业采用了这一方案,国内目前就淘宝、阿里巴巴使用。相信随着多节点RAC数据库的需求方案越来越多,RDS也会逐渐流行开来。

November 26

RAC上收集所有节点AWR报告的脚本

假如你管理着一个超过十个节点的RAC数据库,而当你查看数据库的AWR报告时,相信你会跟我一样非常头疼,必须一个个节点把各自节点的AWR报告都找出来,然后一个个节点进行查看对比。有没有这么一个脚本,能够将RAC数据库中所有节点的AWR报告整合起来只生成一份,然后我们要诊断RAC数据库的性能时只需要查看这么一份整合好的AWR报告,里面有非常清晰的RAC各节点数据库性能指标的数据排列在一起,可以方便地查看对比各个节点的性能指标差异。Oracle从11g开始提供了$ORACLE_HOME/rdbms/admin/spawrrac.sql这个脚本,就可以满足此需求,而且还可以向下兼容到10g使用,非常方便。
November 23

今天看到彭伟国了

      上周到黄龙体育中心看中超浙江绿城的比赛,混入主席台所在的后台就座。当时本来是想看台离教练席近些,看看能不能看到彭伟国。毕竟这是自己最喜欢的国内球员,从94年开始迷上足球之后,国仔就一直是我最喜欢的国内球员,我一直认为他是中国足坛到目前为止脚法最好的球员。当年国仔和他所效力的广州太阳神队都是我所钟爱的,而现在当年太阳神的主教练周穗安和国仔都是浙江绿城执教,因此便想趁机会接近看一眼。
      不想上周比赛后国仔倒是都没碰到,出门后居然碰到阎嵩在身边,当时想和他握个手,不过后面觉得无趣也就离开了。这星期浙江绿城最后一个主场对深圳上清饮,还是照例混入主席台看比赛,比赛本身倒是平平,浙江以2:3负于对手。比赛结束以后混入球员通道所在的大厅,等了好久没看到球员出来。于是准备回家,不想一大帮球迷冲着球队所在的大巴过去。于是我也跟着过去看了一下,后面看到阎嵩他们走了过来,让同事帮着给我和阎嵩拍张照片,同事不会用我的相机,结果合影没拍成。大巴离开后我们便冲着过去,这时候同事说那不是彭伟国吗。于是我紧跟着跑进去,找到彭伟国提出合影的要求,我说我可是你十几年的老球迷了。国仔因为球队输球之后兴致不是很高,不过还是很配合地合影,结果比较晕的就是同事接连按了几下快门后还是没拍成我们的合影,我们看到国仔有些不耐烦也就说拍好了,然后跟着国仔从球员通道离开体育场。后面在外面等着的时候顺便和周穗安以及外援奥托拍了两张合影,他们都很配合。快离开的时候看到国仔开着他的BMW735,车牌很牛X,粵A*6666。
     虽然说合影没拍成有些遗憾,不过还是挺高兴能够和当年的偶像能够如此地接近。想想时间如流水,14年就这样过去了。当年我还是一个啥都不知道的毛孩子,因为我堂哥满屋子的《足球》报而迷上了足球,继而喜欢上巴乔和彭伟国,更想不到的是居然能够14年后在杭州相继看到他们真人。这在以前这都是那么遥远的事情,只能在电视上看到他们拼搏的身影。可惜他们如今都退役了,而我对足球的喜爱也随着年岁渐长而日渐消逝。再见了,我的偶像们……
    
November 12

RAC中的跨节点并行

        RAC中,我们可以通过设置跨节点并行,将并行操作分布到RAC中的不同节点同时进行,以便发挥整个RAC环境的最大运算能力。在RAC中设置跨节点并行主要是通过设置parallel_instance_groupinstance_groups这两个参数进行的。

instance_groups这个参数主要是设置该节点实例是否属于某一个实例组,这个实例组的命名可以根据你的需要随便命名,而没有严格的限制。每个节点可以设置多个不同的实例组名,实例组名用逗号隔开,比如:instance_groups=crm,erp,oltp。这样只要其他节点的instance_groups参数中有设置成一个一样的名字,就表示这个节点也属于这个实例组。比如在一个4节点RAC的环境中,A节点的instance_groups设置为(crm,erp,oltp,B节点设置为(crm,oltp,C节点设置为(crm,erp),D节点设置为(crm,erp,oltp),那么就有ABCD4个节点共同组成crm这个实例组,ACD3个节点组成erp这个实例组,ABD3个节点组成oltp这个实例组。

parallel_instance_group设置的值为instance_groups里面设置的值,表明这个节点上面进行的并行操作可以跨越哪些实例组。回到上面的例子,假如A节点的parallel_instance_group设置为crm,由于crm这个实例组的成员是ABCD四个节点都有,那么A节点上的并行操作就可以跨越所有的4个节点。如果A节点的parallel_instance_group设置为erp,那么A节点并行操作就可以跨越ACD3个节点。如果一个节点的parallel_instance_group设置的参数在instance_groups中没有设置,那么这个节点的并行操作将只会在本节点进行,假如B节点的parallel_instance_group设置为erp,那么它上面的并行操作将不会跨节点进行。

默认情况下这两个参数都为空,那么并行操作默认将会是跨节点并行的。当然并不是设置了这两个值就一定会发生跨节点并行,是由优化器和RAC的负载均衡机制共同决定一个并行操作是否跨节点并行,需要跨越实例组中的哪几个节点并行还是实例组的所有节点并行,每个节点分配多少个并行进程工作。由于跨节点并行还有内部互联通信的开销,因此并不一定就会比单节点并行会快多少,只有那些很大的并行操作可能才需要到跨节点并行。这个可以根据测试再进行变更。在我们运行的实际案例中,由于跨节点并行的机制比较复杂,有时候会触发一些BUG,甚至并行度为DEFAULT的表在进行跨节点并行DML时一个并行进程死掉导致整个节点宕机。推荐的做法是系统级别的parallel_instance_group这个参数不要设置,不同的程序在部署之前做好测试工作,看是否需要跨节点并行。由于parallel_instance_group是可以在会话级别设置的,可以修改一些需要跨节点并行的程序在执行之前先执行alter session set parallel_instance_group=……一下,然后只限制这些程序跨节点并行。

November 05

RAC的负载均衡

RAC的负载均衡主要是指新会话连接到RAC数据库时,如何判定这个新的连接要连到哪个节点进行工作。在RAC中,负载均衡分为两种,一种是基于客户端连接的,另外一种是基于服务器端的。
客户端的负载均衡配置相对简单,只需要在tnsnames.ora中添加LOAD_BALANCE=ON这么一个选项即可。比如下面的TNS:

RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
(LOAD_BALANCE = ON)
(FAILOVER = ON)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = rac)
)
)

这样当客户端连接RAC数据库时,会随机在TNS里面挑个监听地址进行连接。在Oracle10g以前,假如有节点宕机或者类似事故时,客户端可能还是选择连接到这个节点,这样会发生较长时间的TCP等待超时。而在10g以后,由于VIP和FAN的引入,这样的情况可以得到很大程度的改善。客户端的负载均衡在通常情况下能够较好地工作,但是由于连接是在客户端随机发起的,这样客户端并不知道RAC各节点的负荷及连接数情况,有可能负荷大的节点还会源源不断地增加新的连接,导致RAC节点无法均衡工作。
从Oracle 10g开始,服务器端的负载均衡可以根据RAC中各节点的负荷及连接数情况,而判定将新的客户端连接分配到负荷最小的节点上去。RAC中各节点的PMON进程每3秒会将各自节点的负荷(包括LOAD、最大LOAD、CPU使用率)及连接数更新到service_register里面,然后假如节点的负荷有发生变化,将会通知到监听程序,由监听程序再决定新的客户端连接分配至哪个节点。假如RAC中一个节点的监听失败了,PMON每一分钟会去检查一次是否已经恢复正常。
服务器端的监听配置是在各节点的tnsnames.ora里面添加一个连接到各个节点监听的条目,然后再在初始化参数里面设置remote_listeners这个参数。比如:

LISTENERS_RAC =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))
)

ALTER SYSTEM SET REMOTE_LISTENER = LISTENERS_RAC;

这样服务器端的LOAD BALANCE便配置完成。
但是有时候由于PMON取节点负荷的延迟,导致客户端连接可能还是会连接到负荷较大的节点上,这时候便可以在服务器各节点的listener.ora里面加入PREFER_LEAST_LOADED_NODE=OFF这么一行,这样服务器端的负载均衡将不再根据节点的负荷来进行分配,而是根据节点的连接数进行分配,达到各个节点连接数比较平衡的效果。
另外一个不得不说的便是并行操作,假如有个会话连接以后要进行并行操作。由于连接时是按负荷或连接数连接,这样可能连接时各个节点连接数和负荷等比较平衡,但是这个并行会话启动多个并行进程以后,那么这个节点的负荷及连接数就会有可能上升得比较快。如果在RAC中开启了节点并行,那么有可能会把并行进程分配到多个节点运行以达到负载均衡的效果。
从Oracle 10.2开始,Oracle引入了Load Balance Advisor,对负载均衡有了进一步的改进。结合Service,可以对不同的SERVICE设置不同的负载均衡策略。Load Balance Advisor的配置可以通过DBMS_SERVICE包对SERVICE进行更改而完成。在Load Balance Advisor首先必须设置SERVICE负载均衡的目标,目标分为3种:

GOAL_NONE Disables the load balancing advisory
GOAL_SERVICE_TIME The LBA calculates a weighted moving average of the total elapsed time for completed work plus the bandwidth that’s available to the service to calculate the service goodness. This goal is ideal for services whose workload may change dramatically over a short period of time, e.g. an application that services a “clicks and mortar” store that provides customer self-service through an internet-based shopping web site.
GOAL_THROUGHPUT The LBA calculates a weighted moving average of throughput (i.e. the rate at which work is completed) in addition to the bandwidth available to the service to calculate the service goodness. This goal is best suited for long-duration tasks that are typically queued to run serially, e.g. scheduled jobs that handle large batches of transactions.

另外可以额外设置连接的负载均衡:

CLB_GOAL_SHORT The Load Balancing Advisory will be used for connection load balancing only if it is enabled (i.e. set to other than GOAL_NONE). If the LBA has been disabled, connection load balancing will utilize abridged advice determined by CPU utilization.
CLB_GOAL_LONG Connection load balancing will be determined by first tallying the total number of connections per instance, and then by counting the number of sessions per each service. Oracle recommends using this setting for services whose applications tend to connect for long periods of time (e.g. Oracle Forms). The Load Balancing Advisory can be used in conjunction with this setting as long as the connection pool has been sized to accommodate “gravitation “ within the pool without adding or subtracting connections. Oracle recommends this option as the most efficient design.

October 21

并行度为DEFAULT的表进行PDML时有可能导致RAC中的节点重启

也发生过几次,一并记录一下,好记性不如烂笔头。并行度设置为DEFAULT的表如果进行PDML时,会导致相应的节点重启,DEFAULT在并行度默认是按cpu_count*parallel_threads_per_cpu来跑的,但是引起节点重启也是比较怪异的。解决办法便是将表的并行度设置为一个具体的数值。碰到过很多引起节点重启的怪异问题,接下逐渐记录。

wmsys.wm_concat这个函数可能导致RAC节点重启

应用中有个行列转换需要使用wmsys.wm_concat这个函数来做,结果发现一旦使用了这个函数,就会导致相应的节点CPU和内存消耗非常之高,接下主机无法响应,导致节点被踢出重启,甚至其他节点为了防止splitbrain而将自己也重启了。看来这个函数的使用还是需要小心。
August 01

并行度设置为default时可能会导致PDML ora-12805错误

最近在测试ETL迁移,结果有几条SQL语句老是报ora-12805错误,然后没有进一步的信息。隐约记得这个问题以前处理过,不过具体细节却是忘了。早上准备开SR了,wanghai过来提醒了一下,这几张表的并行为default,应该是因为这个原因引起的。猛然想起来去年也碰到这问题,解决办法便是把表的并行度固定住,设置为具体的数字,不再让它为DEFAULT,这样就好了。好记性不如烂笔头,还是需要多做做笔记。
July 27

把我的生日改成情人节了

当初入职HR外包人员填信息时不小心把我的身份证号填错了,0124写成0214,当初估计填的时候还在想这小子真会挑日子生,选在情人节这天落地。结果我现在办啥事身份证号出错都得折腾一番。本来这个周末要去取公积金的,临走前突然间想到这事,就打电话查了下,果然公积金帐户的身份证号也搞错了。幸好还没出门,要不这么大热的天白跑一趟我会杀人的。
July 22

Linux下如何迁移VG及文件系统

在LINUX下,如果需要将一台主机上的文件系统迁移至另外一台主机上,并且文件系统是基于LVM创建的,那么可以使用VG导入导出功能将VG和LV在不同主机上迁移。
 
源主机上操作:
 
首先在源主机上将文件系统umount:
umount /u05
再将LV和VG inactive:
lvchange -an /dev/vg_u05/lv_u05
vgchange -an vg_u05
最后导出VG:
vgexport vg_u05
 
目标主机上操作:
 
导入VG:
vgimport vg_u05
激活VG,MOUNT 文件系统:
vgchange -ay vg_u05
mkdir /u05
mount /dev/vg_u05/lv_u05 /u05
 
 
 

如何转换RAC中RDS和UDP互联

配置基于Infiniband RDS内部互联方案的RAC时,需要重新build Oracle library。在操作之前需要先把整个RAC中的ASM实例和数据库实例都停止掉,然后进行BUILD:
$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk ipc_rds ioracle
而将RDS切换回普通的UDP协议时,则比较简单:
$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk ipc_g ioracle

Solaris安装RAC运行root.sh失败解决一例

前段时间一个朋友在安装Solaris上的RAC时,安装clusterware最后一步运行root.sh总是无法成功,报如下的错:
# ./root.sh WARNING: directory '/oracle/product/10.2' is not owned by root
WARNING: directory '/oracle/product' is not owned by root
WARNING: directory '/oracle' is not owned by root
 Checking to see if Oracle CRS stack is already configured
Setting the permissions on OCR backup directory
Setting up NS directories
Failed to upgrade Oracle Cluster Registry configuration r
 
看了一下crs的alert日志:
 
2008-07-01 23:51:53.642 [client(2216)]CRS-1006:The OCR location /oracle/OCR_A is inaccessible. Details i n /oracle/product/10.2/cluster/log/db1/client/ocrconfig_2216.log. 2008-07-01 23:51:53.807 [client(2216)]CRS-1001:The OCR was formatted using version 2.
 
细看/oracle/product/10.2/cluster/log/db1/client/ocrconfig_2216.log:
 
Oracle Database 10g CRS Release 10.2.0.1.0 Production Copyright 1996, 2005 Oracl e. All rights reserved. 2008-07-01 23:51:53.612: [ OCRCONF][1]ocrconfig starts... 2008-07-01 23:51:53.612: [ OCRCONF][1]Upgrading OCR data 2008-07-01 23:51:53.630: [ OCRRAW][1]propriogid:1: INVALID FORMAT 2008-07-01 23:51:53.631: [ OCRRAW][1]ibctx:1:ERROR: INVALID FORMAT 2008-07-01 23:51:53.631: [ OCRRAW][1]propri
 
发现在格式化OCR的盘时出错。第一个反应是祼设备权限的问题,折腾几次后发现这个并不存在问题。最终定位到问题是由于ocr和voting disk对应的祼设备用了cylinder 0,而Solaris上祼设备的cylinder 0是要预留给系统使用的,因此才会导致格式化OCR失败。解决办法便是重建OCR和VOTING DISK对应的祼设备,跳过CYLINDER 0。
July 21

RAC中如何更改对外网卡和内部互联网卡的IP及VIP

在RAC环境中,有时候由于需要会更改网卡或IP地址,这边简单记录一下操作步骤(参考metalink文档:283684.1)。
1、查看当前PUBLIC网卡和PRIVATE网卡的配置:
test1:/home/oracle>$oifcfg getif
eth1  10.0.100.0  global  cluster_interconnect
eth0  172.19.20.0  global  public
2、更改PUBLIC网卡或者IP:
比如我们需要将PUBLIC网卡从eth0改为bond0,IP地址由172.19.20.0 改为172.13.20.0 。那么首先必须用oifcfg delif 命令删除原先的PUBLIC网卡设置,然后再用oifcfg setif 命令更改网卡及IP配置,这步只要在任意一个节点执行就可以了。(注意:在更改PUBLIC或者PRIVATE网卡及IP之前都需要将RAC中的资源停止,可以使用crs_stop -all来停止)
test1:/home/oracle>$oifcfg delif -global eth0 
test1:/home/oracle>$oifcfg setif -global bond0/172.13.20.0:public
再查看可以看到PUBLIC网卡及IP都更改过来了:
test1:/home/oracle>$oifcfg getif
eth1     10.0.100.0  global  cluster_interconnect
bond0  172.19.20.0  global  public
3、更改PRIVATE网卡或者IP:
这一步和更改PUBLIC网卡大同小异,比如说我们需要将PRIVATE网卡从eth1改为ib1:
test1:/home/oracle>$oifcfg delif -global eth1 
test1:/home/oracle>$oifcfg setif -global ib1/172.13.20.0:cluster_interconnect
4、更改VIP配置:
更改PUBLIC网卡后,那么RAC各个节点的VIP必须重新配置,以便CRS知道VIP对应PUBLIC网卡名称的变更:
test1:/home/oracle>$srvctl modify nodeapps -n test1 -A 172.13.20.1/255.255.255.0/bond0
这样执行完以后,整个更改便完成了。
 
 
 
July 20

需要调整一下

凡事不能操之过急。越想得到结果,结局往往适得其反。把每一件事情都处理解决好,那么收获就是水到渠成的。坚信没有解决不了的问题,碰到困境的时候换种思路,不要陷进死胡同。积极对待一切。
June 13

RAC:Write-to-Read Transfer

The behavior of the write-to-read transfer is determined by the _FAIRNESS_THRESHOLD parameter,which was introduced in Oracle 8.1.5 and defaults to 4. Prior to the introduction of this parameter,when Instance A held a block in exclusive mode and Instance B requested a read-only copy of that block, Instance A would downgrade its exclusive lock to a shared lock and send the block to Instance B,which would also set a shared lock on the block. However, if Instance A is performing frequent updates
on the block, it will need to reacquire the block and set an exclusive lock again. If this process is repeated frequently, then Instance A will be continually interrupted, as it has to downgrade the exclusive lock to a shared lock and wait until Instance B has finished reading the block before it can convert the shared lock back into an exclusive lock.
The _FAIRNESS_THRESHOLD parameter modifies this behavior. When this parameter is set,Instance A will no longer downgrade the exclusive lock. Instead, it sends a null lock to Instance B,and then it can continue processing. However, if instance B requests the block _FAIRNESS_THRESHOLD times, by default 4, then Instance A will revert to the original behavior—it will downgrade the exclusive lock to a shared lock and ship the block to Instance B, which will also set a shared lock on the block.

From:Pro Database 10g RAC on Linux

 

June 12

RAC建库时报ASM单实例错误的解决办法

       安装好RAC后,在用DBCA建库时选择ASM做为存储方案时,有时候会报错说ASM是单实例环境,不是RAC环境,这样就无法继续建库下来,出错信息如下:
 
The ASM instance configured on the local node is a single-instance ASM.To create a single-instance database using this ASM instance ,restart DBCA and select the single-instance database option ,to create a RAC database using this ASM instance,convert it to RAC ASM first.
 
       这个错误一般是发生在重装clusterware和database后,这样无论怎么样重启DBCA运行都会报同样的错。具体的解决办法便是在/etc/oratab里面的关于ASM的记录:+ASM1:/u01/app/oracle/product/10.2.0/db_1:N这么一行删除掉,再接着建库就可以了。碰到过多次这个错误,记录在这里备忘一下。

June 01

杭州两年

两年前的5月31号来到杭州,六一到公司报到。整整两年过去了,一无所成。
May 15

使用DBMS_FILE_TRANSFER配置DATA GURAD和克隆数据库

通常我们配置DATA GUARD,都需要对主库进行备份,再把备份的备份集复制到备库端进行配置。但是当数据库非常大时,尤其是数据库采用ASM作为存储方案时,如果没有足够的空间用于存放备份集,这样显然就无法通过常规的方式来配置STANDBY。利用DBMS_FILE_TRANSFER则可以方便地将主库的数据文件直接传递至备库的ASM磁盘组,这样再也不需要使用中间存储存放备份文件。下面简单介绍一下通过DBMS_FILE_TRANSFER配置基于ASM存储方案的DATA GUARD和克隆数据库的方法。

一、在备用数据库端创建好ASM磁盘组和一个中间数据库。
首先必须要在备用数据库端配置好ASM实例,创建好ASM磁盘组,并且ASM磁盘组的名字最好是和主库一样的。当然,名字不一样也可以,那就需要一些额外的设置。另外由于DBMS_FILE_TRANSFER远程传输是基于DB LINK的,因此需要在备用库端创建一个中间数据库,这个中间数据库的主要作用便是用于DB LINK传输数据文件。假定我们创建的ASM磁盘组叫DATA,中间数据库名字叫transfer。
二、在备用库的中间数据库上创建一个到主库的DB LINK。做之前需要配置好到主库的TNS。

SQL>create database link lnk_pri connect to system identified by password using ‘primary’;

三、在主库端创建到数据文件目录的directory。

SQL> create or replace directory pri_dir as ‘+DATA/TEST/datafile’;

四、在备库端创建好备库的相应目录,比如bdump,udump等目录,另外在备库的ASM实例中创建备库的数据文件、控制文件等目录。

SQL> alter diskgroup DATA add directory ‘+DATA/TEST/’;
SQL> alter diskgroup DATA add directory ‘+DATA/TEST/DATAFILE’;
SQL> alter diskgroup DATA add directory ‘+DATA/TEST/CRONTROLFILE’;
SQL> alter diskgroup DATA add directory ‘+DATA/TEST/TEMPFILE’;

五、在备库的中间数据库上创建好两个DIRECTORY,用于存放传递过来的数据文件和控制文件。

SQL> create or replace directory stb_dir as ‘+DATA/TEST/datafile’;
SQL> create or replace directory stb_ctl_dir as ‘+DATA/TEST/controlfile’;

六、在中间数据库开始传输数据文件。
由于是在线配置STANDBY,在传输数据文件之前,必须先在主库把相应的表空间置于恢复模式,然后利用dbms_file_transfer进行数据文件的传输,最后再把相应的表空间置为正常状态:

SQL> conn sys/password@lnk_pri as sysdba
SQL> alter tablespace system begin backup;
SQL> conn /as sysdba
SQL>begin
dbms_file_transfer.get_file(
source_directory_object => ‘ pri_dir ‘,
source_file_name => ‘ system.286.650339101′,
destination_directory_object => ‘ stb_dir ‘,
destination_file_name => ‘ system01.dbf ‘,
source_database => ‘lnk_pri’);
end;
/
SQL> conn sys/password@lnk_pri as sysdba
SQL> alter tablespace system end backup;

这样依次对主库的每个数据文件进行处理传递后,主库上的数据文件都会传递至备库的ASM磁盘组上。
七、 传输备库的控制文件。
首先在主库端生成备库的控制文件:

SQL> alter database create standby controlfile as ‘+DATA/TEST/datafilefile/standby.ctl’;

如果是克隆数据库的话,那么生成一个普通备份控制文件即可:

SQL> alter database backup controlfile to ‘+DATA/TEST/datafilefile/standby.ctl’;

然后传输控制文件:

SQL>begin
dbms_file_transfer.get_file(
source_directory_object => ‘ pri_dir ‘,
source_file_name => ‘ standby.ctl’,
destination_directory_object => ‘ stb_ctl_dir ‘,
destination_file_name => ‘ control01.ctl ‘,
source_database => ‘lnk_pri’);
end;
/

八、 配置备用库。

首先配置好备库的参数文件,并且配置好主库和备库的TNS,接下就可以配置备用库了:
启动备库至mount状态

SQL > startup nomount
SQL > alter database mount standby database;

如果是配置克隆数据库的话,则直接将数据库MOUNT就行:

SQL > alter database mount;

执行RMAN的catalog命令,以使控制文件能够识别传输过来的数据文件:

RMAN> catalog start with ‘+DATA/TEST/DATAFILE’;

然后将这些数据文件转换为备库的数据文件:

RMAN >switch database to copy;

如果是配置DATA GUARD的话,则可以将备库置为恢复模式:

SQL > alter database recover managed standby database disconnect from session;

如果是配置克隆数据库的话,那么直接恢复数据库并打开:

SQL >recover database until cancel;
SQL >alter database open resetlogs;

这样DATA GUARD和克隆数据库就配置完成了。最后可以把中间操作创建的directory,DB LINK和中间数据库删除掉。