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
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