Instalacion de Oracle 26ai- Creacion de ASM

Seguimos con la seria de la instalación de un Oracle 26ai , ahora vamos a por el ASM

El appliance en el que estoy usando de laboratorio es bastante raquítico, con un pequeño disco de 100Gb, por lo que habra que apañarse con lo que tenemos,.
Mi configuracion de disco es :

[root@gigabyte u01]# fdisk -l
Disk /dev/sda: 111.79 GiB, 120034123776 bytes, 234441648 sectors
Disk model: KINGSTON SUV400S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x00fde38f

Device     Boot     Start       End   Sectors  Size Id Type
/dev/sda1  *         2048 156250111 156248064 74.5G 83 Linux
/dev/sda2       156250112 181415935  25165824   12G 82 Linux swap / Solaris

Asi que vamos a crear dos discos pequeños de 5 Gb que pondremos en /dev/sda3 y /dev/sda4 para poder hacer ver que tenemos un DATA y FRA , el disco quedará:

[root@gigabyte ~]# fdisk -l
Disk /dev/sda: 111.79 GiB, 120034123776 bytes, 234441648 sectors
Disk model: KINGSTON SUV400S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x00fde38f

Device     Boot     Start       End   Sectors  Size Id Type
/dev/sda1  *         2048 156250111 156248064 74.5G 83 Linux
/dev/sda2       156250112 181415935  25165824   12G 82 Linux swap / Solaris
/dev/sda3       181415936 191180799   9764864  4.7G 83 Linux
/dev/sda4       191180800 200945663   9764864  4.7G 83 Linux

Descargaremos el asmlib desde
https://www.oracle.com/linux/downloads/linux-asmlib-v9-downloads.html e instalaremos los paquetes.
Una vez instalados,configuraremos el orcleasm

[root@gigabyte ~]# oracleasm configure -i
Configuring the Oracle ASM system service.
This will configure the on-boot properties of the Oracle ASM system
service.  The following questions will determine whether the service
is started on boot and what permissions it will have.  The current
values will be shown in brackets ('[]').  Hitting  without
typing an answer will keep that current value.  Ctrl-C will abort.
Default user to own the ASM disk devices []: grid
Default group to own the ASM disk devices []: asmdba
Start Oracle ASM system service on boot (y/n) [y]: y
Scan for Oracle ASM disks when starting the oracleasm service (y/n) [y]: y
Maximum number of ASM disks that can be used on system [2048]:
Enable iofilter if kernel supports it (y/n) [y]: y
Writing Oracle ASM system service configuration: done

Configuration changes only come into effect after the Oracle ASM
system service is restarted.  Please run 'systemctl restart oracleasm'
after making changes.

WARNING: All of your Oracle and ASM instances must be stopped prior
to restarting the oracleasm service.

[root@gigabyte ~]# systemctl stop oracleasm
[root@gigabyte ~]# systemctl start oracleasm
[root@gigabyte ~]# systemctl status oracleasm
● oracleasm.service - Oracle ASM Service
     Loaded: loaded (/usr/lib/systemd/system/oracleasm.service; enabled; preset: disabled)
     Active: active (exited) since Wed 2026-01-28 17:06:33 CET; 4s ago
    Process: 5027 ExecStartPre=/usr/bin/udevadm settle -t 120 (code=exited, status=0/SUCCESS)
    Process: 5028 ExecStart=/usr/sbin/oracleasm.init start (code=exited, status=0/SUCCESS)
   Main PID: 5028 (code=exited, status=0/SUCCESS)
        CPU: 378ms

Jan 28 17:06:33 gigabyte.pamplona.name systemd[1]: Starting Oracle ASM Service...
Jan 28 17:06:33 gigabyte.pamplona.name oracleasm.init[5042]: Mounting oracleasm driver filesystem: Not applicable with UEK8
Jan 28 17:06:33 gigabyte.pamplona.name oracleasm.init[5053]: Reloading disk partitions: done
Jan 28 17:06:33 gigabyte.pamplona.name oracleasm.init[5053]: Cleaning any stale ASM disks...
Jan 28 17:06:33 gigabyte.pamplona.name oracleasm.init[5053]: Setting up iofilter map for ASM disks: done
Jan 28 17:06:33 gigabyte.pamplona.name oracleasm.init[5065]: Scanning system for ASM disks...
Jan 28 17:06:33 gigabyte.pamplona.name oracleasm.init[5081]: Disk scan successful
Jan 28 17:06:33 gigabyte.pamplona.name systemd[1]: Finished Oracle ASM Service.

