RAC-日常管理(2)
应用层管理--CRS_STAT
crs_stat
– crs_stat 这个命令用于查看CRS维护的所有资源的运行状态,如果不带任何参数时,显示所有资源的概要信息。
[[email protected] ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.DATA.dg ora....up.type ONLINE ONLINE rac1
ora....ER.lsnr ora....er.type ONLINE ONLINE rac1
ora....N1.lsnr ora....er.type ONLINE ONLINE rac1
ora.READATA.dg ora....up.type ONLINE ONLINE rac1
ora.RECOVER.dg ora....up.type ONLINE ONLINE rac1
ora.asm ora.asm.type ONLINE ONLINE rac1
ora.gsd ora.gsd.type OFFLINE OFFLINE
ora....network ora....rk.type ONLINE ONLINE rac1
ora.oc4j ora.oc4j.type OFFLINE OFFLINE
ora.ons ora.ons.type ONLINE ONLINE rac1
ora.oradb.db ora....se.type OFFLINE OFFLINE
ora....ice.svc ora....ce.type OFFLINE OFFLINE
ora....SM1.asm application ONLINE ONLINE rac1
ora....C1.lsnr application ONLINE ONLINE rac1
ora.rac1.gsd application OFFLINE OFFLINE
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip ora....t1.type ONLINE ONLINE rac1
ora.rac2.vip ora....t1.type ONLINE ONLINE rac1
ora....ry.acfs ora....fs.type ONLINE ONLINE rac1
ora.scan1.vip ora....ip.type ONLINE ONLINE rac1
这个命令是用来查看各种资源状态的命令,可以将CRS管理的所有资源都列出来。
从上面就可以查看到CRS的一些问题了,正常情况下应该将目光放在state这一列,如果这一列的值和target的值不一样就有问题了,正常情况下这个命令还会显示其他节点的信息,但是这里没有显示,只显示了一个节点的资源状态。RAC2上面的CRS起不来,导致RAC2上面所有的资源也起不来。
crs_stat这个命令可以查看到CRS管理的所有节点,假设是一个三个节点的RAC,那么就会将三个节点的资源列出来。
name这一列显示的是资源的名称。可以看到有ASM资源,VIP资源,LSNR资源等等。Host是主机名的列。Target是指这个资源本应该的状态,而stat是指资源实际的状态。
ora.rac1.vip ora....t1.type ONLINE ONLINE rac1
ora.rac2.vip ora....t1.type ONLINE ONLINE rac1
ora....ry.acfs ora....fs.type ONLINE ONLINE rac1
[[email protected] ~]$ cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.56.88 rac1
192.168.56.11 rac1-vip
10.10.10.1 rac1-priv
192.168.56.99 rac2
192.168.56.12 rac2-vip
10.10.10.2 rac2-priv
192.168.56.103 scan
[[email protected] ~]$ ifconfig
eth0 Link encap:Ethernet HWaddr 08:00:27:92:93:E3
inet addr:192.168.56.88 Bcast:192.168.56.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe92:93e3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:272 errors:0 dropped:0 overruns:0 frame:0
TX packets:214 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:30319 (29.6 KiB) TX bytes:29686 (28.9 KiB)
eth0:1 Link encap:Ethernet HWaddr 08:00:27:92:93:E3
inet addr:192.168.56.103 Bcast:192.168.56.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
eth0:2 Link encap:Ethernet HWaddr 08:00:27:92:93:E3
inet addr:192.168.56.12 Bcast:192.168.56.255
通过上面可以有意思的看到ora.rac2.vip ora....t1.type ONLINE ONLINE rac1 ,在RAC2上面的VIP资源在主机RAC1上面启动了,之前已经说过,当其中一个节点坏掉的时候VIP会自动的飘到另外一个节点上面去,通过查看网卡也可以看到在RAC1上面的网卡绑定了RAC2的VIP,这样的话,RAC2一旦宕机了,它的VIP就直接飘到了RAC1上面启动。这样的好处就是当用户去链接RAC2的时候不需要等待网络的超时,链接到RAC1上面的VIP,发现上面没有监听,直接返回给客户端错误。
VIP的目的并不是将用户的链接转到另外一个实例上面继续操作,而是快速的让用户接受到一个错误。
ora.oradb.db ora....se.type OFFLINE OFFLINE
这个表示现在数据库的状态是open的。可以看到这里只有这一个资源,因为RAC其实就是一台数据库。多个实例共享一个数据库,所以db资源只有一个。
现在将RAC2上面的CRS启动起来,再到RAC1上面使用crs_stat -t来查看
正常情况下应该是下面状态
[[email protected] ~]$ crs_stat -t
Name Type Target State Host
------------------------------------------------------------
ora.DATA.dg ora....up.type ONLINE ONLINE rac1
ora....ER.lsnr ora....er.type ONLINE ONLINE rac1
ora....N1.lsnr ora....er.type ONLINE ONLINE rac1
ora.READATA.dg ora....up.type ONLINE ONLINE rac1
ora.RECOVER.dg ora....up.type ONLINE ONLINE rac1
ora.asm ora.asm.type ONLINE ONLINE rac1
ora.gsd ora.gsd.type OFFLINE OFFLINE
ora....network ora....rk.type ONLINE ONLINE rac1
ora.oc4j ora.oc4j.type OFFLINE OFFLINE
ora.ons ora.ons.type ONLINE ONLINE rac1
ora.oradb.db ora....se.type ONLINE ONLINE rac1
ora....ice.svc ora....ce.type ONLINE ONLINE rac2
ora....SM1.asm application ONLINE ONLINE rac1
ora....C1.lsnr application ONLINE ONLINE rac1
ora.rac1.gsd application OFFLINE OFFLINE
ora.rac1.ons application ONLINE ONLINE rac1
ora.rac1.vip ora....t1.type ONLINE ONLINE rac1
ora....SM2.asm application ONLINE ONLINE rac2
ora....C2.lsnr application ONLINE ONLINE rac2
ora.rac2.gsd application OFFLINE OFFLINE
ora.rac2.ons application ONLINE ONLINE rac2
ora.rac2.vip ora....t1.type ONLINE ONLINE rac2
ora....ry.acfs ora....fs.type ONLINE ONLINE rac1
ora.scan1.vip ora....ip.type ONLINE ONLINE rac1
应用层管理--CRSCTL
crsctl
– 这个工具可以操作下面的几种资源:Database,Instance,ASM,Service,Listener 和 Node
Application,其中Node application又包括GSD,ONS,VIP。 这些资源除了使用srvctl工具统一管理外,某些资源还有自己独立的管理工具,比如ONS可以使用onsctl命令进行管理;
Listener 可以通过lsnrctl 管理
应用层管理--SRVCTL
查看注册到CRS中的数据库,实例等资源信息
srvctl config database
srvctl config database -d rdatabasename
srvctl config database -d racdb -a
srvctl config listener -n rac3
srvctl config asm -n rac3
srvctl config database(用来查看所有注册到CRS里面数据库的信息,CRS和数据库并不是1对1的关系,一套CRS可以管理多套数据库)
srvctl config database -d rdatabasename(查看数据库相关信息)
[[email protected] ~]$ srvctl config database -d oradb
Database unique name: oradb
Database name: oradb
Oracle home: /u01/app/oracle/product/11.2.0/db_1
Oracle user: oracle
Spfile: +READATA/oradb/spfileoradb.ora
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: oradb
Database instances: oradb1,oradb2
Disk Groups: READATA,RECOVER
Mount point paths:
Services: newservice
Type: RAC
Database is administrator managed
[[email protected] ~]$ srvctl config database -d oradb -a
Database unique name: oradb
Database name: oradb
Oracle home: /u01/app/oracle/product/11.2.0/db_1
Oracle user: oracle
Spfile: +READATA/oradb/spfileoradb.ora
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: oradb
Database instances: oradb1,oradb2
Disk Groups: READATA,RECOVER
Mount point paths:
Services: newservice
Type: RAC
Database is enabled
Database is administrator managed
[[email protected] ~]$ srvctl config listener -n RAC1(节点名)查看节点上面监听信息
Warning:-n option has been deprecated and will be ignored.
Name: LISTENER
Network: 1, Owner: grid
Home: <CRS home>
End points: TCP:1521
[[email protected] ~]$ srvctl config asm -n RAC1查看节点1上面ASM信息
Warning:-n option has been deprecated and will be ignored.
ASM home: /u01/app/11.2.0/grid
ASM listener: LISTENER
应用层管理--SRVCTL
添加资源到CRS中
srvctl add database -d newdb -o $ORACLE_HOME
srvctl add instance -d newdb -n rac1 -i newdb1
srvctl add instance -d newdb -n rac2 -i newdb2
srvctl add service -d dbname -s service_name -r instance_name_1 -a instance_name_2 -P BASIC -m basic -z 10 -e select
添加资源就是将新添加的资源注册到OCR磁盘里面去。让新建立的资源成为CRS管理资源的一部分,资源还是得自己手动创建的,资源创建好之后还是得添加到CRS中,即注册到OCR里面。上面是添加数据库实例和服务到CRS里面。
上面添加服务是用来区分不同的业务,比如RAC是两个节点,现在有两个业务,一个是用户的查询,一种是用户的加载,可以将其中一个节点给一个用户,一个用户对应于其上面的查询业务,另外一个节点上面对应于另外一个用户的加载业务,两个业务分别使用两个不同的服务,一个服务指向其中一个节点,另外一个服务指向另外一个节点。
查询的应用在TNS里面配置指向第一个节点服务的名字,加载的应用在TNS里面配置指向另外一个节点的服务的名字,TNS里面有servicesname这一项,要实现这个就先要在CRS里面将服务添加进去。
应用层管理--SRVCTL
启用或禁止某些资源随crs启动
srvctl disable(enable) database -d racdb
srvctl disable(enable) instance -d db_name -i instance_name_n
srvctl disable(enable) service -d db_name -s service_name -i instance_name_n
[[email protected] ~]$ srvctl enable database -d oradb
PRCC-1010 : oradb was already enabled
PRCR-1002 : Resource ora.oradb.db is already enabled
这个命令就是让数据库随着CRS一起启动。
[[email protected] ~]$ srvctl enable instance -d oradb -i oradb1
让实例一起启动
应用层管理--SRVCTL
从CRS中删除先关的资源
srvctl remove service -d racdb -s myservice
srvctl remove instance -d racdb -i rac3
srvctl remove database -d racdb
删除相关资源就是相对于将其从OCR里面的注册表里面删除。
应用层管理--SRVCTL
停止或启动相关的资源
srvctl start database -d racdb
srvctl start database -d racdb -i rac3 -o mount
srvctl start database -d racdb -i rac3 -o nomount
srvctl stop instance -d racdb -i rac3 -o immediate
srvctl stop instance -d racdb -i rac3 -o abort
srvctl start service -d racdb -s myservice -i rac1
srvctl stop service -d racdb -s myservice -i rac1
在RAC下面,最常用的启动方式有几种,最常用的就是登入每个节点下面的数据库(使用sqlplus)来关闭和启动。
使用srvctl这条命令来启停数据库比上面方法的好处就是:这条命令执行完之后操作的资源的状态,比如数据库,它的状态立刻会体现到CRS里面。如果使用sqlplus将数据库关闭,状态可能不会立刻反应到CRS里面。使用SRVCTL最大的好处就是可以立刻更新CRS的状态。
应用层管理--SRVCTL
命令的跟踪
export SRVM_TRACE=TRUE
srvctl config database -d racdb
这个是给环境变量设置一个值,设置为true,之后的操作都可以通过trace出来。这条命令没有太多的意义,如果有故障可以使用一下。
应用层管理--ONSCTL
onsctl
[[email protected] ~]$ onsctl
usage: /opt/ora10g/product/10.2.0/db_1/bin/onsctl start|stop|ping|reconfig|debug
start - Start opmn only.
stop - Stop ons daemon
ping - Test to see if ons daemon is running
debug - Display debug information for the ons daemon
reconfig - Reload the ons configuration
help - Print a short syntax description (this).
detailed - Print a verbose syntax description.
应用层管理--ONSCTL
[[email protected] ~]$ onsctl ping(查看ons在当前节点是否正常运行)
Number of onsconfiguration retrieved, numcfg = 2
onscfg[0]
{node = rac3, port = 6200}
Adding remote host rac3:6200
onscfg[1]
{node = rac4, port = 6200}
Adding remote host rac4:6200
ons is not running ...
[[email protected] ~]$ onsctl debug
Number of onsconfiguration retrieved, numcfg = 2
onscfg[0]
{node = rac3, port = 6200}
Adding remote host rac3:6200
onscfg[1]
{node = rac4, port = 6200}
Adding remote host rac4:6200
CONNECT: Connection refused
上面onsctl的命令主要是用来关注ons这个进程的状态的。
RAC的参数文件
各个实例可以使用自己本地独立的参数文件,也可以使用一个共同的参数文件,当使用同一个参数
文件时,应将参数文件放在所有实例都可以访问的共享存储上。
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DISKGROUP1/conf/spfileracdb.ora
[[email protected] dbs]$ pwd
/opt/ora10g/product/10.2.0/db_1/dbs
[[email protected] dbs]$ more initracdb1.ora
SPFILE='+DATE/racdb/spfileracdb.ora'
所有实例共用一个参数文件的好处就是便于管理,不会出现预想不到的错误。
怎么让oracle知道参数文件在共享存储上面呢?这个需要在本地的文件里面写一条路径,因为oracle启动实例的时候默认到本地路径下面去读和实例名相同的ora文件,里面写了spfil的值oracle就会去找值里面对应的参数文件。
[[email protected] ~]$ cd $ORACLE_HOME/dbs
[[email protected] dbs]$ ls
hc_oradb1.dat init.ora initoradb1.ora orapworadb1
[[email protected] dbs]$ cat initoradb1.ora
SPFILE='+READATA/oradb/spfileoradb.ora'
如果要把参数文件放在ASM上面,需要在本地默认的参数文件里面制定一个路径,oracle通过这个路径找到共享存储上面的spfile。
RAC的UNDO,REDO,TEMP
每个实例有各自的undo表空间
每个实例有独立的redo日志文件
所有实例共享TEMP临时表空间
(1)每个实例需要自己的undo,这样避免了每个实例对undo的征用。这样将每个事务放在自己的undo表空间上面。
(2)当其中一个实例坏了,它的redo数据可以被其他节点访问,可以通过坏了的实例上面的undo数据可以将未提交的事务进行回滚。
(3)临时表空间是用来排序的,因为在排序上面不存在对空间的征用,就是所有实例在一个表空间上面操作和分别在各自的临时表空间上面操作是一样的。
我的环境里面有两个节点
SQL> select instance_name from gv$instance order by 1;
INSTANCE_NAME
----------------
oradb1
oradb2
每一个thread就表示一个实例,可以看到每一个实例有自己的2个redo日志组。
SQL> select thread#,group#,sequence# from v$log order by 1,2;
THREAD# GROUP# SEQUENCE#
---------- ---------- ----------
1 1 21
1 2 20
2 3 25
2 4 26
可以看到两个实例分别各自有自己的undo表空间
SQL> col name for a20;
SQL> col value for a20;
SQL> select inst_id,name,value from gv$parameter where name='undo_tablespace' order by 1;
INST_ID NAME VALUE
---------- -------------------- --------------------
1 undo_tablespaceUNDOTBS1
2 undo_tablespaceUNDOTBS2
所有实例共用一个tmp表空间
SQL> select tablespace_name from dba_temp_files;
TABLESPACE_NAME
------------------------------
TEMP
重做日志包含对数据文件进行的更改记录。在单实例Oracle数据库中,重做日志存储在两个或更多重做日志文件组中。这些组中的每个组都包含一个重做日志文件,并且可能包含该文件的一个或多个镜像副本。在Oracle RAC数据库中,每个实例都需要自己的一组重做日志组,这被称为重做线程。镜像副本的重做日志文件为您的系统提供额外的保护,防止由于硬件故障或数据损坏而导致的数据丢失。如果重做日志文件不可读,则Oracle数据库将尝试访问其镜像副本。重做日志文件镜像应位于主重做日志文件的不同磁盘设备上。
关于访问Oracle RAC数据库的重做日志文件:在Oracle RAC数据库中,每个实例都按照单实例Oracle数据库所做的相同方式将重做日志组写入并归档到其重做线程中。但是,在恢复模式下,执行恢复的实例可以读取和处理数据库的所有重做线程,而不管哪个实例生成重做线程。能够读取所有重做线程使正在运行的实例能够恢复由一个或多个失败实例完成的工作。
如果发生实例故障,幸存的实例可以读取失败实例的重做日志。用户可以继续访问和更新数据库,而无需等待重新启动失败的实例。例如,假设您拥有包含两个实例(实例A和实例B)的Oracle RAC数据库。如果实例A已关闭,则实例B可以读取实例A和B的重做日志文件以确保成功恢复。
RAC的备份和恢复
数据文件的备份
归档的备份
SQL> show parameter log_archive_dest_1;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1 string LOCATION=+diskgroup1/db/archivelog
每个实例有自己的redo,即每个实例要产生自己的归档,这样就要在每一个节点上面备份归档,还有一种就是将所有节点参生的归档集中的放在ASM上面,通过配置log_archive_dest_1这个参数让日志放在ASM上面。备份等待时候直接备份这地方就可以了,就不需要去每个实例上面备份上面归档日志了。
丢了一个归档就无法恢复数据了,因为redo是连续的,中间断了一点点就不行。在RAC环境下还是要将归档集中管理,将其放在ASM上面。首先是安全,因为ASM一般会做外部冗余,其次归档统一管理。
alter system set log_archive_dest_1='location=+diskgroup1/db/archivelog';
将这个参数只需要在其中一个节点设置,因为设置会在spfile里面生效。