domingo, 30 de mayo de 2010

Renombrar un “Log Member”

Para poder renombrar un redo log member lo que necesitamos en primer lugar es el nuevo archivo de redo ya que el comando de SQL lo que hace únicamente es cambiar el puntero interno en el control file hacia el nuevo archivo de redo, es decir que el comando de SQL no modifica el archivo del sistema operativo.

Entonces, para poder renombrar el archivo de redo vamos a realizar los siguientes pasos:

1. Realizamos un shutdown de la base
SQL> shutdown immediate;


2. Copiamos o renombramos el archivo de redo utilizando comandos del sistema operativo


3. Montamos la base de datos

SQL> startup mount;


4. Realizamos el cambio en el puntero del archivo de control.

SQL> ALTER DATABASE RENAME FILE ‘old_redo_file’ TO              ‘new_redo_file’;


5. Abrimos la base de datos

SQL> ALTER DATABASE OPEN;


6. Por último realizamos un backup del archive de control ya que realizamos un cambio en el.


Espero les haya servido

Saludos!
Gondalf

miércoles, 19 de mayo de 2010

Cambiando el orden de las columnas

Como alguno de ustedes ya sabrá el proceso de cambiar el orden las columnas de una tabla en Oracle no se realiza con un simple ALTER TABLE.

Para poder llevar a cabo esta tarea a continuación vamos a ver una sucesión de pasos que nos van a ayudar a solucionar nuestra necesidad.

Cabe aclarar que si la tabla tiene indices asociados primero habría que relevarlos dado que los vamos a perder con este procedimiento.

SQL> create table EJEMPLO (col1 number, col2 number, col3 number);

Table created.

SQL> desc EJEMPLO;
Name          Null?     Type
---------- ------ ----------------
COL1 NUMBER
COL2 NUMBER
COL3 NUMBER

SQL> create table AUXILIAR as select col3, col2, col1 from EJEMPLO;

Table created.

SQL> drop table EJEMPLO;

Table dropped.

SQL> alter table AUXILIAR rename to EJEMPLO;

Table altered.

SQL> desc EJEMPLO;
Name          Null?     Type
---------- ------ ----------------
COL3 NUMBER
COL2 NUMBER
COL1 NUMBER

Espero les haya servido.

Saludos!
Gondalf

lunes, 10 de mayo de 2010

Agregar un disco a un diskgroup en ASM

La idea de este post es mostrarles un poco como podemos agregar espacio (un disco) a nuestro ASM, primero vamos
a crear el link necesario a nuestro raw device para que ASM pueda "verlo", para realizar esto hacemos lo siguiente:

1- Nos paramos en el directorio donde tenemos creados los links a los raw devices

TEST:/u00/oradata/asm# ls -latr
total 2
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_01 -> /dev/rdisk/disk61
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_02 -> /dev/rdisk/disk68
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_03 -> /dev/rdisk/disk73
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_04 -> /dev/rdisk/disk81
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_05 -> /dev/rdisk/disk86
drwxrwxr-x 2 oracle dba 1024 May 15 2009 .
drwxrwxr-x 4 oracle dba 96 May 7 15:22 ..
2- Una vez que el sys admin nos indica que raw tenemos presentado vamos a proceder a darle los permisos necesarios
(en este ejemplo será el disk78)

TEST:/u00/oradata/asm# chown oracle:dba /dev/rdisk/disk78

3- Generamos el link necesario con el comando de UNIX ln -s

TEST:/u00/oradata/asm# ln -s /dev/rdisk/disk78 /u00/oradata/asm/asm_disk_06

4- Revisamos nuestro nuevo link

TEST:/u00/oradata/asm# ll
total 0
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_01 -> /dev/rdisk/disk61
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_02 -> /dev/rdisk/disk68
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_03 -> /dev/rdisk/disk73
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_04 -> /dev/rdisk/disk81
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_05 -> /dev/rdisk/disk86
lrwxr-xr-x 1 root sys 17 May 7 16:12 asm_disk_06 -> /dev/rdisk/disk78
5- Como vemos el link lo creamos con un usuario y un grupo erróneo, por lo que debemos cambiarlo, para eso ejecutamos lo siguiente

TEST:/u00/oradata/asm# chown -h oracle:oinstall asm_disk_06