Como formatear los discos

crearemos los discos, en mi caso, al ser un pequeño sistema de prueba,estos han de ser particiones en un disco, en el caso de produccion,creariamos una particion única para cada disco.

[root@gigabyte ~]# oracleasm  createdisk DATA01 /dev/sda3
Writing disk header: done
Instantiating disk: done
[root@gigabyte ~]# oracleasm  createdisk FRA01 /dev/sda4
Writing disk header: done
Instantiating disk: done

[root@gigabyte ~]# oracleasm  scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Setting up iofilter map for ASM disks: done
Scanning system for ASM disks...

[root@gigabyte ~]# oracleasm  listdisks
DATA01
FRA01

Evitar problemas con SElinux

Para evitar problemas en los siguientes pasos con con SeLinux, ejecutaremos :

semanage fcontext -a -e /bin /u01/app/grid/bin
semanage fcontext -a -e /lib /u01/app/grid/lib
semanage fcontext -a -e /etc /etc/oracle/scls_scr

Configurar el CRS/HAS

Una vez tenemos los discos creados, procederemos a configurar el CRS,para eso, como root
ejecutaremos:

[root@gigabyte ~]# export GI_HOME=/u01/app/grid
[root@gigabyte ~]#  $GI_HOME/perl/bin/perl -I $GI_HOME/perl/lib -I $GI_HOME/crs/install $GI_HOME/crs/install/roothas.pl
Using configuration parameter file: /u01/app/grid/crs/install/crsconfig_params
The log of current session can be found at:
  /u01/app/oracle/crsdata/gigabyte/crsconfig/roothas_2026-01-28_05-21-47PM.log
2026/01/28 17:21:52 CLSRSC-363: User ignored prerequisites during installation
LOCAL ADD MODE
Creating OCR keys for user 'grid', privgrp 'oinstall'..
Operation successful.
2026/01/28 17:23:12 CLSRSC-330: Adding Clusterware entries to file 'oracle-ohasd.service'

gigabyte     2026/01/28 17:25:07     /u01/app/oracle/crsdata/gigabyte/olr/backup_20260128_172507.olr     2107015493
2026/01/28 17:25:09 CLSRSC-327: Successfully configured Oracle Restart for a standalone server

configuracion de oracle net

Como usuario grid iremos a $ORACLE_HOME/network/admin y crearemos los ficheros
sqlnet.ora

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
DIAG_ADR_ENABLED=ON
SQLNET.EXPIRE_TIME= 10
SQLNET.INBOUND_CONNECT_TIMEOUT=60

listener.ora

LISTENER =
   (DESCRIPTION_LIST =
    (DESCRIPTION =
       (ADDRESS = (PROTOCOL = TCP)(HOST = gigabyte.pamplona.name)(PORT = 1521))
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      )
   )
USE_SID_AS_SERVICE_LISTENER=ON
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON
VALID_NODE_CHECKING_REGISTRATION_LISTENER=ON
LOG_FILE_SIZE_LISTENER=50
LOG_FILE_NUM_LISTENER=365

Y despues, crearemos el servicio del listner

grid@gigabyte admin]$ $GI_HOME/bin/srvctl add listener -listener LISTENER -oraclehome  $GI_HOME

grid@gigabyte admin]$ $GI_HOME/bin/srvctl start listener

[grid@gigabyte admin]$ $GI_HOME/bin/crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.LISTENER.lsnr
               ONLINE  ONLINE       gigabyte                 STABLE
ora.ons
               OFFLINE OFFLINE      gigabyte                 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        OFFLINE OFFLINE                               STABLE
ora.diskmon
      1        OFFLINE OFFLINE                               STABLE
ora.evmd
      1        ONLINE  ONLINE       gigabyte                 STABLE
--------------------------------------------------------------------------------

creacion del ASM

Ahora crearemos el ASM con:

[grid@gigabyte admin]$ $GI_HOME/bin/asmca -silent \
      -configureASM \
      -sysAsmPassword CHANGE.me.26ai \
      -asmsnmpPassword CHANGE.me.26ai \
      -diskString "ORCL:*"  \
      -diskGroupName DATA \
      -disk "ORCL:DATA*" \
      -param ASM_POWER_LIMIT=1 \
      -param DIAGNOSTIC_DEST=$ORACLE_BASE \
      -param AUDIT_SYS_OPERATIONS=TRUE \
      -redundancy EXTERNAL



ASM has been created and started successfully.

