lunes, 29 de junio de 2015

Instalar Oracle 12C ASM Grid y Base de Datos

Como instalar Oracle ASM 12C en windows?


ASM es la gestión automática del almacenamiento de los datos de la/las instancias de BD Oracle, esto quiere decir que las unidades de almacenamiento no van a ser gestionadas por SO si no por una instancia ASM Oracle.

Arquitectura ASM

SO Windows server 2008r2
RAM 10Gb
HD 60Gb para el SO
HD 100Gb para el almacenmaiento ASM.

Para esta instalación vamos a tener que realizar unas configuraciones como pre-requisitos para la instalación del ASM.

Oracle 12C ASM sobre un SO WS 2008R2, para ello tenemos primero realizar las descarga del software instalador del Grid y Base de Datos:
http://www.oracle.com/technetwork/database/enterprise-edition/downloads/database12c-win64-download-2297732.html

Oracle Database 12c Release 1 (12.1.0.2.0) for Microsoft Windows (x64)
Descomprimir dentro de la carpeta c:\instaladores\database

Oracle Database Grid Infrastructure (12.1.0.2.0) for Microsoft Windows (x64)
Descomprimir dentro de la carpeta c:\instaladores\grid

Para mas información de lo que es ASM dejo el link siguiente:
http://oracle-y-yo.blogspot.com/2012/01/oracle-asm.html

Preparacion del SO

Instalar Java
https://www.java.com/es/download/

Modificar el archivo c:\Windows\System32\drivers\etc\host, agregar las siguinetes lineas

127.0.0.1 localhost
::1 localhost
127.0.0.1 oracle12c oracle12c.technologylair.com

Desactivar user account control UAC desde el panel de control.

Preparar los volumenes de disco (dejarlas en estado crudo sin formato) que van a ser gestionadas por el ASM,  en este ejemplo solo tenemos un disco de 100Gb que vamos a usar como espacio ASM y vamos a dividirlo en volumenes 90Gb para datos(DATA) y 10Gb para flash recovery(FRA).
Disco sin formatear, se dividara en 90Gb y 10Gb

Agregamos nuevo volumen

Indicamos el tamano

No se le asigna letra

No formateamos, lo dejamos en crudo


Repetimos los pasos para crear el otro volumen con el espacio faltante de 90Gb

Instalación de la infrastructura GRID

Preparacion de los volumenes
Con esto ya tendremos nuestros volumnes de 90Gb y 10Gb en estado RAW que seran presentados al ASM, para ello debemos de prepararlo, para ello vamos a descomprimir los instaladores de grid en la ruta c:\instaladores\grid, abrir una ventada CMD y ejecutar el asmtool.exe list.

  • c:\instaladores\grid\asmtool\asmtool.exe list


Tomamos los volumenes que no tienen formato \Device\Harddisk1\Partition1 y \Device\Harddisk1\Partition2 y vamos a agregarlo como volumenes disponibles para el ASM.
  • c:\instaladores\grid\asmtool\asmtool.exe -add  \Device\Harddisk1\Partition1 DATA_01
  • c:\instaladores\grid\asmtool\asmtool.exe -add  \Device\Harddisk1\Partition1 DATA_02


Instalación del software Oracle Grid
Ejecutar el setup.exe dentro de la carpeta c:\instaladores\grid\setup.exe

Omitimos las actualizaciones, si tienen una cuenta oracle la pueden activar

Instalar y Configurar infraestructura Grid para un Servidor Independiente

Seleccionamos el idioma
 En esta parte vamos a crear el grupo de discos DATA que va a servir de almacenamiento, ASM permite elegir el tipo de redundancia (RAID):

  • EXTERNAL: Necesitas 1 disco para crear 1 diskgroup. no permite fallos de discos
  • NORMAL: Necesitas 2 discos para crear 1 diskgroup. permite un fallo de discos
  • HIGH: Necesitas 3 discos para crear 1 diskgroup. permite hasta 2 fallos de discos

Todo depende del nivel de seguridad ante daños que se desea implementar o si el manejo del raid esta por hardware ya no necesitaras mantener una redundancia. En este ejemplo los crearemos como External.


Sleccionamos el volumen de 90Gb para el grupo DATA

Establecemos contraseña

Definimos el home de la instlacion



