Como actualizar una BD Standby tras haber tenido gaps

miércoles, 27 de julio de 2011
Hace poco tuvimos un caso en el cual se actualizó una BD de Oracle en Dataguard de la versión 9.2.0.8 a la 10.2.0.4, en el proceso de actualización hubo algún problema o error de configuración que provocó que la base de datos de Standby recibiera los archivers pero no los aplicara.

Después de un mes nos dimos cuenta pero era demasiado tarde, los ficheros de archivers necesarios estaban ya borrados y la BD primaria decía que tenía un gap con la BD standby. En este artículo voy a intentar explicar los pasos que hay que hacer para solucionar un gap cuando no tienes los ficheros archivers necesarios para evitarlo.

Los pasos a seguir son los siguientes:

1.- Paramos el listener de la BD de standby para no recibir ni aplicar mas archivers

     lsnrctl stop listener_;


2.- Deshabilitamos en la BD primaria el envío de archivers

      alter system set log_archive_dest_state_1=defer; 
   En vuestro caso habrá que poner el destino de archiver que tengais como remoto a defer, en el mio es el 1.


3.- Cancelamos el recover managed de la BD standby:


     ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;


4.- Determinamos el último valor del SCN de la BD standby, así podremos saber a partir de que SCN debemos hacer backup incremental en la primaria:

     SELECT CURRENT_SCN FROM V$DATABASE; -> 254320

     Este valor será el que tomemos para hacer la copia incremental de la primaria

5.- Nos conectamos con RMAN a la BD primaria y ejecutamos el siguiente comando:

      BACKUP INCREMENTAL FROM SCN 254320 DATABASE FORMAT '/tmp/Standby_%U' tag 'FOR STANDBY';


      Con este comando conseguimos hacer un backup incremental de la BD primaria a partir del SCN especificado, de esta manera podremos adelantar la BD standby al mismo punto que esté la primaria

6.- Enviamos los ficheros generados por el backup a la ruta que queramos de la máquina de la BD standby


      scp /tmp/Standby* usuarios@maquina_standby:/tmp


7.- Nos conectamos con RMAN a la BD standby y hacemos los siguiente:

      CATALOG START WITH '/tmp/Standby_';


      Nos preguntará RMAN si queremos catalogar los ficheros nuevos que no conoce, le decimos "Y" y automáticamente los meterá en su catálogo


8.- Recuperamos la BD standby mediante RMAN:

      RECOVER DATABASE NOREDO;


      Este comando puede tardar mas o menos en función del tamaño de la BD que vayamos a restaurar, en nuestras pruebas tardó unos 10 minutos un fichero de 18GB del backup


9.- Ahora tendremos que crear un controlfile para la BD standby, esto se realiza desde la BD primaria:

     ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/control_stb.ctl';

10.- Paramos la BD standby

     shutdown immediate

11.- Copiamos este fichero a la BD standby y reemplazamos con este fichero el resto de ficheros de controlfile que tengamos en esta BD

12.- Arrancamos la BD standby, la montamos como standby y activamos el recover:

       startup nomount;
       alter database mount standby database;
       alter database recover managed standby database disconnect from session;

13.- Arrancamos los listeners de la BD standby

14.- Habilitamos el envío de archivers de la BD primaria:


       alter system set log_archive_dest_state_1=enable;


   Ahora tendremos que comprobar en el fichero alert.log si la BD primaria ha comenzado a enviar los archivers y a aplicarlos con normalidad sin dar ningún error de que necesita un fichero para solucionar un gap.


Hemos visto como un problema que aparentemente nos puede causar un poco de pánico (tampoco mucho mientras la primaria funcione correctamente) se puede arreglar de una manera fácil y eficaz mediante un backup incremental de la BD primaria.


Un saludo

Diferencia entre instancia, base de datos y servicio en Oracle

miércoles, 12 de enero de 2011
Hablando con mi compañero de trabajo nos ha entrado la duda de la diferencia real en Oracle entre el nombre de la base de datos, el nombre de la instancia y el nombre del servicio. Nosotros estamos acostumbrados en la empresa a poner siempre el mismo nombre de BD que de instancia ya que solemos trabajar con entornos simples (sin RAC), pero a la hora de utilizar RAC nos entró la duda de la diferencia entre estos tres términos.

A continuación vamos a explicar un poco lo que significa cada término:

Nombre de la base de datos (Database Name):  Es el nombre de la estructura física de la BD. Esta estructura se guarda en los controlfile y con este nombre podemos identificar todas las estructuras que pertenecen a la misma BD. El nombre de la base de datos se puede definir en tiempo de instalación y el valor estático que la define es el database_name (este valor no se puede cambiar una vez definido salvo que reconstruyas los controlfiles)