[DBT-30001] Disk groups created successfully. Check /u01/app/oracle/cfgtoollogs/asmca/asmca-260128PM053656.log for details.

Luego, craremos los otros diskgroups al estilo de

$GI_HOME/bin/asmca -silent \
      -createDiskGroup \
      -sysAsmPassword CHANGE.me.26ai \
      -asmsnmpPassword CHANGE.me.26ai \
      -diskString "ORCL:*"  \
      -diskGroupName FRA \
      -disk "ORCL:FRA*" \
      -param ASM_POWER_LIMIT=1 \
      -param DIAGNOSTIC_DEST=$ORACLE_BASE \
      -param AUDIT_SYS_OPERATIONS=TRUE \
      -redundancy EXTERNAL
[DBT-30001] Disk groups created successfully. Check /u01/app/oracle/cfgtoollogs/asmca/asmca-260128PM053938.log for details.

Con esto, ya tendremos el asm creado e instalado en nuestra versio

[grid@gigabyte admin]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                   State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       gigabyte                 STABLE
ora.FRA.dg
               ONLINE  ONLINE       gigabyte                 STABLE
ora.LISTENER.lsnr
               ONLINE  ONLINE       gigabyte                 STABLE
ora.asm
               ONLINE  ONLINE       gigabyte                 Started,STABLE
ora.ons
               OFFLINE OFFLINE      gigabyte                 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.cssd
      1        ONLINE  ONLINE       gigabyte                 STABLE
ora.diskmon
      1        OFFLINE OFFLINE                               STABLE
ora.evmd
      1        ONLINE  ONLINE       gigabyte                 STABLE
--------------------------------------------------------------------------------
[grid@gigabyte admin]$ asmcmd lsdg
State    Type    Rebal  Sector  Logical_Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB  Usable_file_MB  Offline_disks  Voting_files  Name
MOUNTED  EXTERN  N         512             512   4096  1048576      4768     4701                0            4701              0             N  DATA/
MOUNTED  EXTERN  N         512             512   4096  1048576      4768     4704                0            4704              0             N  FRA/

Siguiente paso.. creación de una base de datos 26ai

Instalacion de Oracle 26ai – Oracle restart

Vamos a continuar con la instalacion de un Oracle26ai

En la anterior entrada vimos como teniamos que preparar un Oracle Linux 9.
Ahora veremos como instalar el Oracle Restart. Para no hacer la entrada muy larga, instalaremos solamente los binarios y en la siguiente configuraremos la capa de almacenamiento y crearemos el ASM.

Nosotros usaremos el paquete clásico LINUX.X64_2326100_grid_home.zip ya que instalar desde .rpm no tiene ninguna gracia.

Tras haer ejecutado esos pasos, nos conectaremos con nuestro usuario GRID y pondremos las variables de entorno en su fichero .bash_profile.

En muchos documentos hablan indistintamente e GI_HOME y GROD_HOME, con lo que nosotros nos ahorraremos el aburrimiento de ir poniéndolas siempre añadiéndolas directamente en nuestro bash_profile


export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/grid
export GI_HOME=$GRID_HOME
export ORACLE_HOME=$GRID_HOME
export ORACLE_SID=+ASM
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
umask 022
# Required for install and compile
export VUQDISK_GRP=oinstall
export CV_ASSUME_DISTID=OL8

Descomprimir binarios

Iremos a nuestro ORACLE_HOME y descomprimiremos los binarios:

cd $ORACLE_HOME
unzip /var/tmp/26ai/LINUX.X64_2326100_grid_home.zip

Descomprimir el utimo Opatch

Siempre usaremos la última versión de Opatch, como curiosidad, veremos como aun no le han cambiado el nombre de 23ai a 26 ai 😉

cd $ORACLE_HOME
rm -fR OPatch
unzip /var/tmp/26ai/p6880880_230000_LINUX.zip

Instalar el paquete cvuqdisk

Aunque pensábamos que todos los pasos requeridos como root ya estaban, exsiste algún paquete requerido que no es parte de la distribución sino del propio grid, por lo que solo lo tenemos cuando descargamos el software del grid, el paquete cvuqdisk puede encontrarse con un simple find, y lo instalaremos con el gestor de paquetes de red-hat dnf con el comando:

grid@gigabyte grid]$ find . -name *.rpm
./cv/remenv/cvuqdisk-1.0.10-1.rpm
./cv/rpm/cvuqdisk-1.0.10-1.rpm
sudo dnf install -y ./cv/rpm/cvuqdisk-1.0.10-1.rpm

