星期一 三月 24, 2014

如何在各个平台上配置NTP的微调模式

对于11.2之前的版本,很多环境的重启原因(top5的情况)是由于NTP调整时间的步伐过大导致的,所以RAC环境中,我们建议用户如果使用NTP,需要配置成微调模式;

具体重启的原因,请大家参考Allen Gao写的博客 :如何诊断节点重启问题


这里介绍几个主流linux和unix平台上NTP微调的配置方法:


For Linux :


1.请确确认各节点的ntp包已经安装 ,我这里是个4.2.2的版本


[oracle@nascds10 ~]$ rpm -qa | grep ntp


ntp-4.2.2p1-9.el5_4.1


2.请编辑各个节点的ntp.conf文件


[oracle@nascds10 ~]$ su - root


Password:


[root@nascds10 ~]#  vi /etc/ntp.conf


#New ntp server added by Robinson


server  192.168.1.128 prefer  <<<<===========这里是时钟服务器


restrict 192.168.7.0  mask 255.255.255.255 nomodify notrap #基于网段的限制(限制在网段192.168.7.0)


broadcastdelay 0.008


[root@nascds11 ~]# vi /etc/ntp.conf


#New ntp server added by Robinson


server 192.168.7.71 prefer


broadcastdelay 0.008


3、配置ntpd的参数,我们主要强调的是要配置成"微调的模式" 也就是在options中要加入 -x的选项


[root@nascds10 ~]# vi /etc/sysconfig/ntpd


#The following item added by Robinson


#Set to 'yes' to sycn hw clock after successful ntpdate


SYNC_HWCLOCK=yes  


OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"


[root@nascds11 ~]# vi /etc/sysconfig/ntpd


The following item added by Robinson


SYNC_HWCLOCK=yes


OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"


4、自动启动配置


[root@nascds10 ~]# chkconfig ntpd on


[root@nascds11 ~]# chkconfig ntpd on


5、重启一下,使最新配置生效


[root@nascds10 ~]# service ntpd restart


Shutting down ntpd: [  OK  ]


ntpd: Synchronizing with time server: [  OK  ]


Syncing hardware clock to system time [  OK  ]


Starting ntpd: [  OK  ]


[root@nascds11 ~]# service ntpd restart


Shutting down ntpd: [  OK  ]


ntpd: Synchronizing with time server: [  OK  ]


Syncing hardware clock to system time [  OK  ]


Starting ntpd: [  OK  ]


6、检查ntpd进程的状态


[root@nascds10 ~]# ntpq -p


      remote           refid      st t when poll reach   delay   offset  jitter


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


  LOCAL(0)        .LOCL.          10 l   40   64    1    0.000    0.000   0.001


[root@nascds11 ~]# ntpq -p


      remote           refid      st t when poll reach   delay   offset  jitter


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


  test.oracle.com  .INIT.          16 u   60   64    0    0.000    0.000   0.000


  LOCAL(0)        .LOCL.          10 l   59   64    1    0.000    0.000   0.001




For Aix:




1. NTP的同步设置  编辑 /etc/ntp.conf文件, 内容如下:


----------------------------


#broadcastclient


server 192.168.5.2 


driftfile /etc/ntp.drift


tracefile /etc/ntp.trace


slewalways yes


----------------------------


我们这里还是要强调微调slewalways  ,这个值的默认设置是no,也就是说如果您不设置,NTP最大可一次调整1000秒. 根据IBM的官方说明,如果我们不指定slewthreshold  那么默认值是 0.128 seconds. 如果想特别设置,请指定slewthreshold 的值,注意单位是second




2.在NTP客户端启动xntpd守护进程


# startsrc -s xntpd



3. 查询xntpd的状态


当 system peer 不为 'insane' 时, 表明客户端已与服务器端成功地进行了同步.


# lssrc -ls xntpd


Program name: --/usr/sbin/xntpd


Version: -------3


Leap indicator: 00 (No leap second today.) Sys peer: ------192.168.5.2 ...




关于更多的关于IBM的平台上NTP的设置,可以参考IBM的官方文档解释:


http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.files/doc/aixfiles/ntp.conf.htm



For HP  UX:



NTP在HP上的配置,是比较省心的,不容易导致RAC重启的,因为HP上的NTP默认的就是微调的模式


1、首先我们还是要编辑ntp的配置文件 /etc/rc.config.d/netdaemons,把 XNTPD 设定为1表示启动


   export XNTPD=1


2、编辑配置文件 /etc/ntp.conf ,配置好时间同步服务器


   server 192.168.5.2      #  第一个地址是主服务器


   server 192.168.5.3      #  第二个地址是备用服务器


3、启动ntp的进程


   # /sbin/init.d/xntpd start


4、检查NTP的状态


   # /usr/sbin/ntpq -p


  这个命令您会看到同步的地址


  如果出现的结果是No association ID's returned 那么表示您失败了


关于HP主机上NTP的模式,有3种如下,在HP 平台的man page中有详细的说明:


模式1:offset below 128 milliseconds

This is the normal operating regime of NTP. A properly configured NTP hierarchy (with reasonable networking) can operate for years without ever approaching the 128 millisecond upper limit. All time adjustments are small and smooth (known as slewing), and nobody even notices the slew adjustments unless they have a cesium clock or a GPS clock and expensive instrumentation to make sophisticated measurements (HP/Agilent makes the instruments).

模式2:offset above 128 milliseconds