Siguiendo estos pasos ya tenemos lista la instancia ASM que sera la gestora del alamacenamiento, luego de esto procederemos a crear un grupo mas de discos que sera la Flash Recovery Area llamado FRA

Ejecutamos el asistente de configuracion de Gestion Automatica que esta dentro del Menu Inicio\Oracle-OraGI12Home1\Herramientas de Configuracion y Migracion.
Seleccionamos Crear
Seleccionamos el volumen de 10Gb y lo anexamos al nuevo grupo FRA
La FRA nos servidrá durante la instalación y creación de la instancia Oracle Database, como espacio de recuperación de Flash Recovery.

Instalación del software Oracle Database
Ejecutar el setup.exe dentro de la carpeta c:\instaladores\database\setup.exe

 
Si tenemos un usuario support lo podemos ingresar

Omitimos actualizaciones

Instalamos y creamos base de datos

Seleccionamos de tipo servidor

Instancia de tipo unica

Instalacion avanzada

Seleccionamos nuestros idiomas

Tipo de edicion de BD, en mi caso standart edition one

Seleccionamos que se cree con la cueta incorporada de windows


Seleccionamos el home del software Oracle Database

Selecionamos de tipo transaccional
En esta sección tenemos la opción de crear una instancia PDB que este dentro de una base contenedora CDB, si deseamo crear una base de la forma tradicional enconces de desmarca "Crear como Base de Datos el Contenedor"

Assignamos la memoria de la BD, como recomendación no mas del 60% de la física

Seleccionamos el juego de caracteres

Indicamos en donde se van a ubicar los datos de la BD, en este caso dentro del ASM.

Si tenemos un Cloud Control lo registramos si deseamo, en otro caso no lo marcamos

Seleccionamos DATA como repositorio de almacenamiento

Definimos la clave por usuario de base de datos o unica para todos los usuarios



Nos muestra la información de la base de datos que se creó.

Finalizar.

Listo, ya tenemos listo nuestra base de datos D7IPROD con almacenamiento ASM.

Probamos la conexion a la BD desde el SQLPLUS


domingo, 30 de noviembre de 2014

SHRINK clause should not be specified for this object

Mientras realizaba un mantenimiento de rutina a una BD y en una de las tareas ejecuto un shrink a una tabla a la cual se podía reclamar espacio, pero mi sorpres fue que me presentaba el siguiente error:

SHRINK clause should not be specified for this object

Hasta lo que sabia es que no podemos realizar shrink a tablas externas o que tengan una columna de tipo long. Lo unico que me percate es que la table tenia un índice basado en función y el shrink no lo soporta.

La solucion fue seguir los pasos siguientes:
  1. borrar el indice basado en función, 
  2. aplicar el shrink y 
  3. recrear el indice que borramos.
si el problema persiste, hay otra razones por la que que no puedas aplicar el shrink como:
  • Tablas  comprimida
  • Tablas contiene columnas long
  • Tablas organizada por indices
  • Tablas maestras de vistas materiralizada

viernes, 28 de febrero de 2014

Oracle 11g ORA-03135: connection lost contact

Saludsos,

Estaba finalizando la instlación y configuración base de datos 11g en oracle linux 6, o sorpresa las conexiones en los clientes retornaban el siguiente error:

ORA-03135: connection lost contact

Esto me hizo pensar "Que carajo hice mal en la instalación",  aunque en la conexión local y el funcionamiento de EM todo funcionaba bien.

En la ayuda de oracle se publico un articulo que habla de tema y que su solución esta en configurar el archivo SQLNET.ORA ubicado en el ORACLE_HOME/network/admin/ agregando las siguientes líneas:

vi
#Aqui las gloriosas lineas para solución
SQLNET.INBOUND_CONNECT_TIMEOUT = 300
SQLNET.SEND_TIMEOUT = 300
SQLNET.RECV_TIMEOUT = 300

Adicional a esto es necesario desacivar el IPV6 en el sistema operactivo Linux, esto se lo realiza en los siguientes archivos y comando:
  • /etc/sysconfig/network: NETWORKING_IPV6=no
  • /etc/sysctl.conf: net.ipv6.conf.all.disable_ipv6 = 1
  • chkconfig ip6tables off
Das un reiniciio de confianza al servidor y listo, problema solucionado




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.