Preparar un archivo de response

Ahora tendremos que preparar un archivo de respuesta con las configuraciones que queremos.
Esto va a ser mas sencillo y limpio que tener una linea de comandos enormes , para ello haremos una copia del gridsetup.rsp y modificaremos las lineasque vemos en el bloque de debajo:

cp ./install/response/gridsetup.rsp ./install/response/pamplona_dba.rsp


grid@gigabyte grid]$ diff ./install/response/gridsetup.rsp ./install/response/pamplona_dba.rsp

< INVENTORY_LOCATION= > INVENTORY_LOCATION=/u01/app/oraInventory
---
< installOption= > installOption=CRS_SWONLY
---
< ORACLE_BASE= > ORACLE_BASE=/u01/app/oracle
---
< OSDBA= > OSDBA=asmdba
---
< OSOPER= > OSOPER=asmoper
---
< OSASM= > OSASM=asmadmin
---
< configureAsExtendedCluster= > configureAsExtendedCluster=false
---
< executeRootScript= > executeRootScript=false

Una vez tenemos nuestro fichero, podríamos proceder a la instalacion

Nota Desde Cafe database nos dieron un consejo muy interesante, y es que podemos usar la utilidad de verificación de cluster para asegurarnos que todos los prerrequisitos de nuestro GRID se cumplen, para ello ejecutaríamos:

/runcluvfy.sh stage -pre crsinst -n `hostname -s`

INstalacion

Y llegamos al momento de la verdad, donde haríamos la Instalacion como usuario gridcon el comando

cd $ORACLE_HOME
./gridSetup.sh -silent -responseFile ./install/response/pamplona_dba.rsp

Nota En el momento de hacer este documento no exsiste ningun parche adicional que aplicar, en el caso de que hubiese disponible algun RU, deberiamos de descargarlo y ejecutar como usuario grid

cd $ORACLE_HOME
./gridSetup.sh -silent  -applyRU /var/tmp/[NUMERO_RU_DESCOMPRIMIDO] -responseFile ./install/response/pamplona_dba.rsp

Esto nos dará una salida similar a:

-----------------------------------------------
[WARNING] [INS-13014] Target environment does not meet some optional requirements.
   CAUSE: Some of the optional prerequisites are not met. See logs for details. gridSetupActions2026-01-25_06-23-45PM.log.
   ACTION: Identify the list of failed prerequisite checks from the log: gridSetupActions2026-01-25_06-23-45PM.log. Then either from the log file or from installation manual find the appropriate configuration to meet the prerequisites and fix it manually.
The response file for this session can be found at:
 /u01/app/grid/install/response/grid_2026-01-25_06-23-45PM.rsp

You can find the log of this install session at:
 /tmp/GridSetupActions2026-01-25_06-23-45PM/gridSetupActions2026-01-25_06-23-45PM.log

As a root user, run the following script(s):
	1. /u01/app/oraInventory/orainstRoot.sh
	2. /u01/app/grid/root.sh

Run /u01/app/oraInventory/orainstRoot.sh on the following nodes:
[gigabyte]
Run /u01/app/grid/root.sh on the following nodes:
[gigabyte]


Successfully Setup Software with warning(s).
Moved the install session logs to:
 /u01/app/oraInventory/logs/GridSetupActions2026-01-25_06-23-45PM

Ejecucion de comandos como root

Vamos pues a ejecutarlos comandos de root

[root@gigabyte u01]# /u01/app/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u01/app/oraInventory to oinstall.
The execution of the script is complete.
[root@gigabyte u01]# /u01/app/grid/root.sh
Check /u01/app/grid/install/root_gigabyte.pamplona.name_2026-01-25_18-31-43-054623113.log for the output of root script

Con lo que ya tenemos los binarios listos !!

Siguiente paso en:

Instalacion oracle 26ai -Preparacion del servidor

Ya esta disponible la version on-prem de oracle26ai, con lo que en esta entrada vamos a ver de manera sencilla los pasos para su instalacion.

Paqueteria

Vamos a partir de una OEL9 con la instalacion mínima, por lo que , tendremos que instalar algunos paquetes de comodities que nos facilitaran el trabajo, como son:

  • binutils c
  • compat-libstdc++-33
  • elfutils-libelf
  • elfutils-libelf-devel
  • fontconfig-devel
  • glibc
  • glibc-devel
  • ksh
  • libaio
  • libaio-devel
  • libX11
  • libXau
  • libXi
  • libXtst
  • libXrender
  • libXrender-devel
  • libgcc
  • libxcb
  • make
  • smartmontools
  • sysstat
  • net-tools
  • nfs-utils
  • python3
  • python3-configshell
  • python3-rtslib
  • python3-six
  • targetcli
  • bc
  • tmux
  • parted
  • tcpdump
  • zip
  • unzip
  • xterm
  • lsof
  • lsscsi

