Cambiar de Pfile a Spfile en Windows

Hoy vamos a ver una entrada que es muy básica en Unix pero que puede traer algún quebradero de cabeza en windows.

¿Que ocurre cuando queremos pasar de Pfile a Spfile en Windows?

La pregunta parece sencilla de resolver, y es que , simplemente tenemos que dejar un fichero llamado spfile_SID.ora en el directorio $ORACLE_HOME/database ( el equivalente a $ORACLE_HOME/dba de UNIX) pero, cuando hacemos esto en windows falla.

El problema se encuentra en el modo de arranque, a la hora de crear el servicio seguramente se creo con el parámetro «pfile=XXX» , con lo que el motor busca exactamente el fichero init_SID.ora y por eso no arranca con el nuevo spfile.

Para solucionarlo, abriremos el regedit e iremos a:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME
Allí hay una entrada para cada instancia llamada ORA__PFILE. Lo que vamos ha hacer es eliminar esa entrada, haciendo que el motor busque el fichero de arranque por defecto.

Ah!, recordad que debería de existir el fichero SPFILE, para crearlo desde la 11g la manera mas sencilla es:

 create spfile  from memory;

Si estáis en alguna versión anterior siempre podéis seguir la entrada http://clemente.pamplona.name/dba/recuperar-un-spfile-borrado/

Como siempre, mas información en Soporte.

  • (Doc ID 378021.1) Oradim and Spfile
  • (Doc ID 232587.1) FAQ About Usage of Spfile and Pfile on Windows

Instalacion básica para Oracle 11

Repasando la entrada
Creación de una plataforma de pruebas RAC con VirtualBox veo como partimos de la base de una instalación de linux ya hecha.

Hoy vamos a hacer una entrada rápida con los pasos y paquetes que hay que preparar para una instalación básica de Oracle en un Oracle Linux 6.

Partiremos de la base de que tenemos una instalación mínima.

Los pasos serán

Deshabilitar SELinux

Editaremos el fichero vi /etc/selinux/config
dejándolo como

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Deshabilitar iptables y postfix

No necesitaremos estos servicios, por lo que podemos quitamos del arranque

root@plantilla rc3.d]# rm /etc/rc3.d/S08iptables 
rm: ¿borrar el enlace simbólico «/etc/rc3.d/S08iptables»? (s/n) s
[root@plantilla rc3.d]# rm /etc/rc3.d/S80postfix 
rm: ¿borrar el enlace simbólico «/etc/rc3.d/S80postfix»? (s/n) s

Actualizamos y metemos los paquetes básicos

Necesitaremos algunos paquetes para la BBDD, así pues, ejecutaremos

yum update 
yum install kernel-devel
yum  groupinstall "Development Tools"
yum install oracle-validated

Instalamos las X para los accesos remotos

Para poder lanzar las herramientas gráficas necesitaremos unos pocos paquetes,la manera mas sencilla de obtenerlos es con el paquete xeyes que es el testador definitivo de las Windows y aceptando las dependencias.

yum install xeyes xauth 

Instalamos Utilidades básicas

Hay una serie de utilidades que seguramente usaremos y que no estaban en la instalacion mínima, estas son

yum install unzip atop  yum-utils ntp parted  oracleasm-support kmod-oracleasm oracleasmlib oracleasm-`uname -r` 
yum install compat-libcap1 compat-libstdc++-33 sysstat libaio-devel ksh libaio bind-utils smartmontools cvuqdisk redhat-lsb-core

Con esto, tenemos un Oracle Linux instalado listo para servir de plantilla para la instalación de nuestra base de datos

ORA-08189: no se puede realizar flashback

Hoy vamos a ver otra entrada para dummies.
Un error tremendamente sencillo que puede darnos algún susto, pero que hará que todo se quede en eso, en un susto.

Supongamos que queremos volver una tabla de nuestra base de datos ha hace 2 horas , lo más inmediato es intentar hacer:

FLASHBACK TABLE OWNER.TABLA 
  TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '120' minute);

Pero, nos encontramos con el error:

Error at line 1
ORA-08189: no se puede realizar flashback en la tabla porque el movimiento de filas no está activado

Lo primero que nos viene a la cabeza es pensar que no vamos a poder ser capaces de recupera la tabla, pero, realmente, cuando obtenemos este error (o en Ingles)
ORA-08189: cannot flashback the table because row movement is not enabled
no está todo perdido, simplemente nos está indicando que no tenemos la opcion de «row movement» para poder llevar a cabo esta actualizacion.

Para solventar este problema haremos


ALTER TABLE OWNER.TABLA ENABLE ROW MOVEMENT;

