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

Correlar discos de ASM con sistema

Hoy vamos a ver un pequenio y sendillo script para correlar los discos del sistema operativo y el ASM

#!/bin/bash
for i in `ls /dev/oracleasm/disks/ `; do
ASMDEVICE=/dev/oracleasm/disks/$i
#echo "Looking for $ASMDEVICE"
MINOR=`ls -l ${ASMDEVICE} |awk '{ print $5}'`
MAYOR=`ls -l ${ASMDEVICE} |awk '{ print $6}'`
DISKDEV=`ls -l /dev |grep -w $MAYOR | grep -w $MINOR|awk '{ print $10}'`
echo " The ASM device $ASMDEVICE is $DISKDEV"
#echo "The device $ASMDEVICE has a mayor=$MAYOR and minor=$MINOR"
#ls -l /dev/$DISKDEV
#ls -l ${ASMDEVICE}
#echo "====================================="
done

Como crear un asm sin tener discos

Hoy vamos a ver como hacerle trampas a Oracle para levatar una instancia de ASM sin tener discos en el servidor.

Supongamos que el ORACLE_HOME del grid lo tenemos en /u01/app/oracle/product/19c/grid, los pasos a seguir serian


-- == Fake disk 
sudo dd if=/dev/zero of= /u01/app/oracle/product/19c/grid/ASMFAKE.img bs=1M count=5000
sudo losetup /dev/loop1  /u01/app/oracle/product/19c/grid/ASMFAKE.img
 

  
sudo /usr/sbin/asmtool -C -l /dev/oracleasm -n FAKE1  -s /dev/loop1 -a force=yes
sudo /usr/sbin/oracleasm scandisks
sudo /usr/sbin/oracleasm listdisks

Con esto, cuando ejecutemos el asmca vermos que hay un disco llamado FAKE1 que no es otra cosa que el disc ASMFAKE que hemos creado.

Error PRKO-2207 : Warning:–spfile option has been deprecated and will be ignored

Hoy me he encontrado con un eroor curioso.
Cuando he intentado modificar la ubicacionn del spfile con el comando

srvctl modify asm -spfile +DATA/ASM/ASMPARAMETERFILE/initasm.ora

El sistema me ha devuelto el error
PRKO-2207 : Warning:-spfile option has been deprecated and will be ignored

Cual ha sido mi sorpresa al ver que la modificacion del spfile o el listener en el asm con el comando srvctl esta deprecated.
Segun lanota de soporte «PRKO-2207 : Warning:-spfile option has been deprecated and will be ignored» for ASM instance (Doc ID 2227045.1) la manera de llevarlo a cabo ahora es mediante os comandos de oracle, estoson:

Limpiando el FLASHBACK de la FRA

Hoy vamos a ver una de esas entradas que, nos puede volver algo locos, pero cuya solucion no dejan de ser asombrosamente sencilla.

Cuando tenemos servidores con un diskgroup de FRA compartido, podemos tener el caso de que la ocupacion de la FRA de una de ellas ponga en peligro la disponibilidad e todas ellas.
Esto se agrava aun mas en el caso de que tengamos el Flashback activado.
Veamos un caso practico , aqui tenemos una base de datos donde toda la ocupacion esta en el Flashback

+FRA/SIDTEST/ subdirectories size
Subdir             Used MB       Mirror MB
------             -------       ---------
ARCHIVELOG/           306             306
CHANGETRACKING/        12              12
CONTROLFILE/
FLASHBACK/          163251          163251
ONLINELOG/
     ------         -------       ---------
Total                163569          163569

SI llevamoS a cabo algunos chequeos sobre la FRA tenemos que


SQL> select NAME,FLASHBACK_ON from v$database;
NAME                                                        FLASHBACK_ON
------------------------------------------------------------ ------------------------------------------------------
SIDTEST                                                      YES

SQL> archive log list
Database log mode         Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     284244
Next log sequence to archive   284246
Current log sequence           284246

