Oracle RAC 工作原理:

微信图片_20190802091514.png

单节点数据库,如果实例宕机了,如果一个业务链接在实例上面,那么这个业务就中断了。这个时候系统就不具有可用性了,那么这个时候单节点的可用性是很差的。

对于RAC来说,和单实例一样,还是一份数据文件,都是相同的存储上面放着oracle的文件,但是是由三个实例共用同一份数据文件。这样的好处是在三个实例之间做了冗余,在上面三个实例当中任意两个坏了业务都可以链接到剩下的一个实例,都可以正常的工作。RAC提供了在实例级别的冗余。

RAC不能够解决在数据的安全,尽管有多个实例,但是只有一份数据文件,这样只要数据文件损坏了,那么整个数据库就损坏了。



什么是 RAC ?


20180516200338534.png


一般每个实例都放在不同的服务器上面,这样可以起到冗余作用。所有的数据库文件都放在共享存储上面,但是还有一些文件放在每个实例自己的本地的磁盘上面,比如参数文件,每一个实例都可以有自己的参数文件,这个参数文件既可以放在本地也可以放在共享存储上面,多个实例都使用同一个参数文件。

 
在RAC里面,最重要的就是实例和实例之间的交互,即使是分离的实例,但是读取的数据是相同的,RAC不是分布式的系统,因为它只有一个存储,分布式系统是指数据发布在不同的数据库上面,然后通过中间件来协调做查询。RAC还是一台数据库,多个实例。


RAC架构:

微信图片_20190802092417.png



对于RAC来说至少有两套物理上不同的网络,私有网络是专门用来实例之间的数据交互。如果私有网络,所有的数据都在一个网络下面,那么那么就会对数据造成影响,严重的影响RAC的性能了。实例之间数据之间传递使用私有网络和对外服务提供的网络之间是物理分开的。所以RAC至少有两套网络,一个是实例之间的数据的传递,另外一个是公有网络,是对外提供服务的,外面的业务是提供公有网络的IP链接到数据库的。


RAC特点:


微信图片_20190802093347.png

RAC如何容错的?


20180516200435248.png


使用SAN存储,存储和服务器就不在一起了,而是和服务器分离了,是一个网络的存储系统,服务器是服务器,存储是存储,完全分离的。

当节点1坏了,不仅仅只是将业务切换到节点2,这个时候还要处理节点1坏了遗留下来的问题。主要是一些提交和未提交的事务。比如实例1坏了,实例2就要从实例1的redo里面读最后一次checkpoint之后的信息,就是实例1最后将所有的数据写到磁盘之后产生的所有的redo应用,该回滚的回滚,该恢复的恢复。即现将以提交和未提交的事务产生的redo都先应用,因为是最后一次checkpoint之后的信息,之前的信息是已经写到磁盘上面了,所谓的恢复是将未写到磁盘上面的信息进行恢复。(虽然实例坏了,但是实例的redo并没有坏,放置在共享存储上面,它的redo还是允许其他实例访问的)实例2读取实例1的redo,然后全部应用一遍,之后再回滚未提交的事务修改的数据块,这个有点像实例的恢复。


实战部分:

 

建设背景:

建设本文档的目的在于详细梳理12c RAC图形化安装的流程,结合官方文档尽可能解释安装过程中的各种操作的原理,提供不同的存储配置方法和参数修改方法,最后形成一套完整的12c RAC图形化安装步骤以便于今后参考。


安装流程:

一、软件下载

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/oracle12c-linux-12201-3608234.html

下载 linuxx64_12201_database.zip 和 linuxx64_12201_grid_home.zip 就可以了,然后上传至节点1的任意目录。


图片.png

二、硬件和网络环境

  • 检查内存(至少8GB)、Swap和硬盘大小等等,参考GRID官网安装文档的:Server Hardware Checklist for Oracle Database Installation。