Con este sencillo comando ya podremos ejecutar nuestro flashback… TO TIMESTAMP sin recibir alertas de error

expdp de una particion

Hoy vamos a ver otra entrada para dummies, esta vez una entrada rápida y sencilla sobre el exdp

¿Como podemos hacer para exportar los datos de una partición de una de las tablas de la base de datos?

La respuesta es muy sencilla, ya que, la opción TABLE nos permite mediante el uso de : indicar que lo que queremos extraer de esa tabla es una partición determinada.
Así pues para sacar una o varias particiones de una tabla, el comando sería :

expdp dba_user/password dumpfile=expdppart.dmp 
tables=(
schema_name.tablename:partition_name1,\
schema_name.tablename:partition_name2,\
schema_name.tablename:partition_name3,\
schema_name2.tablename:partition_name \
)

IMPORTANTE
Recordad que, a pesar de que hacer el export es tan sencillo, como vimos en una entrada anterior No se puede importar una partición por separado

Capturar errores de usuario en la base de datos

Hoy vamos a ver como facilitarnos un poco el control del código de aplicación de la base de datos.

En muchas ocasiones, los desarrolladores no llevan a cabo correctamente la captura de errores , lo que produce una serie quejas «no me va y no me da error».
Para lidiar con estas situaciones podemos crear un pequeño trigger que registre en la base de datos que y quien genera errores en la base de datos, para poder seguirlos y depurar estos errores.

Vamos a suponer que:

  • Tenemos un tablespace específico llamado CONTROL donde guardaremos nuestros datos
  • Tenemos un usuario llamado CONTROL que será el propietario del código

Primero crearemos la tabla que contendrán los errores:

-- Creamos la tabla 
create table CONTROL.oraerror (
identificador   NUMBER,
FECHA           DATE,
ESQUEMA         VARCHAR2(30),
USUARIO         VARCHAR2(50),
SQL_ID          VARCHAR2 (13) DEFAULT NULL,
SQL_HASH_VALUE  NUMBER DEFAULT NULL,
err_nr          NUMBER(10),
err_msg         VARCHAR2(4000),
stmt            CLOB
) TABLESPACE CONTROL;

--
-- Creamos una secuencia para el oraerror
create sequence CONTROL.oraerror_seq
start with 1
increment by 1
minvalue 1
nomaxvalue
nocache
nocycle;

Y después crearemos nuestro trigguer

CREATE OR REPLACE TRIGGER CONTROL.after_error
 AFTER SERVERERROR ON DATABASE
 DECLARE
 id             NUMBER;
 vSerial        NUMBER DEFAULT NULL;
 ESQUEMA        VARCHAR2(30);
USUARIO         VARCHAR2(50);
 SQL_ID         VARCHAR2 (13) DEFAULT NULL;
 SQL_HASH_VALUE NUMBER DEFAULT NULL;
  sql_text      ORA_NAME_LIST_T;
 v_stmt         CLOB;
 n              NUMBER;
 vsid           NUMBER DEFAULT NULL;
BEGIN
 -- BUscamos ID 
SELECT dbms_debug_jdwp.current_session_serial serial# INTO vSerial 
      FROM DUAL;
SELECT oraerror_seq.nextval,SYS_CONTEXT ('USERENV', 'sid') INTO  id, vsid
     FROM dual;
SELECT  SQL_ID, SQL_HASH_VALUE,USERNAME,OSUSER INTO SQL_ID, SQL_HASH_VALUE,ESQUEMA,USUARIO
   FROM sys.v_$session   WHERE sid = vsid AND serial# = vSerial;
n:= ora_sql_txt(sql_text);

IF n >= 1
 THEN
 FOR i IN 1..n LOOP
 v_stmt := v_stmt || sql_text(i);
 END LOOP;
END IF;
--
 FOR n IN 1..ora_server_error_depth LOOP
      INSERT  /*+ APPEND */ 
      INTO CONTROL.oraerror VALUES(id, sysdate, ESQUEMA, USUARIO, SQL_ID,SQL_HASH_VALUE,  ora_server_error(n), ora_server_error_msg(n), v_stmt);
  END LOOP;
 --
END ;

Con esto tendrémos en nuestra tabla todos los errores que dela base de datos.
Hay que tener en cuenta que, muchos de los errores pueden ser correctos, como los errores :

  • ORA-01017: nombre de usuario/contraseña no válidos; conexión denegada
  • ORA-00001: unique constraint (XXXX) violated (error asumible en cargas masivas)
  • ORA-03113: end-of-file on communication channel ORA-03113: end-of-file on communication channel

Con lo que habrá que seguirlos con cuidado y ver en que caso son reprochables o asumibles