Renombrando un Diskgroup en Oracle ASM


En más de alguna ocasión me he topado con la necesidad de renombrar un Diskgroup de ASM, si el Diskgroup está vacío (no se ha almacenado ningún archivo de base de datos) la opción más sencilla -opinión personal-  es eliminarlo y volver a crearlo con el nombre correcto. Pero, ¿que sucede si ya tenemos archivos de base de datos en este Diskgroup?

La solución a este problema surgió con la versión 11gR2 de ASM y se mejoró en la versión 12c. Para renombrar un Diskgroup utilizaremos la herramienta renamedg y la complementáremos con la sentencia ALTER DISKGROUP .. RENAME DISKS.

A continuación, un sencillo ejemplo para renombrar un ASM Diskgroup y ASM Disks que lo conforman.

Escenario:
Nuestra base de datos de producción está utilizando como almacenamiento el disco +DATOS1, por control de la aplicación se requiere que el nombre sea +DATA1. Los datafiles residentes en el Diskgroup son:

FILE_NAME
--------------------------------------------
+DATOS1/ORCL12C/DATAFILE/datos.256.926010987
+DATOS1/ORCL12C/DATAFILE/datos.257.926011275

Pasos previos:
  • Apagar la base de datos.
  • Si la base de datos esta en Real Application Cluster, debemos apagar todas las instancias.

Actualmente tenemos los siguientes Disgroups y Disks:


NAME                  NAME
-------------         ------------------
DATA                  DATA_0000
DATOS1                DATOS1_0000

Paso 1: Desmontar el DiskGroup de todas las instancias activas:

SQL> alter diskgroup DATOS1 dismount;

Diskgroup altered.

Paso 2: utilizar la herramienta renamedg para modificar el nombre del Diskgroup a interno. RENAMEDG es un utilitario incluido en los binarios de la instalación de Grid Infraestructure:

Paso 2.1: creación del archivo de configuración para ser usado en el fase 2

[grid@oel-primary Desktop]$ renamedg phase=one dgname=DATOS1 newdgname=DATA1 asm_diskstring='/dev/oracleasm/disks/*' config=/tmp/data1.conf verbose=true

Parsing parameters..