Esto lo haremos con el comando

dnf install -y binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel \
fontconfig-devel glibc glibc-devel ksh libaio libaio-devel libX11 libXau libXi \
libXtst libXrender libXrender-devel libgcc libxcb make \
smartmontools sysstat net-tools nfs-utils python3 python3-configshell \
python3-rtslib python3-six targetcli bc compat-openssl11 tmux \
parted tcpdump zip unzip xterm lsof lsscsi \

Definicion de limites

Editaremos el fichero /etc/security/limits.d/30-oracle.conf añadiendo el contenido:

grid     soft   nofile   1024
grid     hard   nofile   65536

grid     soft   nproc    16384
grid     hard   nproc    16384

grid     soft   stack    10240
grid     hard   stack    32768

grid     soft   memlock  134217728
grid     hard   memlock  134217728

oracle     soft   nofile   1024
oracle     hard   nofile   65536

oracle     soft   nproc    16384
oracle     hard   nproc    16384

oracle     soft   stack    10240
oracle     hard   stack    32768

oracle     soft   memlock  134217728
oracle     hard   memlock  134217728

Configuration de red

Hay qequeños ajustes de red que deben de hacerse, si el sistema no esta propiamente registrado en un dns, deberemos de añadir la entrada en el fichero /etc/hosts por ejemplo

192.168.1.149 gigabyte.pamplona.name gigabyte

Ademas de esto, deberemos de poner en el fichero /etc/sysconfig/network el contenido

NOZEROCONF=yes

Y reniniciar el subsistema de red con el comando systemctl restart NetworkManager

Configuración de Huge Pages

Deberemos de meterle mano al GRUB para añadir la line transparent_hugepage=madvise
Editaremos el fichero /etc/default/grub

y donde ponía
GRUB_CMDLINE_LINUX=»resume=UUID=7691cd59-d957-4d6f-8d2b-e6825eea5403″
Lo modificaremos por
GRUB_CMDLINE_LINUX=»resume=UUID=7691cd59-d957-4d6f-8d2b-e6825eea5403 transparent_hugepage=madvise»
Y regeneraremos el grub con el comando grub2-mkconfig -o /boot/grub2/grub.cfg –update-bls-cmdline
Tras esto reiniciaremos el server.

Una vez reiniciado,comprobaremos que está así mirando el fichero /sys/kernel/mm/transparent_hugepage/enabled