Nombre de la instancia: es el nombre del conjunto de procesos tanto del SO como las estructuras que se guardan en memoria las cuales se utilizan para abrir o montar una base de datos. En un entorno RAC (cluster) podemos tener varias instancias que abren una sola base de datos y cada una de estas instancias tendrá un nombre. En entornos simples (sin RAC), el nombre de la base de datos y el nombre de la instancia suele ser el mismo ya que no hay ninguna razón para distinguirlos porque nos encontramos con una relación 1 a 1. El nombre de la instancia se define en UNIX con la variable ORACLE_SID.


Nombre de servicio: con el nombre de servicio identificamos el lugar al cual nos vamos a conectar. Este nombre se define con el parametro dinámico service_names, si os fijais está en plural ya que una instancia de oracle puede tener multiples nombres de servicio. El concepto de de servicio se utiliza mas frecuentemente para que los usuarios se conecten a las instancias con distintos nombres, por ejemplo en el caso de que tuviéramos un RAC montando en Barcelona y Madrid, podriamos tener distintos nombres de servicio para conectarnos a uno o a otro.

Como se ha comentado mas arriba, normalmente en entornos simples se suele poner el mismo nombre a estos tres términos, de ahí a que cuando vamos a entornos mas complejos no sabemos diferenciar muy bien parar que vale cada uno.

Un saludo

Como crear un interfaz gráfico en Visual Basic para rastrear una IP

viernes, 31 de diciembre de 2010
Aquí os dejo a los maestros de CSI Nueva York intentando rastrear una IP mediante la creación de un interfaz gráfico en Visual Basic. A ver si conseguis rastrear mi IP :)



Feliz fin de año 2010!!!

P.D: al que lo consiga hacer con Cobol le doy una galletita extra

Script para obtener la ocupación de nuestros Tablespaces en Oracle

lunes, 18 de octubre de 2010
Muchas veces se nos da el caso de que no tenemos a mano la consola de ventanas de Oracle y necesitamos saber el tamaño y la ocupación de nuestros Tablespaces. Para ello, os voy a dejar un pequeño script el cual os mostrará los nombres de los Tablespaces y la ocupación de los mismos en %:


select sysdate from dual;
col MB_Asignados format 999g999
col MB_Libres format 999g999d9
col MB_Ocupados format 999g999d9
col Ocupacion_x100 format 99d9
col TableSpace format A15


break on Report
compute sum LABEL TOTALES OF MB_Asignados MB_Libres MB_Ocupados on Report;


