lunes, 3 de agosto de 2020

Como Cambiar el Nombre de una Base de Datos con DBNEWID

Tengo un cliente que tiene todavia bases Oracle 11.2.0.4, si todavia! por mas que me gustaria migrarselas a 19c, en este caso debido a que es la ultima version  certificada por el proveedor del aplicativo no podemos actualizarla, como seguro les pasa todavia a Uds en muchas instalaciones. 

Surgió que necesitan clonar la VM de Desarrollo para tener un ambiente de QA. Esta VM de Desarrollo tiene bases de datos 11.2.0.4 y una vez clonada la VM le voy a cambiar el nombre de a las bases de datos para su nuevo ambiente de  QA. 

Para ello voy a usar el utilitario DBNEWID, que aunque no es una herramienta nueva, no es muy usado porque lo tradicional cuando se cambia el nombre de una base de datos es hacerlo recreando el control file. Como ya lo he usado muchas veces y funciona muy bien me dio ganas de compartirlo con Uds.

El DBNEWID 
1 - Cambia el nombre de la base de datos
2 - Cambia el DBID
3 - Genera en el $ORACLE_BASE/diag todos los directorios necesarios para la nueva base, incluido el alert

Les voy a mostrar los pasos a seguir con DBNEWID para cambiar el nombre de la base de datos luego de clonar una Maquina Virtual.
En este ejemplo la base origen se llama DESA y la destino QA1


En el ambiente clonado 
1 - Montar la Base de Datos 
(En mi caso la base estaba baja, sino previamente bajarla)
 SQL> shutdown immediate

SQL> startup mount

2- Ejecutar el DBNEWID

$ nid TARGET=sys/password@desa DBNAME=qa1

Target es la Base origen, especificamos la password de sys 

Previamente tenemos que agregar en el tnsnames.ora la entrada para esa base. 

DBNAME se especifica el nombre destino.


$ nid TARGET=sys/password@desa DBNAME=qa1

DBNEWID: Release 11.2.0.4.0 - Production on Mon Aug 3 07:02:14 2020

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Connected to database DESA (DBID=742283927)

Connected to server version 11.2.0

Control Files in database:

    /u02/oradata/control01.ctl

    /u05/oradata/control02.ctl

Change database ID and database name DESA to QA1? (Y/[N]) => Y     -SELECCIONAR "Y"  PARA CONTINUAR

Proceeding with operation

Changing database ID from 742283927 to 1597134007

Changing database name from DESA to QA1

    Control File /u02/oradata/control01.ctl - modified

    Control File /u05/oradata/control02.ctl - modified

    Datafile /u02/oradata/system01.db - dbid changed, wrote new name

    Datafile /u02/oradata/sysaux01.db - dbid changed, wrote new name

    Datafile /u02/oradata/undotbs01.db - dbid changed, wrote new name

    Datafile /u02/oradata/users01.db - dbid changed, wrote new name

    Datafile /u02/oradata/temp01.db - dbid changed, wrote new name

    Control File /u02/oradata/control01.ctl - dbid changed, wrote new name

    Control File /u05/oradata/control02.ctl - dbid changed, wrote new name

    Instance shut down


Database name changed to QA1.

Modify parameter file and generate a new password file before restarting.

Database ID for database QA1 changed to 1597134007.

All previous backups and archived redo logs for this database are unusable.

Database is not aware of previous backups and archived logs in Recovery Area.

Database has been shutdown, open database with RESETLOGS option.

Succesfully changed database name and ID.

DBNEWID - Completed succesfully.


3 - Montar la Base que va a dar error, es esperado
SQL> startup mount
ORACLE instance started.

Total System Global Area 4275781632 bytes
Fixed Size                  2260088 bytes
Variable Size            1040188296 bytes
Database Buffers         3221225472 bytes
Redo Buffers               12107776 bytes
ORA-01103: database name 'QA1' in control file is not 'DESA'

4 - Cambiar el db_name

SQL> alter system set db_name=qa1 scope=spfile;

5 - Bajar la Base de Datos

SQL> shutdown immediate

ORA-01507: database not mounted

ORACLE instance shut down. 

6 - Generar un nuevo password file

$cd $ORACLE_HOME/dbs

$orapwd file=orapwdqa1 password=password entries=10

7- Renombrar el spfile ya que el DBNEWID cambio los parametros del spfile pero no cambio el nombre del spfile en el sistema operativo

$mv spfiledesa.ora spfileqa1.ora

8 - Cambiar el ORACLE_SID

$ export ORACLE_SID=qa1

9- Si estas clonando todo el ambiente como en este caso, cambia tambien el ORACLE_SID en el .profile, .bash_profile o el que uses

10 - Cambiar en el /etc/oratab para que quede nuestra nueva base

$vi /etc/oratab

qa1:/u01/app/oracle/product/11.2.0/dbhome_1:Y

11 - Levantar el listener o reiniciarlo

$ lsnrctl start

12 - Montar la base de datos

SQL> startup mount

13 - Resetear los REDOLOGS

SQL> alter database open resetlogs;


Verificaciones
1  - Verifico nombre de la base de datos
 SQL> select name from v$database;

 NAME

---------

QA1


 2 - Verifico nombre de la instancia

SQL> select instance_name from v$instance;

 INSTANCE_NAME

----------------

qa1

Recomendación : Realizar inmediatamente un nuevo backup. No se puede restaurar de los backup de la base origen esta nueva base.

Conclusión : DBNEWID  permite cambiar el nombre de una  base de datos facilmente