需要说明的是12c RAC安装,OCR盘至少需要40GB大小,因为12c新增了MGMTDB实例进行集群管理,如果你不单独的为他创建一个磁盘组,这些信息就会进入OCR盘,导致OCR盘需要40GB的空间才够,其中OCR和votefiles大约需要2GB,MGMT占用38GB,如果RAC节点数大于2那么还需要再增加一些MGMT的空间,例如5节点大约需要再加5GB,当然这里的值都是在外部冗余的条件下计算的。

  • 检查操作系统版本,参考GRID官网安装文档的:Operating System Checklist for Oracle Database Installation on Linux。

本文的系统环境为Oracle Enterprise Linux 6.9。

  • tmpfs务必保证至少是最大内存的一半。

如果需要更大的SGA,那么至少要将将tmpfs设置为大于SGA的值,因为OEL系统下Oracle占用的共享内存不能大于tmpfs。

  • 检查网络环境。

7个IP是需要申请的,其中2个作为Public IP,2个作为VIP,1个Scan-IP,这5个IP应当是同一网段的,最后还需要2个不同网段的Private IP,虽然私网IP可以自定义,但是在不清楚私网是通过公网直连还是通过单独的交换机时(其实oracle要求private ip的interconnect使用单独的交换机且带宽需要至少是GB级别),最好申请独立的私网IP。网卡每个节点需要2个至少,Public IP占用一个,Private占用一个。


*安装环境小编使用的是共享存储一块 2TB的 用oracleasm 格式化后 分别在两台实例上扫描 实例1格式化后 实例二扫描即可;



三、安装软件包

1、oracleasm

用来配置asm的磁盘,如果将oracle数据文件放置在普通磁盘上,则略过;


wget http://public-yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracleasm-support-2.1.11-2.el7.x86_64.rpm


wget http://download.oracle.com/otn_software/asmlib/oracleasmlib-2.0.12-1.el7.x86_64.rpm


yum install -y kmod-oracleasm


rpm -ivh oracleasmlib-2.0.12-1.el7.x86_64.rpm oracleasm-support-2.1.11-2.el7.x86_64.rpm



配置ASM属性:

oracleasm configure -i


Default user to own the driver interface [ ]: grid


Default group to own the driver interface [ ]: oinstall


Start Oracle ASM library driver on boot (y/n) [n]: y


Scan for Oracle ASM disks on boot (y/n) [y]: y


Writing Oracle ASM library driver configuration: done


创建分区 ;

注:在做以下步骤前可先重启服务器,使前面的设置生效 ;这里重启之后我们 oracleasm createdisk myasm01 /dev/sdb1 创建可能会出问题 可以 oracleasm init 解决;记住不重启的话oracleasm有时候会不生效;
 

reboot  #重启  
   

fdisk -l  #查看磁盘

   

#分区/dev/sdb1,/dev/sdc1, /dev/sdd1
  

fdisk /dev/sdb
  

oracleasm createdisk myasm01 /dev/sdb1  
  

oracleasm createdisk myasm02 /dev/sdc1
  

oracleasm createdisk myasm03 /dev/sdd1
  

oracleasm scandisks
  

oracleasm listdisks


图片.png


#小编这里只用了1块磁盘所以要记住oracleasm盘的路径后面会用到;


部署正式开始:


图片.png


  • 基础包安装

oracle-database-server-12cR2-preinstall也不会帮你装好这些包,因此这一步是必须要手工做的。


yum -y install binutils.x86_64 compat-libcap1.x86_64 compat-libstdc* e2fsprogs.x86_64 libaio* libXau* libXi* libXtst* libstdc* glibc* libgcc* ksh gcc-c++*


--以上命令是我自己简化后的安装语句,一般来说执行完以上安装就足够了,不够也没事,装grid时如果有缺失的根据报错Detail再装就好了。

--不同Linux版本所需的包完整列表参考GI安装官方文档的4.7小节--Operating System Requirements for x86-64 LinuxPlatforms。


图片.png


vi /etc/sysctl.conf

fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 10485760
kernel.shmmax = 42949672960
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576


  • 时间同步设置