This regime is often encountered at power-on because, those battery-backed real-time clocks they put in computers are not too great. Because NTP is quite capable of keeping the offset below one millisecond all the time it is running, many users want to get into the normal regime quickly when an offset above 128 millisecond is encountered at startup. So in this situation NTP will (fairly quickly) make a single step change, and is usually successful in getting the offset well below 128 millisecond so there will be no more of the disruptive step changes.


模式3:offset above 1000 seconds


This is so far out of the normal operating range that NTP decides something is terribly wrong and human intervention is required. The daemon shuts down.


For Solars:


我这没有测试的平台,不过在KM (How to Configure NTP or Windows Time for Oracle Clusterware (Doc ID 1056693.1))里找到了配置的办法,这里还有Windows的配置方式


检查配置:


/usr/bin/svcs ntp


STATE          STIME    FMRI


online          7:39:29 svc:/network/ntp:default


ps -ef|grep ntp


root 21212     1   0   Feb 02 ?           0:33 /usr/lib/inet/xntpd



配置/etc/inet/ntp.conf 启用slewalaways


grep 'slewalways|pll' /etc/inet/ntp.conf


slewalways yes


disable pll


启动:


/usr/sbin/svcadm enable ntp

星期日 九月 22, 2013

TimesTen学习资料大汇总

想学习TimesTen内存数据库,苦于相关资料太少?


好消息来了!



如果您的英文不够好,可以通过以下三种渠道来获得相关信息:




1. support.oracle.com 网站已经开始陆续推出TimesTen中文翻译文档。

以下是翻译好的部分文章列表:

TimesTen 内存数据库 (IMDB) 版本支持摘要 [ID 1536728.1]

如何评估发生TimesTen core dumps后的Core 文件的大小 [ID 1566407.1]

如何评估,计算和配置TimesTen 日志定期归档的问题 [ID 1566405.1]

TimesTen中,多久需要更新统计信息? [ID 1566430.1]




2. 到我们的数据库中文社区提问和浏览。




3. 关注我们的中文博客:






如果您的英文足够好,这里给出了一系列链接和文档号,供您学习:



-- 下载软件




-- 下载搭建自己的TimesTen 开发环境:




-- 研读在线文档:




-- 访问我们英文社区并关注我们定期举办的在线直播研讨会




-- 关注我们英文博客




-- 到论坛浏览或者提问




-- 更多文章,尽在support.oracle.com!



------

Master Note : TimesTen In-Memory Database (Doc ID 1088128.1)

Index Note : TimesTen Documentation For Webcasts (Doc ID 1263225.1)

“HOW TO”?

How To Gracefully shutdown a TimesTen system. (Doc ID 1326710.1)

HOWTO : Understand A General Overview Of How TimesTen Uses CPU (Doc ID 416395.1)

How to reload a TimesTen datastore? (Doc ID 789949.1)

How to verify which ports have been configured for TimesTen (Doc ID 462255.1)

How To Reduce PermSize Settings For An Existing TimesTen Data Store (Doc ID 1081032.1)

HOWTO Enable Date and Time Stamp in TimesTen Logs on Unix (Doc ID 755483.1)

Explaining how Server Connection Attributes work: MaxConnsPerServer, ServersPerDSN, and serverpool (Doc ID 1184993.1)

HOWTO : Understand TimesTen Client-Server Configuration Options (Doc ID 1273911.1)



Installation & Backup & Migration & Upgrading

-- Installation

http://docs.oracle.com/cd/E13085_01/doc/timesten.1121/e13063/install.htm#CBHDBEIG

-- Upgrading

http://docs.oracle.com/cd/E13085_01/doc/timesten.1121/e13063/upgrade.htm

-- Backup & Migration

How to migrate a data store from Solaris to Linux? (Doc ID 1302794.1)

Index Behaviour During Timesten Migration (Doc ID 1214634.1)

HOWTO : Understand Moving or Copying A TimesTen Database (Doc ID 974583.1)

TimesTen: Can I Do an Offline Backup? (Doc ID 747801.1)

HOWTO : Use ttMigrateCS To Migrating Across OS Or Chip Set Platforms (Doc ID 1299746.1)

HOWTO : Understand Converting To A Database Characterset From TimesTen A TIMESTEN8 Characterset (Doc ID 1257114.1)

--------------------

Troubleshooting & Monitoring

Index Note : TimesTen Best Practices For Monitoring (Doc ID 1313448.1)

Troubleshooting TimesTen In-Memory Database (Doc ID 406904.1)

How to troubleshoot process using high memory problems (Doc ID 1349825.1)

Troubleshooting TimesTen Replication (Versions 6 & 7) (Doc ID 406867.1)

Monitoring Memory Usage in Virtual Memory Systems (Doc ID 558237.1)

TimesTen Health Monitoring (Doc ID 789629.1)


--------------------------

Development & Maintence

How To Gracefully shutdown a TimesTen system.(Doc ID 1326710.1)

Externally Signaling A Graceful Shutdown in TimesTen Client Processes (Doc ID 884883.1)

Guidelines for Shutting Down TimesTen DataStores and Applications (Doc ID 740819.1)

HOWTO : Understanding Methods For Showing A Query Plan (Doc ID 953297.1)

TimesTen Case Study: "Connection Storm" Appears To Hang Entire Application (Doc ID 1477100.1)

HOWTO : Modify A View In A TimesTen Active Standby Pair (Doc ID 1311731.1) 

--------------------------

For Replication

TimesTen: How to configure Active/Standby pair setup with Oracle Clusterware (CRS)? (Doc ID 809197.1)

TimesTen - Replication Daemon Executable Size Can Grow To Be Very Large (Doc ID 1375872.1)

