Cet article est le premier d'une série d'articles sur l'installation d'Oracle RAC 19c sous virtualbox, à des fins de test.
Ce premier article traite de la création des VM et leur configuration Système, Réseau et Stockage.
Les logiciels requis pour l'ensemble des opérations seront :
Créer une VM sous VirtualBox avec la configuration suivante :
Configurer les cartes réseau de la VM.
Sous VirtualBox, aller dans Configuration / Stockage de la VM et insérer le DVD Centos 8 dans le lecteur optique.
DVD Centos : CentOS-8.2.2004-x86_64-dvd1.iso
Démarrer la VM.
Suivre les instructions d'installation comme suit :
Il convient de redémarrer la VM pour terminer la configuration.
Au redémarrage, accepter les termes de licence présentés.
Ici, nous allons configurer tous les prérequis système pour Oracle RAC.
Comme il faudra installer des paquetages supplémentaires, il faut un accès internet, grace à l'interface réseau NAT que l'on a déjà configuré.
L'ensemble des actions peut être scriptée dans le shell présenté ci-dessous. Il sera à lancer sous root.
Il comporte entre autre :
Fichier /root/configure_oracle_rac.sh :
#!/usr/bin/bash # ==================== # runLevel # ==================== function runLevel { echo "runLevel ..." currentLevel=`runlevel | awk '{ print $NF }'` [[ "$currentLevel" = "3" ]] && echo "Rien a faire" && return 0 init 3 [[ $? -ne 0 ]] && echo "Erreur init 3" && return 1 ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target [[ $? -ne 0 ]] && echo "Erreur ln -sf ..." && return 1 return 0 } # ==================== # changeEtcHosts # ==================== function changeEtcHosts { echo "" echo "Modify /etc/hosts ..." racCount=`grep "rac" /etc/hosts | wc -l` [[ ${racCount} -ge 9 ]] && echo "Rien a faire" && return 0 echo "# public" >> /etc/hosts echo "192.168.56.11 rac1 rac1.localdomain" >> /etc/hosts echo "192.168.56.12 rac2 rac2.localdomain" >> /etc/hosts echo "# virtual" >> /etc/hosts echo "192.168.56.21 rac1-vip rac1-vip.localdomain" >> /etc/hosts echo "192.168.56.22 rac2-vip rac2-vip.localdomain" >> /etc/hosts echo "# private" >> /etc/hosts echo "10.0.1.1 rac1-priv rac1-priv.localdomain" >> /etc/hosts echo "10.0.1.2 rac2-priv rac2-priv.localdomain" >> /etc/hosts echo "# scan" >> /etc/hosts echo "192.168.56.31 rac-scan rac-scan.localdomain" >> /etc/hosts echo "192.168.56.32 rac-scan rac-scan.localdomain" >> /etc/hosts echo "192.168.56.33 rac-scan rac-scan.localdomain" >> /etc/hosts return 0 } # ==================== # installRpm # ==================== function installRpm { echo "" echo "Install RPM ..." for pkg in \ bc \ binutils \ elfutils-libelf \ elfutils-libelf-devel \ fontconfig-devel \ glibc \ glibc-devel \ ksh \ libaio \ libaio-devel \ libXrender \ libX11 \ libXau \ libXi \ libXtst \ libgcc \ libnsl \ librdmacm \ libstdc++ \ libstdc++-devel \ libxcb \ libibverbs \ make \ smartmontools \ sysstat \ libvirt-devel \ libvirt-libs \ net-tools do rpm -q --queryformat '%{ARCH} %{NAME}\n' $pkg > /dev/null 2>&1 if [ $? -ne 0 ] then printf "%-25s%-10s\n" "${pkg}" "not installed" yum -y install ${pkg} > /dev/null 2>&1 else printf "%-25s%-10s\n" "${pkg}" "Ok" fi done return 0 } # ==================== # configureUdev # ==================== function configureUdev { echo "" echo "Configure UDEV ..." rpm -q --queryformat '%{ARCH} %{NAME}\n' udev > /dev/null 2>&1 if [ $? -ne 0 ] then yum -y install udev > /dev/null 2>&1 else echo "pkg udev deja installe" fi udevadm control --reload-rules > /dev/null 2>&1 [[ $? -ne 0 ]] && echo "Erreur reload rules" && return 1 udevadm trigger > /dev/null 2>&1 [[ $? -ne 0 ]] && echo "Erreur trigger rules" && return 1 return 0 } # ==================== # selinux # ==================== function selinux { echo "" echo "Configure SELINUX ..." sed -i.bak "s/^SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config [[ $? -ne 0 ]] && echo "Erreur sed selinux" && return 1 return 0 } # ==================== # configureSysctl # ==================== function configureSysctl { echo "" echo "Configure sysctl ..." grep oracle /etc/sysctl.conf > /dev/null 2>&1 [[ $? -eq 0 ]] && echo "Rien a faire" && return 0 echo "# Oracle" >> /etc/sysctl.conf echo "fs.aio-max-nr = 1048576" >> /etc/sysctl.conf echo "fs.file-max = 6815744" >> /etc/sysctl.conf echo "kernel.shmall = 2097152" >> /etc/sysctl.conf echo "kernel.shmmax = 4294967295" >> /etc/sysctl.conf echo "kernel.shmmni = 4096" >> /etc/sysctl.conf echo "kernel.sem = 250 32000 100 128" >> /etc/sysctl.conf echo "net.ipv4.ip_local_port_range = 9000 65500" >> /etc/sysctl.conf echo "net.core.rmem_default = 262144" >> /etc/sysctl.conf echo "net.core.rmem_max = 4194304" >> /etc/sysctl.conf echo "net.core.wmem_default = 262144" >> /etc/sysctl.conf echo "net.core.wmem_max = 1048576" >> /etc/sysctl.conf sysctl -p > /dev/null 2>&1 [[ $? -ne 0 ]] && echo "Erreur sysctl -p" && return 1 return 0 } # ==================== # configureLimits # ==================== function configureLimits { echo "" echo "Configure limits.conf ..." grep oracle /etc/security/limits.conf > /dev/null 2>&1 [[ $? -eq 0 ]] && echo "Rien a faire" && return 0 echo "# grid" >> /etc/security/limits.conf echo "grid soft nofile 1024" >> /etc/security/limits.conf echo "grid hard nofile 65536" >> /etc/security/limits.conf echo "grid soft nproc 4096" >> /etc/security/limits.conf echo "grid hard nproc 16384" >> /etc/security/limits.conf echo "grid soft stack 10240" >> /etc/security/limits.conf echo "grid hard stack 10240" >> /etc/security/limits.conf echo "# oracle" >> /etc/security/limits.conf echo "oracle soft nofile 1024" >> /etc/security/limits.conf echo "oracle hard nofile 65536" >> /etc/security/limits.conf echo "oracle soft nproc 4096" >> /etc/security/limits.conf echo "oracle hard nproc 16384" >> /etc/security/limits.conf echo "oracle soft stack 10240" >> /etc/security/limits.conf echo "oracle hard stack 10240" >> /etc/security/limits.conf return 0 } # ==================== # addUsersAndGroups # ==================== function addUsersAndGroups { echo "" echo "Add Groups and Users ..." grep "oinstall" /etc/group > /dev/null 2>&1 [[ $? -ne 0 ]] && groupadd -g 500 oinstall grep "dba" /etc/group > /dev/null 2>&1 [[ $? -ne 0 ]] && groupadd -g 501 dba grep "grid" /etc/passwd > /dev/null 2>&1 [[ $? -ne 0 ]] && useradd -u 500 -g oinstall -G dba grid grep "oracle" /etc/passwd > /dev/null 2>&1 [[ $? -ne 0 ]] && useradd -u 501 -g oinstall -G dba oracle [[ ! -d /home/grid ]] && echo "Erreur creation user grid" && return 1 [[ ! -d /home/oracle ]] && echo "Erreur creation user oracle" && return 1 echo "grid" | passwd grid --stdin [[ $? -ne 0 ]] && echo "Erreur passwd grid" && return 1 echo "oracle" | passwd oracle --stdin [[ $? -ne 0 ]] && echo "Erreur passwd oracle" && return 1 echo "umask 022" > /home/grid/.bash_profile echo "export TMP=/tmp" >> /home/grid/.bash_profile echo "export TMPDIR=/tmp" >> /home/grid/.bash_profile echo "export ORACLE_BASE=/u01/app/grid" >> /home/grid/.bash_profile echo "export ORACLE_HOME=/u01/app/19.3.0/grid" >> /home/grid/.bash_profile echo "export PATH=$PATH:$ORACLE_HOME/bin" >> /home/grid/.bash_profile chown grid:oinstall /home/grid/.bash_profile chmod 755 /home/grid/.bash_profile return 0 } # ==================== # createDirectories # ==================== function createDirectories { echo "" echo "create directories ..." mkdir -p /u01/app/oraInventory mkdir -p /u01/app/grid mkdir -p /u01/app/19.3.0/grid mkdir -p /u01/app/oracle chown -R grid:oinstall /u01 chown oracle:oinstall /u01/app/oracle chmod -R 775 /u01 return 0 } # ==================== # stopFirewall # ==================== function stopFirewall { echo "" echo "stop firewall ..." systemctl stop firewalld > /dev/null 2>&1 systemctl disable firewalld > /dev/null 2>&1 return 0 } # ==================== # main # ==================== [[ "$USER" != "root" ]] && echo "Vous devez etre root" && exit 1 runLevel [[ $? -ne 0 ]] && echo "Erreur runLevel" && exit 1 changeEtcHosts [[ $? -ne 0 ]] && echo "Erreur changeEtcHosts" && exit 1 installRpm [[ $? -ne 0 ]] && echo "Erreur installRpm" && exit 1 configureUdev [[ $? -ne 0 ]] && echo "Erreur configureUdev" && exit 1 selinux [[ $? -ne 0 ]] && echo "Erreur selinux" && exit 1 configureSysctl [[ $? -ne 0 ]] && echo "Erreur configureSysctl" && exit 1 configureLimits [[ $? -ne 0 ]] && echo "Erreur configureLimits" && exit 1 addUsersAndGroups [[ $? -ne 0 ]] && echo "Erreur addUsersAndGroups" && exit 1 createDirectories [[ $? -ne 0 ]] && echo "Erreur createDirectories" && exit 1 stopFirewall [[ $? -ne 0 ]] && echo "Erreur createDirectories" && exit 1 echo "Fin normale" |
On lance le shell avec le compte root :
cd /root ./configure_oracle_rac.sh runLevel ... Modify /etc/hosts ... Install RPM ... bc Ok binutils Ok elfutils-libelf Ok elfutils-libelf-devel not installed fontconfig-devel not installed glibc Ok glibc-devel not installed ksh not installed libaio Ok libaio-devel not installed libXrender Ok libX11 Ok libXau Ok libXi Ok libXtst Ok libgcc Ok libnsl not installed librdmacm Ok libstdc++ Ok libstdc++-devel not installed libxcb Ok libibverbs Ok make not installed smartmontools Ok sysstat not installed libvirt-devel not installed libvirt-libs Ok net-tools Ok Configure UDEV ... Configure SELINUX ... Configure sysctl ... Configure limits.conf ... Add Groups and Users ... Changement de mot de passe pour l'utilisateur grid. passwd : mise à jour réussie de tous les jetons d'authentification. Changement de mot de passe pour l'utilisateur oracle. passwd : mise à jour réussie de tous les jetons d'authentification. create directories ... stop firewall ... Fin normale |
On notera la configuration qui a été écrite dans /etc/hosts :
# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # public 192.168.56.11 rac1 rac1.localdomain 192.168.56.12 rac2 rac2.localdomain # virtual 192.168.56.21 rac1-vip rac1-vip.localdomain 192.168.56.22 rac2-vip rac2-vip.localdomain # private 10.0.1.1 rac1-priv rac1-priv.localdomain 10.0.1.2 rac2-priv rac2-priv.localdomain # scan 192.168.56.31 rac-scan rac-scan.localdomain 192.168.56.32 rac-scan rac-scan.localdomain 192.168.56.33 rac-scan rac-scan.localdomain
Le deuxième noeud de notre cluster RAC sera créé à partir du premier.
Sous VirtualBox, arrêter la machine rac1 et cloner la machine rac1 en rac2 en prenant soin de choisir la politique d'adresse MAC "Générer de nouvelles adresses MAC pour toutes les interfaces réseau".
Démarrer rac2 uniquement et changer les hostname et le réseau comme suit :
hostnamectl set-hostname rac2.localdomain cd /etc/sysconfig/network-scripts vi ifcfg-enp0s8 IPADDR=192.168.56.12 vi ifcfg-enp0s9 IPADDR=10.0.1.2 |
Rebooter la machine rac2
shutdown -r now
vérifier la bonne configuration :
hostnamectl status Static hostname: rac2.localdomain Icon name: computer-vm Chassis: vm Machine ID: ef60bf2a889d48bb88d7980d610c4258 Boot ID: edeef5db18724b9ba162f95adbe68746 Virtualization: oracle Operating System: CentOS Linux 8 (Core) CPE OS Name: cpe:/o:centos:centos:8 Kernel: Linux 4.18.0-193.el8.x86_64 Architecture: x86-64 ping -c 1 rac2 PING rac2 (192.168.56.12) 56(84) bytes of data. 64 bytes from rac2 (192.168.56.12): icmp_seq=1 ttl=64 time=0.037 ms --- rac2 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.037/0.037/0.037/0.000 ms |
Démarrer rac1.
Créer les clés SSH pour les users oracle et grid puis configurer les équivalences SSH :
# rac1 & rac2 su - oracle -c "ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa << |
Vérifier les équivalences SSH pour les comptes oracle et grid. La première fois, la commande ssh demande une confirmation (yes). La fois suivante, la commande ssh s'exécute sans prompt.
# rac1 su - oracle ssh rac2 hostname su - grid ssh rac2 hostname # rac2 su - oracle ssh rac1 hostname su - grid ssh rac1 hostname |
Nous allons créer les disques suivants :
Cette configuration est minimale pour créer une base vide à des fins de test.
Arrêter les 2 noeuds rac1 et rac2.
shutdown now
Sous VirtualBox, aller sur Fichier / Gestionnaire de medias.
Pour chacun des disques créés, le changer en shareable : Fichier / Gestionnaire de medias, cliquer sur disque, puis choisir type : partageable et appliquer.
Ajouter ensuite sur rac1 et rac2 les disques précédents : Configuration / Stockage / Controler SATA / Ajouter Disque dur.
Chacun des 2 noeuds possède maintenant les disques :
Nous allons maintenant formater les disques créés. Ceci est à faire uniquement depuis rac1.
Démarrer rac1 et formater les disques sdb, sdc, sdd, sde, sdf.
# rac1 uniquement fdisk -l | grep Disque Disque /dev/sda : 100 GiB, 107374182400 octets, 209715200 secteurs Disque /dev/sdb : 2 GiB, 2147483648 octets, 4194304 secteurs Disque /dev/sdc : 2 GiB, 2147483648 octets, 4194304 secteurs Disque /dev/sdd : 2 GiB, 2147483648 octets, 4194304 secteurs Disque /dev/sde : 6 GiB, 6442450944 octets, 12582912 secteurs Disque /dev/sdf : 6 GiB, 6442450944 octets, 12582912 secteurs Disque /dev/mapper/cl-root : 50 GiB, 53687091200 octets, 104857600 secteurs Disque /dev/mapper/cl-swap : 4 GiB, 4265607168 octets, 8331264 secteurs Disque /dev/mapper/cl-home : 45 GiB, 48343547904 octets, 94420992 secteurs fdisk /dev/sdb n (new) p (primary) 1 enter enter w (write) fdisk /dev/sdc n (new) p (primary) 1 enter enter w (write) fdisk /dev/sdd n (new) p (primary) 1 enter enter w (write) fdisk /dev/sde n (new) p (primary) 1 enter enter w (write) fdisk /dev/sdf n (new) p (primary) 1 enter enter w (write) # Relecture de la table de partitions /sbin/partx -u /dev/sdb1 /sbin/partx -u /dev/sdc1 /sbin/partx -u /dev/sdd1 /sbin/partx -u /dev/sde1 /sbin/partx -u /dev/sdf1 |
Nous allons maintenant configurer les règles UDEV pour que les disques partagés soient reconnus et associés à des disques ASM de manière nominative.
Démarrer les deux noeuds rac1 et rac2.
Configurer le fichier /etc/scsi_id.config :
Sur rac1 et rac2 echo "options=-g" >> /etc/scsi_id.config |
Lister les identifiants de chaque disque partagé :
# Uniquement sur rac1 /lib/udev/scsi_id -g -u -d /dev/sdb 1ATA_VBOX_HARDDISK_VBad30695d-fbf40945 /lib/udev/scsi_id -g -u -d /dev/sdc 1ATA_VBOX_HARDDISK_VB469cf1b5-0dd6bff1 /lib/udev/scsi_id -g -u -d /dev/sdd 1ATA_VBOX_HARDDISK_VB421b62c6-3cc786e8 /lib/udev/scsi_id -g -u -d /dev/sde 1ATA_VBOX_HARDDISK_VBed201e7f-f3760553 /lib/udev/scsi_id -g -u -d /dev/sdf 1ATA_VBOX_HARDDISK_VB98e98274-cccdfdda |
A partir des identifiants obtenus, ajouter les règles UDEV sur rac1 et rac2 :
# rac1 et rac2 vi /etc/udev/rules.d/99-oracle-asmdevices.rules KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="1ATA_VBOX_HARDDISK_VBad30695d-fbf40945", SYMLINK+="asm_crs_01", OWNER="grid", GROUP="dba", MODE="0660" KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="1ATA_VBOX_HARDDISK_VB469cf1b5-0dd6bff1", SYMLINK+="asm_data_01", OWNER="grid", GROUP="dba", MODE="0660" KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="1ATA_VBOX_HARDDISK_VB421b62c6-3cc786e8", SYMLINK+="asm_data_02", OWNER="grid", GROUP="dba", MODE="0660" KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="1ATA_VBOX_HARDDISK_VBed201e7f-f3760553", SYMLINK+="asm_fra_01", OWNER="grid", GROUP="dba", MODE="0660" KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="1ATA_VBOX_HARDDISK_VB98e98274-cccdfdda", SYMLINK+="asm_fra_02", OWNER="grid", GROUP="dba", MODE="0660" |
Redémarrer les 2 noeuds rac1 et rac2 :
shutdown -r now
Après le redémarrage, vérifier que les disques ASM sont bien présents et que les disques /dev/sd[b-f]1 appartiennent à grid :
# sur rac1 et rac2 ls -l /dev/asm* lrwxrwxrwx. 1 root root 4 21 mai 12:09 /dev/asm_crs_01 -> sdb1 lrwxrwxrwx. 1 root root 4 21 mai 12:09 /dev/asm_data_01 -> sdc1 lrwxrwxrwx. 1 root root 4 21 mai 12:09 /dev/asm_data_02 -> sdd1 lrwxrwxrwx. 1 root root 4 21 mai 12:09 /dev/asm_fra_01 -> sde1 lrwxrwxrwx. 1 root root 4 21 mai 12:09 /dev/asm_fra_02 -> sdf1 ls -l /dev/sd?1 brw-rw----. 1 root disk 8, 1 21 mai 12:09 /dev/sda1 brw-rw----. 1 grid dba 8, 17 21 mai 12:09 /dev/sdb1 brw-rw----. 1 grid dba 8, 33 21 mai 12:09 /dev/sdc1 brw-rw----. 1 grid dba 8, 49 21 mai 12:09 /dev/sdd1 brw-rw----. 1 grid dba 8, 65 21 mai 12:09 /dev/sde1 brw-rw----. 1 grid dba 8, 81 21 mai 12:09 /dev/sdf1 |
Si un problème subsiste, il est possible de débuger les UDEV au moyen de : udevadm test /block/sdb/sdb1
Normalement, Oracle n'est certifié que sur Red Hat et pas sur Centos.Néanmoins, il y a possibilité de faire croire que l'on est sur une Red Hat. Voici la marche à suivre :
# Sur rac1 et rac2 rm -f /etc/redhat-release echo "Red Hat Enterprise Linux Server release 8.2 (Ootpa)" > /etc/redhat-release mv /etc/centos-release /etc/centos-release_old rm -f /etc/system-release ln -s /etc/redhat-release /etc/system-release |
La configuration des deux noeuds du cluster est maintenant terminée.
La deuxième partie de cette série d'article traitera de l'installation d'Oracle Grid Infrastructure et Oracle Database.