show parameter undo_retention
NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
undo_retention                       integer                           900

SQL> show parameter DB_FLASHBACK_RETENTION_TARGET
NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
db_flashback_retention_target        integer                           1440

SQL> show parameter  db_recovery_file_dest
NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
db_recovery_file_dest                string                            +FRA
db_recovery_file_dest_size           big integer                       600G


SQL> show parameter  db_recovery_file_dest_size
------------------------------------ --------------------------------- ------------------------------
db_recovery_file_dest_size           big integer                       600G


SQL> select  name,flashback_on   from   v$tablespace where flashback_on!='YES';
no rows selected

SQL> SELECT ESTIMATED_FLASHBACK_SIZE/1024/1024/1024 Gb  FROM V$FLASHBACK_DATABASE_LOG;
        GB
----------
 61.307373

SQL> SELECT FLASHBACK_SIZE/1024/1024/1024 Gb  FROM V$FLASHBACK_DATABASE_LOG;
        GB
----------
159.225609

El problema que tenemos, es que queremos liberar esos 160 Gb, pero no podemos.

Como hacerlo

Hay un truco muy sucio, pero efectivo, es modificar el parametro del tamaño del db_recovery_file_dest_size

En el momento en que seteamos el db_recovery_file_dest_size por debajo de laocupacion actual, la propia base de datos vacia ficheros

 select sum(FLASHBACK_SIZE)/1024/1024/1024
 from V$FLASHBACK_DATABASE_LOG;
SUM(FLASHBACK_SIZE)/1024/1024/1024
----------------------------------
                        159.225609

SQL>  alter system set db_recovery_file_dest_size=50G;
System altered.

SQL> alter system set db_recovery_file_dest_size=600G;
System altered.

select sum(FLASHBACK_SIZE)/1024/1024/1024
 from V$FLASHBACK_DATABASE_LOG;
SUM(FLASHBACK_SIZE)/1024/1024/1024
----------------------------------
                        48.3398438

Veamos que ha asado en el alert.log

ALTER SYSTEM SET db_recovery_file_dest_size='50G' SCOPE=BOTH;
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_22.12053.988373613
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_23.1360.988373647
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_24.12976.988373689
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_25.3952.988373743
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_26.3865.988373799
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_27.12048.988374121
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_28.12304.988374251
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_29.12489.988374301
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_30.1388.988374391
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_31.2666.988374467
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_32.3815.988374789
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_44.4188.988555917
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_45.3063.988555949
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_46.14572.988555983
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_47.12737.988556005
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_48.2546.988556023
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_49.4396.988556049
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_50.2232.988556075
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_51.11446.988556097
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_52.13247.988556125
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_53.13228.988556147
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_60.13017.1003940269
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_54.1819.988556173
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_61.4863.1004080645
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_62.11394.1004080677
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_63.11263.1004083037
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_33.13079.988374861
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_34.11600.988374963
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_35.11804.988377507
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_36.4013.988377931
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_37.3242.988378457
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_59.11364.1003507407
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_38.4922.988378951
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_1.13038.988205331
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_2.1565.988205339
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_64.10813.1004102837
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_3.1899.988209247
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_4.11864.988209287
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_5.1311.988209309
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_6.1715.988209341
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_65.9603.1004103287
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_7.11990.988209441
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_8.3989.988209567
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_9.12500.988209599
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_10.6424.988209633
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_55.1243.989342719
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_11.13330.988209659
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_12.12103.988209683
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_56.3201.989352547
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_66.8648.1004135213
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_67.1132.1004135251
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_68.5686.1004135281
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_69.10834.1004135313
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_70.11789.1004135357
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_71.11145.1004135395
Deleted Oracle managed file +FRA/SIDTEST/flashback/log_72.13516.1004135445
ALTER SYSTEM SET db_recovery_file_dest_size='600G' SCOPE=BOTH;

cOMO PODEIS VER.. SUCIO PERO EFECTIVO