# [23ai] Instalación de Oracle23ai en OraLinux9

*El artículo también se encuentra publicado en Ingles* [*English version*](https://dbaintheshadow.com/23ai-dbca)*.*

En este pequeño artículo, vamos a ver a definir una base de datos 23ai con *Oracle Database Configuration Assistant* (**DBCA**).

Para poder hacer este laboratorio me he creado un **IaaS** en OCI con **Oracle Linux 9**. Es un entorno nuevo con lo que el primer paso que vamos a realizar es la instalación de Oracle 23ai, así que vamos a ello.

```bash
[root@~]# grep PRETTY_NAME /etc/os-release
PRETTY_NAME="Oracle Linux Server 9.6"
```

Para poder realizar la instalación de esta versión, nos vamos apoyar en los siguientes rpm:

```bash
[root@test1 tmp]# ls -lac *rpm
-rw-r--r--. 1 root root 1412957372 Sep  2 09:47 oracle-database-free-23ai-23.9-1.el9.x86_64.rpm
-rw-r--r--. 1 root root      30688 Sep  2 09:30 oracle-database-preinstall-23c-1.0-0.5.el8.x86_64.rpm
```

Dejo a continuación donde podemos descargar cada uno de ellos:

* oracle-database-preinstall-23c-1.0-0.5.el8.x86\_64.rpm, lo podemos descargar desde [aquí](https://yum.oracle.com/repo/OracleLinux/OL8/developer/x86_64/).
    
* oracle-database-free-23ai-23.9-1.el9.x86\_64.rpm. Este rpm lo podemos descargar desde [aquí](https://www.oracle.com/database/free/get-started/).
    

### Instalación y Configuración

* Instalación del RPM oracle-database-preinstall-23c-1.0-0.5.el8.x86\_64.rpm:
    

```bash
[root@tmp]# dnf install oracle-database-preinstall-23c-1.0-0.5.el8.x86_64.rpm -y
Last metadata expiration check: 1:54:40 ago on Tue 02 Sep 2025 07:46:07 AM GMT.
Dependencies resolved.
....
....
Complete!
```

* Instalación del RPM oracle-database-free-23ai-23.9-1.el9.x86\_64.rpm:
    

```bash
[root@test1 tmp]# wget https://objectstorage.....
[root@test1 tmp]# dnf install oracle-database-free-23ai-23.9-1.el9.x86_64.rpm -y
Last metadata expiration check: 2:06:18 ago on Tue 02 Sep 2025 07:46:07 AM GMT.
Dependencies resolved.
....
....                                                                                                                                     3/3
Installed:
  oracle-database-free-23ai-23.9-1.x86_64                                                         oracle-database-preinstall-23ai-1.0-3.el9.x86_64
Complete!
```

Gracias a la instalación de ambos rpm, tendremos el siguiente script **oracle-free-23ai** en /etc/init.d para poder crear nuestra bbdd 23ai. Antes de ejecutar el script, debemos setear la variable DB\_PASSWORD.

```bash
[root@test1 tmp]#  export DB_PASSWORD=oracle
[root@test1 tmp]# (echo "${DB_PASSWORD}"; echo "${DB_PASSWORD}";) | /etc/init.d/oracle-free-23ai configure
Specify a password to be used for database accounts. Oracle recommends that the password entered should be at least 8 characters in length, contain at least 1 uppercase character, 1 lower case character and 1 digit [0-9]. Note that the same password will be used for SYS, SYSTEM and PDBADMIN accounts:
Confirm the password:
Configuring Oracle Listener.
Listener configuration succeeded.
Configuring Oracle Database FREE.
Enter SYS user password:
*****
Enter SYSTEM user password:
********
Enter PDBADMIN User Password:
*********
Prepare for db operation
7% complete
Copying database files
29% complete
Creating and starting Oracle instance
30% complete
33% complete
36% complete
39% complete
43% complete
Completing Database Creation
47% complete
49% complete
50% complete
Creating Pluggable Databases
54% complete
71% complete
Executing Post Configuration Actions
93% complete
Running Custom Scripts
100% complete
Database creation complete. For details check the logfiles at:
 /opt/oracle/cfgtoollogs/dbca/FREE.
Database Information:
Global Database Name:FREE
System Identifier(SID):FREE
Look at the log file "/opt/oracle/cfgtoollogs/dbca/FREE/FREE.log" for further details.

Connect to Oracle Database using one of the connect strings:
     Pluggable database: test1/FREEPDB1
     Multitenant container database: test1
```

Listo, en este punto tendríamos una 23ai lista para poder trabajar. Vamos a configurar los ficheros **.bashrc** y **.bash\_profile** para que sea más sencillo interactuar con los binarios de Oracle, como por ejemplo **sqlplus**, **dbca**, o **tkproff**.

Abajo podemos ver el **.bashrc** después de actualizarlo:

```bash
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
    PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
if [ -d ~/.bashrc.d ]; then
        for rc in ~/.bashrc.d/*; do
                if [ -f "$rc" ]; then
                        . "$rc"
                fi
        done
fi
ORACLE_HOME=/opt/oracle/product/23ai/dbhomeFree; export ORACLE_HOME
PATH=/bin:/usr/bin:/usr/local/sbin:/usr/sbin:$ORACLE_HOME/bin:$ORACLE_HOME/lib:$ORACLE_HOME/OPatch/:$ORACLE_HOME/lib; export PATH
LD_LIBRARY_PATH=${ORACLE_HOME}/lib; export LD_LIBRARY_PATH

ORACLE_SID=FREE; export ORACLE_SID
PDB_NAME=FREEPDB1; export PDB_NAME
```

Nuestra idea inicial no es trabajar con esta versión, sino testear **dbca** para realizar lo siguiente:

* Generar el template de la actual 23ai
    
* Eliminar esta base de datos que hemos creado previamente.
    
* Crear una nueva basa de datos usando el fichero response junto con el template.
    

Todo estos puntos se ejecutaran en modo -**silent**. Essta opción nos permitirá ejecutarr dbca en silent mode.

### Generar el template

```bash
[oracle@test1 ~]$ dbca -silent \
-createTemplateFromDB \
-sourceDB FREE \
-templateName FREE.template \
-sysDBAUserName SYS \
-sysDBAPassword oracle
Prepare for db operation
33% complete
Creating a template from the database
37% complete
40% complete
43% complete
47% complete
50% complete
53% complete
57% complete
60% complete
63% complete
67% complete
Creating template
100% complete
The template "/opt/oracle/product/23ai/dbhomeFree/assistants/dbca/templates/FREE.template.dbt" creation completed.
Look at the log file "/opt/oracle/cfgtoollogs/dbca/silent.log_2025-09-02_12-09-54PM_170638" for further details.
```

### Eliminar la BBDD

Eliminamos la BBDD previamente habiendo hecho un shutdown.

```bash
[oracle@test1 ~]$ dbca -silent \
-deleteDatabase \
-sourceDB FREE \
-sysDBAUserName sys \
-sysDBAPassword oracle
[WARNING] [DBT-11503] The instance (FREE) is not running on the local node. This may result in partial delete of Oracle database.
   CAUSE: A locally running instance is required for complete deletion of Oracle database instance and database files.
   ACTION: Specify a locally running database, or execute DBCA on a node where the database instance is running.
[WARNING] [DBT-19202] The Database Configuration Assistant will delete the Oracle instances and datafiles for your database. All information in the database will be destroyed.
Prepare for db operation
32% complete
Connecting to database
35% complete
39% complete
42% complete
45% complete
48% complete
52% complete
65% complete
Updating network configuration files
68% complete
Deleting instance and datafiles
84% complete
100% complete
Database deletion completed.
Look at the log file "/opt/oracle/cfgtoollogs/dbca/FREE/FREE0.log" for further details.
```

### Creación de la BBDD

Para la creación de la BBDD vamos a trabajar con los siguientes ficheros:

```bash
[oracle@test1 ~]$ ls -lac config/
total 52
drwxr-xr-x. 2 oracle oinstall    49 Sep  3 06:35 .
drwx------. 3 oracle oinstall   127 Sep  2 15:47 ..
-rw-r-----. 1 oracle oinstall 20942 Sep  2 15:47 FREE.template.dbt
-rw-r-----. 1 oracle oinstall 25378 Sep  3 06:35 shadow.rsp
```

* **FREE.template.dbt**, el template que hemos generado en el paso previo. Lo vamos a editar porque solo queremos que nos defina la seed. Para ello, procedemos a eliminar todas las referencias de FREEPDB1:
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1756818902278/4902b0c3-df86-4a22-b5ca-240319b3a2b1.png align="center")

* **shadow.rsp**. Es el fichero response para automatizar el **dbca**. Es una copia del fichero $ORACLE\_HOME/assistants/dbca/dbca.rsp modificado para nuestro caso.
    
    Los valores que contiene el response son los siguientes:
    
    ```bash
    [oracle@test1 ~]$ more config/shadow.rsp | grep -v ^$ | grep -v ^#
    responseFileVersion=/oracle/assistants/rspfmt_dbca_response_schema_v23.0.0
    gdbName=FREE
    sid=FREE
    createAsContainerDatabase=true
    numberOfPDBs=0
    templateName=/home/oracle/config/FREE.template.dbt
    sysPassword=*********
    systemPassword=********
    ```
    

Una vez modificado ambos ficheros, lanzamos la creación de nuestra 23ai vía **dbca** en silent mode:

```bash
[oracle@test1 ~]$ dbca -createDatabase -silent -responseFile /home/oracle/config/shadow.rsp
Prepare for db operation
4% complete
Creating and starting Oracle instance
5% complete
6% complete
8% complete
Creating database files
12% complete
Creating data dictionary views
13% complete
16% complete
17% complete
18% complete
24% complete
Oracle JVM
30% complete
36% complete
42% complete
44% complete
Oracle Text
46% complete
48% complete
Oracle OLAP
52% complete
Oracle Spatial
53% complete
60% complete
Oracle Label Security
68% complete
Oracle Database Vault
76% complete
Creating cluster database views
77% complete
84% complete
Completing Database Creation
86% complete
88% complete
Executing Post Configuration Actions
100% complete
Database creation complete. For details check the logfiles at:
 /opt/oracle/cfgtoollogs/dbca/FREE.
Database Information:
Global Database Name:FREE
System Identifier(SID):FREE
Look at the log file "/opt/oracle/cfgtoollogs/dbca/FREE/FREE10.log" for further details
```

Nos conectamos a la base de datos como SYS:

```bash
[oracle@test1 ~]$ sqlplus /nolog

SQL*Plus: Release 23.0.0.0.0 - Production on Wed Sep 3 09:57:09 2025
Version 23.9.0.25.07

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

SQL>
SQL> conn / as sysdba
Connected.
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
```

La base de datos se encuentra levantada y solo nos ha creado la seed, tal y como habíamos configurado en nuestro template.

Vamos hacer una prueba más jugando con el parámetro **numberOfPDBs**. Este parámetro indica el número de PDBs que se deben crear. Si nos fijamos, el fichero response que hemos usado tenía especificado que el número de PDB es cero, acorde a nuestro template.

```bash
[oracle@test1 ~]$ grep numberOfPDBs  config/shadow.rsp
# Name          : numberOfPDBs
numberOfPDBs=0
```

Pero, ¿Qué sucede si usamos el template original? ¿Hará caso al parámetro del response o hará caso al template?

Vamos a probarlo:

* Eliminamos la base de datos:
    
    ```bash
    [oracle@test1 ~]$ dbca -silent \
    -deleteDatabase \
    -sourceDB FREE \
    -sysDBAUserName sys \
    -sysDBAPassword ******
    [WARNING] [DBT-11503] The instance (FREE) is not running on the local node. This may result in partial delete of Oracle database.
       CAUSE: A locally running instance is required for complete deletion of Oracle database instance and database files.
       ACTION: Specify a locally running database, or execute DBCA on a node where the database instance is running.
    [WARNING] [DBT-19202] The Database Configuration Assistant will delete the Oracle instances and datafiles for your database. All information in the database will be destroyed.
    Prepare for db operation
    32% complete
    Connecting to database
    35% complete
    39% complete
    42% complete
    45% complete
    48% complete
    52% complete
    65% complete
    Updating network configuration files
    68% complete
    Deleting instance and datafiles
    84% complete
    100% complete
    Database deletion completed.
    Look at the log file "/opt/oracle/cfgtoollogs/dbca/FREE/FREE11.log" for further details.
    ```
    
* Creamos la bbdd:
    
    ```bash
    [oracle@test1 ~]$ dbca -createDatabase -silent -responseFile /home/oracle/config/shadow.rsp
    Enter PDBADMIN User Password:
    
    Prepare for db operation
    4% complete
    Creating and starting Oracle instance
    5% complete
    6% complete
    8% complete
    Creating database files
    12% complete
    Creating data dictionary views
    13% complete
    16% complete
    17% complete
    18% complete
    24% complete
    Oracle JVM
    30% complete
    36% complete
    42% complete
    44% complete
    Oracle Text
    46% complete
    48% complete
    Oracle OLAP
    52% complete
    Oracle Spatial
    53% complete
    60% complete
    Oracle Label Security
    68% complete
    Oracle Database Vault
    76% complete
    Creating cluster database views
    77% complete
    84% complete
    Completing Database Creation
    86% complete
    88% complete
    Executing Post Configuration Actions
    100% complete
    Database creation complete. For details check the logfiles at:
     /opt/oracle/cfgtoollogs/dbca/FREE.
    Database Information:
    Global Database Name:FREE
    System Identifier(SID):FREE
    Look at the log file "/opt/oracle/cfgtoollogs/dbca/FREE/FREE13.log" for further details.
    ```
    

Nos conectamos a la base de datos como SYS:

```bash
[oracle@test1 ~]$ sqlplus /nolog

SQL*Plus: Release 23.0.0.0.0 - Production on Wed Sep 3 12:02:06 2025
Version 23.9.0.25.07

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

SQL> conn / as sysdba
Connected.
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
SQL>! grep pdb_dbid /home/oracle/config/FREE.template.dbt
      <PluggableDatabase pdb_name="PDB$SEED" con_id="2" pdb_dbid="3172087764"/>
      <PluggableDatabase pdb_name="FREEPDB1" con_id="3" pdb_dbid="302716810"/>
```

No tenemos PDBs creadas, solo tenemos la seed.

Aunque nuestro template si que tiene definida la creación de una PDB "FREEPDB1", el fichero response indica a DBCA que el número de PDBs debe ser 0.

Podéis descargar tanto el template como el response que he usado desde [aquí](https://github.com/dbaenlasombra/dbca).

Espero que os sirva :)