[root@gigabyte ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never

Por que aparece ese valor y no always
Es el modo en el que Transparent HugePages se activan solo cuando un proceso lo solicita explícitamente, evitando los problemas de rendimiento que genera THP siempre activo (“always”) en bases de datos.

Creacion de usuarios y grupos

En primer lugar, como siempre tendremos que crear la estructura de usuarios y grupos que soportara la instalacion

# Crear grupos
groupadd -g 54321 oinstall
groupadd -g 54322 dba
groupadd -g 54323 oper
groupadd -g 54324 backupdba
groupadd -g 54325 dgdba
groupadd -g 54326 kmdba
groupadd -g 54327 asmdba
groupadd -g 54328 asmoper
groupadd -g 54329 asmadmin
groupadd -g 54330 racdba

# Usuario grid (Grid Infrastructure + ASM)
useradd -u 54331 -g oinstall -G dba,asmadmin,asmdba,asmoper,racdba grid
passwd grid

# Usuario oracle (Base de datos)
useradd -u 54321 -g oinstall -G dba,oper,backupdba,dgdba,kmdba,asmdba,asmoper,asmadmin,racdba oracle
passwd oracle

Creacion de arbol de directirios

Una vez tenemos los usuarios, creareos el arbol de directorios donde queremos instalar el grid.
En nuestro caso sera

  • /u01/app/grid Para el GRID
  • /u01/app/oracle/product/26ai/dbhome_1 Para el motor de bases de datos
  • /u01/app/oracle será nuestro ORACLE_BASE

# 3. Directorios OFA compartidos
mkdir -p /u01/app
mkdir -p /u01/app/oraInventory # Ubicacion del inventory de la base de datos
mkdir -p /u01/app/oracle # ORACLE_BASE compartido
mkdir -p /u01/app/oracle/product/26ai/dbhome_1 # Home de la primera base dedatos
mkdir -p /u01/app/grid # GRID_HOME

# 4. Permisos
chown -R oracle:oinstall /u01/app
chown -R grid:oinstall /u01/app/grid
chown -R oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/app

Con estos sencillos pasos,deberíamos de tener el servidor configurado para proceder a la instalacion , que podremos ver en las entradas

Creación de Discos y ASM con Ansible

Siguiendo con las entradas de Aprovisionamiento de una base de datos con ansible vamos a ver la manera de automatizar la configuracion de discos de ASM mediante ansible.

Supongamos tenemos los prerrequisitos:

  • Un servidor OEL7 con el CRS instalado y el listener en marcha tal y como explicabamos en Instalando el grid infraesturcure con Ansible
    • Dos discos para nuestro diskgroup DATA
    • un disco para nuestro diskgroup FRA
    • un disco para nuestro diskgroup REDO1
    • un disco para nuestro diskgroup REDO2

        Para la ejecucion de nuestro taller de creacion de asm usaremos los siguientes ficheros del repositorio

        Raiz
        |
        |- vars:
             |- oracle_standard.yaml      Fichero con los estandares del departamento
        |
        |- templates
        |
         |- files
         |-REQ01_asm_create_disks.yaml  Ejemplo de informacon de  provisionamiento de discos para el ASM 
        |  
        | asmlib_configure.yaml         Playbook que configura el asmlib
        | asmlib_create_disks.yaml      Playbook que configura los discos de ASM 
        | asm_create.yaml               Playbook que crea una instancia +ASM con en el GRID y con los discos previamente instalados
        

        Ficheros de variables

        Al igual que en el resto de ejecuciones del taller vamos a necesitar el fichero oracle_standard.yaml que contiene todas la estandarizacion de nuestro departamento

        Ficheros informacion

        La creacion de discos necesita de la informacion de que discos del sistema operativo van a ir dedicados a que diskgroup, esta informacion la depositaremos en el directorio files, que va a ser el unico directorio donde deberemos/podremos modificar los ficheros .

        El formato del fichero sera el de una lista en yaml en el que indicaremos el nombre del dispositivo para cada uno de los diskgroups.
        [code lang=»py»]
        DATA:
        – /dev/sda
        – /dev/sdb
        FRA:
        – /dev/sdc
        REDO1:
        – /dev/sdd
        REDO2:
        – /dev/sde
        [/code]

        El nomre del fichero sera [REQ]_asm_create_disks. Donde REQ es el valor en mayusculas de la variable req que es el identificador unico de nuestro fichero, este identificador en un entorno de produccion real podria corresponderse con el numero de peticion del sistema gestion de la compañia.

        Creacion de los discos

        Una vez tenemos claros los ficheros de fuentes y variables ejecutaremos nuestros playbooks.

        asmlib_configure.yaml

        El playbook asmlib_configure.yaml vieje a ser el equialente a la ejecucion manual de oracleasm configure -i
        Como podeis ver en el codigo que es bastante basico, ejecuta la configuracion del oracleasm para cada uno de los campos obteniendo la informacion del fichero de variables generico

        [code lang=»py»]
        # Pamplona 2019
        # Playbook which configures_asmlib
        #
        # requires
        # env: name of the server which should be in the inventory
        # vars/oracle_standard.yaml configuration file with all the deppartment values

        – hosts: "{{env}}"
        remote_user: ansible
        become: yes
        become_user: root
        tasks:
        – fail: msg="Error no server definied, please define the env variable in the job"
        when: env is not defined

        – name: "Including standard variables"
        include_vars:
        file: "vars/oracle_standard.yaml"
        – name: configirando usuario
        command: /usr/sbin/oracleasm configure -u "{{oracle_user}}"

        – name: configurando grupo
        command: /usr/sbin/oracleasm configure -g "{{oracle_group}}"

        – name: seteamos al arranque
        command: /usr/sbin/oracleasm configure -e

        – name: activamos el logical block
        command: /usr/sbin/oracleasm configure -b

        – name: arrancamos
        command: /usr/sbin/oracleasm init

        – name: estado
        command: /usr/sbin/oracleasm status
        register: oasm_status

        [/code]

        asmlib_create_disks.yaml

        El segundo paso es la creacion de los discos en el asmlib .
        Este es el playbook que va a requerir de ese fichero externo [REQ]_asm_create_disks, para cada uno de los discos fisios incluidos.

        [code lang=»py»]
        # Pamplona 2019
        # Playbook which checks if the hosts has all the requested prerequisites
        #
        # requires
        # env: name of the server which should be in the inventory
        # REQ: number of request
        # vars/oracle_standard.yaml configuration file with all the department values

        – hosts: "{{env}}"
        remote_user: ansible
        become: yes
        become_user: root
        tasks:
        – fail: msg="Error no server definied, please define the env variable or de request number in the job"
        when: env is not defined or req is not defined

        – name: "Including standard variables"
        include_vars:
        file: "vars/oracle_standard.yaml"

        – name: "Including So {{version}} requisites"
        include_vars:
        file: "files/{{req|upper}}_asm_create_disks.yaml"

        – name: creating DATA disks
        shell:
        cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_DATA0{{ansible_loop.index}} -s {{item}} -a force=yes "
        loop: "{{DATA}}"
        loop_control:
        extended: yes

        – name: Creating FRA disks
        shell:
        cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_FRA0{{ansible_loop.index}} -s {{item}} -a force=yes "
        loop: "{{FRA}}"
        loop_control:
        extended: yes

        – name: Creating REDO1 disks
        shell:
        cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_REDO1_{{ansible_loop.index}} -s {{item}} -a force=yes "
        loop: "{{REDO1}}"
        loop_control:
        extended: yes

        – name: Creating REDO2 disks
        shell:
        cmd: "/usr/sbin/asmtool -C -l /dev/oracleasm -n {{oracle_hostname|upper}}_REDO2_{{ansible_loop.index}} -s {{item}} -a force=yes "
        loop: "{{REDO2}}"
        loop_control:
        extended: yes

        – name: scanning disks
        shell:
        cmd: "/usr/sbin/oracleasm scandisks"

        [/code]
        debilidades
        -Como curiosidad podeis ver que en mi taller no sigo las normativa de oracle, llamando a los diskgroups HOSTNAME_DATA en ved de DATA y manteniendo 2 grupos de REDO en ved e uno.
        -Este playbook solamente puede usarse para provisionamiento y no para añadir nuevos discos a un diskgroup ya exsistente ya que numerara los discos empezando desde cero. (uso del fact ansible_loop.index)

        Creacion del asm

        Llegados a este punto, tenemos el grid corriendo, el listener arriba y los dispositivos creados , por lo que solamente nos queda el crear el ASM
        El siguiente playbook simplemente va a llevar a cabo una creacion del ASM en modo command line silent y añadirle los discos a sus respectivos diskgroups

        [code lang=»py»]
        # Pamplona 2020
        # Playbook which creates a database
        #
        # requires
        # env: name of the server which should be in the inventory
        # vars/oracle_standard.yaml standard values for Oracle
        #

        – hosts: "{{env}}"
        vars:
        type: asm
        remote_user: ansible
        tasks:

        # checking prerequisites
        – fail:
        msg: "Error no server defined, please define the env variable in the job"
        when: env is not defined

        # Loading env
        – name: Including Standard_values
        include_vars:
        file: "vars/oracle_standard.yaml"

        – name: checking oratab
        shell:
        cmd: "cat /etc/oratab|grep +ASM |sed -e ‘s/# line added by Agent/ /g’ -e ‘s/:/ /g’|awk ‘{ print $1}’ "
        register: count

        – fail:
        msg: "ERROR: The chain {{item}} exists at {{env}} /etc/oratab file "
        when: item == "+ASM"
        with_items:
        – "{{count.stdout_lines}}"

        – set_fact:
        oracle_home: "{{oracle_home_directory.asm}}"
        when: type == ‘asm’

        – name: Creating syslog file
        copy:
        dest: /etc/rsyslog.d/30-oracle.conf
        content: |
        "local0.info {{oracle_home}}/rdbms/audit/asmaudit.log
        &~"
        force: yes
        become: yes
        become_user: root

        – name: Creating logrotate file
        copy:
        dest: /etc/logrotate.d/30-oracle_logs
        content: |
        "{{oracle_home}}/rdbms/audit/asmaudit.log {
        weekly
        rotate 4
        compress
        copytruncate
        delaycompress
        notifyempty
        }"
        force: yes
        become: yes
        become_user: root

        – name: create ASM
        become: yes
        become_user: "{{oracle_user}}"
        shell:
        cmd: "{{ oracle_home }}/bin/asmca -silent
        -configureASM
        -sysAsmPassword {{sysasm_passd}}
        -asmsnmpPassword {{asmdbsnmp_passwd}}
        -diskString \"/dev/oracleasm/disks/*\"
        -diskGroupName {{oracle_hostname|upper}}_DATA
        -disk \"/dev/oracleasm/disks/{{oracle_hostname|upper}}_DATA*\"
        -param ASM_POWER_LIMIT=1
        -param DIAGNOSTIC_DEST={{oracle_base}}
        -param AUDIT_SYSLOG_LEVEL=’local0.info’
        -param AUDIT_SYS_OPERATIONS=TRUE
        -redundancy EXTERNAL"

        – name: Create FRA, REDO1 and REDO2
        become: yes
        become_user: "{{oracle_user}}"
        shell:
        cmd: "{{ oracle_home }}/bin/asmca -silent
        -createDiskGroup
        -sysAsmPassword {{sysasm_passd}}
        -diskString \"/dev/oracleasm/disks/*\"
        -diskGroupName {{oracle_hostname|upper}}_{{item}}
        -disk \"/dev/oracleasm/disks/{{oracle_hostname|upper}}_{{item}}*\"
        -redundancy EXTERNAL "
        with_items:
        – FRA
        – REDO1
        – REDO2
        [/code]