HOWTO Set-up and Tear-down A TimesTen Master and Subscriber Database Replication Scheme (Doc ID 752168.1)

HOWTO : Understand TimesTen: LSNs, Bookmarks and Replication (Doc ID 786982.1)

TimesTen: Details of the "TTRepAdmin -duplicate" operation (Doc ID 787019.1)

--------------------------

For Cache to Oracle

Quick Start Guide - Getting started with TimesTen Cache (Doc ID 549803.1)C

Steps to use Active Standby replication in a Cache Grid environment (Doc ID 844517.1)

Steps to add a TimesTen node into an existing Cache Grid (Doc ID 842990.1) )

What is the best practice for gracefully detaching a database from a TimesTen Cache Grid?

TimesTen Cache Connect to Oracle: Internals, Performance Hazards and Performance Tuning (Doc ID 473493.1)

HOW TO HANDLE SHUTDOWN/RESTART OF CACHE GRID AFTER A SERVER REBOOT (Doc ID 973717.1)

------

AIX Specific

Note:1354237.1 - Timesten Datastore loads Very Slowly on IBM AIX systems (Doc ID 1354237.1)

Note:1311244.1 - Why do I see multiple shared memory segments used for a TimesTen datastore on AIX?

Note:867692.1 - Using the AIX "Large Pages" Facility to Pin TimesTen Segments in Memory

------


如果您觉得有其他更好的渠道和资料,也欢迎您分享到这里!


















星期三 九月 18, 2013

TimesTen的Active-standby配置中如何安全重启Active节点主机

TimesTen的Active-Standby pair是TimesTen中的HA配置,但是和Oracle的Physical/Logical Standby又有区别。其同步方法和Logical Standby类似,是应用Active主机的transaction log.

但是Standby主机是只读的。

重启Standby主机没有问题,日志会堆积在Active端,等standby重启后会自动接续。

但是很多客户发现重启Active主机,经常会导致Active-Standby pair丢失。即使用户先将Standby转换成Active,再重启原来的Active主机(转换后的standby)也不行。

这将总是需要重建原来的Active主机(转换后的standby)上的数据库,在数据量巨大时,这个过程将非常缓慢。


经过反复实验和考证,我们现在可以确认问题出在哪里:

1)Active主机在重启前,并未将所有的transaction都同步到Standby,如果一旦Active和Standby角色互换,会造成Standby上存在Active上并不存在的transaction,产生TT16227错误:

TT16227: Standby store has replicated transactions not present on the active. Local CTN=1377070661.7568, Backup CTN=1376558513.698865, Received CTN=1377070661.7564.

2)用户只是用了./ttdaemonadmin -stopserver -force来尝试中止所有应用连接。

需要指出的是TimesTen有两种连接,一种是C/S,一种是直连。



C/S是指应用程序和TimesTen不在同一台主机上的连接方式。对于同一台主机上的程序,可以使用直连。

而./ttdaemonadmin -stopserver只会停止C/S连接。

同一台主机上,仍可以通过ttisql登录数据库。

3)如果停止所有应用,并确认Active-standby两侧的transaction同步后,可以做任意重启操作。如果要使用force或者杀进程停止transaction的话,一定要确认回滚完毕并且两侧确认同步后,再重启。可以用dsmap工具来实现确认动作。


下面给出了详细的重启Active主机的确认步骤:



1)停止Server来中断已有的并阻止未来的client/Server连接.

./ttdaemonadmin -stopserver -force


2)杀用户进程,主要是杀Direct link连接:

Command> host ttXactAdmin -connections

2013-08-26 14:32:44.696

/home/oracle/TimesTen/tt1121/info/HHCBEDATA

TimesTen Release 11.2.1.9.8


ID   PID     Context    Name           Program        State TransID     UID


1 32654   0x082723b8 hhcbedata      ttIsqlCmd      Run      1.88     TTADMIN <==========ttIsqlCmd连接需要kill

2 32663   0x0a1ff1b0 REPHOLD        timestenrepd   Run               SYS

3 32663   0x0a24fda0 FAILOVER       timestenrepd   Run               SYS

4 32663   0x92c00468 REPLISTENER    timestenrepd   Run               SYS

5 32663   0x0a2a0990 XLA_PARENT     timestenrepd   Run               SYS

6 32663   0x0a17ca18 LOGFORCE       timestenrepd   Run               SYS

7 32663   0x0a3117e8 TRANSMITTER    timestenrepd   Run               SYS

8 32663   0x0a3623d8 RECEIVER       timestenrepd   Run               SYS

9 437     0x09cfaba0 hhcbedata      ttIsqlCmd      Run               ORACLE <=========这是你的当前连接

2032 32564   0x0830e340 Manager        timestensubd   Run               SYS

2033 32564   0x08360e98 Rollback       timestensubd   Run               SYS

2034 32564   0x0842f538 Flusher        timestensubd   Run               SYS

2035 32564   0x084a05a0 Monitor        timestensubd   Run               SYS

2036 32564   0x084f13a0 Deadlock Detector timestensubd   Run               SYS

2037 32564   0x085421a0 Checkpoint     timestensubd   Run               SYS

2038 32564   0x08592fa0 Aging          timestensubd   Run               SYS

2039 32564   0x085e3da0 Log Marker     timestensubd   Run               SYS

2040 32564   0x08634ba0 AsyncMV        timestensubd   Run               SYS

2041 32564   0x086859a0 HistGC         timestensubd   Run               SYS


3)等待并确认Active-standby两侧的transaction同步:


Command> call ttRepSubscriberWait(null, null, null, null, -1);


TIMEOUT:   00

Command> vertical 1;

Command> select * from ttrep.reppeers;


COMMIT_TIMESTAMP:    1377498342

COMMIT_SEQNUM:       352                   <==============352


-bash-3.2$ cd ../support

-bash-3.2$ ./dsmap -shmid 4161544 -hdr| grep -i ctn  <===========4161544 是通过ttstatus命令获得的shared memory ID

 latch                   = 9     (SbCTNWrapLatch)

 latch                   = 10    (SbRepCTNLatch)

replBackupCTN             = <0.0>

locCTN                    = <1377498342.352>

appliedCTN                = <1377498342.352> <==============352

lastLocalAwtCTN           = <0.0>

lastGlobalAwtCTN          = <0.0>


<======需要等到COMMIT_TIMESTAMP.COMMIT_SEQNUM=dsmap命令结果中的locCTN,并且等于appliedCTN


4)在standby上执行角色转换,(如果应用不需要在这段时间内切换到Standby上,也可以不执行):


call ttrepstateset('ACTIVE');

call ttrepstateget;


5)在以前的Active上执行以下命令然后:

./ttAdmin -repStop HHCBEDATA

./ttadmin -ramunload  "dsn=HHCBEDATA"

./ttDaemonAdmin -stop


<====现在可以安全重启Active主机了

星期二 九月 17, 2013

如何配置SQL developer从windows客户端远程连接TimesTen


配置SQL developerwindows客户端远程连接TimesTen之前,Windows上必须要安装TimesTen Client软件才会有远程连接必要的客户端程序及TimesTen for windows ODBC 驱动。


1)在以下连接下载最新的TimesTen for windows,需要说明的是,TimesTen的服务器和客户端是下载同一个安装程序,如果只安装客户端,可以安装时自定义安装选择只装客户端。


http://www.oracle.com/technetwork/products/timesten/downloads/index.html



需要先点击“Accept License Agreement才能下载。


2)Windows7上安装,以管理员身份运行setup.exe



3)选择只安装TimesTen Client:



4)安装步骤的最后一步,让安装程序自动注册TimesTen的环境变量。



5)ODBC中添加一个数据源,选择TimesTen Client:


(64位系统上打开32ODBC管理器需要在cmd运行%systemdrive%\Windows\SysWoW64\Odbcad32.exe)




6)点击Servers按钮,配置TimesTen服务器端口。


7)在这个界面点Add添加一个服务器:



8)服务器地址及端口号:



端口号可以通过在服务器上执行ttstatus获得:


-bash-3.2$ ttstatus


TimesTen status report as of Tue Aug 27 10:51:21 2013


Daemon pid 650 port 53380 instance tt1121


TimesTen server pid 14608 started on port 53381 ç=========53381端口


9)选择服务器,填写DSN,用户名密码可填写,不填写的话会要求在连接时再输入。



10)重新启动sql developer,因为安装客户端时注册了环境变量,再次启动sql developer会发现新建数据库连接页出现了TimesTen选项:



11)选择刚才添加的ODBC数据源即可。



点击“连接”就可以连接上TimesTen数据库了。


12)如果不使用ODBC的自定义配置:


以上使用ODBC是最简洁明了的配置,但是很多用户还是想直接写连接字符串,这里也给出方法。从第5步开始省略,安装完客户端后在sql developer中直接输入连接字符串:


TTC_Server=hostname;TTC_Server_DSN=Server_DSN;TCP_Port=Server_port


这里


o Hostname: TimesTen的主机名或者IP地址


o TTC_SERVER_DSN: TimesTen DSN 名,也就是Datastore的名称。


o Server_port: 我们之前用ttstatus看到的���务端口号。


TimesTen server pid 14608 started on port 53381 ç=========53381端口


例如可以设置为:


TTC_Server=nascds8;TTC_Server_DSN=HHCBEDATA;TCP_Port=53381


注意要填写用户名口令:



星期五 七月 12, 2013

CSS 功能简介


最近处理了一些和CSS(Cluster
Synchronization Service)
相关的问题,进而对CSS 的功能有了一些粗浅的认识,尤其是GM(Group Management)部分的功能,在这里和大家分享一下,希望对我们今后处理CSS 问题和理解CSS 这个oracle
集群的核心组件有所帮助。


CSS的功能主要包括节点管理(Node Management,以下简称NM)和组管理(Group Management,以下简称GM)两部分,都是由守护进程ocssd.bin 来实现的,这是个多线程的进程(我们可以通过命令pstack获得更多线程的信息,本文并不会详细的介绍每个线程的功能)。


首先,NM主要负责集群中节点的管理。集群是由若干个节点构成的,NM要解决的问题就是如何让集群的各个节点处于一致的状态,以及,当集群成员发生改变时,如果维护集群的一致性。所以,NM要实现下列的功能:


1. 节点间的网络心跳:通过集群私网,每一个节点都定期向其他所有的节点发送网络心跳,以便确认节点之间的通信和健康性。


2. 磁盘心跳:只有网络心跳是不够的,因为,一旦出现了网络问题,当节点间互相无法发现对方的网络心跳时,无法判断那一个(些)节点的状态正常,哪一些不正常,所以,我们还需要磁盘心跳。每个节点会定期向表决盘(VF)中注册本地节点的状态信息。这样,当网络心跳出现问题时,我们就可以基于表决盘中的信息,判断节点的状态并作出正确的决定,并防止脑裂(split brain)的发生。


