Cambiando el SID de una base de datos

En este post, les dejo el procedimiento manual para cambiar el nombre de una base de datos sin borrarla. Aunque el procedimiento es sencillo, la primera vez me costó algo de trabajo.

Voy a enumerar los pasos requeridos para cambiar el nombre o SID de la base de datos.

Nota 1. Les recomiendo tener un respaldo antes de realizar el procedimiento por si algo llegara a fallar.

Nota 2. Mi base de datos inicial se llama LAB y le cambiaremos el nombre a METALDB.

Nota 3. Mi base de datos LAB se encuentra en Windows, por lo que algunos pasos extra son requeridos y serán marcados en el post.

1. Crear script de recreación del control file

Para iniciar, debemos crear un script para recreación de los control files. Recuerden que estos son los que garantizan la unidad de todos los archivos de la base de datos. Para hacer esto, debemos tener en cuenta el directorio user_dump_dest para saber dónde se generará el script mencionado:

SQL> show parameter user_dump_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest                       string      C:\ORACLE\PRODUCT\10.2.0\ADMIN
                                                 \LAB\UDUMP

Después de esto, en nuestra instancia, ejecutar el comando para crear el script de recreación del control file:

SQL> alter database backup controlfile to trace;

Database altered.

Una vez hecho esto, hay que ir al directorio mostrado con anterioridad para ver el archivo más reciente generado:

 Directorio de C:\oracle\product\10.2.0\admin\metaldb\udump

09/01/2011  01:51 p.m.               641 lab_ora_3784.trc
09/01/2011  02:00 p.m.             3,411 lab_ora_4084.trc
09/01/2011  02:10 p.m.             1,111 lab_ora_2828.trc
29/09/2011  05:32 a.m.               609 lab_ora_244.trc
07/11/2011  12:01 p.m.               610 lab_ora_3260.trc
07/11/2011  12:01 p.m.             2,063 lab_ora_3900.trc
07/11/2011  12:09 p.m.             2,237 lab_ora_2564.trc
07/11/2011  07:02 p.m.               610 lab_ora_1976.trc
07/11/2011  07:02 p.m.             1,012 lab_ora_3456.trc
07/11/2011  07:08 p.m.             1,109 lab_ora_3232.trc
11/11/2011  07:36 p.m.               610 lab_ora_2408.trc
11/11/2011  07:36 p.m.    <DIR>          ..
11/11/2011  07:36 p.m.    <DIR>          .
11/11/2011  08:23 p.m.               870 lab_ora_2948.trc

En este caso, ya está marcado en negritas, el archivo que se generó.

2. Verificar ubicación actual de data files

Hay que realizar este paso para garantizar que sabemos en qué ubicación están los data files de la base de datos. En mi caso, son pocos, pero puede ser que en la base de datos que quieran aplicarlo, haya muchos. En este caso, me baso en uno de mis Scripts útiles para un DBA:

SQL> star tbsdef %
SQL> set echo    off
------------------------------------------------------------------------------|
Script:  TbsDef | Muestra los Data Files de uno o mas Tablespaces.
Uso:     tbsdef nombre_tbs|%
Ejemplo: tbsdef sys%
------------------------------------------------------------------------------|

Data Files del sistema
----------------------------------
TABLESPACE_NAME           FILE_NAME                                             TOTAL_MB
------------------------- -------------------------------------------------- -----------
DATOS                     C:\ORACLE\PRODUCT\10.2.0\ORADATA\LAB\DATOS01.DBF         1,024
*************************                                                    -----------
sum                                                                                1,024
INDICES                   C:\ORACLE\PRODUCT\10.2.0\ORADATA\LAB\INDICES01.DBF       1,024
*************************                                                    -----------
sum                                                                                1,024
SYSAUX                    C:\ORACLE\PRODUCT\10.2.0\ORADATA\LAB\SYSAUX01.DBF          300
*************************                                                    -----------
sum                                                                                  300
SYSTEM                    C:\ORACLE\PRODUCT\10.2.0\ORADATA\LAB\SYSTEM01.DBF          300
*************************                                                    -----------
sum                                                                                  300
UNDOTBS                   C:\ORACLE\PRODUCT\10.2.0\ORADATA\LAB\UNDO01.DBF            500
*************************                                                    -----------
sum                                                                                  500

5 rows selected.

Con esto, ya tenemos los data files a considerar.

3. Dar de baja la instancia de la base de datos

Ya que tenemos los datos de los puntos previos, podemos dar de baja la instancia de nuestra base de datos. Para hacer esto, se usar nada más el comando:

shutdown [immediate];

Por ejemplo:

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

4. Detener el servicio (sólo Windows)

Si la base de datos está instalada en Windows, se deberá detener el servicio correspondiente a la base de datos a renombrar. Esto se puede hacer desde la ventana de Servicios ubicada en Panel de Control – Herramientas Administrativas, o por medio del comando:

oradim -shutdown -sid nombre_db -shutttype SRVC,INST –shutmode A 

Hay que recordar que los servicios tienen el formato: OracleServiceSID.

5. Mover, renombrar y borrar archivos

En este paso, se deberían contemplar actividades como:

  1. Mover los data files de lugar
  2. Renombrar data files
  3. Renombrar carpetas para que tengan el nuevo SID (data files y admin donde se encuentra bdump, udump, …)
  4. Importante: Borrar o mover los control files actuales para que no sean encontrados

Por ejemplo:

-- Listar nueva carpeta donde se encuentran redo, control y data files:
C:\oracle\product\10.2.0\oradata\metaldb>dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 9CE9-FC28 

 Directorio de C:\oracle\product\10.2.0\oradata\metaldb

09/01/2011  01:52 p.m.    <DIR>          .
09/01/2011  01:52 p.m.    <DIR>          ..
11/11/2011  07:48 p.m.        12,304,384 CONTROL01.CTL 
11/11/2011  07:48 p.m.        12,304,384 CONTROL02.CTL
11/11/2011  07:48 p.m.     1,073,758,208 DATOS01.DBF
11/11/2011  07:48 p.m.     1,073,758,208 INDICES01.DBF
11/11/2011  07:48 p.m.        20,972,032 REDO01A.LOG
11/11/2011  07:48 p.m.        20,972,032 REDO01B.LOG
11/11/2011  07:48 p.m.        20,972,032 REDO02A.LOG
11/11/2011  07:48 p.m.        20,972,032 REDO02B.LOG
11/11/2011  07:48 p.m.       314,589,184 SYSAUX01.DBF
11/11/2011  07:48 p.m.       314,589,184 SYSTEM01.DBF
09/01/2011  02:10 p.m.       524,304,384 TEMP01.DBF
11/11/2011  07:48 p.m.       524,304,384 UNDO01.DBF

-- Moviendo los control files de lugar:
C:\oracle\product\10.2.0\oradata\metaldb>mkdir ooo_respaldo
C:\oracle\product\10.2.0\oradata\metaldb>move *.ctl ooo_respaldo
C:\oracle\product\10.2.0\oradata\metaldb\CONTROL01.CTL
C:\oracle\product\10.2.0\oradata\metaldb\CONTROL02.CTL

-- Lista de nuevo la carpeta:
C:\oracle\product\10.2.0\oradata\metaldb>dir
 El volumen de la unidad C no tiene etiqueta.
 El número de serie del volumen es: 9CE9-FC28

 Directorio de C:\oracle\product\10.2.0\oradata\metaldb

11/11/2011  08:37 p.m.    <DIR>          .
11/11/2011  08:37 p.m.    <DIR>          ..
11/11/2011  07:48 p.m.     1,073,758,208 DATOS01.DBF
11/11/2011  07:48 p.m.     1,073,758,208 INDICES01.DBF
11/11/2011  08:37 p.m.    <DIR>          ooo_respaldo
11/11/2011  07:48 p.m.        20,972,032 REDO01A.LOG
11/11/2011  07:48 p.m.        20,972,032 REDO01B.LOG
11/11/2011  07:48 p.m.        20,972,032 REDO02A.LOG
11/11/2011  07:48 p.m.        20,972,032 REDO02B.LOG
11/11/2011  07:48 p.m.       314,589,184 SYSAUX01.DBF
11/11/2011  07:48 p.m.       314,589,184 SYSTEM01.DBF
09/01/2011  02:10 p.m.       524,304,384 TEMP01.DBF
11/11/2011  07:48 p.m.       524,304,384 UNDO01.DBF

6. Crear nuevo initSID.ora

Partiendo del anterior pfile initSID.ora, se puede crear uno nuevo. Si su base de datos está basada en spfile y tienen dudas de cómo crear un pfile, pueden visitar Pfile vs Spfile en mi blog, muestro el nuevo archivo pfile:

background_dump_dest='c:\oracle\product\10.2.0\admin\metaldb\bdump'
compatible='10.2.0.4.0'
control_files='c:\oracle\product\10.2.0\oradata\metaldb\control01.ctl','c:\oracle\product\10.2.0\oradata\metaldb\control02.ctl'
core_dump_dest='c:\oracle\product\10.2.0\admin\metaldb\cdump'
db_cache_size=200M
db_block_size=16384
db_file_multiblock_read_count=16
db_files=1500
db_flashback_retention_target=0
db_name='metaldb'
java_pool_size=25M
large_pool_size=200M
job_queue_processes=20
open_cursors=300
optimizer_index_cost_adj=50
parallel_execution_message_size=65535
parallel_max_servers=64
parallel_min_servers=2
parallel_threads_per_cpu=1
pga_aggregate_target=1063256064
processes=400
query_rewrite_enabled='true'
remote_login_passwordfile='EXCLUSIVE'
shared_pool_size=200M
undo_management='AUTO'
undo_tablespace='UNDOTBS'
undo_retention=300
user_dump_dest='c:\oracle\product\10.2.0\admin\metaldb\udump'
query_rewrite_enabled=true
recyclebin=OFF
sort_area_size=524288
sort_area_retained_size=65536

En el mismo, es conveniente cambiar todos los directorios para que se ajusten a los movimientos hechos en el paso anterior, así como el nombre de la base de datos.

7. Editar archivo trace creado en punto 1

Para la modificación del archivo creado, se deben considerar los siguientes puntos:

1. Cambiar todos los SID por el nuevo.
2. Borrar todas las líneas arriba de la primera instrucción STARTUP NOMOUNT.
3. Modificar la línea de STARTUP NOMOUNT:

STARTUP NOMOUNT PFILE=%ORACLE_HOME%\DATABASE\INITSID.ORA

4. Cambiar la línea de CREATE CONTROLFILE a:

CREATE CONTROLFILE SET DATABASE "SID" RESETLOGS  NOARCHIVELOG

5. Borrar el resto de líneas.

La línea ALTER SYSTEM ARCHIVE LOG ALL deberá estar presente si la base de datos original está en archive mode.

6. Ajustar los directorios y nombres de archivos

7. Cambiar el archivo de nombre a change_db_name.sql para poderlo ejecutar posteriormente.

Un ejemplo de cómo se debería ver el archivo change_db_name.sql, ya con el cambio de metaldb, queda como sigue:

STARTUP NOMOUNT PFILE=%ORACLE_HOME%\DATABASE\INITMETALDB.ORA
CREATE CONTROLFILE SET DATABASE "metaldb" RESETLOGS  NOARCHIVELOG
    MAXLOGFILES 8
    MAXLOGMEMBERS 4
    MAXDATAFILES 500
    MAXINSTANCES 1
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\REDO01A.LOG',
    'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\REDO01B.LOG'
  ) SIZE 20M,
  GROUP 2 (
    'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\REDO02A.LOG',
    'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\REDO02B.LOG'
  ) SIZE 20M
DATAFILE
  'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\SYSTEM01.DBF',
  'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\UNDO01.DBF',
  'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\SYSAUX01.DBF',
  'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\DATOS01.DBF',
  'C:\ORACLE\PRODUCT\10.2.0\ORADATA\metaldb\INDICES01.DBF'
CHARACTER SET UTF8;

8. Crear nuevo servicio (sólo Windows)

Para que la instancia de la base de datos «nueva» pueda ser levantada en Windows, se requiere de un nuevo servicio. Para hacer esto, se usa el comando:

ORADIM -NEW -SID nuevosid -INTPWD password -STARTMODE MANUAL -PFILE %ORACLE_HOME%\database\initnuevosid.ora

Para el ejemplo que estoy mostrando en este post, queda como:

C:\oracle\product\10.2.0\db_1\BIN>ORADIM -NEW -SID metaldb -INTPWD manager99 -STARTMODE MANUAL -PFILE %ORACLE_HOME%\database\initmetaldb.ora
Instance created.

Este servicio nuevo, deberá verificarse en Servicios, en Panel de Control – Herramientas Administrativas:

9. Ejecutar archivo change_db_name.sql

Antes de ejecutar el archivo creado en el punto 7, se deben configurar las variables de ambiente de Oracle:

ORACLE_BASE <--- Base de Oracle
ORACLE_HOME <--- Ubicación de binarios de Oracle
ORACLE_SID  <--- Nombre de base de datos nuevo

Por ejemplo:

C:\oracle\product\10.2.0\db_1\BIN>set
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Administrador\Datos de programa
CLIENTNAME=Console
CommonProgramFiles=C:\Archivos de programa\Archivos comunes
COMPUTERNAME=LABORATO-1EC0B5
ComSpec=C:\WINDOWS\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\Administrador
LOGONSERVER=\\LABORATO-1EC0B5
NUMBER_OF_PROCESSORS=1
ORACLE_BASE=c:\oracle\product\10.2.0 
ORACLE_HOME=c:\oracle\product\10.2.0\db_1 
ORACLE_SID=metaldb

Para después, ya ejecutar el archivo como tal:

C:\oracle\product\10.2.0\db_1\BIN>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Vie Nov 11 20:40:56 2011

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

Connected to an idle instance.

SQL>
SQL> star c:\ewq\change_db_name
ORACLE instance started.

Total System Global Area  662700032 bytes
Fixed Size                  1298472 bytes
Variable Size             448794584 bytes
Database Buffers          209715200 bytes
Redo Buffers                2891776 bytes

Control file created.

10. Abrir base de datos y verificar

Una vez que se ha creado el o los control files, ya nada más resta el abrirla con el comando:

alter database open resetlogs;

y verificar que ya todo se encuentra correcto. Para esto, usaré un par de mis Scripts útiles para un DBA:

SQL> star conwin prod
------------------------------------------------------------------------------|
Script:  ConWin | Formatos y columnas para comportamiento de la pantalla.
Uso:     conwin tipo_instancia
Ejemplo: conwin prod
------------------------------------------------------------------------------|

TYPE NAME     CREATED  ARCHIVE      VERSION           STARTUP  PAR CURRENT_SCN PLATFORM_NAME
---- -------- -------- ------------ ----------------- -------- --- ----------- -----------------------------------------
DB   METALDB  11/11/11 NOARCHIVELOG                                     213728 Microsoft Windows IA (32-bit)
INST METALDB                        10.2.0.4.0        11/11/11 NO

SQL> star tbsdef %
SQL> set echo   off
------------------------------------------------------------------------------|
Script:  TbsDef | Muestra los Data Files de uno o mas Tablespaces.
Uso:     tbsdef nombre_tbs|%
Ejemplo: tbsdef sys%
------------------------------------------------------------------------------|

Data Files del sistema
----------------------------------
TABLESPACE_NAME           FILE_NAME                                             TOTAL_MB
------------------------- -------------------------------------------------- -----------
DATOS                     C:\ORACLE\PRODUCT\10.2.0\ORADATA\METALDB\DATOS01.D       1,024
                          BF

*************************                                                    -----------
sum                                                                                1,024
INDICES                   C:\ORACLE\PRODUCT\10.2.0\ORADATA\METALDB\INDICES01       1,024
                          .DBF

*************************                                                    -----------
sum                                                                                1,024
SYSAUX                    C:\ORACLE\PRODUCT\10.2.0\ORADATA\METALDB\SYSAUX01.         300
                          DBF

*************************                                                    -----------
sum                                                                                  300
SYSTEM                    C:\ORACLE\PRODUCT\10.2.0\ORADATA\METALDB\SYSTEM01.         300
                          DBF

*************************                                                    -----------
sum                                                                                  300
UNDOTBS                   C:\ORACLE\PRODUCT\10.2.0\ORADATA\METALDB\UNDO01.DB         500
                          F

*************************                                                    -----------
sum                                                                                  500

5 rows selected.

Con lo que se puede apreciar que mi base de datos e instancia, han cambiado de nombre a METALDB.

11. Pasos complementarios

Ya en este punto, les extiendo las siguientes recomendaciones:

  1. Detener la instancia y respaldar la base de datos
  2. Si está en Windows, borrar el servicio anterior
  3. Borrar control files anteriores

Para borrar un servicio en Windows de Oracle, se usa el comando:

ORADIM -DELETE -SID sidanterior

Por ejemplo:

C:\oracle\product\10.2.0\db_1\BIN>oradim -delete -sid lab
Instance deleted.

Con lo que la ventana de Servicios queda como sigue:

Conclusiones

Con esto, hemos terminado de cambiar de nombre a mi base de datos LAB por el nuevo METALDB. Espero les sea de utilidad.

Finalmente, hay un procedimiento automático que permite hacer este movimiento de esa manera. La aplicación se llama dbnewid y pueden ver cómo aplicarlo dando clic en la liga.

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

8 comentarios sobre “Cambiando el SID de una base de datos

  1. Hola Mr. Incredible.

    Qué gusto que me hayas visitado en mi blog y ojalá que te haya sido de utilidad este post.

    Orlando.

Deja un comentario