Linux Centos7静默安装(非图形安装)Oracle RAC 11gR2(Oracle RAC 11.2.0.4)

Oracle RAC (全称Oracle Real Application Clusters )静默安装(非图形安装)教程。

由于这篇文章花费了我太多时间,设置了仅粉丝可见,见谅。

环境说明:

虚拟机软件:VMware Workstation 16 Pro
虚拟机操作系统:Centos7 64位
数据库版本:Oracle 11gR2(11.2.0.4.0)
数据库软件(Oracle Database software): Oracle11gR2(11.2.0.4.0)
集群软件(Cluster software): Oracle grid infrastructure 11gR2(11.2.0.4.0)
共享存储:ASM

# oracle安装包
p13390677_112040_Linux-x86-64_1of7.zip
p13390677_112040_Linux-x86-64_2of7.zip
# grid安装包
p13390677_112040_Linux-x86-64_3of7.zip
# 补丁包18370031
p18370031_112040_Linux-x86-64.zip

官方文档:Oracle Database 在线文档 11g

主机规划

主机名public ipprivate ipvirtual ip (VIP)scan ip用户名密码
rac1192.168.111.201192.168.63.201192.168.111.211192.168.111.222grid
oracle
grid
oracle
rac2192.168.111.202192.168.63.202192.168.111.212

共享磁盘规划

路径大小用途
/dev/sdb2Gvote(投票)
/dev/sdc2Gvote(投票)
/dev/sdd2Gvote(投票)
/dev/sde10Garch(归档)
/dev/sdf20Gdata(数据)

最终效果

共7个IP地址,2块网卡,其中public、vip和scan都在同一个网段,private在另一个网段。
主机名不要包含下横线,如:RAC_01是不允许的;

准备5块共享存储盘(测试其实可以只挂载一个盘,分5个区效果一样,但是生产不建议这样做,放在一块磁盘上io压力太大)

注意:
为了方便知道每条命令,使用什么用户执行,在哪个节点上执行,我保留了命令如下头部信息。
如果文中没有注明使用什么用户执行,请注意命令前面的部分。

[grid@rac1 ~]$ ls 
[grid@rac2 ~]$ ls 
[oracle@rac1 ~]$ ls 
[oracle@rac2 ~]$ ls 
[root@rac1 ~]# ls 
[root@rac2 ~]# ls 

一、准备两台服务器

服务器安装参考:VMware16安装Centos7

创建完整克隆,准备两台服务器。虚拟机名称分别命名为 rac1、rac2

需要保证两台服务器时间一致。

二、准备两张网卡

准备两张网卡,一个网卡为NAT模式,一个网卡为仅主机模式。

公有网卡(NAT模式):分配 public ip 、virtual ip (VIP)、scan ip。
私有网卡(仅主机模式):分配 private ip。

VMware创建网卡过程:编辑(E) 》 虚拟网络编辑器(N)... 》更改设置(C) 》添加网络(E)...

我这里已经有两张网卡,就不添加了,VMnet1网卡为“仅主机模式”,VMnet8网卡为“NAT模式”。

这里需要记住,我2个网卡的子网地址分别为:192.168.63.0、192.168.111.0后面设置静态ip必须在这两个ip段中。

两台虚拟服务器需要在关机模式下,把另外一张网卡添加上。

添加块网卡方法如下所示:

第1台主机 rac1 添加网卡:选中第一台虚拟机rac1 》右键 》 设置(S)... 》硬件 》添加(A)... 》网络适配器 》

自定义,选择VMnet1网卡,这里VMnet1要根据自己实际情况来,我上面截图中两张网卡就是VMnet1和VMnet8。

三、准备5块共享磁盘

准备5块共享存储盘(其实可以只挂载一个盘,分5个区效果一样,但是生产不建议这样做,放在一块磁盘上io压力太大)

添加创建好的五块虚拟硬盘,要求是独立永久属性。各盘存储情况如下:

3个2G的投票盘,一个10G的备份盘,一个20G的数据盘。
分别命名为 ocr1、ocr2、ocr3、backup、data

第一步:创建共享磁盘

该步骤可以用cmd命令也可以用图形界面,本文采用用图形界面行进行添加。

第1台主机 rac1 创建磁盘:

创建磁盘:选中第一台虚拟机rac1 》右键 》 设置(S)... 》硬件 》添加(A)... 》选中硬盘 》

  

磁盘类型,默认

   

创建新的虚拟磁盘

指定磁盘容量
勾选立即分配所有磁盘空间,并存储为单个文件。

指定磁盘文件存放位置,分别命令为 ocr1、ocr2、ocr3、backup、data

硬盘高级设置
选择创建的磁盘,并打开高级设置,勾选“独立”模式和“永久”属性。

  

Vmware 虚拟机无法设置磁盘模式 “独立模式”显示为为灰色
原因:虚拟机系统拍摄了快照。
解决办法:删除快照即可。

分别创建其他磁盘,分别命令为 ocr1、ocr2、ocr3、backup、data,磁盘文件如下图所示:

这里创建了3个2G的投票盘,一个10G的备份盘,一个20G的数据盘。

共享磁盘,物理文件保存位置,后面第2台主机添加磁盘需要用到。

 第二步:添加共享磁盘

在第一步,在第1台主机 rac1 上已经创建了5个共享磁盘,这一步不再需要创建磁盘,只需要将5个磁盘添加上即可。

添加磁盘:选中第二台虚拟机rac2 》右键 》 设置(S)... 》硬件 》添加(A)... 》选中硬盘 》

   

选择 “使用现有 虚拟磁盘(E)”

选择,前面创建好的磁盘 

选中刚新增的硬盘,高级,设置为独立永久模式。

同理添加其他4个硬盘。

此时两台虚拟机都添加了同一块磁盘,但启动时会报错,因为会造成磁盘的征用。

那么更改虚拟机配置文件,找到两台虚拟机下的.vmx文件,分别添加以下内容。

参数1:disk.locking="FALSE"。参数说明:虚拟机系统在启动的时候会锁定磁盘,当启动虚机1后共享磁盘被锁定了,虚机2就起不来了。
参数2:scsi[n].sharedBus = "virtual" 。参数说明:以上的设置表示所有的BUS都共享,vmare推荐这种做法。

关机情况下设置,scsi0.sharedBus 这里的0根据自己的实际情况来可以搜索下自己rac1.vmx配置文件下 scsi 后面的数字是多少。

rac1.vmx

scsi0.sharedBus= "virtual"
disk.locking= "false"
diskLib.dataCacheMaxSize= "0"
diskLib.dataCacheMaxReadAheadSize= "0"
diskLib.DataCacheMinReadAheadSize= "0"
diskLib.dataCachePageSize= "4096"
diskLib.maxUnsyncedWrites= "0"

rac2.vmx

scsi0.sharedBus= "virtual"
disk.locking= "false"
diskLib.dataCacheMaxSize= "0"
diskLib.dataCacheMaxReadAheadSize= "0"
diskLib.DataCacheMinReadAheadSize= "0"
diskLib.dataCachePageSize= "4096"
diskLib.maxUnsyncedWrites= "0"

四、配置网卡和主机名

1、关闭防火墙和SELinux

两个节点都要关闭。

# 关闭防火墙
systemctl stop firewalld 
systemctl disable firewalld# 关闭SELinux
vi /etc/selinux/config
# 也就是修改文件 /etc/selinux/config 设置SELINUX=disabled
SELINUX=disabled

2、修改主机名

主机名分别为 rac1、rac2

# 节点1
hostnamectl set-hostname rac1# 节点2
hostnamectl set-hostname rac2

3、配置网卡

显示所有网卡,我这里有两张网卡 ens32、ens33

[root@rac1 ~]# nmcli con show
NAME        UUID                                  TYPE      DEVICE
ens32       661c00dc-8371-4f29-87cc-1eea3ad2a607  ethernet  ens32
有线连接 1  8f918403-5122-35c2-9081-2e56884b784f  ethernet  ens33

 修改网卡,网卡ens32为NAT模式,作为public ip,网卡ens33为仅主机模式,作为private ip。

第1台主机 rac1 配置如下:

# 配置公网ip
vi /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens32"
DEVICE="ens32"
ONBOOT="yes"IPADDR="192.168.111.201"
NETMASK="255.255.255.0"
GATEWAY="192.168.111.2"
DNS1="8.8.8.8"
DNS2="114.114.114.114"
# 配置私网ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33

仅主机模式这张网卡,不要配置网关,否则不能正常联网。 

TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yesIPADDR=192.168.63.201
NETMASK=255.255.255.0
NETWORK=192.168.63.0

重启网卡,使其生效

service network restart

第2台主机 rac2 配置如下:

# 配置公网ip
vi /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens32"
DEVICE="ens32"
ONBOOT="yes"IPADDR="192.168.111.202"
NETMASK="255.255.255.0"
GATEWAY="192.168.111.2"
DNS1="8.8.8.8"
DNS2="114.114.114.114"
# 配置私网ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33

仅主机模式这张网卡,不要配置网关,否则不能正常联网。  

TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yesIPADDR=192.168.63.202
NETMASK=255.255.255.0
NETWORK=192.168.63.0

重启网卡,使其生效

service network restart

4、设置host

2个节点均配置相同,如下:

# 在结尾处新增如下7个
vi /etc/hosts
#Public IP
192.168.111.201		rac1
192.168.111.202		rac2#Private IP
192.168.63.201		rac1-priv
192.168.63.202		rac2-priv#Virtual IP
192.168.111.211		rac1-vip
192.168.111.212		rac2-vip#Scan IP
192.168.111.222		rac-scan

在两个节点上通过ping验证两个节点是否可通 ,另外3个没有配置在网卡中ping会错误。

ping rac1
ping rac2
ping rac1-priv
ping rac2-priv

五、创建用户和组

Oracle建议以不同的用户分别安装Grid Infrastructure软件、Oracle数据库软件。
一般以grid用户安装Grid Infrastructure,oracle用户安装Oracle数据库软件。
grid、oracle用户需要属于不同的用户组。
在配置RAC时,还要求这两个用户在RAC的不同节点上uid、gid要一致。

创建5个组
OSDBA组:dba,oinstall。
Oracle Inventory组:asmdba,asmoper,asmadmin作为ASM磁盘管理组。

上述创建的所有用户和组在每台机器上的名称和对应ID号,口令,以及属组关系和顺序必须保持一致。grid和oracle密码不过期。

创建组:

groupadd -g 1000 oinstall
groupadd -g 1001 dba
groupadd -g 1002 oper
groupadd -g 1003 asmadmin
groupadd -g 1004 asmdba
groupadd -g 1005 asmoper

创建grid和oracle用户:

#官方文档2.5.7 创建角色分配的组、用户和路径的示例
useradd -u 1100 -g oinstall -G dba,asmdba,asmoper,asmadmin grid#官方文档 2.5.5.2.8 创建 Oracle 软件所有者用户
useradd -u 1101 -g oinstall -G dba,asmdba,oper oracle

如果用户已经存在,修改组命令

usermod -g oinstall -G dba,asmdba,asmoper,asmadmin grid
usermod -g oinstall -G dba,asmdba,oper oracle

 查看

id oracle
id grid

创建目录结构 

mkdir -p  /u01/app/11.2.0/grid
mkdir -p /u01/app/grid
mkdir /u01/app/oracle
chown -R grid:oinstall /u01
chown oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/

为oracle和grid用户设密码

echo "oracle" | passwd --stdin oracle  #为oracle用户设置密码为oracle
echo "grid" | passwd --stdin grid      #为grid用户设置密码grid

设置oracle和grid用户密码永不过期:

chage -M -1 oracle
chage -M -1 grid
chage -l oracle
chage -l grid

六、设置系统参数

以下操作,两个节点都要操作。

1、在配置文件 /etc/sysctl.conf 末尾添加以下内容:

kernel.msgmnb = 65536 
kernel.msgmax = 65536 
kernel.shmmax = 68719476736 
kernel.shmall = 4294967296 
kernel.shmmni = 4096 
kernel.sem = 250 32000 100 128 
fs.aio-max-nr = 1048576 
fs.file-max = 6815744 
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 = 1048586 
net.ipv4.tcp_wmem = 262144 262144 262144 
net.ipv4.tcp_rmem = 4194304 4194304 4194304

执行以下命令生效

sysctl -p

2、配置shell限制
修改 /etc/security/limits.conf 配置文件,末尾添加以下内容:

grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

3、配置login
在 /etc/pam.d/login 文件,末尾添加以下内容:

session    required     pam_limits.so

4、禁用 NTP 服务,没有 NTP 服务,那就不用管。

systemctl stop ntpd

5、配置grid和oracle用户的环境变量文件

grid用户

## 节点1如下配置
su - grid
vi .bash_profileexport TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=+ASM1  # RAC1
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
umask 022## 节点2如下配置
su - grid
vi .bash_profileexport TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=+ASM2  # RAC2
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
umask 022

执行 source .bash_profile  命令使配置生效。

Oracle用户

## 节点1如下配置
su - oracle
vi .bash_profileexport TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=orcl1  # RAC1
export ORACLE_UNQNAME=oradb
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib## 节点2如下配置
su - oracle
vi .bash_profileexport TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=orcl2  # RAC2
export ORACLE_UNQNAME=oradb
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

执行 source .bash_profile 命令使配置生效。

七、ssh互信

配置 oracle 用户和 grid 用户 ssh 互信。

这是很关键的一步,这里采用手动配置互信,还可以使用官方脚本设置。

切换至oracle用户,在两个主机上生成密钥文件,需逐行执行,生成过程中全部回车

# 节点1执行
# 执行后,一直回车
[oracle@rac1 ~]$ ssh-keygen -t rsa# 节点2执行
# 执行后,一直回车
[oracle@rac2 ~]$ ssh-keygen -t rsa

在rac1主机执行,以下命令需逐行执行:需要输入密码。