3. 集群节点重新配置:ocssd.bin会每隔一段时间都对集群中的每个节点的最后一次网络心跳和磁盘心跳进行判断,以决定是否需要对集群进行重新配置(也就是说,是否有某一个/些节点需要被evict掉)。当然,当一个节点加入集群时,集群的其他节点需要收到集群重新配置的信息,得到最新的节点成员列表。同样的道理,当集群的某一个节点离开集群时,其他节点需要知道最新的成员列表。当然,无论是节点加入或者离开集群,都会有一个RMN(reconfig)节点负责集群的重新配置,并���知集群中的其他节点。


注意:以上内容是针对cssd.bin的基本功能进行的介绍,对已11gR2的新特性,如:本地心跳,cssdagent/cssdmonitor, rebootless restart,在本文并不包括。如果您对这些新特性感兴趣,请参考之前的文章。


 接下来,我们介绍一下GM这部分的功能。在一个集群中,除了节点之外,还有很多资源是需要管理的,(当然,主要的资源管理工作是由crsd.bin来完成的)而这些资源会作为一个一个的组(在css的世界里,我们把组称为grock)注册到css上,每一个组会由若干个成员构成,而且每一个组或者组中的一些成员都要向外共享一些信息。例如,集群中的每一个数据库都会作为一个组注册到css上,而这个组的主要的成员就是lmon进程(这就是为什么,有的时候我们会发现lmon进程有的时候会报ora-29701错误的原因。),当一个进程被启动的时候,本地实例的lmon进程需要把自己注册到css对应的组当中,它才能够知道,这个数据库同时又多少个实例在运行,每个实例运行在哪一个节点,对于这种行为,我们一般称之为组内共享。
再举一个例子,当ASM实例启动之后,ASM对应的组会把自己的信息共享出去,以便数据库实例能够发现运行的ASM实例,并进行通信,对于这种行为,我们一般称之为组间共享。如果一个组的所有成员都来自于同一个节点,我们称之为本地组;如果组中的成员来自不同的节点,我们称之为全局组。


NM类似,当组中的某一个成员离开或者加入组的时候,也会有一个master节点(一般称这个节点为GM master)来完成组成员的重新配置。另外,组管理中另一个重要的功能就是fencing,也就是说,当组中的某一个成员离开的时候(例如:这个进程被terminate掉),css 必须确保这个进程在OS 级别已经离开,而且进程pending的所有I/O 操作都被清理掉,因为对于集群来说,我们需要在节点间保证I/O的一致性,这也是我们经常在很多文档当中会讲到,只有I/O capability的进程才会注册到css的原因之一。


最后,由于CSS的首要功能是构建集群和确保集群的一致性,所以,当集群的节点数量发生改变的时候(节点加入集群,或者离开集群),css 首先会进行NM层面的重新配置,之后才能进行GM层面的重新配置,这个顺序是不能颠倒,也不能同时进行的。这也从某种程度上解释了,为什么我们会看到,当ocssd.bin 没有完成工作的时候,crsd.bin是不能启动所管理的资源的。


以上的内容希望对大家理解CSS这个oracle集群核心进程的功能有些帮助。在今后的文章中我们会尝试通过一些具体的例子来对上面的内容进行解释。


参与此主题的后续讨论,可以访问我们的中文社区,跟帖“共享: CSS 功能简介"

星期一 五月 27, 2013

关于正则表达式

Oracle在10G之前的版本,对于字符串的处理有很大的局限性。ORACLE 10G引入的正则表达式的函数 ,对字符串的处理有了极大的提
高。接下来会给大家介绍相关函数的语法,以及通过一些简单的例子来说明正则表达式的应用。



请在此链接下载全文:  关于正则表达式


参与此主题的后续讨论,可以访问我们的中文社区,跟帖分享 : 关于正则表达式

星期四 五月 23, 2013

在AIX上运行RAC时网络方面的一些最佳经验

在AIX上运行RAC时网络方面的一些最佳经验

1. Oracle推荐使用Etherchannel来配置网卡绑定,推荐主/备模式的网卡绑定,主/主(Active/Active)模式不推荐,因为主/备模式更稳定一些。注意:从11.2.0.2开始,Oracle 的集群软件Grid Infrastructure(GI)中新增了Redundant Interconnect with Highly Available IP(HAIP),以实现集群私网的高可用性和负载均衡。也就是说,有了HAIP之后,无需使用网卡绑定就可以实现私网网卡的冗余( 关于HAIP的更多信息,请参考 Redundant Interconnect with Highly Available IP (HAIP) 简介)。

2. Oracle针对网络的另外一个推荐是使用Jumbo Frames,网卡和交换机支持9000 MTU 大小就可以启用。MTU (Maximum Transmission Unit)是指最大的网络传输单位,默认一般是1500 bytes。由于在RAC实例间传输的数据可能在2K to 64K或者更大,当MTU是1500时,会导致这些数据被分割,对性能产生影响。启动Jumbo Frames后,MTU可以达到9000 bytes,这样可以降低数据被分割的次数。 更多信息,请参考MOS文档:
Recommendation for the Real Application Cluster Interconnect and Jumbo Frames (Note 341788.1)

3. 如果网络的一些参数设置不合理,可能会产生"gc cr multi block request" 这样的等待事件。如果在AWR中发现了这个等待事件很高,需要检查UDP 参数udp_sendspace和udp_recvspace的设置是否满足下面的要求:

针对AIX:
o 设置udp_sendspace >=[(DB_BLOCK_SIZE * DB_FILE_MULTIBLOCK_READ_COUNT) + 4096],但是不低于 65536.
o 设置udp_recvspace 为 4到10倍的udp_sendpace
o 由于sb_max 必须 >= udp_recvspaceIf ,可能需要增加sb_max的值(默认为1048576)
o 如果udp的参数设置不合理,可能会产生“socket buffer overflows”,如果这个值非0, 需要增加udp_recvspace:
 netstat -s | grep "socket buffer overflows"

4. 针对交换机使用哪种协议,CRS 和 RAC 没有要求,如果使用了Etherchannel,只要这种协议和Etherchannel兼容并且稳定就可以。

下面的文档中有针对网络方面的一些要求:
Minimum Software Versions and Patches Required to Support Oracle Products on IBM Power Systems (Note 282036.1)
10 Gigabit Ethernet
. LACP timeout: Use the “long timeout” switch setting for the amount of time to wait
before sending LACPDUs.
· Flow control: Enable flow control at the switch port and on the server side ports
(using HMC) for the 10GE adapter or 10GE HEA configuration.

星期三 五月 08, 2013

RAC 中锁的管理—Buffer Lock

本文是前一篇文章《RAC 中锁(排队)的管理》的继续,在这篇文章中,我们会介绍RAC

中buffer lock(也称为PCM lock)是如何工作的。


首先,在数据库中,当我们需要访问一个buffer的时候,我们需要在对应的buffer上面加一个锁,而当一个进程持有这个buffer的lock时,其他的进程如果以不兼容的方式访问相同的buffer,就需要等待,对应的等待事件是’buffer busy wait’(不同的版本等待事件可能不同)。在RAC 数据库中,事情变得更加复杂了,由于所有实例访问相同的数据文件,我们需要在多个实例之间保证数据的一致性,所以, 在RAC 环境下buffer lock的结构更加的复杂。


RAC下的buffer lock 由3部分构成:

锁模式(lock mode):对于buffer lock,只有三种 N(空), S(共享)和X(独占)模式。下面的表格说明了各种模式的兼容性。  



锁角色(lock role):本地或共享。本地表示对应的块只在本地被修改过,全局表示对应的块在一个或多个远程缓存中被修改过。

旧镜象(past image):这部分的值为1 或 0。1 表示对应的块存在PI(past image), 0表示不存在。 PI的存在主要是加快RAC 介质恢复,在今后的文章我们会详细的介绍PI的功能。


另外,和RAC中的排队(enqueue)类似,每一个buffer lock都有一个主(master)节点,每个块的主节点是通过hash算法决定的(具体的算法在本文中不作讨论)。主节点包含了对应lock 的全局信息,而每个访问过对应块的节点都包含了本实例的锁信息。


接下来,我们通过下面的的例子说明在RAC 数据库中访问某个block时会发生什么事情。

1. 节点C要求读取块1008。



1)1008块的主节点被hash到D节点,之后节点C向主节点发送请求,要求以S模式锁定块1008。这时buffer lock的模式是SL0(S?hared ,L?local, 0?没有PI)。

2)主节点把对应的锁赋予节点C。

3)节点C 从数据文件中读取块108。

4)读取完成,节点C 以 获得对应的锁,属性为SL0。


2.节点B要求读取块1008。



1) 节点B向主节点D发出请求,要求以S模式锁定块1008。

2) 主节点D发现节点C已经以S模式获得了对应的锁,而且S锁之间是可兼容的,所以,不需要锁的转换,主节点D要求实例C发送块1008 给实例B。

3) 节点C发送对应的块给节点B。

4) 节点B通知主节点D,已经获得了块1008上的S 锁,属性为SL0。


3.节点B要求修改块1008 中的信息。



1) 节点B向主节点D发出请求,要求以X模式锁定块1008。

2) 主节点D发现节点C已经以S模式获得了对应的锁,而且S锁于X锁之间是不兼容的,所以,需要锁的转换,主节点D要求节点C将对应的锁级别降低为N,所得属性为NL0

3) 节点B将自己的所降级,并且将本地的块1008 标识为CR。之后,节点B将块1008 修改为块1009,同时将通知主节点锁的属性为XL0。

4.节点A要求修改块1009。


 1) 节点A向主节点D发出请求,要求以X模式锁定块1009。

2) 节点D发现节点B已经以X模式持有了对应的锁,而且X模式的锁是不能兼容的,所以,主节点D 要求节点B降级锁到N模式,同时由于块在节点A和B都被修改,所以,锁的角色变为全局(Global),而且节点B上的块会变成一个PI。也就是说这时,节点B上的锁的属性为NG1(模式—> N, 角色—>G, 存在PI—>1)。

3) 节点B完成锁的降级之后,把块1009传递给节点A。

4) 节点A修改块1009 为1013,同时将自己节点的锁设置为XG0,并且通知主节点。


5. 节点C 查询块1013。



1) 节点C发送请求给主节点D,要求以S模式锁定块1013.

2) 主节点发现节点A拥有最新的块1013,而且这个节点以X模式锁定了这个块,因为X和S锁是不兼容的,主节点发送请求给节点A,要求降级锁。

3) 节点A降级锁为S模式,同时,由于最新的块会发送给节点C,所以在节点A上的块1013变为PI。接下来,节点A把块1013发送给节点C。这是节点A上的锁为SG1。

4) 节点C收到最新的块1013,并且以S模式锁定块,并把自己的锁更新为SG0。最后,通知主节点D。