Parameters in effect:

      Old DG name       : DATOS1
      New DG name          : DATA1
      Phases               :
           Phase 1
      Discovery str        : /dev/oracleasm/disks/*
      Clean              : TRUE
      Raw only           : TRUE
renamedg operation: phase=one dgname=DATOS1 newdgname=DATA1 asm_diskstring=/dev/oracleasm/disks/* config=/tmp/data1.conf verbose=true
Executing phase 1
Discovering the group
Performing discovery with string:/dev/oracleasm/disks/*
Identified disk UFS:/dev/oracleasm/disks/DATA02 with disk number:0 and timestamp (33041132 -829995008)
Checking for hearbeat...
Re-discovering the group
Performing discovery with string:/dev/oracleasm/disks/*
Identified disk UFS:/dev/oracleasm/disks/DATA02 with disk number:0 and timestamp (33041132 -829995008)
Checking if the diskgroup is mounted or used by CSS
Checking disk number:0
Generating configuration file..
Completed phase 1
Terminating kgfd context 0x7faa4ee150a0

Paso 2.2: Ejecutar los cambios según archivo de configuración creado en fase 1.

[grid@oel-primary Desktop]$ renamedg phase=two dgname=DATOS1 newdgname=DATA1 config=/tmp/data1.conf verbose=true

Parsing parameters..

Parameters in effect:

      Old DG name       : DATOS1
      New DG name          : DATA1
      Phases               :
           Phase 2
      Discovery str        : (null)
      Clean              : TRUE
      Raw only           : TRUE
renamedg operation: phase=two dgname=DATOS1 newdgname=DATA1 config=/tmp/data1.conf verbose=true
Executing phase 2
Looking for /dev/oracleasm/disks/DATA02
Modifying the header
Completed phase 2
Terminating kgfd context 0x7fa7c6e220a0

Paso 3: montar nuevamente el  Diskgroup:

Si montamos nuevamente el disco (ahora DATA1) y verificamos los discos que lo integran podremos ver que aún conservan los nombres anteriores:

SQL> alter diskgroup DATA1 mount;

Diskgroup altered.

SQL> select a.name, b.name
from v$asm_diskgroup a, v$asm_disk b
     where a.group_number = b.group_number;

NAME                  NAME
-------------------- ------------------------------
DATA                  DATA_0000
DATA1                 DATOS1_0000

Los nombres de ASM Disks no afectan la operación, pero por orden y buenas practicas debemos mantener los nombres con una referencia al Diskgroup que integran.

Paso 4 (opcional): este paso está disponible solo para la versión 12c y es una de las nuevas características en ASM, para renombrar los ASM Diks en un Diskgroup hacemos uso de la sentencia ALTER DISKGROUP <name >RENAME DISKS…
Antes de poder renombrar debemos montar el DiskGroup en modo restringido:


SQL> alter diskgroup DATA1 dismount;

Diskgroup altered.

SQL> alter diskgroup DATA1 mount restricted;

Diskgroup altered.

SQL> alter diskgroup DATA1 rename disks all;

Diskgroup altered.

Después de esto, desmontamos y montamos en modo normal el diskgroup y podremos verificar que los nombres de discos ya corresponden al Diskgroup renombrado.

SQL> select a.name, b.name
from v$asm_diskgroup a, v$asm_disk b
     where a.group_number = b.group_number;

NAME                  NAME
--------------------  ------------------------------
DATA                  DATA_0000
DATA1                 DATA1_0000

Paso 5: nuestro nuevo disco está listo para ser usado, sin embargo, la base de datos originalmente hacía referencia al disco +DATOS1 para los nombres de DataFiles, por lo que es necesario, antes de poder trabajar con los datos, renombrar los nombres de los DataFiles para que apunten a la nueva ubicación.

En la base de datos en modo MOUNT:

alter database rename file '+DATOS1/ORCL12C/DATAFILE/datos.257.926011275' to '+DATA1/ORCL12C/DATAFILE/datos.257.926011275';

alter database rename file '+DATOS1/ORCL12C/DATAFILE/datos.256.926010987' to '+DATA1/ORCL12C/DATAFILE/datos.256.926010987';

Finalmente, podemos abrir nuestra base de datos y habremos finalizado la operación de renombrado.

Notas importantes:
  • Renombrar un disco que ya posea datos puede complicarse tanto según el tipo de datos que almacene. En este ejemplo nuestro disco solo contenía Datafiles pero por ejemplo podemos almacenar archivos de parámetros, Online Redo Log Files, etc. Por lo tanto, los pasos para cambiar la ruta de la ubicación de los archivos variar según el tipo de archivo. Con las siguientes consultas podemos fácilmente generar los scripts necesarios para cambiar nombres de DataFiles y Online Redo Log Files.

SQL> select 'alter database rename file ''' || name || ''' to ''+DATA' || substr(name,instr(name,'/',1,1)) || ''';' from v$datafile ;

SQL> select 'alter database rename file '''|| member ||''' to ''+DATA' || substr(member,instr(member,'/',1,1)) || ''';' from v$logfile;
  • Si cambiamos nombres de Diskgroup en un ambiente RAC, debemos modificar los recursos a nivel de clusterware, el nuevo nombre del Diskgroup se registra solo como recurso, pero el nombre anterior queda registrado como “huérfano” por lo que debemos eliminarlo mediante la cláusula: $ crsctl delete resource…
  • Debemos modificar todas las características y parámetros de la base de datos que hagan referencia al antiguo nombre de Diskgroup para evitar cualquier problema de ubicación.
Referencia de las clausulas para renombrar DiskGroups y Disks:

Feliz semana,

Comments

Popular posts from this blog

Cómo extraer Archive Logs desde un Backup Piece

Ejemplo práctico con SQL Tuning Advisor y SQL Access Advisor

Guía rápida de uso de Oracle ASMLib