jueves, 29 de noviembre de 2012

Nueva arquitectura de Oracle DB 12C

La nueva versión de Oracle DB 12 a sido anunciada su salida para el 2013 y posee grandes características a nivel de arquitectura, seguridades, desarrollo y demas.

Entre una de las que mas me fascino, es la nueva arquitectura del Oracle Server CDB (Conteinar Dtabase) y PDB(Pluggable Database) lo que nos permite tener en una base de datos contenedora CDB e ir enchufando otras base de datos Oracle PDB. Como ya hemos venido trabajando con BD Oracle, sabemos que por cada base de datos se necesita de una instancia con su respectiva asignación de memoria, procesos  y archivos y que son de uso exlusivo para cada BD. Con la introducción del CDB y PDB podremos tener una base de datos contenedora con varias BD PDB que compartan la memoria asignada a la base de datos principal (Es como lo maneja MS Sql Server), procesos, archivos. En esta nueva versión tenemos la opción de compartir el tablespace TEMP (Si lo deseamos) de la base de datos principal hacia las pase de datos plugueable(Enchufable).

La sola idea de que todos estos recursos asignados a instacias de forma separada y que ahora funcionaran como uno solo nos, hace pensar en la gran capacidad de mejorar el rendimiento de nuestro servidores de BD y optimizar el uso de nuestra infraestructura.

El limite de base de datos PDB que se podran enchufar en la BD contenedora CDB por el momento son 252


Cuales son las demas caracteristicas que tiene esta nueva arquitectura?

División del diccionario de datos:Cada PDB tendra su propio dicionario de datos con la información de la metadata y la CDB la información general del espacio denominado Roo(Diccionario de la metadata de la base de dato contenedora).

Nuevo administrador root: La introducción del administrador Root CDB viene acompañado de un grupo de comandos que podrá ejecutar.

Enchufar y desenchufar: EL poder desenchufar una PDB de una CDB y enchufarla en otra CDB es una gran caracteristica que nos ayudaría en varios escenarios:

· Migración de bases de datos a una nueva plataforma o
Harware

· Migración de versiones de bases de datos.

· Mover bases de datos para diferentes sistemas

· Aumento de la alta disponibilidad de las bases de datos se mueven entre los sistemas

· Clonar base de datos


Las caracteristicas que vienen con la 12C no van solo a nivel de arquitectura, si no tambien a nivel de desarrollo, administración y rendimiento.

viernes, 3 de agosto de 2012

DML LOG ERROR

Saludos,

A muchos nos ha pasado que estamos realizando un mega insert de registros desde un select y de pronto nos falla por error constraint lo que lleva a la fastidiosa tarea de buscar cual es el registro que esta causando que el insert no finalice.

Pensando en estos tediosos casos, Oracle introduce la claúsula DML LOG ERROR que es una caracteristica introducida desde la versión 10g R2, esto nos permite registrar los errores que se prenseten por inconsistencia, validaciones de integridad durante las operaciones IMSERT, DELETE, UPDATE Y MERGE.

ClaúsulaLOG ERRORS [INTO [esquema.]tabla] [('INSERT|UPDATE|DELETE')] [REJECT LIMIT integer|UNLIMITED]
[INTO [esquema.]tabla] : Esta es opcional e indica a que tabla log se enviará los registros que no se pudieron procesar en la sentencia, por defecto lo enviará a la tabla log asociada a la tabla.
[REJECT LIMIT integer|UNLIMITED]: Para definir cual es la cantidad de errores que podrá soportar antes de generar un error, si se indica UNLIMITED, no importará la cantidad de errores que se almacenen el en la tabla Log.

Ejemplo
Para entenderlo mejor pongamos un ejemplo rutinario, tenemos una tabla ORIGEN con 100,000 registros y necesitamos traspasar a otra tabla DESTINO, lo que se nos viene a la cabeza es INSERT SELECT, pero al realizar esta operación nos arroja un error por que uno de los registro presenta una inconsistencia de validación de datos no soportada por la tabla DESTINO. Por un condenado registro se nos agrió el día ya que debemos buscar cual de los 10 millones de registros es el condenado que no nos deja finalizar la transacción.

--INSERT
SQL> --Creamos la tabla que contendra los datos
SQL> create table origen pctfree 0 as
  2  select rownum codigo, decode(rownum,90000,'C',90001,'B','A')estado
  3  from dual
  4  connect by level <=100000;

Tabla creada.
SQL>
SQL> select count(*) registros from origen;

 REGISTROS