根据以上的说明,我们能够看到,对于RAC系统,当一个进程需要访问一个块时,一定要首先获得块上对应的锁,之后才能对块进行相应的操作。而且,在RAC系统中,无论数据库包含多少个节点,当访问一个buffer时,最多会有3个节点参与其中,他们是主节点,持有者节点和申请者节点。而且,每一次访问的时候,都要有消息在节点间不断的传递。另外,我们能看到,如果锁的角色是全局,那么我们要做的事情更多,也意味着我们要访问的代码深度也越多。这也从一个角度解释了为什么oracle 会在RAC中推出DRM,read mostly,reader bypass等新特性(关于后两个新特性,我们会在今后的文章介绍)。



最后,对于PCM lock,以上过程都是由 lms进程完成的。而对于enqueue,是由lmdj进程完成的。


以上的描述,希望对大家理解RAC数据库中锁的管理的机制有所帮助。在接下来的文章中,我们会通过详细的例子对以上的内容进行讲解。


参与此主题的后续讨论,可以访问我们的中文社区,跟帖“共享:RAC 中锁的管理—Buffer Lock��。

星期五 二月 22, 2013

DRM 简介

首先,我们对和DRM 相关的一些概念进行介绍。

Buffer: 对于RAC 数据库,当一个数据块被读入到buffer cache后,我们就称其为buffer , cache fusion 会将这个buffer作为resource来管理。


Master:在RAC 数据库的世界里,每一个resource都会有一个master实例,这个master实例会在shared pool 中(例如:gcs resource 和ges resource 部分)分配一些空间来存放和这个资源相关的信息,例如:哪一个实例拥有了这个buffer的最新版本,哪一个实例拥有了这个buffer的什么级别的lock等等。并且,负责维护和这个资源的状态。


接下来,我们对RAC 环境中,访问一个buffer的过程进行简单的描述。我们以一个4节点的RAC 数据库为例。注意,我们只会列出比较典型的一种情况,不会把所有可能的情况都一一列出,而且只是把步骤进行了简单的介绍。



步骤1:实例3需要以X(exclusive)方式访问buffer1, 向master实例(1) 发出了请求。

步骤2:master实例(1)发现实例2 以X方式持有buffer1,之后通知实例2释放X lock,并把buffer1发送给实例3。

步骤3: 实例2释放X lock,并把最新版本的buffer1发送给实例3。

步骤4:实例3获得buffer1, 并通知master 实例(1)更新资源buffer1的最新状态。


从上面的步骤,我们不难看出,在RAC 数据库中,当我们访问一个buffer的时候,最多会有3个实例参与其中,master实例,holder(持有者)实例 和requestor(申请者) 实例。2种数据传输会出现,message:用于和lock相关的信息传输,data:用于传输buffer。同时,根据上面的步骤我们也自然会想到,如果master和requestor在同一个实例上,那么就可以减少实例之间message的传输并且访问的代码路径(code path)会更短,从而提高性能,但是每个buffer在被读取到buffer cache时,master节点的选择是随机的。基于这种考虑, oracle从10g开始,推出了一个新特性DRM(Dynamic Resource management)。



DRM的主要功能是,根据一段时间内(默认10分钟),每个实例,对某一个数据库对象的 (10gR1以数据文件为单位)的访问次数和方式,来决定数据库对象对应的buffer应该被mastering 到哪一个实例。在指定时间内,如果某一个实例访问某个数据库对象次数高于其他实例一定倍数(默认50倍),则oracle 会把这个对象所有的buffer的master信息,转移到对应实例(注意:不是转移buffer)。当然,转移的过程是渐进式的。当oracle 决定将一个buffer的master实例确定到本地实例后,会对这个buffer上加上affinity lock,来实现快速的访问。这也是我们经常提到的object affinity 的由来。


接下来,我们对DRM的基本步骤进行介绍。

1. Oracle停止所有在需要进行remastering的buffer上的操作。注意:DRM是渐进的,也就是说以windows 为单位,每次对一部分的buffer 进行remastering 操作。

2. Lmon 通知所有实例,准备进行remastering

3. 在旧的master实例清除对应buffer的master信息

4. 将master信息传递给新的master实例

5. 在新的master实例构建资源的最新状态

6. 结束,并释放所有之前所有步骤占用的资源。


然后,我们对DRM相关的一些参数进行简单的介绍。

_gc_policy_time :单位为分钟,控制DRM统计实例访问buffer次数的时间间隔,默认为是10分钟。

_gc_affinity_ratio:控制进行remastering所需要达到的最小比例(阀值),默认为50。也就是说,如果某个实例在10分钟(_gc_policy_time)之内,访问某个数据库对象的次数大于其他所有实例50倍时(注意:是50倍,而不是50次),对该数据库对象的buffer进行remastering。


注意:请不要修改以上参数的值,除非您很清楚自己在做什么,或者是根据oracle 工程师的建议。


最后,如果您遇到了和DRM相关的问题,建议您查看以下的信息。

1. Lmon,lmd,lms和diag进程的 trace file,来确认问题出现在DRM的哪一步和lms,lmon,lmd进程的状态。

2. AWR 和ASH report,确认那些等待事件持续了很长时间,以及lmon,lms 和lmd的状态。

3. 参照note 1492990.1 获取 DMR 诊断脚本输出。


希望以上的介绍对理解DRM有些帮助。

星期五 一月 18, 2013

ORACLE数据库存储结构简介

我们知道数据库是存储数据的容器,它的主要功能是保存和共享数据。在这篇文章中,我们对数据库存放数据的基础知识进行了介绍。

首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的。
    逻辑存储结构:oracle内部的组织和管理数据的方式。
  物理存储结构:oracle外部(操作系统)组织和管理数据的方式。

