Oracle 12C 双机冷备的常见问题解答

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvshaorong/article/details/79958202

1、什么是Oracle数据库的双机冷备?

双机冷备,不同于Oracle RAC,是指多台物理机或虚拟机,可以挂载相同某个存储,并在每台数据库服务器上都安装好同样的数据库软件和Oracle实例,在主服务器宕机之后,切换到备用服务器继续提供服务的功能。


2、双机冷备有什么特点?

双机冷备不能像Oracle RAC那样同步工作,效率叠加。而是一台在工作,备用服务器在关机状态或空转状态。但是这并不代表双机冷备就没有优点。

首先,在很多情景下,不能使用Oracle RAC,比如异地的灾备机房,灾备机房在正常情况下是不提供服务的,存储设备通过光纤线缆与主机房进行同步,所以存储是同步的,而数据库服务本身需要在主机房和灾备机房都搭建一套环境。一台物理主机可以给多个业务数据库作为备用服务器,实际开销也并不很大。当主机房的服务器被摧毁之后,异地机房挂载上同步后的存储马上又可以继续提供服务。

第二,Oracle RAC并不适合所有的业务类型,有些业务并不需要太强悍的性能和超高的可用性,可以容忍服务中断三十分钟到一小时左右,使得运维人员有充足的时间进行手动、人工的切换服务。比如一些办公系统,管理系统等等。而冷备这种基于单机的运维模式操作简单,对运维人员的要求也较低。只要mount上存储,然后startup就可以了,管理起来非常方便。而Oracle Rac经常会因为网络问题导致服务器自身重启,而且往往一重启就两台一起重启,除了要排查网络故障外,还需要排查RS232串行口,光纤等故障,往往把运维人员搞得焦头烂额。所以对于这些情况来说,双机冷备的方式反而更易于维护,宕机切换速度更快。


3、双机冷备有什么要件?

第一,要有两台配置相似,最好完全一样的服务器硬件,这个在虚拟化平台上非常容易实现。在物理服务器中,成本也不会特别高,因为可以好多服务的数据库共用一台备机。

第二,要有可共享的存储介质。在普通的虚拟机和PC机上,要为数据库文件和备份文件单独一块硬盘,这样在一台服务器宕机之后,可以拔下这块硬盘,插到另一台服务器上,然后启动数据库继续运行。如果是两台使用SAN存储的服务器,那么就需要通过对光纤交换机的ZONE的划分,让两台服务器都可以发现并挂载同一块存储。如果是使用基于TCP/IP的iSCSI设备,同SAN一样,要让两个服务器可以挂载同一个存储服务器上的块设备。如果是异地灾备机房,可以通过对存储网关的特殊设置,让本地机房的存储和异地的存储实时同步。从应用层面上来看,SAN这种方式挂载的速度要比硬盘来回拔插速度快多了。

第三,一个可转移的IP,可以理解成LVS集群中那样的虚拟IP,客户端通过虚拟IP连接数据库,而使用这个虚拟IP的数据库即为激活的数据库,另一台就stand by。


4、如何让多台服务器都能挂载同一VG?

在SAN和iSCSI这种网络存储方案中,只要让主备服务器都可以通过fdisk发现到共享的存储设备,一般就问题不大了。而能否发现取决于你的存储链路的规划,和光纤交换机有关。

当一个块设备在多台服务器都能发现的情况下,你使用其中一台创建PV,VG,LV在其他机器上都可以通过pvscan,vgscan,lvscan等发现。并且都可以mount。但是如果使用ext2,3,4这种非集群文件格式进行格式化,那么一方的修改其他人是看不见的,反而还会产生冲突。所以同一时间我们要人工的控制只有一台服务器mount这个块设备。

在主服务器上划分了VG和LV之后,可以在当前服务器上自由的mount,但是其他服务器需要先激活此VG,然后再mount相应的LV。未激活由其他主机建立VG里的LV之前,使用lvscan命令得到结果就是相关lv是inactive状态,如下

[root@localhost ~]# lvscan  
  inactive          '/dev/rhel/swap' [16.00 GiB] inherit  
  inactive          '/dev/rhel/tmp' [10.00 GiB] inherit  
  inactive          '/dev/rhel/home' [10.00 GiB] inherit  
  inactive          '/dev/rhel/root' [50.00 GiB] inherit  
  inactive          '/dev/rhel/rpms' [74.50 GiB] inherit  
  ACTIVE            '/dev/rootvg/LogVol01' [151.80 GiB] inherit  
  ACTIVE            '/dev/rootvg/LogVol00' [8.00 GiB] inherit  
[root@localhost ~]#  

使用

vgchange -ay lv路径的前半部分

再次查看,就会发现VG里面的lv都变成了ACTIVE状态,此时就可以挂载了,注意多台可以连接同一存储的主机可以都设置为ACTIVE状态,但是不要同时mount。