select
a.tablespace_name TableSpace,
a.Totalasig/1024/1024 MB_Asignados,
b.Libre/1024/1024 MB_Libres,
(a.Totalasig - b.Libre)/1024/1024 MB_Ocupados,
((a.Totalasig - b.Libre) * 100)/a.Totalasig Ocupacion_x100
from
(select tablespace_name, sum(bytes) Totalasig
from dba_data_files
group by tablespace_name) a,
(select tablespace_name , sum(bytes) Libre, max(bytes) Mayor_blk
from dba_free_space
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name;


Como veis este pequeños script lo que hace es hacer una consulta de la dba_datafiles y compararla con la dba_free_space obteniendo así los valores que nos interesan, un ejemplo de la ejecución del script sería este:

TABLESPACE MB_ASIGNADOS MB_LIBRES MB_OCUPADOS   OCUPACION_X100
---------------        ------------                  ----------            -----------                    --------------
SYSTEM          510                           303.9                206.1                        40.4
TS_PRUEBA   2,000                        596.1                1,403.9                     70.2
PROBANDO1  3,071                        3,010.1              60.9                          2.0
PROBANDO2   4,000                        3,792.8             207.3                         5.2
PROBANDO3   3,000                        2,631.3             368.7                        12.3
PROBANDO4  1,000                        907.2                92.8                          9.3
PROBANDO5  2,047                        1,768.7             278.3                        13.6
TS_UNDO        510                          479.7                30.3                           5.9
                          ------------                  ----------            -----------
TOTALES        16,138                     13,489.7           2,648.3

Este script nos puede venir muy bien para crear a su vez otro script que nos mande por correo las alertas de ocupación en nuestras BD Oracle o también para tener un pequeño log del resumen de ocupación de nuestras Bases de Datos.

Un saludo

Como limitar el acceso a bases de datos Oracle

martes, 13 de abril de 2010
Muchas veces queremos que solo cierta gente acceda a una base de datos Oracle debido a que puede tener información importante y nos interesa que el acceso sea mas restringido que un simple usuario y contraseña.

Para poder asegurar el acceso a las BBDD de Oracle podemos implantarlo de dos maneras:


1.- Limitar el acceso a la BBDD por IP

Para limitar el acceso por IP a la BBDD tendremos que hacerlo a través del fichero sqlnet.ora, los parametros que tendremos que modificar serán los siguientes:

tcp.validnode_checking = yes
tcp.invited_nodes = equipos que queramos que accedan (IP o nombre equipo)
tcp.excluded_nodes = equipos que NO queramos que accedan (IP o nombre equipo)

Ejemplo

tcp.validnode_checking = yes
tcp.invited_nodes = 192.168.2.10, servidor-bd
tcp.excluded_nodes = 192.168.2.20, 192.168.2.30, servidor-ficheros

2.- Limitar la conexión con el usuario dba a solo ciertos usuarios o IP's

Si queremos que solo ciertos usuarios de S.O puedan acceder como un usuario a una determinada BD tendremos que crear un pequeño trigger:

--Creamos un trigger que se dispare después del logon del usuario en la BBDD
create or replace trigger logon_trg after logon on database
DECLARE
ip_address VARCHAR2(64);
--Creamos un cursos para guardar la información
CURSOR c1 IS
SELECT SYS_CONTEXT('USERENV','IP_ADDRESS') from dual;
--Comenzamos el procedimiento
BEGIN
OPEN c1;
FETCH c1 INTO ip_address;
CLOSE c1;
--Comparamos la IP y el nombre de la persona que ha accedido con el que no accederá
IF ip_address = '192.168.2.20' and user = 'PACO' THEN
RAISE_APPLICATION_ERROR(-20020, 'You are not allowed to log into database now.');
END IF;
END;
/





Como veis esta es una forma de asegurar el acceso rapidamente a Oracle sin tener ningún tipo de quebraderos de cabeza. Algo fácil, sencillo y para toda la familia.

Un saludo

Como quitar ^M o fin de linea en Unix

miércoles, 7 de abril de 2010
Mas de una vez nos hemos encontrado con que hemos creado un script o un fichero con el Bloc de Notas de Windows o con el MS-DOS y luego lo pasamos a un sistemas Unix/Linux y nos encontramos con que al final de cada línea aparece el carácter "^M". Este carácter corresponde al retorno de carro (CR) que Windows pone a cada fin de linea que hacemos (LR) mientras que Unix solo utiliza el fin de línea (LR), de ahí a que aparezca este bonito "^M".

A continuación vamos a enumerar distintas opciones para borrar este carácter:


  • Con cualquier editor de textos (vi,nano,gedit) editarlo y borrarlo a mano, como vemos esto no es viable si el fichero tiene muchas líneas
  • Editar el fichero con el editor de textos "vi" y ejecutar el siguiente comando ":%s/^M//g"
  • Utilizar el comando sed de esta manera "sed 's///g' -i fichero"
  • Utilizar perl de esta manera "perl -pi -e 's/\r\n/\n/g' fichero"
  • En el caso de que queramos aplicar este cambio a todos los ficheros de una misma carpeta solo tendriamos que ejecutar "perl -pi -e 's/\r\n/\n/g' *"
Como habeis visto, hay maneras sencillas modificar ficheros sin tener que editar a mano cada uno de ellos, la verdad es que este es un truco bastante sencillo que nos ahorra muchos quebraderos de cabeza y sobretodo mucho tiempo :)

¿Para que sirve "> /dev/null 2>&1"?

lunes, 5 de abril de 2010
Cuando empecé a tocar sistemas Unix y veía en la crontab líneas de scripts que se ejecutaban y acababan en "> /dev/null 2>&1" me quedaba un poco anonadado ya que no entendía bien lo que hacía esta sentencia.

Había aprendido que el comando "mayor que" (>) servía para desviar la salida de un programa a otro sitio y que "/dev/null" lo que hacía era desviar esa salida hacia un fichero que no guarda ningún tipo de información (como si fuera un agujero negro) y por lo tanto conseguimos que no nos saque nada por pantalla. Esto lo sabía de las veces que tenía que borrar el contenido de un fichero y usaba el siguiente comando:
cat /dev/null > fichero.txt

STDIN, STDOUT y STDERR


Estos tres valores son las entradas y salidas standard para un programa. La entrada STDIN (Standard Input) normalmente viene por teclado o también puede venir desde otro programa. La salida STDOUT (Standard Output) es la salida por defecto de los programas y la STDERR es igual que la STDOUT pero para los errores de los programas.

A veces, estos valores los podemos encontrar en forma de número, siendo STDIN (0), STDOUT (1) y STDERR (2). Una vez que sabemos esto podemos deducir que el comando "> /dev/null 2>&1" lo que intenta es sacar el STDOUT a /dev/null y después de esto redirige la STDERR a la STDOUT.

En resumen, lo que hace "> /dev/null 2>&1" es mandar todo lo que salga a un agujero negro en donde no vamos a ver nada por pantalla y con lo cual tendremos un programa que no saca ninguna información sobre su ejecución.

Para verlo todavía mas claro podríamos decir que "> /dev/null 2>&1" es lo mismo que "> /dev/null 2>/dev/null"