#下面的目的是将公钥放到对方信任名单中
[oracle@rac1 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys# 将rac2节点的key追加到当前节点的authorized_keys文件中
# 提示yes/no,输入:yes,提示输入oracle密码,输入:oracle
[oracle@rac1 ~]$ ssh rac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys[oracle@rac1 ~]$ chmod 600 ~/.ssh/authorized_keys

在rac2主机执行:

# 将节点1的 authorized_keys 复制到当前节点
[oracle@rac2 ~]$ ssh rac1 cat ~/.ssh/authorized_keys >> ~/.ssh/authorized_keys
[oracle@rac2 ~]$ chmod 600 ~/.ssh/authorized_keys

测试一下,相互之间是否在oracle用户下已经免密登录了 ,提示 (yes/no)?  输入yes

ssh rac1
ssh rac2
ssh rac2
ssh rac1
ssh rac1-priv 
ssh rac2-priv 

切换至grid用户,同上:

# 节点1执行
# 执行后,一直回车
[grid@rac1 ~]$ ssh-keygen -t rsa# 节点2执行
# 执行后,一直回车
[grid@rac2 ~]$ ssh-keygen -t rsa

在rac1主机执行,以下命令需逐行执行:需要输入密码。 

#下面的目的是将公钥放到对方信任名单中
[grid@rac1 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys# 将rac2节点的key追加到当前节点的authorized_keys文件中
# 提示yes/no,输入:yes,提示输入grid密码,输入:grid
[grid@rac1 ~]$ ssh rac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys[grid@rac1 ~]$ chmod 600 ~/.ssh/authorized_keys

 在rac2主机执行:

# 将节点1的 authorized_keys 复制到当前节点
[grid@rac2 ~]$ ssh rac1 cat ~/.ssh/authorized_keys >> ~/.ssh/authorized_keys
[grid@rac2 ~]$ chmod 600 ~/.ssh/authorized_keys

测试一下,相互之间是否在grid用户下已经免密登录了  ,提示 (yes/no)?  输入yes

ssh rac1
ssh rac2
ssh rac2
ssh rac1 
ssh rac1-priv 
ssh rac2-priv 

说明:关于互信设置,还有另外一种方式,直接使用软件包解压后提供的ssh互信设置脚本(sshUserSetup.sh)来完成,如果觉得前面设置方法麻烦的话,也可尝试用脚本设置
Oacle安装包解压后,脚本位于:database/sshsetup/sshUserSetup.sh

./sshUserSetup.sh -user grid  -hosts "rac1 rac2" -advanced exverify –confirm./sshUserSetup.sh -user oracle  -hosts "rac1 rac2" -advanced exverify -confirm

由于我前面已经手动设置过互信,所以直接跳过下面步骤。 

八、安装依赖

我系统版本是Linux7

执行以下命令,安装依赖包。

yum install -y binutils compat-libcap1 compat-libstdc++-33 elfutils-libelf-devel smartmontools gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat kmod-oracleasm unzip

用 grid 用户登录上传 p13390677_112040_Linux-x86-64_3of7.zip 并解压

#用 grid 用户上传文件到grid的home目录
[grid@rac1 ~]$ pwd
/home/grid[grid@rac1 ~]$ ll
-rw-r--r-- 1 root root 1205251894 1月   6 20:33 p13390677_112040_Linux-x86-64_3of7.zip# 解压文件
[grid@rac1 ~]$ unzip p13390677_112040_Linux-x86-64_3of7.zip

使用root用户安装cvuqdisk,安装包在解压目录中/home/grid/grid/rpm
两个节点都需要安装cvuqdisk,否则,集群验证时程序就无法发现共享磁盘。

[root@rac1 ~]# cd /home/grid/grid/rpm
[root@rac1 rpm]# rpm -ivh cvuqdisk-1.0.9-1.rpm
准备中...                          ################################# [100%]
Using default group oinstall to install package
正在升级/安装...1:cvuqdisk-1.0.9-1                 ################################# [100%]

传输到第2个节点上进行安装:

[root@rac2 ~]# scp rac1:/home/grid/grid/rpm/cvuqdisk-1.0.9-1.rpm .[root@rac2 ~]# rpm -ivh cvuqdisk-1.0.9-1.rpm
准备中...                          ################################# [100%]
Using default group oinstall to install package
正在升级/安装...1:cvuqdisk-1.0.9-1                 ################################# [100%]

九、ASM磁盘

用oracle asm创建ASM磁盘。

1、安装asm软件

oracle asm需要三个包:kmod-oracleasm, oracleasm-support, oracleasmlib。

官方下载页面:Oracle ASMLib Downloads for Red Hat Enterprise Linux 7

备份下载地址:https://download.csdn.net/download/u014644574/88671993

#下载 rpm 包
curl -o oracleasmlib-2.0.12-1.el7.x86_64.rpm https://download.oracle.com/otn_software/asmlib/oracleasmlib-2.0.12-1.el7.x86_64.rpmcurl -o oracleasm-support-2.1.11-2.el7.x86_64.rpm https://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracleasm-support-2.1.11-2.el7.x86_64.rpm

安装oracle asm:依次安装 rpm 包(rac1和rac2都需要执行)

# kmod-oracleasm 这个前面已经安装
# yum -y install kmod-oracleasm
rpm -ivh oracleasmlib-2.0.12-1.el7.x86_64.rpm
rpm -ivh oracleasm-support-2.1.11-2.el7.x86_64.rpm

初始化 ASM(rac1和rac2都需要执行)

[root@rac1 ~]# oracleasm configure -iDefault user to own the driver interface []: grid          # 选择用户:grid
Default group to own the driver interface []: asmadmin     # 选择用户所在的组:asmadminStart Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
#初始化
[root@rac1 ~]# oracleasm init

查看asm状态

[root@rac1 ~]# oracleasm  status
Checking if ASM is loaded: yes
Checking if /dev/oracleasm is mounted: yes

2、磁盘分区

由于是共享磁盘,只需在节点rac1上分区,节点rac2扫描即可

#查看已经添加的磁盘
lsblk#查询结果如下
sdb      8:16   0    2G  0 disk
sdc      8:32   0    2G  0 disk
sdd      8:48   0    2G  0 disk
sde      8:64   0   10G  0 disk
sdf      8:80   0   20G  0 disk

对5个磁盘分区,这里有5块磁盘,需要每个磁盘做1个分区,如果只有一块磁盘做5个分区效果是一样的。

​[root@rac1 ~]# fdisk /dev/sdb
[root@rac1 ~]# fdisk /dev/sdc
[root@rac1 ~]# fdisk /dev/sdd
[root@rac1 ~]# fdisk /dev/sde
[root@rac1 ~]# fdisk /dev/sdf

具体操作如下:

②n表示新建分区
③p表示类型为:主分区
④假如输入1分区名称就叫 /dev/sdb1,输入3分区名称就叫 /dev/sdb3
⑤w表示保存修改。
起始扇区设置,直接回车,使用默认即可,如果要分多个区需要手动调整。

5块磁盘分区完成后,查看分区情况

[root@rac1 ~]# lsblk
sdb      8:16   0    2G  0 disk
└─sdb1   8:17   0    2G  0 part
sdc      8:32   0    2G  0 disk
└─sdc1   8:33   0    2G  0 part
sdd      8:48   0    2G  0 disk
└─sdd1   8:49   0    2G  0 part
sde      8:64   0   10G  0 disk
└─sde1   8:65   0   10G  0 part
sdf      8:80   0   20G  0 disk
└─sdf1   8:81   0   20G  0 part

另外一台,使用命令 更新磁盘信息

[root@rac2 ~]# partprobe
[root@rac2 ~]# lsblk

3、创建 ASM 磁盘

1、在任意一个节点创建 ASM 磁盘
在节点 rac1 进行如下操作:

# 查看 ASM 磁盘列表
[root@rac1 ~]# oracleasm  listdisks   # 无返回结果# 再次确认下磁盘
[root@rac1 ~]# fdisk -l | grep ^/dev/sd
/dev/sdb1            2048     4194303     2096128   83  Linux
/dev/sdc1            2048     4194303     2096128   83  Linux
/dev/sdd1            2048     4194303     2096128   83  Linux
/dev/sde1            2048    20971519    10484736   83  Linux
/dev/sdf1            2048    41943039    20970496   83  Linux
# 创建 ASM 磁盘
[root@rac1 ~]# oracleasm createdisk ocr1 /dev/sdb1
[root@rac1 ~]# oracleasm createdisk ocr2 /dev/sdc1
[root@rac1 ~]# oracleasm createdisk ocr3 /dev/sdd1
[root@rac1 ~]# oracleasm createdisk bak1 /dev/sde1
[root@rac1 ~]# oracleasm createdisk data1 /dev/sdf1# 查看 ASM 磁盘列表
[root@rac1 ~]# oracleasm  listdisks
BAK1
DATA1
OCR1
OCR2
OCR3

2、在另一个节点扫描 ASM 磁盘
在节点 rac2 执行如下操作:

# 查看 ASM 磁盘列表
[root@rac2 ~]# oracleasm  listdisks # 无返回结果# 扫描 ASM 磁盘信息
[root@rac2 ~]# oracleasm scandisks# 重新查看 ASM 磁盘列表
[root@rac2 ~]# oracleasm  listdisks
BAK1
DATA1
OCR1
OCR2
OCR3

十、安装grid软件

1、检查集群安装的是否满足条件

手动运行 cvu 使用验证程序验证Oracle集群件要求,校验集群安装的可行性。
节点 rac1 到 grid 软件目录下执行 runcluvfy.sh命令

[grid@rac1 ~]$ cd /home/grid/grid# 注意这里的参数rac1,rac2是两台节点的主机名
[grid@rac1 grid]$ ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -fixup -verbose

结果:"pdksh" 的 包存在性 检查失败,这个错误不用管,pdksh只有在Linux 4上需要,Linux 5/6/7都已经被ksh取代,忽略该错误。

未检测通过的显示为failed,有的failed可以根据提供的脚本进行修复。有的需要根据情况进行修复,有的failed也可以忽略。

2、修改 grid 响应文件

1、在节点1执行如下操作

[grid@rac1 ~]$ cd /home/grid/grid/response
[grid@rac1 response]$ cp grid_install.rsp grid_install.rsp.bak
[grid@rac1 response]$ vi grid_install.rsp

2、修改 grid 响应文件内容如下

# oracle安装响应文件版本
oracle.install.responseFileVersion=/oracle/install/rspfmt_crsinstall_response_schema_v11_2_0# 当前安装节点的计算机名称:rac1,查询方式 hostname
ORACLE_HOSTNAME=rac1# 选择Inventory目录,默认:/u01/app/oraInventory
INVENTORY_LOCATION=/u01/app/oraInventory# 语言:en,zh_CN
SELECTED_LANGUAGES=en,zh_CN# 指定安装类型:CRS_CONFIG:为集群配置
oracle.install.option=CRS_CONFIG# grid 的 BASE目录:/u01/app/grid
ORACLE_BASE=/u01/app/grid# grid 的 HOME 目录:/u01/app/11.2.0/grid
ORACLE_HOME=/u01/app/11.2.0/grid# 设置组信息
oracle.install.asm.OSDBA=asmdba
oracle.install.asm.OSOPER=asmoper
oracle.install.asm.OSASM=asmadmin# scan名称:为/etc/hosts文件中配置的rac-scan
oracle.install.crs.config.gpnp.scanName=rac-scan# 集群监听端口号:1521
oracle.install.crs.config.gpnp.scanPort=1521# 集群名称:rac-cluster
oracle.install.crs.config.clusterName=rac-cluster# 不使用GNS:以下四个选项不用设置
oracle.install.crs.config.gpnp.configureGNS=false
oracle.install.crs.config.gpnp.gnsSubDomain=
oracle.install.crs.config.gpnp.gnsVIPAddress=
oracle.install.crs.config.autoConfigureClusterNodeVIP=# 节点信息,跟为/etc/hosts文件中配置对应:rac1:rac1-vip,rac2:rac2-vip
oracle.install.crs.config.clusterNodes=rac1:rac1-vip,rac2:rac2-vip# 网络地址:IP地址和子网掩码的二进制形式进行与运算,即IPADDR和NETMASK的二进制与运算结果。
# 网卡信息和网段:网卡1名称:网络地址(公网):1,网卡2名称:网络地址(私网):2(1表示公共,2表示私有)
oracle.install.crs.config.networkInterfaceList=ens32:192.168.111.0:1,ens33:192.168.63.0:2# 注册表(OCR)和投票的存储类型
oracle.install.crs.config.storageOption=ASM_STORAGE# 上一步使用 ASM_STORAGE,以下选项不用设置
oracle.install.crs.config.sharedFileSystemStorage.diskDriveMapping=
oracle.install.crs.config.sharedFileSystemStorage.votingDiskLocations=
oracle.install.crs.config.sharedFileSystemStorage.votingDiskRedundancy=NORMAL
oracle.install.crs.config.sharedFileSystemStorage.ocrLocations=
oracle.install.crs.config.sharedFileSystemStorage.ocrRedundancy=NORMAL# 不使用IPMI,以下选项不用设置
oracle.install.crs.config.useIPMI=false
oracle.install.crs.config.ipmi.bmcUsername=
oracle.install.crs.config.ipmi.bmcPassword=# 配置 ASM 操作密码:oracle
oracle.install.asm.SYSASMPassword=oracle# 配置 ASM 表决盘名称:OCR
oracle.install.asm.diskGroup.name=OCR# 配置 ASM 表决盘冗余选项:NORMAL(默认值)
oracle.install.asm.diskGroup.redundancy=NORMAL# 配置 单元大小ASM AUSize:1(默认值)
oracle.install.asm.diskGroup.AUSize=1# 设置表决盘所使用的裸盘:查询方式:ll /dev/oracleasm/disks/*
oracle.install.asm.diskGroup.disks=/dev/oracleasm/disks/OCR1,/dev/oracleasm/disks/OCR2,/dev/oracleasm/disks/OCR3# 配置 ASM 磁盘位置:/dev/oracleasm/disks
oracle.install.asm.diskGroup.diskDiscoveryString=/dev/oracleasm/disks/*# 配置 ASMSNMP 密码:oracle
oracle.install.asm.monitorPassword=oracle# 指定要升级的节点
oracle.install.crs.upgrade.clusterNodes=# 升级ASM
oracle.install.asm.upgradeASM=false# 设置系统自动更新选项:SKIP_UPDATES跳过更新
oracle.installer.autoupdates.option=SKIP_UPDATES# 不自动更新,以下选项不用设置
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=# 配置代理服务器选项:不使用代理服务器
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
PROXY_REALM=

3、开始安装 grid 软件

运行安装脚本 runInstaller

[root@rac1 ~]# su - grid
[grid@rac1 ~]$ cd /home/grid/grid[grid@rac1 grid]$ ll
total 52
drwxr-xr-x  4 grid oinstall   281 Aug 26  2013 install
-rw-r--r--  1 grid oinstall 30016 Aug 27  2013 readme.html
drwxr-xr-x  2 grid oinstall    58 Jun 11 22:08 response
drwxr-xr-x  2 grid oinstall    34 Aug 26  2013 rpm
-rwxr-xr-x  1 grid oinstall  4878 Aug 26  2013 runcluvfy.sh
-rwxr-xr-x  1 grid oinstall  3268 Aug 26  2013 runInstaller
drwxr-xr-x  2 grid oinstall    29 Aug 26  2013 sshsetup
drwxr-xr-x 14 grid oinstall  4096 Aug 26  2013 stage
-rw-r--r--  1 grid oinstall   500 Aug 27  2013 welcome.html#安装
[grid@rac1 grid]$ ./runInstaller  -force -noconfig -IgnoreSysPreReqs -showProgress -ignorePrereq -silent -responseFile /home/grid/grid/response/grid_install.rsp#安装成功提示,而且告诉后续需要执行3个脚本
以 root 用户的身份执行以下脚本:1. /u01/app/oraInventory/orainstRoot.sh2. /u01/app/11.2.0/grid/root.sh
..................................................   100% 完成。执行 Root 脚本成功。
以安装用户的身份执行以下脚本来完成配置。1. /u01/app/11.2.0/grid/cfgtoollogs/configToolAllCommands RESPONSE_FILE=<response_file>Successfully Setup Software.

分别在节点 rac1 和 rac2 上按顺序以 root 用户身份执行以下两个脚本
(1)执行脚本:/u01/app/oraInventory/orainstRoot.sh
脚本的作用:修改目录的权限。

# 节点1
[root@rac1 disks]# /u01/app/oraInventory/orainstRoot.sh# 节点2
[root@rac2 disks]# /u01/app/oraInventory/orainstRoot.sh

(2)执行脚本:/u01/app/11.2.0/grid/root.sh
脚本的作用:启动相关资源。

运行脚本前,需要打一个补丁18370031。否则会报错 CRS-2101: 。虽然这个错误可以通过下面的方式临时解决

# 执行过程中出现如下错误:
# [client(7427)]CRS-2101:The OLR was formatted using version 3.#新开一个窗口,以 root 用户执行以下命令:
/bin/dd if=/var/tmp/.oracle/npohasd of=/dev/null bs=1024 count=1

但是,这样解决的问题,在遇到重启Linux后,不能正常启动crs

CRS-2101:通过MOS查询,该问题是ORACLE的一个BUG,已经在11.2.0.3中修复,该问题是由于在执行root.sh时候 会在/tmp/.oracle下产生一个文件npohasd文件,此文件的只有root用户有权限,因此,出现不能启动ohasd进程。

因为RHEL 7使用systemd而不是initd运行进程和重启进程,而root.sh通过传统的initd运行ohasd进程。如果 init.ohasd进程 不存在,crs启动不了。 

这是由于RHEL 7改变了init的管理方式,出现了兼容性上的问题。官方给出了补丁18370031,在PSU 28429134也有包含,选择一个就好。

节点rac1安装,会自动安装到其他节点

[root@rac1 ~]# su - grid
# 上传补丁包18370031
[grid@rac1 ~]$ unzip p18370031_112040_Linux-x86-64.zip
[grid@rac1 ~]$ cd $ORACLE_HOME/OPatch# 当前OPatch版本号
[grid@rac1 OPatch]$ ./opatch version
OPatch Version: 11.2.0.3.4
OPatch succeeded.[grid@rac1 OPatch]$ pwd
/u01/app/11.2.0/grid/OPatch#进入补丁解压包
[grid@rac1 ~]$ cd /home/grid/18370031#打补丁,中途提示输入y即可。
[grid@rac1 18370031]$ /u01/app/11.2.0/grid/OPatch/opatch apply#成功提示
Patch 18370031 successfully applied
Log file location: /u01/app/11.2.0/grid/cfgtoollogs/opatch/18370031_Jan_07_2024_00_39_58/apply2024-01-07_00-39-58上午_1.logOPatch succeeded.

节点rac1执行脚本:

[root@rac1 ~]# /u01/app/11.2.0/grid/root.sh
Check /u01/app/11.2.0/grid/install/root_rac1_2022-06-12_01-19-58.log for the output of root script

另开一个窗口,查看节点1(rac1)执行 /u01/app/11.2.0/grid/root.sh 时的日志:

成功日志如下

[root@rac1 ~]# tail -f /u01/app/11.2.0/grid/install/root_rac1_2022-06-12_01-19-58.logCRS-2672: Attempting to start 'ora.asm' on 'rac1'
CRS-2676: Start of 'ora.asm' on 'rac1' succeeded
CRS-2672: Attempting to start 'ora.OCR.dg' on 'rac1'
CRS-2676: Start of 'ora.OCR.dg' on 'rac1' succeeded
Configure Oracle Grid Infrastructure for a Cluster ... succeeded

失败如下

[root@rac1 ~]# tail -f /u01/app/11.2.0/grid/install/root_rac1_2022-06-12_01-19-58.logAdding Clusterware entries to inittab
ohasd failed to start
Failed to start the Clusterware. Last 20 lines of the alert log follow: 
2022-06-12 01:21:53.036: 
[client(7427)]CRS-2101:The OLR was formatted using version 3.

节点rac2执行脚本:

[root@rac2 ~]# /u01/app/11.2.0/grid/root.sh
Check /u01/app/11.2.0/grid/install/root_rac2_2022-06-12_01-29-23.log for the output of root script

另开一个窗口,查看节点2(rac2)执行 /u01/app/11.2.0/grid/root.sh 时的日志: 

[root@rac2 ~]# tail -f /u01/app/11.2.0/grid/install/root_rac2_2022-06-12_01-29-23.log

3、在节点 rac1 上执行下面的脚本

[root@rac1 ~]# su - grid
[grid@rac1 ~]$ vi cfgrsp.properties

 设置响应内容如下

oracle.assistants.asm|S_ASMPASSWORD=
oracle.assistants.asm|S_ASMMONITORPASSWORD=
oracle.crs|S_BMCPASSWORD=

官方网站解释这个响应文件怎么配置:Installing and Configuring Oracle Database Using Response Files
如果您没有 BMC 卡,或者不想启用 IPMI,请将S_BMCPASSWORD输入留空。

[grid@rac1 ~]$ /u01/app/11.2.0/grid/cfgtoollogs/configToolAllCommands RESPONSE_FILE=/home/grid/cfgrsp.properties

十一、CRS 状态

1、查看 grid rac 状态
节点1:

[grid@rac1 ~]$ crs_stat -t
Name           Type           Target    State     Host
------------------------------------------------------------
ora....ER.lsnr ora....er.type ONLINE    ONLINE    rac1
ora....N1.lsnr ora....er.type ONLINE    ONLINE    rac1
ora.OCR.dg     ora....up.type ONLINE    ONLINE    rac1
ora.asm        ora.asm.type   ONLINE    ONLINE    rac1
ora.cvu        ora.cvu.type   ONLINE    ONLINE    rac1
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE
ora....network ora....rk.type ONLINE    ONLINE    rac1
ora.oc4j       ora.oc4j.type  ONLINE    ONLINE    rac1
ora.ons        ora.ons.type   ONLINE    ONLINE    rac1
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.scan1.vip  ora....ip.type ONLINE    ONLINE    rac1

我这里只有ora.gsd处于OFFLINE状态是正常的,仅仅当集群中存在9i版本的数据库软件时,ora.gsd资源才应处于在线状态(ONLINE),其他情况下,都应该保持OFFLINE状态。

也就是,执行如下命令,只有gsd是OFFLINE离线状态表示集群正常。

[grid@rac1 ~]$ crs_stat -t | grep OFFLINE
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE
ora.rac1.gsd   application    OFFLINE   OFFLINE
ora.rac2.gsd   application    OFFLINE   OFFLINE

如果 ora.cvu OFFLINE 离线

# ora.cvu启动命令
[grid@rac1 ~]$ srvctl start cvu

2、查看 CRS 状态

查看本地节点的 CRS 状态,4个状态全是 online 在线

[grid@rac1 grid]$ crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online

3、查看集群的 CRS 状态,3个状态全是 online 在线

[grid@rac1 grid]$ crsctl check cluster
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online

4、查看集群中节点的配置信息

[grid@rac1 grid]$ olsnodes -n -i -s
rac1	1	rac1-vip	Active
rac2	2	rac2-vip	Active

5、查看集群件的表决磁盘信息

[grid@rac1 grid]$ crsctl query css votedisk
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------1. ONLINE   346370b3c9784f88bf6c1cd51e8c3dd0 (/dev/oracleasm/disks/OCR1) [OCR]2. ONLINE   1924a6ec08824fefbfb1cfdc7c172cb7 (/dev/oracleasm/disks/OCR2) [OCR]3. ONLINE   36f4cb31efaa4f9ebf81fa478a82a48d (/dev/oracleasm/disks/OCR3) [OCR]
Located 3 voting disk(s).

6、查看集群 SCAN VIP 信息

[grid@rac1 ~]$  srvctl config scan
SCAN 名称: rac-scan, 网络: 1/192.168.111.0/255.255.255.0/ens32
SCAN VIP 名称: scan1, IP: /rac-scan/192.168.111.222

7、查看集群 SCAN Listener 信息

[grid@rac1 ~]$ srvctl config scan_listener
SCAN 监听程序 LISTENER_SCAN1 已存在。端口: TCP:1521

8、查看集群件 OCR 文件信息

[grid@rac1 grid]$ ocrcheck

9、查看集群件 OCR 备份信息

[grid@rac1 grid]$ ocrconfig -showbackup
PROT-24: Auto backups for the Oracle Cluster Registry are not available
PROT-25: Manual backups for the Oracle Cluster Registry are not available

10、查询节点实例

[grid@rac3 ~]$ srvctl status database -d oradb
实例 orcl1 正在节点 rac1 上运行
实例 orcl2 正在节点 rac2 上运行

11、 查看集群状态,两个重要的指标 asm 实例

[grid@rac3 ~]$ crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------
ora.asmONLINE  ONLINE       rac1                     StartedONLINE  ONLINE       rac2                     Startedora.oradb.db1        ONLINE  ONLINE       rac1                     Open2        ONLINE  ONLINE       rac2                     Open

十二、安装 Oracle 软件

1、创建磁盘组

创建两个磁盘组 DATA 和 BAK

#查看ASM磁盘
[root@rac1 ~]# ll /dev/oracleasm/disks/*
brw-rw---- 1 grid asmadmin 8, 65 12月 29 05:35 /dev/oracleasm/disks/BAK1
brw-rw---- 1 grid asmadmin 8, 81 12月 29 05:35 /dev/oracleasm/disks/DATA1
brw-rw---- 1 grid asmadmin 8, 17 12月 30 12:00 /dev/oracleasm/disks/OCR1
brw-rw---- 1 grid asmadmin 8, 33 12月 30 12:00 /dev/oracleasm/disks/OCR2
brw-rw---- 1 grid asmadmin 8, 49 12月 30 12:00 /dev/oracleasm/disks/OCR3

在节点 rac1 创建两个磁盘组 DATA 和 BAK

[root@rac1 ~]# su - grid
[grid@rac1 ~]$ sqlplus / as sysasm-- 创建磁盘组 data
SQL> create diskgroup data external redundancy disk '/dev/oracleasm/disks/DATA1';
Diskgroup created.-- 为磁盘组 data 添加磁盘,这里没有DATA2不用执行。
-- SQL> alter diskgroup data add disk '/dev/oracleasm/disks/DATA2';
-- Diskgroup altered.-- 创建磁盘组 bak
SQL> create diskgroup bak external redundancy disk '/dev/oracleasm/disks/BAK1';
Diskgroup created.-- 为磁盘组 bak 添加磁盘,这里没有BAK2不用执行。
-- SQL> alter diskgroup bak add disk '/dev/oracleasm/disks/BAK2';
-- Diskgroup altered.-- 查看磁盘组信息
SQL> select INST_ID,name,free_mb,state from gv$asm_diskgroup;INST_ID NAME                              FREE_MB STATE
---------- ------------------------------ ---------- -----------1 OCR                                  5215 MOUNTED1 DATA                                20429 MOUNTED1 BAK                                 10189 MOUNTED2 OCR                                  5215 MOUNTED2 DATA                                    0 DISMOUNTED2 BAK                                     0 DISMOUNTED6 rows selected.

新建的DATA和BAK状态为 DISMOUNTED。

在节点 rac2 上修改磁盘组的状态为 mount,这一步是为了测试集群节点任何一个节点操作效果是一样的。
在个节点 rac2 上执行如下操作:

[grid@rac2 ~]$ sqlplus / as sysasmSQL> alter diskgroup data mount;Diskgroup altered.SQL> alter diskgroup bak mount;Diskgroup altered.--查看磁盘组信息
SQL> select INST_ID,name,free_mb,state from gv$asm_diskgroup;INST_ID NAME                              FREE_MB STATE
---------- ------------------------------ ---------- -----------2 OCR                                  5215 MOUNTED2 DATA                                20386 MOUNTED2 BAK                                 10146 MOUNTED1 OCR                                  5215 MOUNTED1 DATA                                20386 MOUNTED1 BAK                                 10146 MOUNTED6 rows selected.

全部挂载成功。

2、修改 oracle 响应文件

用 oracle 用户登录上传 p13390677_112040_Linux-x86-64_1of7.zip 和 p13390677_112040_Linux-x86-64_2of7.zip 并解压

[root@rac1 ~]# su - oracle# 使用oracle用户上传安装包到oracle的home目录
[oracle@rac1 ~]$ ll
-rw-r--r-- 1 root root 1395582860 1月   2 21:09 p13390677_112040_Linux-x86-64_1of7.zip
-rw-r--r-- 1 root root 1151304589 1月   2 21:09 p13390677_112040_Linux-x86-64_2of7.zip# 解压缩安装文件
[oracle@rac1 ~]$ unzip p13390677_112040_Linux-x86-64_1of7.zip
[oracle@rac1 ~]$ unzip p13390677_112040_Linux-x86-64_2of7.zip[oracle@rac1 ~]$ ll
drwxr-xr-x 7 oracle oinstall        136 8月  27 2013 database

修改 oracle 响应文件

[oracle@rac1 ~]$ cd database/response/
#备份
[oracle@rac1 response]$ cp db_install.rsp db_install.rsp.bak[oracle@rac1 response]$ vi db_install.rsp

文件 db_install.rsp 的内容如下:

# oracle安装响应文件版本
oracle.install.responseFileVersion=/oracle/install/rspfmt_dbinstall_response_schema_v11_2_0# 选择安装类型:INSTALL_DB_SWONLY(只安装数据库软件 )
oracle.install.option=INSTALL_DB_SWONLY# 指定安装过程中设置的系统主机名:通过hostname命令获取
ORACLE_HOSTNAME=rac1# 指定清单目录oracle inventory的所有者:oinstall
UNIX_GROUP_NAME=oinstall# 指定清单目录的路径:
INVENTORY_LOCATION=/u01/app/oraInventory# 指定数据库语言:en,zh_CN
SELECTED_LANGUAGES=en,zh_CN# 设置ORALCE_HOME的路径
ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1# 设置ORALCE_BASE的路径:
ORACLE_BASE=/u01/app/oracle# 选择Oracle安装数据库软件的版本:EE(企业版)
oracle.install.db.InstallEdition=EE# 是否自定义Oracle的组件:false(安装默认组件)
oracle.install.db.EEOptionsSelection=false# 要安装的组件列表(不要修改)
oracle.install.db.optionalComponents=oracle.rdbms.partitioning:11.2.0.4.0,oracle.oraolap:11.2.0.4.0,oracle.rdbms.dm:11.2.0.4.0,oracle.rdbms.dv:11.2.0.4.0,oracle.rdbms.lbac:11.2.0.4.0,oracle.rdbms.rat:11.2.0.4.0# 指定拥有OSDBA权限的用户组:
oracle.install.db.DBA_GROUP=dba# 指定拥有OSOPER权限的用户组:
oracle.install.db.OPER_GROUP=oper# 指定要安装oracle软件的节点:rac1,rac2
oracle.install.db.CLUSTER_NODES=rac1,rac2# 是否安装单节点rac:false
oracle.install.db.isRACOneInstall=# 安装单节点rac的服务名称
oracle.install.db.racOneServiceName=# 选择数据库的用途:GENERAL_PURPOSE(一般用途/事务处理)
oracle.install.db.config.starterdb.type=GENERAL_PURPOSE# 指定数据库的GlobalName(全局名称):
oracle.install.db.config.starterdb.globalDBName=oradb# 指定数据库的SID:
oracle.install.db.config.starterdb.SID=orcl# 选择字符集:AL32UTF8
oracle.install.db.config.starterdb.characterSet=AL32UTF8# 11g的新特性:自动内存管理:true
oracle.install.db.config.starterdb.memoryOption=true# 指定Oracle自动管理内存的大小:物理内存的60%左右,单位MB
oracle.install.db.config.starterdb.memoryLimit=1024# 是否载入模板示例:false
oracle.install.db.config.starterdb.installExampleSchemas=false# 是否启用安全设置:true
oracle.install.db.config.starterdb.enableSecuritySettings=true# 设置数据库用户密码
# 设定所有数据库用户使用同一个密码,其它数据库用户就不用单独设置了。
oracle.install.db.config.starterdb.password.ALL=oracle# 设定SYS用户的密码:不用设定,统一使用 oracle 作为密码
oracle.install.db.config.starterdb.password.SYS=# 设定SYSTEM用户的密码:不用设定,统一使用 oracle 作为密码
oracle.install.db.config.starterdb.password.SYSTEM=# 设定SYSMAN用户的密码:不用设定,统一使用 oracle 作为密码
oracle.install.db.config.starterdb.password.SYSMAN=# 设定DBSNMP用户的密码:不用设定,统一使用 oracle 作为密码
oracle.install.db.config.starterdb.password.DBSNMP=# 使用数据库本地管理工具:DB_CONTROL
oracle.install.db.config.starterdb.control=DB_CONTROL# 当上一个选项设置为GRID_CONTROL时,才需要设定grid control的远程路径URL
oracle.install.db.config.starterdb.gridcontrol.gridControlServiceURL=# 设置自动备份:false
oracle.install.db.config.starterdb.automatedBackup.enable=false# 不是自动备份:不用设置
oracle.install.db.config.starterdb.automatedBackup.osuid=
oracle.install.db.config.starterdb.automatedBackup.ospwd=# 指定存储类型:ASM_STORAGE
oracle.install.db.config.starterdb.storageType=ASM_STORAGE# 不使用文件系统:不用设置
oracle.install.db.config.starterdb.fileSystemStorage.dataLocation=
oracle.install.db.config.starterdb.fileSystemStorage.recoveryLocation=# 指定ASM的磁盘组:
oracle.install.db.config.asm.diskGroup=DATA# 指定ASM实例密码:
oracle.install.db.config.asm.ASMSNMPPassword=oracle# 不使用metalink账户:不用设置
MYORACLESUPPORT_USERNAME=
MYORACLESUPPORT_PASSWORD=
SECURITY_UPDATES_VIA_MYORACLESUPPORT=# 是否设置安全更新
# False表示不需要设置安全更新,在11.2的静默安装中必须指定为true,否则会提示错误
DECLINE_SECURITY_UPDATES=true# 不使用代理服务器,不用设置
PROXY_HOST=
PROXY_PORT=
PROXY_USER=
PROXY_PWD=
PROXY_REALM=# Oracle支持中心URL。
COLLECTOR_SUPPORTHUB_URL=# 自动更新:SKIP_UPDATES
oracle.installer.autoupdates.option=SKIP_UPDATES# 不使用自动:不用设置
oracle.installer.autoupdates.downloadUpdatesLoc=
AUTOUPDATES_MYORACLESUPPORT_USERNAME=
AUTOUPDATES_MYORACLESUPPORT_PASSWORD=

3、开始安装 oracle 软件

执行 runInstaller 命令开始安装 oracle

[oracle@rac1 ~]$ cd /home/oracle/database[oracle@rac1 database]$ ./runInstaller -silent -ignorePrereq -showProgress -responseFile /home/oracle/database/response/db_install.rsp# 安装成功提示安装程序文件成功。
Oracle Database 11g 的 安装 已成功。
请查看 '/u01/app/oraInventory/logs/silentInstall2024-01-03_02-43-00AM.log' 以获取详细资料。执行 Root 脚本 正在进行中。以 root 用户的身份执行以下脚本:1. /u01/app/oracle/product/11.2.0/db_1/root.sh在以下节点上执行/u01/app/oracle/product/11.2.0/db_1/root.sh:
[rac1, rac2]..................................................   100% 完成。执行 Root 脚本成功。
Successfully Setup Software.

-silent:此选项表示静默安装,意味着安装过程不会显示任何图形用户界面,而是以批处理模式进行。
-ignorePrereq:此选项告诉安装程序忽略先决条件检查。通常,在安装之前,安装程序会检查系统是否满足安装所需的最低要求。使用此选项,您可以跳过这些检查。
-ignoreSysPrereqs:此选项类似于 -ignorePrereq,但它专门针对操作系统级别的先决条件。
-responseFile:此选项允许您指定一个响应文件,该文件包含在安装过程中需要回答的问题的答案。这样,您可以在不手动回答问题的情况下进行安装。
-showProgress:此选项会显示安装的进度。静默安装时通常不显示进度,但使用此选项可以查看进度信息。

切换到 root 用户,在 rac1、rac2 执行以下脚本
分别在rac1, rac2上以root执行脚本:

# 节点1
[root@rac1 ~]# /u01/app/oracle/product/11.2.0/db_1/root.sh# 节点2
[root@rac2 ~]# /u01/app/oracle/product/11.2.0/db_1/root.sh

4、创建数据库实例

修改建库使用的响应文件

[oracle@rac1 ~]$ cd /home/oracle/database/response#备份
[oracle@rac1 response]$ cp dbca.rsp dbca.rsp.bak[oracle@rac1 response]$ vi dbca.rsp

响应文件的内容如下:

[GENERAL]
# 响应文件的版本号
RESPONSEFILE_VERSION = "11.2.0"
# 操作类型:createDatabase(创建数据库)
OPERATION_TYPE = "createDatabase"[CREATEDATABASE]
# 数据库名称,相当于SERVICE_NAME
GDBNAME = "oradb"# 指定数据库的 SID 和 oracle 用户环境变量中的 ORACLE_SID 必须一致,查看方式su - oracle后执行cat .bash_profile
# 每个节点实例SID前缀为orcl  会自动生成orcl1,orcl2 两个实例
SID = "orcl"# 逗号分隔的群集节点列表:rac1,rac2
NODELIST="rac1,rac2"# 数据库模板的名称:General_Purpose.dbc(默认值)
TEMPLATENAME = "General_Purpose.dbc"##设置 sys 账户的密码
SYSPASSWORD = "oracle"##设置 system 账户的密码
SYSTEMPASSWORD = "oracle"# 数据库文件的位置:
DATAFILEDESTINATION ="+DATA"# 恢复区的位置:
RECOVERYAREADESTINATION="+BAK"# 指定要创建的数据库的存储类型:ASM(自动存储管理)
STORAGETYPE="ASM"# 指定存储的磁盘组名称:
DISKGROUPNAME=DATA# 指定恢复区磁盘组名称:
RECOVERYGROUPNAME=BAK# 数据库字符集:
CHARACTERSET = "AL32UTF8"# 数据库国家字符集:
NATIONALCHARACTERSET= "AL16UTF16"# oracle所占物理内存百分比:60%
MEMORYPERCENTAGE = "60"# 分配给oracle数据库的总内存:单位MB,这个是SGA大小
TOTALMEMORY = "800"# 默认值
[createTemplateFromDB]
SOURCEDB = "myhost:1521:orcl"
SYSDBAUSERNAME = "system"
TEMPLATENAME = "My Copy TEMPLATE"
[createCloneTemplate]
SOURCEDB = "orcl"
TEMPLATENAME = "My Clone TEMPLATE"
[DELETEDATABASE]
SOURCEDB = "orcl"
[generateScripts]
TEMPLATENAME = "New Database"
GDBNAME = "orcl11.us.oracle.com"
[CONFIGUREDATABASE]
[ADDINSTANCE]
DB_UNIQUE_NAME = "orcl11g.us.oracle.com"
NODELIST=
SYSDBAUSERNAME = "sys"
[DELETEINSTANCE]
DB_UNIQUE_NAME = "orcl11g.us.oracle.com"
INSTANCENAME = "orcl11g"
SYSDBAUSERNAME = "sys"

使用 dbca 命令创建数据库

[oracle@rac1 ~]$ cd /u01/app/oracle/product/11.2.0/db_1/bin[oracle@rac1 bin]$ dbca -silent -responseFile /home/oracle/database/response/dbca.rsp复制数据库文件
1% 已完成
3% 已完成
9% 已完成
15% 已完成
21% 已完成
27% 已完成
30% 已完成
正在创建并启动 Oracle 实例
32% 已完成
36% 已完成
40% 已完成
44% 已完成
45% 已完成
48% 已完成
50% 已完成
正在创建集群数据库视图
52% 已完成
70% 已完成
正在进行数据库创建
73% 已完成
76% 已完成
85% 已完成
94% 已完成
100% 已完成
有关详细信息, 请参阅日志文件 "/u01/app/oracle/cfgtoollogs/dbca/oradb/oradb.log"。# 查看日志 tail -500f /u01/app/oracle/cfgtoollogs/dbca/oradb/oradb.log
数据库信息:
全局数据库名:oradb
系统标识符 (SID) 前缀:orcl

5、测试连接数据库

查看 grid 集群状态

[grid@rac1 ~]$ crs_stat -t

查看集群SCAN VIP信息,访问数据库使用这个地址

[grid@rac1 ~]$ srvctl config scan
SCAN 名称: rac-scan, 网络: 1/192.168.111.0/255.255.255.0/ens32
SCAN VIP 名称: scan1, IP: /rac-scan/192.168.111.222

创建用户

[oracle@rac1 ~]$ sqlplus / as sysdba##创建一个新用户abc和密码123456
SQL> create user abc identified by 123456;##授予DBA权限。
SQL> grant connect,resource,dba to abc;

本地plsql连接

RAC =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.222)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = oradb)))

select instance_name, status from v$instance;

在不同的session,得到的实例名不相同,说明正常负载均衡了。

当开启第二个session连接时,发现实例名为orcl2,可以看出,scan-ip的加入可以具有负载均衡的作用。

正常安装好后,不需要做任何操,全部节点关机重启后会自动加入集群正常工作。

十三、RAC 增加节点

给RAC系统扩充一个节点

新增节点之前主机规划

主机名public ipprivate ipvirtual ip (VIP)scan ip用户名密码
rac1192.168.111.201192.168.63.201192.168.111.211192.168.111.222grid
oracle
grid
oracle
rac2192.168.111.202192.168.63.202192.168.111.212

新增节点之后主机规划

主机名public ipprivate ipvirtual ip (VIP)scan ip用户名密码
rac1192.168.111.201192.168.63.201192.168.111.211192.168.111.222grid
oracle
grid
oracle
rac2192.168.111.202192.168.63.202192.168.111.212
rac3192.168.111.203192.168.63.203192.168.111.213

1、创建完整克隆。虚拟机名称为 rac3
2、添加网卡VMnet1,参考上面。
3、添加5个共享磁盘,设置为独立永久,参考上面。
4、设置虚拟机 rac3.vmx

scsi0.sharedBus= "virtual"
disk.locking= "false"
diskLib.dataCacheMaxSize= "0"
diskLib.dataCacheMaxReadAheadSize= "0"
diskLib.DataCacheMinReadAheadSize= "0"
diskLib.dataCachePageSize= "4096"
diskLib.maxUnsyncedWrites= "0"

5、修改网卡,有2个网卡,修改为静态ip

vi /etc/sysconfig/network-scripts/ifcfg-ens32

TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens32"
DEVICE="ens32"
ONBOOT="yes"IPADDR="192.168.111.203"
NETMASK="255.255.255.0"
GATEWAY="192.168.111.2"
DNS1="8.8.8.8"
DNS2="114.114.114.114"

仅主机模式这张网卡,不要配置网关,否则不能正常联网。 
vi /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yesIPADDR=192.168.63.203
NETMASK=255.255.255.0
NETWORK=192.168.63.0

重启生效

service network restart

6、修改主机名为 rac3

hostnamectl set-hostname rac3

7、关闭防火墙

# 关闭防火墙
systemctl stop firewalld 
systemctl disable firewalld

8、修改时间,保持3台节点的时间一致,时间相差太大不能安装,时间大致相同就忽略此步骤。

# 节点1 查询时间
date "+%Y-%m-%d %H:%M:%S"## 节点3 修改时间
#修改日期时间
date -s "2024-01-07 20:00:34"
#将当前时间和日期写入BIOS,避免重启后失效
hwclock -w

9、设置host,3个节点都需要修改(以前的节点也需要修改)

vi /etc/hosts
#Public IP
192.168.111.201		rac1
192.168.111.202		rac2
192.168.111.203		rac3#Private IP
192.168.63.201		rac1-priv
192.168.63.202		rac2-priv
192.168.63.203		rac3-priv#Virtual IP
192.168.111.211		rac1-vip
192.168.111.212		rac2-vip
192.168.111.213		rac3-vip#Scan IP
192.168.111.222		rac-scan

10、创建用户和组,这个组id和组名称要和以前的节点一致。

# 创建组
groupadd -g 1000 oinstall
groupadd -g 1001 dba
groupadd -g 1002 oper
groupadd -g 1003 asmadmin
groupadd -g 1004 asmdba
groupadd -g 1005 asmoper# 创建用户
useradd -u 1100 -g oinstall -G dba,asmdba,asmoper,asmadmin grid
useradd -u 1101 -g oinstall -G dba,asmdba,oper oracle#创建安装目录
mkdir -p  /u01/app/11.2.0/grid
mkdir -p /u01/app/grid
mkdir /u01/app/oracle
chown -R grid:oinstall /u01
chown oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/# 设置密码
# 这里密码分别设置为:oracle 和 grid
echo "oracle" | passwd --stdin oracle  #为oracle用户设置密码为oracle
echo "grid" | passwd --stdin grid      #为grid用户设置密码为grid#设置oracle和grid用户密码永不过期:
chage -M -1 oracle
chage -M -1 grid
chage -l oracle
chage -l grid

11、设置系统参数

在配置文件 /etc/sysctl.conf 末尾添加以下内容:

kernel.msgmnb = 65536 
kernel.msgmax = 65536 
kernel.shmmax = 68719476736 
kernel.shmall = 4294967296 
kernel.shmmni = 4096 
kernel.sem = 250 32000 100 128 
fs.aio-max-nr = 1048576 
fs.file-max = 6815744 
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 = 1048586 
net.ipv4.tcp_wmem = 262144 262144 262144 
net.ipv4.tcp_rmem = 4194304 4194304 4194304

执行以下命令生效

sysctl -p

配置shell限制,修改 /etc/security/limits.conf 配置文件,末尾添加以下内容:

grid soft nproc 2047 
grid hard nproc 16384 
grid soft nofile 1024 
grid hard nofile 65536 
oracle soft nproc 2047 
oracle hard nproc 16384 
oracle soft nofile 1024 
oracle hard nofile 65536

配置login,在 /etc/pam.d/login 文件最后添加一行内容:

session    required     pam_limits.so

12、配置用户环境变量

grid用户

su - grid
vi .bash_profileexport TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=+ASM3  # RAC3
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
umask 022

执行 source .bash_profile 命令使配置生效。

Oracle用户

su - oracle
vi .bash_profileexport TMP=/tmp
export TMPDIR=$TMP
export ORACLE_SID=orcl3  # RAC3
export ORACLE_UNQNAME=oradb
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=/usr/sbin:$PATH
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

执行 source .bash_profile 命令使配置生效。

13、ssh互信(oracle和grid用户)

节点 rac3 切换至oracle用户

# 执行后,一直回车
[oracle@rac3 ~]$ ssh-keygen -t rsa# 将rac1节点的key复制到当前节点
[oracle@rac3 ~]$ scp rac1:~/.ssh/authorized_keys ~/.ssh/#新生成的公钥追加到key文件中
[oracle@rac3 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[oracle@rac3 ~]$ chmod 600 ~/.ssh/authorized_keys#最新key复制到另外两个节点中
[oracle@rac3 ~]$ scp ~/.ssh/authorized_keys rac1:~/.ssh/authorized_keys
[oracle@rac3 ~]$ scp ~/.ssh/authorized_keys rac2:~/.ssh/authorized_keys

节点 rac3 切换至grid用户

# 执行后,一直回车
[grid@rac3 ~]$ ssh-keygen -t rsa# 将rac1节点的key复制到当前节点
[grid@rac3 ~]$ scp rac1:~/.ssh/authorized_keys ~/.ssh/#新生成的公钥追加到key文件中
[grid@rac3 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
[grid@rac3 ~]$ chmod 600 ~/.ssh/authorized_keys#最新key复制到另外两个节点中
[grid@rac3 ~]$ scp ~/.ssh/authorized_keys rac1:~/.ssh/authorized_keys
[grid@rac3 ~]$ scp ~/.ssh/authorized_keys rac2:~/.ssh/authorized_keys

测试一下,相互之间是否在oracle用户下已经免密登录了 ,提示 (yes/no)?  输入yes 

ssh rac1
ssh rac2
ssh rac3ssh rac1-priv 
ssh rac2-priv
ssh rac3-priv 

14、安装依赖

yum install -y binutils compat-libcap1 compat-libstdc++-33 elfutils-libelf-devel smartmontools gcc gcc-c++ glibc glibc-devel ksh libaio libaio-devel libgcc libstdc++ libstdc++-devel libXi libXtst make sysstat kmod-oracleasm unzip

安装cvuqdisk,否则,集群验证时程序就无法发现共享磁盘。 

[root@rac3 ~]# scp rac1:/home/grid/grid/rpm/cvuqdisk-1.0.9-1.rpm .[root@rac3 rpm]# rpm -ivh cvuqdisk-1.0.9-1.rpm
准备中...                          ################################# [100%]
Using default group oinstall to install package
正在升级/安装...1:cvuqdisk-1.0.9-1                 ################################# [100%]

15、安装ASM软件

涉及3个包, 备份下载地址:https://download.csdn.net/download/u014644574/88671993

# kmod-oracleasm 这个前面已经安装
# yum -y install kmod-oracleasm
# 上传另外两个安装包,下地址参考上面,安装如下
[root@rac3 ~]# rpm -ivh oracleasmlib-2.0.12-1.el7.x86_64.rpm
[root@rac3 ~]# rpm -ivh oracleasm-support-2.1.11-2.el7.x86_64.rpm

初始化 ASM

[root@rac3 ~]# oracleasm configure -iDefault user to own the driver interface []: grid          # 选择用户:grid
Default group to own the driver interface []: asmadmin     # 选择用户所在的组:asmadminStart Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y

初始化

[root@rac3 ~]# oracleasm init

查看 ASM 的状态

[root@rac3 ~]# oracleasm  status
Checking if ASM is loaded: yes
Checking if /dev/oracleasm is mounted: yes
# 扫描 ASM 磁盘信息
[root@rac3 ~]# oracleasm scandisks# 重新查看 ASM 磁盘列表
[root@rac3 ~]# oracleasm  listdisks
BAK1
DATA1
OCR1
OCR2
OCR3

16、检查环境是否满足安装grid软件

在节点rac1校验新增节点rac3安装环境是否准备好了。在节点rac1中执行。

[grid@rac1 ~]$ cluvfy stage -pre nodeadd -n rac3 -fixup

我只有一个"pdksh" 的 包存在性 检查失败,pdksh只有在Linux 4上需要,Linux 5/6/7都已经被ksh取代,忽略改错误

17、新增节点,安装grid软件

接下来在rac1执行如下操作,此时要先导入 ignore_preaddnode_checks 环境变量,否则后面的命令无法安装

[root@rac1 ~]# su - grid
[grid@rac1 ~]$ export IGNORE_PREADDNODE_CHECKS=Y[grid@rac1 ~]$ cd $ORACLE_HOME/oui/bin/
[grid@rac1 bin]$ ./addNode.sh "CLUSTER_NEW_NODES={rac3}" "CLUSTER_NEW_VIRTUAL_HOSTNAMES={rac3-vip}" "CLUSTER_NEW_PRIVATE_NODE_NAMES={rac3-priv}"

成功后的提示

.                                                               100% 已完成。
保存产品清单完成
WARNING:已在此会话中的一个或多个节点上创建了新的产品清单。但是, 尚未将它注册为此系统的主产品清单。
要注册新的产品清单, 请以 root 权限在节点 'rac3' 上的 '/u01/app/oraInventory/orainstRoot.sh' 中运行脚本。
如果不注册产品清单, 可能无法更新所安装的产品或对其打补丁。
以下配置脚本需要以各个新集群节点中的 "root" 用户的身份执行。以下列表中的每个脚本后面跟随一个节点列表。
/u01/app/oraInventory/orainstRoot.sh #On nodes rac3
/u01/app/11.2.0/grid/root.sh #On nodes rac3
要执行配置脚本, 请执行以下操作:1. 打开终端窗口2. 以 "root" 身份登录3. 在每个集群节点中运行脚本/u01/app/11.2.0/grid 的 添加集群节点 已成功。

 执行完之后需要 以root用户在新加节点rac3上执行两个脚本。

# 脚本1
[root@rac3 ~]# /u01/app/oraInventory/orainstRoot.sh# 脚本2
[root@rac3 ~]# /u01/app/11.2.0/grid/root.sh
Check /u01/app/11.2.0/grid/install/root_rac3_2024-01-04_17-04-54.log for the output of root script

执行第二个脚本,另开一个窗口查看日志

[root@rac3 ~]# tail -500f /u01/app/11.2.0/grid/install/root_rac3_2024-01-04_17-04-54.logCreating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
Creating trace directory
User ignored Prerequisites during installation
Installing Trace File Analyzer
OLR initialization - successful
Adding Clusterware entries to oracle-ohasd.service
CRS-4402: CSS 守护程序已在独占模式下启动, 但在节点 rac1 (编号为 1) 上发现活动 CSS 守护程序, 因此正在终止
An active cluster was found during exclusive startup, restarting to join the cluster
clscfg: EXISTING configuration version 5 detected.
clscfg: version 5 is 11g Release 2.
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
sh: /bin/netstat: 没有那个文件或目录
Configure Oracle Grid Infrastructure for a Cluster ... succeeded

配置成功,检查节点是否正常添加到GI,在任意一台主机上执行,查看后台进程是否正常

可以看见3个节点都正常了。

[grid@rac3 ~]$ crs_stat -t
Name           Type           Target    State     Host
------------------------------------------------------------
ora.BAK.dg     ora....up.type ONLINE    ONLINE    rac1
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    rac2
ora.OCR.dg     ora....up.type ONLINE    ONLINE    rac1
ora.asm        ora.asm.type   ONLINE    ONLINE    rac1
ora.cvu        ora.cvu.type   ONLINE    ONLINE    rac2
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE
ora....network ora....rk.type ONLINE    ONLINE    rac1
ora.oc4j       ora.oc4j.type  ONLINE    ONLINE    rac2
ora.ons        ora.ons.type   ONLINE    ONLINE    rac1
ora.oradb.db   ora....se.type ONLINE    ONLINE    rac1
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....SM3.asm application    ONLINE    ONLINE    rac3
ora....C3.lsnr application    ONLINE    ONLINE    rac3
ora.rac3.gsd   application    OFFLINE   OFFLINE
ora.rac3.ons   application    ONLINE    ONLINE    rac3
ora.rac3.vip   ora....t1.type ONLINE    ONLINE    rac3
ora.scan1.vip  ora....ip.type ONLINE    ONLINE    rac2

18、新增节点,安装oracle软件

接下来在rac1执行如下操作

[root@rac1 ~]# su - oracle
[oracle@rac1 ~]$ export IGNORE_PREADDNODE_CHECKS=Y
[oracle@rac1 ~]$ cd $ORACLE_HOME/oui/bin/
[oracle@rac1 bin]$ ./addNode.sh "CLUSTER_NEW_NODES={rac3}"

成功后的提示

在节点上保存产品清单 (2024年1月7日 星期日 下午10时23分34秒 CST)
.                                                               100% 已完成。
保存产品清单完成
WARNING:
以下配置脚本需要以各个新集群节点中的 "root" 用户的身份执行。以下列表中的每个脚本后面跟随一个节点列表。
/u01/app/oracle/product/11.2.0/db_1/root.sh #On nodes rac3
要执行配置脚本, 请执行以下操作:1. 打开终端窗口2. 以 "root" 身份登录3. 在每个集群节点中运行脚本/u01/app/oracle/product/11.2.0/db_1 的 添加集群节点 已成功。
请查看 '/tmp/silentInstall.log' 以获取详细资料。

在新节点 rac3上,使用root用户执行脚本

[root@rac3 ~]# /u01/app/oracle/product/11.2.0/db_1/root.sh

执行结果,若有报错,如果不需要nmhs这个功能不影响。
如果需要这个功能,上传oracle软件手动安装,参照上面:步骤十二、安装 Oracle 软件

The following environment variables are set as:ORACLE_OWNER= oracleORACLE_HOME=  /u01/app/oracle/product/11.2.0/db_1Copying dbhome to /usr/local/bin ...Copying oraenv to /usr/local/bin ...Copying coraenv to /usr/local/bin ...Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root script.
Now product-specific root actions will be performed.
/bin/chown: 无法访问"/u01/app/oracle/product/11.2.0/db_1/bin/nmhs": 没有那个文件或目录
/bin/chmod: 无法访问"/u01/app/oracle/product/11.2.0/db_1/bin/nmhs": 没有那个文件或目录
Finished product-specific root actions.
Finished product-specific root actions.

19、新增节点,创建数据库实例

接下来是在rac1上用DBCA创建实例的过程
在rac1上以Oracle用户登录,使用dbca silent模式创建数据库实例:

[root@rac1 ~]# su - oracle[oracle@rac1 ~]$ dbca -silent -addInstance -nodeList rac3 -gdbName oradb -instanceName orcl3 -sysDBAUserName sys -sysDBAPassword oracle#成功提示
正在添加实例
1% 已完成
2% 已完成
6% 已完成
13% 已完成
20% 已完成
26% 已完成
33% 已完成
40% 已完成
46% 已完成
53% 已完成
66% 已完成
正在进行实例管理。
76% 已完成
100% 已完成
有关详细信息, 请参阅日志文件 "/u01/app/oracle/cfgtoollogs/dbca/oradb/oradb0.log"。

-silent: 这个选项让DBCA在静默模式下运行。
-addInstance: 这个选项指示添加一个新的数据库实例。
-nodeList rac3: 这个参数指定了新实例将被添加到名为rac3的节点。
-gdbName oradb: 这个参数指定了新实例将加入到名为oradb的全局数据库名(db_name或者SERVICE_NAME)。
-instanceName orcl3: 这个参数指定了新实例的名称orcl3。
-sysDBAUserName sys: 这个参数指定了具有系统管理员权限的用户名sys。
-sysDBAPassword oracle: 这个参数指定了具有系统管理员权限的用户的密码oracle。

查询节点实例

[grid@rac3 ~]$ srvctl status database -d oradb
实例 orcl1 正在节点 rac1 上运行
实例 orcl2 正在节点 rac2 上运行
实例 orcl3 正在节点 rac3 上运行

查看集群状态

[grid@rac3 ~]$ crsctl status res -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS
--------------------------------------------------------------------------------
ora.asmONLINE  ONLINE       rac1                     StartedONLINE  ONLINE       rac2                     StartedONLINE  ONLINE       rac3                     Startedora.oradb.db1        ONLINE  ONLINE       rac1                     Open2        ONLINE  ONLINE       rac2                     Open3        ONLINE  ONLINE       rac3                     Open

执行如下命令,只有gsd是OFFLINE离线状态表示集群正常。

[grid@rac1 ~]$ crs_stat -t | grep OFFLINE
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE
ora.rac1.gsd   application    OFFLINE   OFFLINE
ora.rac2.gsd   application    OFFLINE   OFFLINE
ora.rac3.gsd   application    OFFLINE   OFFLINE

十四、RAC 删除节点

如果只是需要关闭其中一个节点,这个节点需要重启维护,直接关闭该节点CRS即可。
如果您关闭了其中一个节点的 CRS,该节点将无法处理任何新的连接请求或提供服务,直到您重新启动 CRS 并重新加入到集群中。在此期间,其他节点将继续正常运行并处理连接和服务请求。

# 停止当前节点crs
[root@rac3 ~]# /u01/app/11.2.0/grid/bin/crsctl stop crs#启动当前节点crs
[root@rac3 ~]# /u01/app/11.2.0/grid/bin/crsctl start crs

如果实在要删除节点,往下看。 这里测试删除节点rac3。

查看节点状态

[grid@rac1 ~]$ crsctl stat res -t
[grid@rac1 ~]$ crs_stat -t#如下只有gsd是OFFLINE离线状态表示集群正常
[grid@rac1 ~]$ crs_stat -t | grep OFFLINE
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE
ora.rac1.gsd   application    OFFLINE   OFFLINE
ora.rac2.gsd   application    OFFLINE   OFFLINE
ora.rac3.gsd   application    OFFLINE   OFFLINE

1、备份ocr

在添加/删除节点前,建议手工备份一下OCR,在某些情况下添加/删除节点失败,可以通过恢复原来的OCR来解决问题。我这里有自动备份,没有再执行手动备份。

# 查看自动备份
[grid@rac1 ~]$ ocrconfig -showbackup autorac1     2024/01/07 05:04:27     /u01/app/11.2.0/grid/cdata/rac-cluster/backup00.ocr
rac1     2024/01/07 05:04:27     /u01/app/11.2.0/grid/cdata/rac-cluster/day.ocr
rac1     2024/01/07 05:04:27     /u01/app/11.2.0/grid/cdata/rac-cluster/week.ocr

2、查看将要删除的节点是被pin住,如果pin住需要,unpin节点 

[grid@rac3 ~]$ olsnodes -t -s
rac1    Active  Unpinned
rac2    Active  Unpinned
rac3    Active  Unpinned[root@rac3 ~]# /u01/app/11.2.0/grid/bin/crsctl unpin css -n rac3
CRS-4667: Node rac3 successfully unpinned.[grid@rac3 ~]$ olsnodes -t -s
rac1    Active  Unpinned
rac2    Active  Unpinned
rac3    Active  Unpinned

3、删除数据库实例

在节点rac1上,使用oracle用户删除节点rac3的实例。

[oracle@rac1 ~]$ dbca -silent -deleteInstance -nodeList rac3 -gdbName oradb -instanceName orcl3 -sysDBAUserName sys -sysDBAPassword oracle

-nodeList rac3 是删除节点名rac3
-gdbName oradb 是全局数据库名oradb
-instanceName orcl3 是删除的实例名orcl3
-sysDBAUserName sys 是拥有sysdba权限的oracle用户名称
-sysDBAPassword oracle 是sysdba用户的密码 

删除后,查看实例已经少了一个,监听还是3个

[grid@rac1 ~]$ srvctl status database -d oradb
实例 orcl1 正在节点 rac1 上运行
实例 orcl2 正在节点 rac2 上运行[grid@rac1 ~]$ srvctl status listener
监听程序 LISTENER 已启用
监听程序 LISTENER 正在节点上运行: rac2,rac1,rac3

4、禁用和停止监听

[grid@rac1 ~]$ srvctl disable listener -n rac3
[grid@rac1 ~]$ srvctl stop listener -n rac3# 停止rac3的监听后,集群监听只有rac1和rac2
[grid@rac1 ~]$ srvctl status listener
监听程序 LISTENER 已启用
监听程序 LISTENER 正在节点上运行: rac2,rac1

5、更新删除节点 rac3上的 inventory 清单目录(可选)
在要删除节点 rac3 的 $ORACLE_HOME/oui/bin 目录下执行(oracle用户)

[oracle@rac3 ~]$ cd $ORACLE_HOME/oui/bin
[oracle@rac3 bin]$ ./runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={rac3}" -local

6、卸载 oracle 软件

在要删除节点 rac3 中删除 RAC 数据库软件(卸载节点rac3的oracle软件)。
注意:
卸载过程提示[]:直接回车
如果提示输入(是 - 是, 否 - 否),输入

#测试下ssh,若提示输入yes
[oracle@rac3 ~]$ ssh rac3[oracle@rac3 ~]$ cd $ORACLE_HOME/deinstall/
[oracle@rac3 deinstall]$ ./deinstall -local## 注意:
## 卸载过程提示[]:直接回车
## 如果提示输入(是 - 是, 否 - 否),输入是指定在此 Oracle 主目录中配置的数据库名的列表 []:是否要继续 (是 - 是, 否 - 否)? [否]: 是Oracle 卸载工具已成功清除临时目录。
#################################################################################### ORACLE DEINSTALL & DECONFIG TOOL END #############

7、更新保留的节点的 inventory 清单目录
在集群的保留节点上 $ORACLE_HOME/oui/bin 目录下执行

[oracle@rac1 ~]$ cd $ORACLE_HOME/oui/bin/
[oracle@rac1 bin]$ ./runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={rac1,rac2}"

8、重新配置CRS
在要删除节点 rac3上使用root用户执行

[root@rac3 ~]# /u01/app/11.2.0/grid/crs/install/rootcrs.pl -deconfig -force[root@rac3 ~]# cd /u01/app/11.2.0/grid/crs/install/
./rootcrs.pl -deconfig -force

保报错-bash: ./rootcrs.pl: /usr/bin/perl: 坏的解释器: 没有那个文件或目录

yum -y install perl kernel-headers kernel-devel

9、从集群中删除节点

停止需要删除节点rac3的CRS

[root@rac3 ~]# /u01/app/11.2.0/grid/bin/crsctl stop crs

在保留节点运行(任何一个正常节点),使用root用户运行

[root@rac1 ~]# /u01/app/11.2.0/grid/bin/crsctl delete node -n rac3
CRS-4661: Node rac3 successfully deleted.#删除后,节点rac3已经没有了
[root@rac1 ~]# /u01/app/11.2.0/grid/bin/olsnodes -t -s
rac1    Active  Unpinned
rac2    Active  Unpinned

10、更新删除节点 rac3上的 inventory 清单目录(可选)
在要删除节点 rac3 的 $ORACLE_HOME/oui/bin 目录下执行(grid用户)

[grid@rac3 ~]$ cd $ORACLE_HOME/oui/bin
[grid@rac3 bin]$ ./runInstaller -updateNodelist ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={rac3}" CRS=TRUE -local

11、卸载grid软件

在要删除节点 rac3 执行,从rac3中删除集群软件GI。

注意:
如果提示输入 >  直接回车
如果提示输入(y|n),输入y
如果提示输入(是 - 是, 否 - 否),输入
中途还是让另外开一个窗口,使用root用户执行一个脚本,按提示执行就行。
另外开一个窗口执行完后,回来继续按回车。

#测试下ssh,若提示输入yes
[grid@rac3 ~]$ ssh rac3[grid@rac3 ~]$ cd $ORACLE_HOME/deinstall
[grid@rac3 deinstall]$ ./deinstall –local## 注意:
## 如果提示输入 >  直接回车。
## 如果提示输入(y|n),输入y
## 如果提示输入(是 - 是, 否 - 否),输入是
## 中途还是让另外开一个窗口,使用root用户执行一个脚本,按提示执行就行。
## 另外开一个窗口执行完后,回来继续按回车。输入一个地址或在节点 "rac3" 上使用的虚拟 IP 的名称[rac3-vip]> 直接回车!!!!在此 Oracle 主目录中未检测到 ASM 配置。此 Oracle 主目录 (y|n) 中是否配置了 ASM [n]: y是否要继续 (是 - 是, 否 - 否)? [否]: 是以 root 用户或管理员身份在节点 "rac3" 上运行以下命令。/tmp/deinstall2024-01-14_02-28-54PM/perl/bin/perl -I/tmp/deinstall2024-01-14_02-28-54PM/perl/lib -I/tmp/deinstall2024-01-14_02-28-54PM/crs/install /tmp/deinstall2024-01-14_02-28-54PM/crs/install/rootcrs.pl -force  -deconfig -paramfile "/tmp/deinstall2024-01-14_02-28-54PM/response/deinstall_Ora11g_gridinfrahome1.rsp" -lastnodeOracle 卸载工具已成功清除临时目录。
#################################################################################### ORACLE DEINSTALL & DECONFIG TOOL END #############

注意:如果不指定-local选项,那么默认将会把所有的集群信息全部删除,这是非常危险的操作
运行此命令过程中需要进行多次手动配置,请注意!!!!

在要删除节点 rac3 执行,卸载完成后,使用root用户删除残留文件。

[root@rac3 ~]# rm -rf /etc/oraInst.loc
[root@rac3 ~]# rm -rf /opt/ORCLfmap
[root@rac3 ~]# rm -rf /etc/oratab

12、更新保留的节点的 inventory 清单目录
在集群的保留节点上 $ORACLE_HOME/oui/bin 目录下执行

[grid@rac1 ~]$ cd $ORACLE_HOME/oui/bin
[grid@rac1 bin]$ ./runInstaller -updateNodeList ORACLE_HOME=$ORACLE_HOME "CLUSTER_NODES={rac1,rac2}" CRS=TRUE -silent

13、验证节点是否删除成功

在保留节点上执行

[grid@rac1 ~]$ cluvfy stage -post nodedel -n rac3 -verbose执行 删除节点 的后期检查正在检查 CRS 完整性...集群件版本一致性测试已通过
Oracle Clusterware 在节点 "rac2" 上处于健康状态
Oracle Clusterware 在节点 "rac1" 上处于健康状态CRS 完整性检查已通过
结果:
删除节点检查通过删除节点 的后期检查成功。

十五、节点的启动和关闭

正常安装好后,不需要做任何操,全部节点关机重启后会自动加入集群正常工作。

由于单节点操作系统需要重启维护。

查询nodename、dbname、instancename

需要查询,需要启动/关闭节点的3个名称:
节点名称nodename、数据库名称dbname、实例名称instancename

## 1、查询节点名称
[root@rac3 ~]# uname -n
rac3## 2、查询数据库名称和实例名称
[oracle@rac3 ~]$ sqlplus / as sysdba
SQL> show parameter name;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      oradb
db_unique_name                       string      oradb
instance_name                        string      orcl3
service_names                        string      oradb

我这查询结果如下:
节点名称 nodename = rac3
节点名称 dbname = oradb
节点名称 instancename = orcl3

关闭过程

1、停止Oracle实例和监听器

#停止实例
srvctl stop instance -d <dbname> -i <instancename>
#停止监听
srvctl stop listener -n <nodename>

请将<dbname>替换为你的数据库名称,<instancename>替换为实例名称,<nodename>替换为节点名称。 

#启动实例
[grid@rac3 ~]$ srvctl stop instance -d oradb -i orcl3
#启动监听
[grid@rac3 ~]$ srvctl stop listener -n rac3

2、查看集群中实例和监听运行情况

srvctl status database -d <dbname>
## 查看集群中实例运行情况
[grid@rac3 ~]$ srvctl status database -d oradb
实例 orcl1 正在节点 rac1 上运行
实例 orcl2 正在节点 rac2 上运行
实例 orcl3 没有在 rac3 节点上运行## 查看集群中监听运行情况
[grid@rac3 ~]$ srvctl status listener
监听程序 LISTENER 已启用
监听程序 LISTENER 正在节点上运行: rac2,rac1

3、关闭CRS服务

[root@rac3 ~]# /u01/app/11.2.0/grid/bin/crsctl stop crs

启动过程 

1、启动CRS服务

[root@rac3 ~]# /u01/app/11.2.0/grid/bin/crsctl start crs
CRS-4123: Oracle High Availability Services has been started.

2、启动Oracle实例和监听器

#启动实例
srvctl start instance -d <dbname> -i <instancename>
#启动监听
srvctl start listener -n <nodename>

 请将<dbname>替换为你的数据库名称,<instancename>替换为实例名称,<nodename>替换为节点名称。 

#启动实例
[grid@rac3 ~]$ srvctl start instance -d oradb -i orcl3
#启动监听
[grid@rac3 ~]$ srvctl start listener -n rac3

3、查看集群中实例和监听运行情况

## 查看集群中实例运行情况
[grid@rac3 ~]$ srvctl status database -d oradb
实例 orcl1 正在节点 rac1 上运行
实例 orcl2 正在节点 rac2 上运行
实例 orcl3 正在节点 rac3 上运行## 查看集群中监听运行情况
[grid@rac3 ~]$ srvctl status listener
监听程序 LISTENER 已启用
监听程序 LISTENER 正在节点上运行: rac2,rac1,rac3

4、再次查看,只有 ora.gsd  OFFLINE 是离线,其余全部处于ONLINE在线状态。

[grid@rac3 ~]$ crs_stat -t#如下只有gsd是OFFLINE离线状态表示集群正常
[grid@rac3 ~]$ crs_stat -t | grep OFFLINE
ora.gsd        ora.gsd.type   OFFLINE   OFFLINE
ora.rac1.gsd   application    OFFLINE   OFFLINE
ora.rac2.gsd   application    OFFLINE   OFFLINE
ora.rac3.gsd   application    OFFLINE   OFFLINE

十六、cssd故障的处理

问题描述:
oracle rac 11.2.0.4 主机重启,重启之后发现oracle rac集群无法启动。
节点rac2主机启动后,发现rac集群启动不了,检查集群进程状态,发现cssd一直处于starting状态

[root@rac2 ~]# /u01/app/11.2.0/grid/bin/crsctl status res -t -init
ora.cssd   1   ONLINE  OFFLINE  STARTING[root@rac2 ~]#  tail -f /u01/app/11.2.0/grid/log/rac2/cssd/ocssd.log

由于集群启动到cssd无法继续正常启动,查看cssd的日志ocssd.log

发现有报错:has a disk HB, but no network HB

我这里错误是由于防火墙未关闭,关闭防火墙就好了。

# 关闭防火墙
systemctl stop firewalld 
systemctl disable firewalld

十七、crs启动失败

1、检查has是否启动

2、检查 ora.crsd 是否启动,大多数情况是正因为这个没有启动

/u01/app/11.2.0/grid/bin/crsctl status res -t -init
#分析集群的alter日志
tail -500f /u01/app/11.2.0/grid/log/rac3/alertrac3.log

手动启动crsd

[grid@rac3 rac3]$ crsctl start resource "ora.crsd" -init#查看crsd已经启动成功
/u01/app/11.2.0/grid/bin/crsctl status res -t -init
#启动实例
[grid@rac3 log]$ srvctl start instance -d oradb -i orcl3

参考:

VMware超详细Oracle RAC安装及搭建指南-CSDN博客

VMware超详细Oracle RAC安装及搭建指南_vm部署11g rac-CSDN博客

https://wanggx.blog.csdn.net/article/details/125269870

Oracle11g RAC在一个节点宕掉的情况下添加一个新的节点:_一个添加一个-CSDN博客

https://www.cnblogs.com/bicewow/p/13577210.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git与VScode联合使用详解

目录 Git与VScode联合使用 方式一 1. 用vscode打开文件夹&#xff0c;如图点击初始化仓库&#xff0c;把此仓库初始为git仓库。 2. 提交文件到本地仓库 3. vscode与github账号绑定 4. 在github中建立远程仓库 5. 本地仓库与远程仓库绑定 方式二 1. 在github上建立远程仓…

VSCode添加Python解释器并安装Python库

目录 一、安装VSCode 二、安装Python解释器 1、安装包链接 2、安装过程 3、测试 4、安装flake8和yapf两个包 &#xff08;1&#xff09;安装flake8包 &#xff08;2&#xff09;安装yapf包 三、VSCode中选择python解释器 一、安装VSCode VSCode安装教程&#xff08;默…

Windows之任意文件删除到提权

前言 ZDI 发表过从任意文件夹删除到提权的利用过程&#xff0c;还提供了任意文件删除到提权的利用过程&#xff0c;所以一字之差但是漏洞利用方式也是有细微偏差的。 这里把任意文件删除和任意文件夹删除漏洞提权结合起来分析&#xff0c;是因为其最后的利用过程是一样的&…

认识监控系统zabbix

利用一个优秀的监控软件&#xff0c;我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控数据 ●可以回溯寻找事故发生时系统的问题和报警情况 了解zabbix zabbix是什么&#xff1f; ●zabbix 是一个基于 Web 界面的提供分布…

JVM:从零到入门

JVM&#xff0c;就是Java虚拟机。 JVM是一个巨大的话题&#xff0c;我们本文主要简单介绍一些围绕JVM相关的基础知识。 目录 JVM内存区域划分 本地方法栈 虚拟机栈 堆 程序计数器 方法区/ 元数据区 类加载 1.加载 2.验证 3.准备 4.解析 5.初始化 双亲委派模型 …

yydict属性字典-一种更加方便的方式访问字典

yydict属性字典-一种更加方便的方式访问字典 问题引入 这篇文章是想介绍 最近在使用字典的一种困惑. 我希望通过少写几个字符来访问 python中字典这种数据结构. 比如这个例子: person {name: frank,age: 18,hobby: swimming }在python中字典的定义 如上面的例子, 如果我希…

spring boot mybatis plus mapper如何自动注册到spring bean容器

##Import(AutoConfiguredMapperScannerRegistrar.class) ##注册MapperScannerConfigurer ##MapperScannerConfigurer.postProcessBeanDefinitionRegistry方法扫描注册mapper ##找到mapper候选者 ##过滤mapper 类 候选者 ##BeanDefinitionHolder注册到spring 容器

vue项目之.env文件.env.dev、test、pro

.env文件是vue运行项目时的环境配置文件。 .env: 全局默认配置文件&#xff0c;所有环境(开发、测试、生产等&#xff09;均会加载并合并该文件 .env.development(开发环境默认命名) 开发环境的配置&#xff0c;文件名默认为.env.development,如果需要改名也是可以的&#xf…

【Python】使用pyinstaller打包为Windows平台的xxx.exe方法步骤

pyinstaller 是一个用于将 Python 代码打包成独立可执行文件的工具&#xff0c;它可以将 Python 代码打包成 Windows、Linux、Mac 等平台的可执行文件&#xff0c;方便用户在不同环境中运行。 pyinstaller用法&#xff1a; 1.安装pyinstaller库&#xff0c;这里以PyCharm环境为…

ACM论文LaTeX模板解析(一)| 模板下载与安装

本文收录于专栏&#xff1a;ACM 论文 LaTeX模板解析&#xff0c;本专栏将会围绕ACM 论文 LaTeX模板解析持续更新。欢迎点赞收藏关注&#xff01; 文章目录 1. 引言2. 下载方式 1. 引言 计算机械协会&#xff08;ACM&#xff0c;Association for Computing Machinery&#xff0…

UG装配-WAVE几何链接器

自上向下&#xff08;自顶向下&#xff09;设计 先将产品主要结构&#xff08;或主要部件&#xff09;建立好&#xff0c;然后再根据要求设计其它组件&#xff0c;使每个组件之间有数据关联&#xff0c;适用于产品开发初期&#xff0c;便于修改&#xff0c;修改组件数据后&…

基于JavaWeb的酒店管理系统

基于JavaWeb的酒店管理系统 文章目录 基于JavaWeb的酒店管理系统系统介绍技术选型成果展示源码获取账号地址及其他说明 系统介绍 基于JavaWeb的酒店管理系统是为酒店打造的管理平台&#xff0c;其主要功能有管理员登陆、客房预订、客房入住、房间管理、数据查询(预订单查询、入…

PySide6/PyQt6中的时间管理类:QTime的使用方法

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📝 创建QTime对象📝 常用方法⚓️ 相关链接 ⚓️📖 介绍 📖 QTime是PySide6中用于处理时间段的类,可以用来表示一天中的时间,例如小时、分钟和秒。它提供了许多操作和格式化时间的功能,使得处理时间变得更加…

mysql-实战案例 (超详细版)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

VL53L4CD TOF开发(1)----驱动TOF进行测距

VL53L4CX TOF开发.1--驱动TOF进行测距 概述视频教学样品申请完整代码下载主要特点硬件准备技术规格系统框图应用示意图生成STM32CUBEMX选择MCU串口配置IIC配置 XSHUTX-CUBE-TOF1演示结果 概述 VL53L4CD适用于接近测量和短距离测量&#xff0c;可实现从仅仅1 mm到1300 mm的超精…

SAP SD-DN-MM 交货单相关物料凭证的视图的日期问题

眼下有个需求 获取交货单对应的物料凭证的过账日期BLDAT。 同步BW数据过去 新增一个数据库视图 但是实际使用时&#xff0c;有效部分仅本月&#xff0c;再选择条件里面要加上 MATdoc-bldat > sy-datum - sydatum6(2). 于是使用ST05 跟踪了一下&#xff0c;发现在DD28S…

echarts——折线图实现不同区间不同颜色+下钻/回钻功能——技能提升

echarts——折线图实现不同区间不同颜色下钻/回钻功能——技能提升 需求场景解决步骤1&#xff1a;安装echarts插件解决步骤2&#xff1a;html代码解决步骤3&#xff1a;封装option配置和initChart渲染方法解决步骤4&#xff1a;回钻功能 需求场景 最近在写后台管理系统时&…

乐意购项目前端开发 #2

一、Axios的安装和简单封装 安装Axios npm install axios在utils目录下创建 http.js 文件, 内容如下 import axios from axios// 创建axios实例 const http axios.create({baseURL: http://localhost:9999,//后端服务器地址timeout: 5000 })// axios请求拦截器 http.interc…

为什么使用双token实现无感刷新用户认证?

单token机制 认证机制&#xff1a;对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处&#xff1a; 安全性较低&#xff08;因为只有一个token在客户端和服务器端之间进行传递&#xff0c;一旦Access Token被截…

pip查看某个包存在的历史版本

简介&#xff1a;当我们想查看某个包有哪些可安装版本&#xff0c;但是又不想去官网查询&#xff0c;如何用pip命令查询出全部历史版本&#xff1f; 历史版本&#xff1a; Python&#xff1a;pip升级超时解决方案 Python&#xff1a;指定的Python版本pip Python&#xff1a…