参考网上配置ntp相关的文档即可,手工设置时间也可以。在安装过程中两台实例时间一样即可,后面安装中可以忽略

  • 禁用防火墙和selinux

由于内网的数据交互会使用大量UDP端口,因此官网要求为RAC关闭防火墙,所以:


图片.png


其他的预安装要求个人认为不再需要了,如果有更高的性能需求可以查看官方文档来进行更详细的设置,但本着简单安装、简单管理的原则,就这样啦!CentOS7 版本 可用 systemctl stop firewalld; Selinux : vim /sysconfig/selinux ;


图片.png


四、用户、组、以及目录


图片.png

groupadd -g 501 oinstall

groupadd -g 502 dba
groupadd -g 503 asmadmin
groupadd -g 504 asmdba
groupadd -g 505 asmoper
groupadd -g 506 oper
useradd -u 501 -g oinstall -G asmadmin,asmdba,asmoper,dba grid
useradd -u 502 -g oinstall -G dba,asmdba,oper oracle


mkdir -p /u01/app/oracle/product/12.2.0/db_1
mkdir -p /u01/app/grid
mkdir -p /u01/12.2.0/grid
mkdir -p /u01/app/oraInventory
chown -R oracle.oinstall /u01/app/oracle/
chown -R oracle.oinstall /u01/app/oracle/*
chown -R grid.oinstall /u01/app/grid/
chown -R grid.oinstall /u01/app/oraInventory/
chown -R grid.oinstall /u01/12.2.0/grid/


给予权限后给grid&oracle用户设置密码:passwd grid  passwd oracle ;密码自定义;


--修改用户安全限制:

--如果你不使用oracle-database-server-12cR2-preinstall,那么将以下内容复制到/etc/security/limits.conf文件中即可;

--如果你使用了oracle-database-server-12cR2-preinstall,那么将以下内容复制到/etc/security/limits.d/oracle-database-server-12cR2-preinstall.conf中即可(将之前的内容清空);


vim /etc/security/limits.conf 填写即可;


图片.png


oracle soft nofile 2048
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
oracle hard memlock 134217728

oracle soft memlock 134217728


grid soft nofile 2048
grid hard nofile 65536
grid soft nproc 16384
grid hard nproc 16384
grid soft stack 10240
grid hard stack 32768
grid hard memlock 134217728
grid soft memlock 134217728


session  required  pam_limits.so


图片.png


su - grid

vi .bash_profile
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/12.2.0/grid
export ORACLE_SID=+ASM1/+ASM2
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH



su - oracle

vi .bash_profile

export ORACLE_BASE=/u01/app/oracle

export ORACLE_HOME=$ORACLE_BASE/product/12.2.0/db_1

export ORACLE_SID=orcl1/orcl2<br>export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH


图片.png


可以把自己的两个压缩包放到刚才创建的目录中 linuxx64_12201_database.zip  /home/oracle ; linuxx64_12201_grid_home.zip  /u01/12.2.0/grid;之后给予相关权限;


# chown oracle.oinstall linuxx64_12201_database.zip

# chown oracle.oinstall linuxx64_12201_grid_home.zip #上面图片中没这个但是都提前给了吧一会解压的时候还得给,记住进入相关目录中直接给就行;

# su - oracle
$ unzip linuxx64_12201_database.zip
$ cd database/sshsetup/
$ ./sshUserSetup.sh -user oracle -hosts "node1 node2" -advanced -noPromptPassphrase  #自己的主机名,小编的是 rac-1&rac-2;

$ ./sshUserSetup.sh -user grid -hosts "node1 node2" -advanced -noPromptPassphrase


--最后在节点1使用oracle和grid用户都执行以下两条命令验证互信:


$ ssh node2 date     #小编这里的主机名字是 rac-1 所以 ssh rac-1 date即可;

$ ssh node2-priv date   


六、GRID安装

这里有个小坑,12c的GRID安装不再会按你设置的grid用户的$ORACLE_HOME变量来作为GI的家目录,而是直接将你GRID软件的解压目录作为家目录。

当然这个小坑还可能引发另一个大坑,多次尝试安装grid时你会发现绑定好的磁盘即便dd格式化掉在安装grid时也找不到了...此时只要删了解压的grid目录重新解压安装就好了...(MMP的12c,还有扯淡的屎一样PDB,谁让你从11g升12c直接上腿就完事了)

你需要将linuxx64_12201_grid_home.zip拷贝至grid用户的$ORACLE_HOME,本文中就是/u01/12.2.0/grid,然后:


图片.png


# chown grid.oinstall linuxx64_12201_grid_home.zip
# su - grid
$ unzip linuxx64_12201_grid_home.zip


# cp /home/oracle/database/rpm/cvuqdisk-1.0.10-1.rpm /root
# rpm -ivh cvuqdisk-1.0.10-1.rpm


# cd /u01/12.2.0/grid/

# ./gridSetup.sh      # 执行过程中会出现问题;


故障如下:


[grid@lsl crs]$ ./gridSetup.sh 

ERROR: Unable to verify the graphical display setup. This application requires X display. Make sure that xdpyinfo exist under PATH variable.

Can't connect to X11 window server using '10.138.135.167:1.0' as the value of the DISPLAY variable.


解决方法:


[root@lsl Desktop]# xdpyinfo            #切换的root目录下执行;
name of display:    :1
version number:    11.0
vendor string:    The X.Org Foundation
vendor release number:    11500000

...省略...只需要记录name of display:的值
[root@lsl ]$ export DISPLAY=:1(这时设置为name of display的值:1)   #这里看xdpyinfo 的值,小编的是 export DISPLAY=:0 ;
[root@lsl ]# xhost +
access control disabled, clients can connect from any host

[root@jytest3 Desktop]# su - grid
Last login: Tue Mar  7 17:50:40 CST 2017 on pts/0 ;

su - grid 

cd /u01/12.2.0/grid 

./gridSetup.sh

图片.png  

图片.png


注意:scan的 name需要和/etc/hosts里面的scan的名称一致否则会出现错误;


图片.png

图片.png


注意:这里的主机名字和虚拟主机名字也需要和/etc/hosts 的名称一样;


图片.png


图片.png


注意:在执行远程的时候从服务(实例2&rac-2)安装目录不要有文件,如有会提示远程失败,需要把文件里面的文件清除掉;


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


注意:这里小编建议直接√上节省后面自己执行脚本了;


图片.png


注意:这里执行成功了会显示所有节点(rac-1 rac-2)自己的主机名称;如果没有需要检查下共享存储;


图片.png


图片.png


注意:如果按照小编的方法√自己执行的话不会出现下方文件,注意执行脚本先在实例一(rac-1)上执行 /oracle/app/oraInventory/orainstROOt.sh ;

之后再到实例二(rac-2)上执行 /oracle/app/oraInventory/orainstROOt.sh; 之后再实例一(rac-1)执行/data/grid/root.sh 实例二(rac-2)执行;


图片.png


注意!这里实例一(rac-1)执行脚本一般不会出现问题,实例二(rac-2)会出现问题;问题总结如下;


TIM图片20190802113905.jpg


这个问题基本上是oracleasm权限的问题需要给相应的权限需要对比下如果不同可以修改;


修改方法如下;chown grid.asmadmin MYASM01  chmod 642 MYASM01 ;


图片.png


图片.png


图片.png


注意:执行过程到90%会提示错误可以直接忽略即可;


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


图片.png


 echo "oracle soft memlock 3145728" >>/etc/security/limits.conf

 echo "oracle hard memlock 3145728" >>/etc/security/limits.conf


图片.png


图片.png


图片.png


至此小编安装结束后面喜欢继续往下安装的伙伴可以到我百度云盘下载pdf;


https://pan.baidu.com/s/1AiDlKVz77-mhpkHpf9F2OA    提取码 9s5z;