Usando los bloques logicos en ASM

Hoy vamos a ver una entrada que nos puede causar grandes dolores de cabeza .

Uno de los problemas con los que nos podemos encontrar cuando se modifica la tecnología de los discos físicos utilizados en el ASM es el cambio del tamaño de bloque lógico.

Supongamos que nos ofrecen un nuevo disco /dev/xvdz

Nosotros intentamos añadirlo al ASM, pero recibimos un error ORA-01378

Errors in file /u01/app/oracle/diag/rdbms/test/TEST/trace/TEST_ora_40862.trc:
ORA-01378: The logical block size (512) of file +REDO is not compatible with the disk sector size 
(media sector size is 4096 and host sector size is 4096)

Veamos las características de este disco

sudo fdisk -l /dev/xvdz
Disk /dev/xvdd: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x00000000

Y veamos ahora otro de los discos que tenemos

The other disks  have sector size 512
Disk /dev/xvdp: 2147.5 GB, 2147483648000 bytes
255 heads, 63 sectors/track, 261083 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Si nos fijamos, el problema que tenemos es que el sector size de nuestro nuevo disco es 8 veces mayor que el del disco viejo (521 / 4096) .

Como solucionamos ahora nuestro problema?

Tal y como indican el el blog flashdba ASM tiene un parámetro en el fichero de configuración llamado ORACLEASM_USE_LOGICAL_BLOCK_SIZE que por defecto esta a false, que era el parámetro por defecto de oracleasm-support-2.1.8.
Podemos ver su valor en el fichero /etc/sysconfig/oracleasm