[root@localhost ~]# lvscan  
  ACTIVE            '/dev/rhel/swap' [16.00 GiB] inherit  
  ACTIVE            '/dev/rhel/tmp' [10.00 GiB] inherit  
  ACTIVE            '/dev/rhel/home' [10.00 GiB] inherit  
  ACTIVE            '/dev/rhel/root' [50.00 GiB] inherit  
  ACTIVE            '/dev/rhel/rpms' [74.50 GiB] inherit  
  ACTIVE            '/dev/rootvg/LogVol01' [151.80 GiB] inherit  
  ACTIVE            '/dev/rootvg/LogVol00' [8.00 GiB] inherit  
[root@localhost ~]#

注意,在inactive的时候,/dev/rhel/swap这个文件是不存在的,也不需要存在,使用vgchange的时候,只需要填前面部分也就是/dev/rhel/就可以激活了。


5, 哪些文件需要放到共享存储上

一般我们在安装Oracle 12c/11g的时候,都是先安装oracle软件,再部署oralce实例。在建立双机冷备也是,先在所有的机器上都安装oracle数据库,注意安装目录,参数等等都要一模一样,要安装到机器自己的硬盘上,这样才能起到备份的作用。然后只在主机上安装oralce实例,此时就要规定哪些文件要放到共享存储上。

理论上来说,在建立实例的时候,最好所有和实例有关的都放到共享存储上,总结一下,大约有一下几点

主要就是:系统表空间,用户自定义表空间,.ctl控制文件,快速恢复区

这些在安装的时候后都可以指定路径,默认为/home/数据库用户名,所以在安装的时候要仔细看好,不然安装到了/home下就不方便迁移了。主要有一下几幅图

下面是数据库文件的位置,非常重要,不要使用默认。


下面是快速恢复区的位置,用于放置RMAN产生的数据库全备增备的目录。


下面是归档日志的位置


下面是系统表空间的位置,注意以后使用create tablespace命令创建用户表空间的时候也要注意放到共享存储上,不然就无法流畅的迁移了。



6,如何将主服务器建立好的实例同步到备用服务器上

我们在主服务器上建立了一个数据库实例,还需要到每个备用服务器上再建立一遍么?其实不需要,只需要将生成好的spfile放置到备用服务器指定的位置上,再改改监听器就可以了。

在建立好数据库实例后,oracle会生成一个spfile来记录这个数据库实例的相关配置参数,其中就包含上面我们数据库表空间,控制文件,快速恢复区位置的字段,这个spfile一般放在$ORACLE_HOME/dbs/下面,如下图,在建立好数据库实例后会告诉你


一般来说,我们把dbs目录下面所有的文件(除了init.ora)全部拷贝到备用服务器相同的目录下就可以了。

然后我们还需要在备用服务器上设置Sid的环境变量,编辑~/.bashprofile,设置

export ORACLE_SID=xxxx

具体的值和主服务器上一样就可以。

然后就可以使用 sqlplus / as sysdba一样连接备份服务器上的数据库了。

假设我们此时把存储挂载到备份服务器上,执行startup,发现还是启动不了,报错

[oracle@newoadb2 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Fri Apr 13 16:41:31 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup
ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925

是因为除了表空间,控制文件,快速恢复区需要共享之外,还有一个数据库审计日志需要相应的路径,但是数据库审计并不需要各个服务器都同步,用的人也不多,所以可以直接建立在各个服务器自身的存储上。

在建立实例的时候,虽然没有地方设置,但是还是会贴出相关审计日志的存储路径,我们只需要保证每台数据库服务器上都有这个目录即可,里面文件不需要同步就可以让数据库正常运行。


所以,我们只需要保证{ORACLE_BASE}/admin/{数据库名}/adump这个目录存在即可


7,如何让备用服务器的监听器连接上备用服务器上的数据库实例

建立相关目录之后,我们发现数据库可以正常启动了,但是在使用JAVA客户端连接的时候还是会报错,连接主服务器就没事,是因为在备用服务器上我们没有配置监听器的原因,而主服务器在建立实例的时候已经帮你设置了监听器,所以主服务器没事



报错如下:

An error occurred while establishing the connection:

Long Message:
Listener refused the connection with the following error:
ORA-12514, TNS:listener does not currently know of service requested in connect descriptor

Details:
   Type: java.sql.SQLRecoverableException
   Error Code: 12514
   SQL State: 08006

需要在监听器上添加这个SID的监听项,方法是修改$ORACLE_HOME/network/admin/listener.ora这个文件

修改成


# listener.ora Network Configuration File: /u01/product/12.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = 数据库SID)
      (ORACLE_HOME = /u01/oracle)
      (GLOBAL_DBNAME = 数据库名称)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )

然后使用lsnrctl restart重启监听器,就可以使用客户端正常连接数据库了。


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页