----------
    100000

SQL>
SQL> --Creamos la tabla a la que se enviara los datos
SQL> create table destino
  2  (
  3      codigo_des number,
  4      estado_des varchar2(1)
  5  );

Tabla creada.
SQL>
SQL> --Creamos una restriccion de integridad CHECK
SQL> alter table destino add ( constraint chk_destino_estado
  2                              check(estado_des in ('A','B','X')));

Tabla modificada.
SQL>
SQL> --Insertamos los datos
SQL> insert into destino(codigo_des, estado_des) select codigo, estado from orig
insert into destino(codigo_des, estado_des) select codigo, estado from origen
*
ERROR en lÝnea 1:
ORA-02290: restricci¾n de control (CONTROL.CHK_DESTINO_ESTADO) violada


SQL>
SQL> ------------------------------------------------------------------
SQL> --Creamos la tabla log de errores, err_log_table_name es opcional si no lo

         indicamos creara la tabla log concatenando 'ERR$_' mas los primeros 25
         caracteres del nombre de la tabla pasado en el parametrodml_table_name
SQL> BEGIN
  2    DBMS_ERRLOG.create_error_log (dml_table_name => 'destino',
  3                                  err_log_table_name=>'err$_destino');
  4  END;
  5  /

Procedimiento PL/SQL terminado correctamente.

SQL>
SQL> --Probamos de nuevo la sentencia pero con la clausula LOG ERROR
SQL> insert into destino(codigo_des, estado_des)
  2  select codigo, estado from origen
  3  log errors into err$_destino  ('INSERT') reject limit unlimited;

99999 filas creadas.
SQL>
SQL> commit;

Confirmación terminada.

SQL> select * from err$_destino;

Como vemos, el insert se realizó solo de los registros que no generaron errores, los que presentaron errores se envian a la tabla ERR$_DESTINO.
UPDATE
SQL> --Borramos la tabla log
SQL> delete err$_destino;
2 filas suprimidas.
SQL>
SQL> --Contamos los datos
SQL> select count(*) cantidad from destino;

  CANTIDAD
----------
     99999

SQL>
SQL> --Ejecutamos el update
SQL> update destino
  2  set estado_des=decode(estado_des,'A','X','B','Z');
update destino
*
ERROR en lÝnea 1:
ORA-02290: restricci¾n de control (CONTROL.CHK_DESTINO_ESTADO) violada


SQL>--Ya no es necesario crear la tabla LOG con el procedimiento ya que en el
             ejemplo anterio del INSERT ya lo creamos
SQL> --Update con LOG ERROR
SQL> update destino
  2  set estado_des=decode(estado_des,'A','X','B','Z')
  3  log errors into err$_destino  ('UPDATE') reject limit unlimited;

99998 filas actualizadas.
SQL>
SQL> --Consultamos los errores
SQL> select * from err$_destino;


Conclusión
Esta es una gran utilidad para gestionar de manera automatico el registro de errores que se producen al momento de realizar operaciones DML en operaciones masivas o individuales. Puede ser implemtado tambien en procedimiento PL/SQL .

lunes, 11 de junio de 2012

ORA-01031: insufficient privileges al ingresar al SQLPLUS

Si al tratar de ingresar al sqlplus como sysdba con el siguiente comando te da un error:
>set ORACLE_SID=D7ITEST 
>sqlplus / as sysdbaSQL*Plus: Release 10.2.0.5.0 - Production on Lun Jun 11 13:27:23 2012
Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.
ERROR:
ORA-01031: insufficient privileges


Este error se presenta cuando el usuario del SO no esta dentro del grupo ORA_DBA del host donde se encuentra instalado la base de dato.

Para que no se presente este error deberas agregar al ususario dentro del grupo ORA_DBA
Luego de que se agregue el usuario de OS al grupo no habrá problema de ingresar.

viernes, 18 de mayo de 2012

Error al crear repositorio del Enterprise Manager 10G con el EMCA

Saludos,

No es raro que la consola del Enterprise Manager falle debido a cambios en el host como el cambio de dominio, cambio de ip o de ip fija a dínamica. Aunque esto falle no es de preocuparnos ya que lo podemos reconstruir sin afectar la operación de la base de datos. Aunque esto ya lo había realizado un monton de veces se presento un error al tratar de generarlo. Mi version de base de datos en la que estoy trabajando es 10.2.0.3.0

Claro que antes de crear el repositorio borre el anterior con el comando:
emca -deconfig dbcontrol db -repos drop