# ORACLEASM_USE_LOGICAL_BLOCK_SIZE: 'true' means use the logical block size
# reported by the underlying disk instead of the physical. The default
# is 'false'
ORACLEASM_USE_LOGICAL_BLOCK_SIZE=false

Lo que vamos ha hacer es modificarlo a TRUE, de manera que el ASM sea capaz de usar los bloques de manera lógica y no se aferre a la configuración física de los mismos, esto lo hacemos con el script
oracleasm-configure.sh

  • -b|—logical-blocks sets logical blocksize usage
  • -p|—physical-blocks set physical blocksize usage

Veamos ahora cual es la información que nos dará nuestro ASM

[oracle@testserver ~]$ sysasm
 SQL> select NAME,SECTOR_SIZE,BLOCK_SIZE,DATABASE_COMPATIBILITY,COMPATIBILITY,((TOTAL_MB-FREE_MB)*100/TOTAL_MB) PERCENT_USED from v$asm_diskgroup;

NAME         SECTOR_SIZE BLOCK_SIZE DATABASE_COMPATIBILI COMPATIBILITY        PERCENT_USED
-------------------- --------- ---------- -------------------- -------------------- ------------
REDO               4096       4096 10.1.0.0.0           10.1.0.0.0             .249023438
FRA                 512       4096 10.1.0.0.0           12.1.0.0.0             44.1858724
DATA                512       4096 11.2.0.0.0           11.2.0.0.0             90.4637587

Como podeis ver, es un problema que se nos puede dar en bases de datos con ASM antiguos en los que llevemos a cabo un cambio de tecnología física.

Mas informacion en

Oracle ASMLib: Physical and Logical Blocksize