Oracle 12c RAC 安装文档

时间:2020-11-28 08:56:09

参考文档:

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/cwlin/index.html

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ladbi/index.html

https://oracle-base.com/articles/linux/udev-scsi-rules-configuration-in-oracle-linux

https://oracle-base.com/articles/12c/oracle-db-12cr2-rac-installation-on-oracle-linux-7-using-virtualbox

建设背景:

建设本文档的目的在于详细梳理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的任意目录。

Oracle 12c RAC 安装文档

二、硬件和网络环境

  • 检查内存(至少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占用一个。

  • 以下为一个示例/etc/hosts文件:
vi /etc/hosts
#需要注意的是12c对主机名的要求比以前更加严格,不再允许出现下划线'_',只能使用连接线'-'。
#Public IP
192.168.10.101 node1
192.168.10.102 node2
#Private IP
1.1.1.1 node1-priv
1.1.1.2 node2-priv
#VIP
192.168.10.103 node1-vip
192.168.10.104 node2-vip
#Scan-IP
192.168.10.105 scanip
三、系统环境设置

Oracle强烈推荐使用一个名为oracle-database-server-12cR2-preinstall的RPM包来做预原装的检测工作。

此RPM包安装完毕后会出现一个/usr/bin/oracle-database-server-12cR2-preinstall-verify的系统命令,此命令主要就是做一些RAC安装前的准备工作,如禁用透明大页,修改内核参数和修改用户limits等等,需要提示的是此脚本只修改Oracle用户的limits,对于grid用户你需要把Oracle的limits内容复制一遍就可以了,相关的文件位置为:

/etc/security/limits.d/oracle-database-server-12cR2-preinstall.conf
--需要说明的是:limits.d目录中的用户限制文件是在/etc/security/limits.conf文件生效之后生效的,因此会覆盖limits.conf文件中的重复部分。
--稳妥起见直接在/etc/security/limits.d/oracle-database-server-12cR2-preinstall.conf文件中定义好oracle和grid用户的ulimit限制。

Oracle提供了多种 oracle-database-server-12cR2-preinstall RPM包的下载方式,这里只选择我认为较简单的一种获取方式:

wget http://yum.oracle.com/public-yum-ol6.repo -O /etc/yum.repos.d/public-yum-ol6.repo
--执行以上下载命令前最好检查下你是否本来就有public-yum-ol6.repo,如果有先做个备份防止被覆盖。
yum -y install oracle-database-server-12cR2-preinstall
--如果无法联网,那么可以使用yum的--downloadonly选项在其他机器上下载此rpm包后上传到安装节点,然后使用rpm安装。
--无法联网时使用rpm安装oracle-database-server-12cR2-preinstall还需要先安装ksh依赖包。
--此外注意,如果没有yum makecache那么以上安装可能非常慢,因为这个repo库特别庞大,国内网络连Oracle的yum源的速度大家也懂得。

安装完毕后会出现一个oracle-database-server-12cR2-preinstall-verify的系统命令,执行此命令应该就可以进行预设置了,然而实测还发现这个命令在OEL6.5版本上不能用,因为需要/etc/sysctl.d文件夹,这个文件夹OEL6.9是有的6.5并没有,因此要么是需要低版本的oracle-database-server-12cR2-preinstall,要么是不支持OEL6.5,无论是哪种原因这里都懒得深究了。

那么假如不用oracle-database-server-12cR2-preinstall,我们自己大致需要做哪些预操作呢,主要有以下几部分:

  • 禁用透明大页

如果有大页需求,Oracle建议使用标准的大页提升性能,严禁使用透明大页。透明大页与标准大页的区别在于可以在系统运行时分配内存,而标准大页只能重启生效。

如果你要使用大页来提升性能,请务必搜索安装文档的所有HugePage关键词,根据文档作出修改,消除大页带来的隐患。

具体禁用透明大页的步骤,我就不复制粘贴了,有兴趣的参考12c GI安装文档的4.13部分--Disabling Transparent HugePages,百度也可以查到关闭方式,一般系统都是默认关闭的。
  • 基础包安装

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。
  • 内核参数修改(64GB内存 40GB tmpfs时的设置)

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关闭防火墙,所以:

service iptables stop
service ip6tables stop
chkconfig iptables off
chkconfig ip6tables off
--selinux的关闭自己上网搜。

其他的预安装要求个人认为不再需要了,如果有更高的性能需求可以查看官方文档来进行更详细的设置,但本着简单安装、简单管理的原则,就这样啦。

四、用户、组、以及目录

--两节点添加用户和组
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/
--修改用户安全限制:
--如果你不使用oracle-database-server-12cR2-preinstall,那么将以下内容复制到/etc/security/limits.conf文件中即可
--如果你使用了oracle-database-server-12cR2-preinstall,那么将以下内容复制到/etc/security/limits.d/oracle-database-server-12cR2-preinstall.conf中即可(将之前的内容清空)
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
--无论以上哪种用户安全限制方式,都是需要PAM模块来调用的,因此继续检查/etc/pam.d/login文件内容:
session required pam_limits.so
如果未发现以上行,那么加上。
--两节点设置用户环境变量,向.bash_profile添加如下项:
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
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
--在节点一配置ssh互信,步骤如下:
--使用root将数据库软件拷贝至/home/oracle/下:
# chown oracle.oinstall linuxx64_12201_database.zip
# su - oracle
$ unzip linuxx64_12201_database.zip
$ cd database/sshsetup/
$ ./sshUserSetup.sh -user oracle -hosts "node1 node2" -advanced -noPromptPassphrase
$ ./sshUserSetup.sh -user grid -hosts "node1 node2" -advanced -noPromptPassphrase
--最后在节点1使用oracle和grid用户都执行以下两条命令验证互信:
$ ssh node2 date
$ ssh node2-priv date
--如果不需要输入密码则说明互信配置成功。

五、存储环境设置

存储的配置总结下只有2步:持久化配置 和 权限配置 。一般来说这两步是可以合在一起的,只是使用多路径软件时需要分开来讲(多路径软件多了一个多路径聚合的步骤)。

所谓持久化就是将磁盘通过UUID或者其他唯一标识符绑定为一个human friendly的磁盘名(可以是磁盘的软链接等),而权限配置就是为了可以使oracle可以正确使用这些磁盘,给他们赋予正确的用户和组以及权限(MODE)。

在Linux环境下能够实现设备持久化的系统服务就是udev,除此之外几乎别无他法(就算有也千万别用)。可以通过man udev来查看udev rules的配置规则。

我们分两种情况来描述存储配置的步骤。

  • 情况一:使用多路径软件时:

一般来说生产上的存储使用系统自带的多路径软件multipath即可完成多路径持久化配置(lvm device mapper),这里贴一个示例配置文件的一部分:

# multipath.conf written by anaconda
......
multipaths {
multipath {
wwid "360080e50003279f000001a785a275fe8"
alias REDO_01
}
multipath {
wwid "360080e50003279f000001a775a275fba"
alias RAC_OCR
}
multipath {
wwid "360080e50003279f000001a795a27604e"
alias RAC_ARCHIVE
}
multipath {
wwid "360080e50003217cc00001c6d5a280dd8"
alias REDO_02
}
multipath {
wwid "360080e50003217cc00001c6e5a280e2b"
alias RAC_DATA
}
}
--不建议在这里加uid gid mode来设置属主和权限,因为不能设置附属group。

根据uuid进行了alias的绑定,之后重启multipathd即可,使用multipath -ll可以看到聚合后的盘。

然后使用multipath自带的udev规则文件12-dm-permissions.rules来完成聚合盘(/dev/dm-*)的udev配置,这样安装时直接查找/dev/mapper/*路径即可找到以alias名字显示的盘。

--设置步骤:
cp /usr/share/doc/device-mapper-1.02.117/12-dm-permissions.rules /etc/udev/rules.d/
vi /etc/udev/rules.d/12-dm-permissions.rules
--添加或注释如下一行:
ENV{DM_UUID}=="mpath-?*", OWNER:="grid", GROUP:="asmadmin", MODE:="660"
--说白了就是设置下聚合盘的权限
start_udev
这里还有一些替代的方法,例如使用60-raw.rules来代替12-dm-permissions.rules的权限设置功能,例子如下:
# vi /etc/udev/rules.d/60-raw.rules
ACTION=="add", KERNEL=="dm-0", RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="dm-1", RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="dm-2", RUN+="/bin/raw /dev/raw/raw3 %N"
ACTION=="add", KERNEL=="dm-3", RUN+="/bin/raw /dev/raw/raw4 %N"
ACTION=="add", KERNEL=="dm-4", RUN+="/bin/raw /dev/raw/raw5 %N"
KERNEL=="raw*", OWNER="grid" GROUP="asmadmin", MODE="0660"
--其原理是:/dev/mapper/下的盘符其实是指向/dev/dm-*的,将这些聚合盘映射为裸设备,也可以同时改变权限,缺点在于没有alias容易混淆。
# start_udev

至此情况一的权限配置已经完成了。

  • 情况二:如果你未使用multipath(常见于使用虚拟机的测试环境)

那么直接使用99-oracle-asmdevices.rules(udev规则,名字随便定,第一个数字表示解析顺序)或者通过60-raw.rules绑定raw盘来完成持久化配置和权限配置,并绑定易于人眼识别的name。

这种直接使用udev规则的方式与上述多路径绑定的区别只是在于无需通过多路径lvm进行映射,使用udev直接完成了绑定工作+权限配置工作。

参考:https://oracle-base.com/articles/linux/udev-scsi-rules-configuration-in-oracle-linux

以及参考:官网文档附加的A部分中的Configuring Device Persistence Manually for Oracle ASM小节

基本步骤就是:

首先获取sd盘的uuid或ID_SERIAL(或其他可以唯一标识磁盘且在udev中定义了的标识符),然后将uuid/ID_SERIAL绑定至99-oracle-asmdevices.rules即可。

例如:
# /usr/lib/udev/scsi_id -g -u -d /dev/sdb --获取到某个盘的scsi-id。
# udevadm info --query=all --name=/dev/sdb | grep ID_SERIAL --获取到某个盘的ID_SERIAL

本文绑定UUID和ID_SERIAL的示例都来一个,以便新手可以清楚的认识udev是个什么东西:

绑定UUID示例(其实还可以大大简化):

[root@node1 ~]# cat /etc/udev/rules.d/99-oracle-asmdevices.rules
KERNEL=="sd*", ENV{DEVTYPE}=="disk", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode", RESULT=="1ATA_VBOX_HARDDISK_VBc6580c49-d54cc0df", RUN+="/bin/sh -c 'mknod /dev/asmdisk01 b $major $minor; chown grid:asmadmin /dev/asmdisk01; chmod 0660 /dev/asmdisk01'"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode", RESULT=="1ATA_VBOX_HARDDISK_VB41a7cba4-749c4aec", RUN+="/bin/sh -c 'mknod /dev/asmdisk02 b $major $minor; chown grid:asmadmin /dev/asmdisk02; chmod 0660 /dev/asmdisk02'"
KERNEL=="sd*", ENV{DEVTYPE}=="disk", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode", RESULT=="1ATA_VBOX_HARDDISK_VB6aaaf601-96dab065", RUN+="/bin/sh -c 'mknod /dev/asmdisk03 b $major $minor; chown grid:asmadmin /dev/asmdisk03; chmod 0660 /dev/asmdisk03'"

绑定ID_SERIAL示例:

KERNELS=="sd*",ENV{ID_SERIAL}=="VBOX_HARDDISK_VBc6580c49-d54cc0df",SYMLINK+="asm-ocr", OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNELS=="sd*",ENV{ID_SERIAL}=="VBOX_HARDDISK_VB41a7cba4-749c4aec",SYMLINK+="asm-mgmt",OWNER="grid",GROUP="asmadmin",MODE="0660"
KERNELS=="sd*",ENV{ID_SERIAL}=="VBOX_HARDDISK_VB6aaaf601-96dab065",SYMLINK+="asm-data",OWNER="grid",GROUP="asmadmin",MODE="0660"

需要注意的是rules文件中的内容是不允许任何主动换行符的,例如\等。

然后执行如下命令使udev规则生效即可:

udevadm control --reload-rules
udevadm trigger --type=devices
//Linux 7之前应该只需要start_udev即可,7版本去除了start_udev的命令,使用udevadm替代。

至于udev的规则文件中KERNELS,ENV{}都是些什么东西,为何用KERNELS和KERNEL都可以,为何用不同的命名方式都行,直接man udev寻找答案。

在这里我还要提一句,udev在CentOS-7上有个坑,NAME关键字不再能表示devnode名了,只能表示网卡名,这坑实在是太深我也翻车了,仔细看了好几遍man udev才发现。

六、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,然后:

# chown grid.oinstall linuxx64_12201_grid_home.zip
# su - grid
$ unzip linuxx64_12201_grid_home.zip
--这样在进行安装时就会将你设置的grid用户的$ORACLE_HOME作为GI家目录了。

--注意所有软件都只需在节点一解压,节点二无需操作,安装GI和DB软件的过程中安装程序会自动将软件传至远端节点。

--这里还需要先装下cvuqdisk包,这个包存在于解压后的/home/oracle/database/rpm/目录下:
cp /home/oracle/database/rpm/cvuqdisk-1.0.10-1.rpm /root
--使用root rpm安装cvuqdisk
rpm -ivh cvuqdisk-1.0.10-1.rpm
--以上包的安装需要在2节点都执行,使用scp将cvuqdisk包传至节点二安装。

解压后使用grid用户进行GI安装:

cd /u01/12.2.0/grid/
./gridSetup.sh

接下来基本只要下一步下一步就完事了,我自己的安装步骤忘了截图,因此这里参考下如下网址的安装截图:

https://oracle-base.com/articles/12c/oracle-db-12cr2-rac-installation-on-oracle-linux-7-using-virtualbox

注意:别按他的预安装步骤做,他使用的是很古老的单用户RAC安装方式,现在推荐使用单独的grid用户来管理集群,与管理数据库的oracle用户分离开。

Oracle 12c RAC 安装文档Oracle 12c RAC 安装文档

Oracle 12c RAC 安装文档

Oracle 12c RAC 安装文档

--这里需要特别说明下,如果你选了YES即为GIMR创建单独的MGMT磁盘组,那么OCR盘大小20GB左右就可以(当然你还需要为MGMT磁盘组准备存储,大概需要40G),如果你选择NO,那么请保证OCR盘至少40GB大小(准确数字忘了大概是38GB左右,不过40GB保险)。

Oracle 12c RAC 安装文档

Oracle 12c RAC 安装文档

根据提示依次在两节点执行以上脚本即可,出现下图所示文字是表示执行成功:

Oracle 12c RAC 安装文档

至此GRID已经安装完毕,使用如下命令查看集群状态:

su - grid
crsctl stat res -t

七、创建ASM磁盘组

使用grid用户执行asmca创建数据磁盘组DATA和存放REDO、归档的磁盘组,一般测试环境这几个磁盘组合在一起即可。

su - grid
sqlplus / as sysasm
set lines 200
col path for a40
select group_number,header_status,state,name,path,redundancy from v$asm_disk;
select group_number,name,state,COMPATIBILITY,DATABASE_COMPATIBILITY from v$asm_diskgroup;
create diskgroup DATA external redundancy disk '/dev/mapper/RAC_DATA' ATTRIBUTE 'compatible.asm' = '12.2';
create diskgroup ARCHIVE external redundancy disk '/dev/mapper/RAC_ARCHIVE' ATTRIBUTE 'compatible.asm' = '12.2';
create diskgroup REDO external redundancy disk '/dev/mapper/REDO_01','/dev/mapper/REDO_02' ATTRIBUTE 'compatible.asm' = '12.2';

八、DATABASE安装

cd /home/oracle/database
./runInstaller

Oracle 12c RAC 安装文档

Oracle 12c RAC 安装文档

根据提示执行以上脚本即可。

九、创建数据库

使用oracle用户执行dbca建库:

--如无pdb需求,那么不选create as container database

Oracle 12c RAC 安装文档

--并不推荐以上建库方式,建议使用下边的高级配置,可以自己设置SGA,PGA和字符集等等。

建库完毕后使用如下命令查看整个集群和数据库的状态:

su - grid
crsctl stat res -t
srvctl config database -d orcl
lsnrctl status

十、最后的工作

ALTER SYSTEM SET AUDIT_TRAIL=NONE SCOPE=SPFILE SID='*';--关闭审计
alter system set deferred_segment_creation=false SCOPE=BOTH SID='*'; --关闭段创建延迟
#ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON=FALSE SCOPE=SPFILE SID='*'; --关闭密码大小写验证,在12c版本中此参数已被弃用,如果手动改为FALSE,除非设置正确的SQLNET.ALLOWED_LOGON_VERSION_SERVER参数,否则所有用户都会无法登陆,因此不要这么改了。
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;--设置登录次数为无限
ALTER SYSTEM SET CONTROL_FILE_RECORD_KEEP_TIME=31 SCOPE=BOTH SID='*';--控制文件内容保存时间
ALTER SYSTEM SET MAX_DUMP_FILE_SIZE='2048M' SCOPE=BOTH SID='*';--DUMP文件size的最大值
ALTER SYSTEM SET PROCESSES=2048 SCOPE=SPFILE SID='*';--最大进程数
ALTER SYSTEM SET "_UNDO_AUTOTUNE"=FALSE SCOPE=BOTH SID='*';--关闭UNDO自动调优的功能
ALTER SYSTEM SET "_USE_ADAPTIVE_LOG_FILE_SYNC"=FALSE SCOPE=BOTH SID='*'; --关闭自适应日志同步功能
alter database add supplemental log data; --打开附加日志,便于进行故障后数据找回

重启使以上部分设置生效:srvctl stop/start database -d orcl

最后,再设置下数据和归档的备份计划,根据业务压力调整下REDO大小和组数就可以了。