Revisando el log "emca_2012-05-18_09-47-23-AM.log" no me decía mucho acerca del error

May 18, 2012 9:51:36 AM oracle.sysman.emcp.EMReposConfig createRepository
CONFIG: ORA-01403: no data found
ORA-06512: at line 259
oracle.sysman.assistants.util.sqlEngine.SQLFatalErrorException: ORA-01403: no data found
ORA-06512: at line 259
 at oracle.sysman.assistants.util.sqlEngine.SQLEngine.executeImpl(SQLEngine.java:1467)
 at oracle.sysman.assistants.util.sqlEngine.SQLEngine.executeScript(SQLEngine.java:841)
 at oracle.sysman.assistants.util.sqlEngine.SQLPlusEngine.executeScript(SQLPlusEngine.java:265)
 at oracle.sysman.assistants.util.sqlEngine.SQLPlusEngine.executeScript(SQLPlusEngine.java:306)
 at oracle.sysman.emcp.EMReposConfig.createRepository(EMReposConfig.java:389)
 at oracle.sysman.emcp.EMReposConfig.invoke(EMReposConfig.java:191)
 at oracle.sysman.emcp.EMReposConfig.invoke(EMReposConfig.java:133)
 at oracle.sysman.emcp.EMConfig.perform(EMConfig.java:142)
 at oracle.sysman.emcp.EMConfigAssistant.invokeEMCA(EMConfigAssistant.java:485)
 at oracle.sysman.emcp.EMConfigAssistant.performConfiguration(EMConfigAssistant.java:1141)
 at oracle.sysman.emcp.EMConfigAssistant.statusMain(EMConfigAssistant.java:469)
 at oracle.sysman.emcp.EMConfigAssistant.main(EMConfigAssistant.java:418)
May 18, 2012 9:51:36 AM oracle.sysman.emcp.EMReposConfig invoke

Revisando el log del script que ejecutó para ver en donde se dió el error "emca_repos_create_2012-05-18_09-48-37-AM.log" tampoco ayudaba mucho:

PL/SQL procedure successfully completed.
No errors.
BEGIN
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 259

Para determinar el error para ver en donde se caia realice un monitoreo del proceso y econtre que el ORA-01403: no data found se generaba en el script "self_monitor_post_creation.sql" dentro en la ruta %HOME_ORACLE%\db_1\sysman\admin\emdrep\sql\core\latest\self_monitor.

Revisando este archivo se encontró la linea que generaba el error "SELECT host_name into l_host_name FROM v$instance WHERE ROWNUM=1;". Esto sucede ya que en version 10.2.0.3 esto no retorna datos.

Para solucionar este error hay dos opciones:
  1. Parchar a la version 10.2.0.5.0(Version que se presento el error 10.2.0.3.0)
  2. Modificar el script "self_monitor_post_creation.sql" modificando "SELECT host_name into l_host_name FROM v$instance WHERE ROWNUM=1;" por esto "SELECT host_name into l_host_name FROM v$instance WHERE ROWNUM<=1;"
Cualquiera de las dos opciones puedes usar para solucionar el error, pero antes no olvidar borrar el repositorio que quedo a medias.

martes, 24 de enero de 2012

ORACLE ASM

Saludos, este post lo dedicare para explicar de manera breve que es ASM, las ventajas de usar ASM y dar un pequeño ejemplo de la creación de una instancia simple ASM.
 ASM es Administración Automática de Almacenamiento o sus siglas en ingles Automatic Storage Management, es una nueva característica introducida desde la versión 10G cuyo objetivo es simplificar la administración de los archivos de base de datos como datafile, control file, spfile , log file y archive log.



Acerca de ASM (Administración Automática de Almacenamiento)  ASM Esta característica tiene como objetivo simplificar la administración de los archivos relacionados con la base de datos Oracle como: 

  • Database files
  • Control files
  • Online redo log files
  • Archived redo log files
  • Archivo Flash recovery area
  • Archivos RMAN 

Exceptiones:
  • Archivos tracer
  • Archivos log
  • Archivos del sistema operativo

ASM es un file system creado exclusivamente para los archivos de base de datos Oracle, esto permite a los administradores asignar estos archivos a grupos de discos en lugar de discos individuales. ASM nació de la funcionalidad Archivos Administrados por Oracle OMF(Oracle Managed File) que incluye balanceo y redundancia. 
 Esta utilidad ASM es administrada por una instancia Oracle tipo ASM. Esta instancia Oracle ASM no es una versión completa sino que es muy ligera, solo se necesita de estructuras de memoria SGA y procesos background para poder trabajar.