6- Volvemos a chequear

TEST:/u00/oradata/asm# ll
total 0
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_01 -> /dev/rdisk/disk61
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_02 -> /dev/rdisk/disk68
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_03 -> /dev/rdisk/disk73
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_04 -> /dev/rdisk/disk81
lrwxr-xr-x 1 oracle oinstall 17 May 15 2009 asm_disk_05 -> /dev/rdisk/disk86
lrwxr-xr-x 1 oracle oinstall 17 May 7 16:12 asm_disk_06 -> /dev/rdisk/disk78
7- Por otro lado chequemos que el raw presentado tenga los permisos necesario para que ASM lo pueda acceder correctamente

TEST:/u00/oradata/asm# ls -latr /dev/rdisk/disk78
crw-r-----   1 oracle     dba         23 0x000014 May 15  2009 /dev/rdisk/disk78
/*********************************************/

Una vez terminado el trabajo de generar el link para ASM estamos en condiciones de agregar el disco a nuestro diskgroup.
Quiero aclarar que voy a seguir los pasos que aconseja Oracle para agregar un nuevo disco a un diskgroup existente (Metalink ID 557348.1)

Paso 1 - Creamos un nuevo diskgroup para testear si ASM puede acceder al nuevo disco y asi no correr riesgos con nuestro diskgroup productivo
SQL> CREATE DISKGROUP TEST EXTERNAL REDUNDANCY DISK 'YOUR DISK';

Paso 2 - Checkeamos si el diskgroup esta creado y montado
SQL> SELECT STATE, NAME FROM V$ASM_DISKGROUP;

Paso 3 - Si tenemos varias instancias de ASM (hablamos de un RAC sobre ASM) debemos montar el diskgroup en las demas instancias de ASM
SQL> ALTER DISKGROUP TEST MOUNT;

Paso 4 - Chequeamos en todas las demás instancias de ASM si el diskgroup está montado
SQL> SELECT STATE, NAME FROM V$ASM_DISKGROUP;

Paso 5 - Desmontamos el diskgroup de todas las instancias menos de una, es de esta última de donde eliminamos la instancia de ASM
SQL> alter diskgroup test dismount; --(desde todas las instancias de ASM salvo de una).

SQL> DROP DISKGROUP TEST; --(desde la instancia ASM de donde no desmontamos el diskgroup).

Paso 6 - Agregamos el nuevo disco a nuestro diskgroup existente
SQL> ALTER DISKGROUP ADD DISK 'YOUR DISK';

Espero les haya servido.

Saludos!
Gondalf

viernes, 7 de mayo de 2010

Scripts sobre tamaños en general

•• Conocer Tamaño ocupado por una tabla concreta incluyendo los índices de la misma

SELECT sum(bytes)/1024/1024 Mb
FROM user_segments
WHERE segment_type in ('TABLE','INDEX') and (segment_name='NOMBRETABLA' or segment_name in
(SELECT index_name FROM user_indexes WHERE table_name='NOMBRETABLA'));

•• Conocer Tamaño ocupado por una columna de una tabla

SELECT sum(vsize('NOMBRECOLUMNA'))/1024/1024 Mb FROM 'NOMBRETABLA';

•• Conocer Espacio ocupado por cada usuarios

SELECT owner, SUM(BYTES)/1024/1024 FROM dba_extents
GROUP BY owner;

•• Conocer Espacio ocupado por los diferentes segmentos (tablas, índices, undo, rollback, cluster, ...)

SELECT SEGMENT_TYPE, SUM(BYTES)/1024/1024 FROM dba_extents
GROUP BY SEGMENT_TYPE;

•• Conocer el tamaño ocupado por una tabla

SELECT SEGMENT_name, SUM(BYTES)/1024/1024 FROM dba_extents
WHERE segment_name = 'NOMBRETABLA'
GROUP BY segment_name;

•• Conocer el espacio ocupado por todos los objetos de la base de datos, muestra los objetos que más ocupan primero

SELECT segment_name, sum(bytes)/1024/1024 FROM dba_extents
GROUP BY segment_name
ORDER BY 2 desc;

•• Conocer el espacio ocupado por la base de datos

SELECT sum(bytes)/1024/1024 FROM dba_extents;


Espero les haya servido

Saludos!
Gondalf