接下来我们对上面的两种结构进行详细的介绍。
1.逻辑存储结构:



oracle在逻辑上将保存的数据划分为一个个小单元来进行存储和维护,更高一级的逻辑存储结构都是由这些基本的小单元组成的。
逻辑结构类型按照尺寸从小到大分可分为:块(block)-->区(extent)-->段(segment)-->表空间(tablespace)


    块:Oracle用来管理存储的最小单元,也是最小的逻辑存储结构。Oracle数据库在进行输入输出时,都是以块为单位进行读写操作的。我们建议数据块的尺寸为操作系统块尺寸的整数倍(1、2、4等)。另外,块的大小是在创建数据库的时候决定的,之后不能修改。当然,oracle同时也支持不同的表空间拥有不同的数据块尺寸。下面,我们对块的结构进行一些介绍。
    块的头部信息区:
        块头:包含块的一般属性信息 如块的物理地址、块所属的段的类型
        表目录:如果块中存储的数据是表数据, 则在表目录中保存块中所包含的表的相关信息
        行目录:行记录的相关信息 如ROWID
    块的存储区:主要包含空闲空间和已经使用的空间。Oracle主要是通过下面的两个参数对这部分空间进行管理的
        PCTFREE参数:指定块中必须保留的最小空闲空间比例。当块中的空闲存储空间减少到PCTFREE所设置的比例后,Oracle将块标记为不可用状态,新的数据行将不能被加入到这个块。
        PCTUSED参数:制定一个百分比,当块中已经使用的存储空间降低到这个百分比只下时,这个块才被重新标记为可用状态。
        请注意:以上两个参数既可以在表空间级别进行设置,也可以在段级别进行设置。段级别的设置优先级更高。

    区:比块高一级的逻辑存储结构 由连续的块组成,它是oracle在进行存储空间的分配和回收的最小单位。在创建具有独立段结构的数据库对象时,例如表、索引等,Oracle会为数据库对象创建一个数据段,并为数据段分配一个‘初始区’。后续区的分配方式,则根据表的空间管理办法不同,而采用不同的分配方式,例如autoextent,uniform size 或者在创建表或表空间时设置default storage 子句。另外,用户还能够通过执行下面的命令来回收表、索引等对象中未使用的区:
SQL>alter table table_name deallocate unused;
    段:由多个区组成,这些区可以是连续的,也可以是不连续的。当用户在数据库中创建各种具有实际存储结构的对象时(保存有数据的对象),比如表、索引等,Oracle将为这些对象创建“段”。 一般一个对象只拥有一个段。在创建段时,可以为它指定PCTFREE、PCTUSED等参数来控制其中的块的存储空间管理方式,也可以为它指定INITIAL、NEXT、PCTINCREASE等存储参数,以指定其中区的分配方式。如果没有为段指定这些参数,段将自动继承表空间的相应参数。不同类型的数据库对象拥有不同类型的段:
        数据段:保存表中的记录
        索引段:索引中的索引条目
        临时段:在执行查询等操作时,Oracle可能会需要使用到一些临时存储空间,用于临时保存解析过的查询语句以及在排序过程中产生的临时数据。
        回滚段:保存回滚数据。

  表空间:最高级的逻辑存储结构,数据库是由多个表空间组成的。在创建数据库时会自动创建一些默认的表空间,例如 SYSTEM表空间,SYSAUX表空间等。通过使用表空间,Oracle将所有相关的逻辑结构和对象组合在一起。我们可以在表空间级别指定存储参数,也可以在短级别指定。下面我们列出常见的表空间,和他们所存储的信息:
      数据表空间:用于存储用户数据的普通表空间。
      系统表空间:默认的表空间,用于保存数据字典(一组保存数据库自身信息的内部系统表和视图,及用于Oracle内部使用的其他一些对象),保存所有的PL/SQL程序的源代码和解析代码,包括存储过程和函数、包、数据库触发器等,保存数据库对象(表、视图、序列)的定义。
      回滚表空间:用于存放回滚段,每个实例最多只能使用一个撤销表空间
      临时表空间:存储SQL执行过程中产生的临时数据
最后,我们可以用下面的比喻来描述逻辑结构关系:
块 :一张张白纸 ---> 区:白纸组成的本子---> 段:多个本子放到一个文件袋中---> 表空间:文件柜(存放多个文件袋)


2. oracle物理存储结构
Oracle数据库逻辑上由一个或多个表空间组成,每个表空间在物理上由一个或多个数据文件组成,而每个数据文件是有数据块构成的。所以,逻辑上数据存放在表空间中,而物理上存储在表空间所对应的数据文件中。我们可以用这张图来描述数据文件和表空间的关系。




构成数据库物的物理文件主要有三种:
      数据文件:存放数据库数据。
      控制文件:存放数据库的基本信息,告诉数据库到哪里找到数据文件和重做日志文件等。对数据库的成功启动和正常运行是很重要的。
      重做日志文件:存放对数据的改变。至少两组,Oracle以循环方式来使用它们。



About

本博客由Oracle全球技术支持中国区的工程师维护。为中文用户提供数据库相关的技术支持信息,包括常用的诊断工具、诊断方法、产品新特性、案例分析等。此外,MOS也陆续推出各类中文内容:技术通讯统一发布在Note 1529795.1 中,中文文档列表更新在Note 1533057.1 中,网上讲座请查看MOS文档 1456176.1,在"Archived"中可以下载历史的录音和文档。

Search

Archives
« 四月 2014
星期日星期一星期二星期三星期四星期五星期六
  
1
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   
       
今天