En la imagen anterior se muestra como una base de datos hace uso del repositorio ASM para almacenar los archivos Oracle, además se como interactúa con la instancia ASM. Por debajo vemos las dos unidades de disco que forman un grupo de discos administrado por la instancia Oracle ASM.
Funcionalidades:
  • Simplifica la administración de los archivos Oracle. Debido que a la base ASM se le presenta los grupos de discos para almacenar los archivos, estos por debajo pueden crecer, balancear y administrar de manera independiente y transparente. Por ejemplo, que pasaría si en una base de datos no ASM manejada por archivos del file system del sistema operativo nos estemos quedando sin espacio y nuestra base requiera de mas espacio, bueno, la tarea es agregar discos y agregar datafiles direccionados a las nuevas unidades agregadas, ahora en una base ASM esto es más simple, solo se tiene que agregar los discos al grupo de disco ASM y de forma automática se pondrá a disponibilidad el espacio a los grupos de discos.  


  • Manejo de redundancia dentro de los grupos de discos. Se puede agregar la redundancia para crear espejos de información de tal manera que se evite la perdida de información en caso de que falle uno de los discos.
  • Maneja archivos de gran tamaño.
  • Puede dar servicio a una o más servicios de base de datos residentes en el servidor. Esto quiere decir que solo necesitamos de una sola instancia ASM para brindar servicios a una o mas base de datos que residan en el servidor de la ASM.

  • Creación de una instancia ASM simple de manera manual.
    Como indique, ASM es un file system manjado exclusivamente por Oracle, como lo hace esto? Lo logra por medio de una instancia Oracle tipo ASM quien es el encargado de administrar el file system y proporcionar este servicio a otras bases de datos Oracle para que almacen sus archivos en el repositorio Oracle ASM intance.
    Previo a esto deberá estar instalado Oracle Database 10g o superior para poder realizar la creación de una instancia ASM simple en un sistema operativo windows.
    Nuestro ejercicio constará de:
    • Creación de los directorios
    • Creación de discos ASM con la utilidad ASMTOOL
    • Creación del CSS (Cluster Synchronization Services) requerido para ASM
    • Creación del archivo de parámetros de inicialización ini+ASM.ORA
    • Creación e iniciar la instancia ASM
    Asociar los discos ASM creados a la instancia ASM.El home donde trabajaremos es donde se instaló la base de datos Oracle que para mi caso es C:\Oracle\BDHome_1\10
     
    Creación de los directorios
    Estos directorios son para registrar los archivos log y tracer que se generará la instancia ASM
    C:\>mkdir C:\Oracle\BDHome_1\10\admin\+ASM\bdump
    C:\>mkdir C:\Oracle\BDHome_1\10\admin\+ASM\cdump
    C:\>mkdir C:\Oracle\BDHome_1\10\admin\+ASM\hdump
    C:\>mkdir C:\Oracle\BDHome_1\10\admin\+ASM\pfile
    C:\>mkdir C:\Oracle\BDHome_1\10\admin\+ASM\udump
    Creación de discos ASM con la utilidad ASMTOOL
    Lo ideal es presentar a la instancia ASM dispositivos RAW, pero como es una práctica podemos crear archivos que sirvan a la ASM con la utilidad ASMTOOL es una herramienta que nos permitirá crear en al file sytem unidades ASM para nuestra instancia.
    Esto puede crearse antes o después de crear la instancia ASM. Crear en la carpeta oraasmdisk en la unidad C antes de ejecutar en el cmd los comandos ASMTOOL
    C:\>asmtool -create c:\oraasmdisk\asmdsk01.asm 2048m
    C:\>asmtool -create c:\oraasmdisk\asmdsk02.asm 2028m
    Creación del CSS (Cluster Synchronization Services) requerido para ASM
    C:\>set ORACLE_HOME=C:\Oracle\BDHome_1\10\db_1\BIN
    C:\>localconfig.bat add
    Step 1:  creating new OCR repository
    Successfully accumulated necessary OCR keys.
    Creating OCR keys for user 'victor endara', privgrp ''..
    Operation successful.
    Step 2:  creating new CSS service
    successfully created local CSS service
    successfully added CSS to home

    Creación del archivo de parámetros de inicialización ini+ASM.ORA
    Abrimos un bloc de notas y guardamos la siguiente configuración en la ruta C:\Oracle\BDHome_1\10\db_1\database
    #Se indoca el tipo de instancia ASM
    instance_type=ASM
    #Nombre de la instancia
    DB_UNIQUE_NAME = +ASM
    #Ruta de donde tomara los discos
    ASM_DISKSTRING = 'C:\oraasmdisk\*'
    _ASM_ALLOW_ONLY_RAW_DISKS=FALSE
    remote_login_passwordfile=exclusive
    LARGE_POOL_SIZE = 16M
    #ruta en donde se crearan los tracer y logs
    BACKGROUND_DUMP_DEST ='C:\Oracle\BDHome_1\10\admin\+ASM\bdump'
    USER_DUMP_DEST = 'C:\Oracle\BDHome_1\10\admin\+ASM\udump'
    CORE_DUMP_DEST = 'C:\Oracle\BDHome_1\10\admin\+ASM\cdump'
    #Nombre del grupo de disco a crear
    ASM_DISKGROUPS='dgroup1'

    Crear e iniciar la instancia ASM
    Primero crearemos la instancia ASM indicando que arrancará con el archivo ini+ASM.ORA que creamos en el paso anterior.
    C:\>ORADIM -NEW -ASMSID +ASM -pfile 'C:\Oracle\BDHome_1\10\db_1\database\init+ASM.ora' -SYSPWD oracle -STARTMODE auto
    Instancia creada. 
    • NEW indicamos que agregaremos una nueva instancia
    • ASMSID indicamos el nombre de la instancia ASM
    • PFILE indicamos la ruta del archivo de inicialización con la que arrancará la instancia
    • SYSPWD indicamos la clave para crear el archivo password para ingresar posteriomente
    Una vez creada la instancia la iniciamos
    C:\>set oracle_sid=+ASM
    El error presenta es normal, ya que todavía no hemos presentados los discos al grupo
    C:\>sqlplus sys/oracle as sysdba
    SQL*Plus: Release 10.2.0.1.0 - Production
    Copyright (c) 1982, 2005, Oracle.  All rights reserved.
    Conectado a una instancia inactiva.
    SQL> startup
    Instancia de ASM iniciada
    Total System Global Area   88080384 bytes
    Fixed Size                  1247444 bytes
    Variable Size              61667116 bytes
    ASM Cache                  25165824 bytes
    ORA-15032: no se han realizado todas las modificaciones
    ORA-15063: ASM ha detectado un numero insuficiente de discos para el grupo de
    discos "DGROUP1"

    Asociar los discos ASM creados a la instancia ASM.
    Presentaremos los discos creados al grupo para que puedan ser usados como repositorios.
    SQL> create diskgroup dgroup1 normal redundancy disk
      2  'C:\oraasmdisk\asmdsk01.asm',
      3  'C:\oraasmdisk\asmdsk02.asm';
    Grupo de discos creado.
    SQL> startup force;
    Instancia de ASM iniciada
    Total System Global Area   88080384 bytes
    Fixed Size                  1247444 bytes
    Variable Size              61667116 bytes
    ASM Cache                  25165824 bytes
    Grupos de discos de ASM montados
    Consultemos es espacio disponible para el grupo
    SQL> select name, state, total_mb, free_mb from  V$ASM_DISKGROUP;
    NAME                           STATE         TOTAL_MB    FREE_MB
    ------------------------------ ----------- ---------- ----------
    DGROUP1                        MOUNTED           4076       3974
    Consultemos los discos asociados al grupo
    SQL> SELECT name, path FROM v$asm_disk;
    NAME          PATH
    ------------- ------------------------------------------
    DGROUP1_0000  C:\ORAASMDISK\ASMDSK01.ASM
    DGROUP1_0001  C:\ORAASMDISK\ASMDSK02.ASM

    Listo!!! Ahora ya tenemos nuestra instancia ASM básica disponible para presentarlo como almacenamiento.

    domingo, 15 de enero de 2012

    ORA-01031: insufficient privileges (DBD ERROR: OCISessionBegin)

    Error al ingresar ASMCMD "ORA-01031: insufficient privileges (DBD ERROR: OCISessionBegin)" Este error ocurre cuando no se tiene los privilegios o accesos necesarios a nivel del sistemas operativo.

    Para resolver este problema debes de asegurarte de:

    • Asegurate de que el usuario logoneado en el sistemas operativo tenga asociado el grupo ORA_DBA.
    • Que exista la siguiente configuración en el SQLNET.ORA: SQLNET.AUTHENTICATION_SERVICES = (NTS)