jueves, 17 de agosto de 2017

Exports e Imports en BD Oracle 11g utilizando Datapump

 Exports/Imports de Tablas

El parámetro tables es usado para especificar que solo se exportaran tablas desde la base de datos de origen. La siguiente es la sintaxis para realizar este proceso de exportación:

expdp scott/tiger@db10g tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log

impdp scott/tiger@db10g tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=impdpEMP_DEPT.log

El parámetro TABLE_EXISTS_ACTION=APPEND permite anexar información en tablas ya existentes en la base de datos destino.

 Exports/Imports de Esquemas

El parametro OWNER ha sido reemplazado por el parámetro SCHEMAS para asi indicar los esquemas que requieren ser exportados. La siguiente es la sintaxis para realizar este proceso de exportación:

expdp scott/tiger@db10g schemas=SCOTT directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log

impdp scott/tiger@db10g schemas=SCOTT directory=TEST_DIR dumpfile=SCOTT.dmp logfile=impdpSCOTT.log

 Exports/Imports de Base de datos

El parámetro FULL se indica cuando se quiere exportar la base de datos en su totalidad. La siguiente es la sintaxis para realizar este proceso de exportación:

expdp system/password@db10g full=Y directory=TEST_DIR dumpfile=DB10G.dmp logfile=expdpDB10G.log

impdp system/password@db10g full=Y directory=TEST_DIR dumpfile=DB10G.dmp logfile=impdpDB10G.log

INCLUDE y EXCLUDE

Los parámetros EXCLUDE e INCLUDE son utilizados cuando se requiere limitar a objectos especificos la exportación o importación segun sea lo necesario. Al especificar INCLUDE solo esos objetos especificos seran exportados.  Al usar EXCLUDE solo esos objectos seran excluidos en el proceso de exportación .  La siguiente es la sintaxis para realizar este proceso de exportación:

INCLUDE=object_type[:name_clause] [, ...]
EXCLUDE=object_type[:name_clause] [, ...]
 

expdp scott/tiger@db10g schemas=SCOTT include=TABLE:"IN ('EMP', 'DEPT')" directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log

expdp scott/tiger@db10g schemas=SCOTT exclude=TABLE:"= 'BONUS'" directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log

Si estos por parametros son usados desde linea de comandos dependiendo del Sistema operativo, los caracteres especiales deben ser omitidos.

include=TABLE:\"IN (\'EMP\', \'DEPT\')\"
 
Un export/import puede tener referencias a parametros multiples del siguiente modo:

INCLUDE=TABLE,VIEW,PACKAGE:"LIKE '%API'"

or

INCLUDE=TABLE
INCLUDE=VIEW
INCLUDE=PACKAGE:"LIKE '%API'"
 
Se pueden indicar multiples objetos usando los operadores LIKE e IN .

EXCLUDE=SCHEMA:"LIKE 'SYS%'"

EXCLUDE=SCHEMA:"IN ('OUTLN','SYSTEM','SYSMAN','FLOWS_FILES','APEX_030200','APEX_PUBLIC_USER','ANONYMOUS')"

ORA-01034: ORACLE Not Available Tips

Caso: Se me esta presentando el error ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist.

Respuesta:  El error ORA-01034 es un error simple que indica que la base de datos está abajo.
ORA-01034: ORACLE not available
Causa: La instancia de BD no ha sido iniciada. Entre las psoibles causas están:
- La SGA (Area global de sistema) posee menos memoria de la necesaria.
- Las variables del sistema operativo estan apuntanto a una instancia errónea.
Acción: Se debe revisar los valores seteados para la SGA, las variables de entorno de la BD (ORACLE_HOME, ORACLE_SID) y el estado del listener.

Instalación de Oracle 11g en Linux


Como es sabido la instalación de Oracle en Linux suele ser algo complicada. Para facilitar este proceso  a continuación se explican las fases para llevar a cabo, sin ningún problema, el proceso de instalación de Oracle 11g en Linux.

Antes de proceder a la instalación de Oracle Database 11g se deben tener en cuenta los siguientes requisitos de Hardware:
  • Requisitos de memoria
  • Requisitos de espacio en disco
  • Creación directorios necesarios
Requisitos de memoria
Para un funcionamiento óptimo de nuestro sistema será necesario disponer de un equipo con, al menos, 1GB de memoria RAM. Aunque podemos trabajar con sistemas que no cumplan con este requisito, si nuestro sistema crece y, con él, el número de transacciones realizadas por la base de datos, podemos obtener un deterioro drástico del rendimiento de nuestro servidor.
Directamente relacionado con el tamaño de nuestra memoria RAM, tendremos nuestra partición de swap o intercambio, la cual deberá tener, en la mayoría de los casos, una capacidad el doble de grande que nuestra memoria principal. Para ser más exactos, y según las recomendaciones facilitadas por Oracle, podemos fijarnos en la siguiente tabla para conocer la relación RAM/Swap óptima para diferentes situaciones.
RAM Disponible
Espacio Swap Requerido
Entre 257 MB y 512 MB
El doble de memoria RAM
Entre 513 MB y 2048 MB
1.5 veces el tamaño de nuestra RAM
Entre 2049 MB y 8192 MB
El mismo tamaño que RAM
Más de 8192 MB
0.75 veces el tamaño de la RAM
Requisitos de espacio en disco
Para instalar Oracle Database 11g debemos tener disponibles por lo menos entre 150 y 200MB en el directorio /tmp. Dependiendo del tipo de instalación necesitaremos, además, entre 1.5GB y 3.5GB de espacio en nuestro disco para instalar todo el software Oracle. Este tamaño podrá variar ampliamente según el tipo de instalación y elementos seleccionados. Además, si escogemos la utilidad de autobackup necesitaremos espacio extra a medida que trabajemos normalmente con nuestro sistema. Según el tipo de instalación necesitaremos:
Tipo de Instalación Espacio Requerido (GB)
Enterprise Edition 3.47
Standard Edition 3.22
Custom (espacio máximo)
3.37

Creación directorios necesarios
Antes de proceder a la instalación de Oracle, debemos crear ciertos directorios y concederles los permisos necesarios. Crearemos el directorio base de Oracle y, opcionalmente, un directorio para datos.
Para crear dichos directorios usaremos:
Comando
Acción
mkdir -p /mount_point/app/
Creación del directorio app en /mount_point
chown -R oracle:oinstall /mount_point/app/
Cambiando propietario
chmod -R 775 /mount_point/app/
Concesión de permisos
En nuestro caso /mount_point es una partición a parte montada en raíz con el nombre u01.

Requisitos de Software

Dependiendo de los productos que queramos instalar y el sistema utilizado como base, deberemos tener en cuenta ciertos puntos:
  • Requisitos de Sistema Operativo
  • Requisitos de Kernel
  • Paquetes necesarios
  • Usuarios y grupos
Requisitos de Sistema Operativo
Los siguientes sistemas operativos son soportados por la versión 11g de la Base de Datos Oracle:
Distribuciones Linux Soportadas
Asianux 2.0
Asianux 3.0
Oracle Enterprise Linux 4.0
Oracle Enterprise Linux 5.0
Red Hat Enterprise Linux 4.0
Red Hat Enterprise Linux 5.0
SUSE Enterprise Linux 10.0
Aunque solo las distribuciones que aparecen en la lista anterior son las soportadas oficialmente por Oracle, otras distribuciones tales como Fedora o Ubuntu funcionan correctamente.
Requisitos de Kernel
Las distribuciones anteriores deben utilizar las siguientes versiones de Kernel:
Distribución Versión de Kernel
Asianux 2, Oracle EL 4.0 y Red Hat EL 4.0 2.6.9
Asianux 3, Oracle EL 5.0 y Red Hat EL 5.0 2.6.18
SUSE 10 2.6.16.21
Parámetros de kernel
Hay numerosos parámetros de nuestro kernel que deberemos modificar para el uso de Oracle en nuestro equipo. La siguiente tabla muestra los valores mínimos recomendados para esos parámetros y el archivo donde aparecen.
Parámetro Valor Archivo
semmsl 250 /proc/sys/kernel/sem
semmns 32000 /proc/sys/kernel/sem
semopm 100 /proc/sys/kernel/sem
semmni 128 /proc/sys/kernel/sem
shmall 2097152 /proc/sys/kernel/shmall
shmmax La mitad del tamaño total de RAM /proc/sys/kernel/shmmax
shmmni 4096 /proc/sys/kernel/shmmni
file-max 512 * PROCESSES /proc/sys/fs/file-max
ip_local_port_range Mínimo: 1024 / Máximo: 65000 /proc/sys/net/ipv4/ip_local_port_range
rmem_default 4194304 /proc/sys/net/core/rmem_default
wmem_default 262144 /proc/sys/net/core/wmem_default
rmem_max 4194304 /proc/sys/net/core/rmem_max
wmem_max 262144 /proc/sys/net/core/wmem_max
Si en un determinado parámetro tenemos un valor igual o superior, no es necesaria su modificación, es decir, únicamente debemos modificar los parámetros que posean un valor inferior al dado. Todos los archivos mostrados en la tabla anterior contienen parámetros del kernel con lo cual puede resultar complicado y delicado su modificación directa. Una posible solución elegante y efectiva consiste en modificar el archivo /etc/sysctl.conf añadiéndole, de las líneas mostradas a continuación, únicamente las que necesitemos modificar:
kernel.shmall = 2097152 
kernel.shmmax = 2147483648 
kernel.shmmni = 4096 
kernel.sem = 250 32000 100 128 
fs.file-max = 65536 
net.ipv4.ip_local_port_range = 1024 65000 
net.core.rmem_default = 4194304 
net.core.rmem_max = 4194304 
net.core.wmem_default = 262144 
net.core.wmem_max = 262144
Paquetes necesarios
La distribución que hemos utilizado en la realización del presente proyecto ha sido Oracle Enterprise Linux 5.0 y Ubuntu 8.04 LTS. Oracle recomienda realizar una instalación típica sea cual sea la versión de nuestra distribución Linux para facilitar así todo el proceso de instalación y eliminar gran parte de los problemas de dependencias. De igual forma, es posible el uso de apt-get (previa instalación y configuración) aunque no ha sido la alternativa utilizada en nuestro caso. Los usuarios más avanzados pueden escoger una instalación mínima (con soporte para x-window ya que es necesaria para realizar la instalación de nuestra base de datos) optimizando así el uso de disco e instalar, posteriormente, los paquetes necesarios y que se añaden en el CD-ROM adjunto. Los paquetes requeridos para nuestra distribución junto a sus versiones mínimas se muestran a continuación:
binutils-2.17.50.0.6-2.el5 
compat-libstdc++-33-3.2.3-61 
elfutils-libelf-0.125-3.el5 
elfutils-libelf-devel-0.125 
glibc-2.5-12 
glibc-common-2.5-12 
glibc-devel-2.5-12 
glibc-headers-2.5-12 
gcc-4.1.1-52 
gcc-c++-4.1.1-52 
libaio-0.3.106 
libaio-devel-0.3.106 
libgcc-4.1.1-52 
libstdc++-4.1.1 
libstdc++-devel-4.1.1-52.e15 
make-3.81-1.1 
sysstat-7.0.0 
unixODBC-2.2.11 
unixODBC-devel-2.2.11
Usuarios y grupos
Los siguientes usuarios y grupos serán necesarios para la instalación y el uso de Oracle:
Nombre Tipo Rol
oinstall Grupo Grupo de inventario de Oracle
dba Grupo Grupo de OSDBA
oracle Usuario El propietario del software Oracle
nobody Usuario Usuario sin privilegios en el sistema
El usuario oracle deberá pertenecer al grupo oinstall (grupo primario) y también al grupo dba (grupo secundario).
Para mejorar el rendimiento de nuestra base de datos podemos incrementar las limitaciones de shell para el usuario oracle. En concreto, modificaremos el número máximo de descriptores abiertos y el número máximo de procesos disponibles para este usuario. Podemos establecer también ciertas variables de entorno en el archivo .bash_profile en el home del usuario oracle para tenerlas siempre disponibles cuando éste acceda al sistema. El conjunto de modificaciones que añadiremos en este paso se resumen en la siguiente tabla.
Fichero Parámetros
/etc/security/limits.conf oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
/etc/pam.d/login session required /lib/security/pam_limits.so
session required pam_limits.so
/etc/profile if [ $USER = “oracle” ]; then
if [ $SHELL = “/bin/ksh” ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
Para finalizar estableceremos variables de entorno ORACLE_BASE y ORACLE_SID.
Nota:
Para establecer las variables de entorno:
ORACLE_BASE=/mount_point/app/oracle 
ORACLE_SID=sid 
export ORACLE_BASE ORACLE_SID
Una vez hechas estas modificaciones ya estamos listos para iniciar el proceso de instalación de Oracle 11g.

Bloqueo de acceso a Base de Datos Oracle por IP o nombre de host

Se puede bloquear el acceso a la base de datos a clientes basandose en su nombre de host o dirección IP. Solo es necesario agregar unas lineas en el archivo sqlnet.ora ($TNS_ADMIN/sqlnet.ora file)
   Para esto es necesario configurar el siguiente parámetro:

tcp.validnode_checking = yes

Esto habilita la revisión de IP's y host del listener de la base de datos.
Se puede habilitar o bloquear una lista de nodos de acuerdo a lo que se requiera
quedando del siguiente modo:


tcp.invited_nodes = (hostA, hostB, hostC) o tcp.excluded_nodes = (192.168.10.3)

Nota: Si se especifica el parámetro invited_nodes solo esos nodos podrán acceder a la BD.
Al indicar el parámetro excluded_nodes solo se excluyen esos y el resto podrá acceder sin problemas.

jueves, 13 de agosto de 2015

Casos en que los Indices de Tabla son Ignorados por el Motor de BD

Al aplicar funciones en columnas indexadas en la clausula WHERE (TRUNC, TRIM.. ETC).
Estadísticas Obsoletas o inexistentes: El motor de base construye el plan de ejecución basándose por completo en las estadísticas de los objetos almacenadas en el diccionario de datos. Las estadísticas deben realizarse de manera periódica de manera que Oracle sepa con claridad cuales son los costos  asociados a cada uno de los métodos de acceso a los registros para así poder escoger la mejor opción de acceso a los datos.
Consultas que retornan muchos registros: En los casos en que las consultas retornen mas del 5% del total de filas de la tabla. Cuando ocurre esto es menos costoso para Oracle realizar un FULL SCAN de la tabla y almacenarla en memoria, que  acceder a cada uno de los registros mediante el uso del índice.
Usar el operador NULL en columnas indexadas.
Concatenar columnas indexadas. Ej.: where  nombre || apellido = ‘JUAN PEREZ’
Uso de OR en sentencias SQL.
Uso de funciones matemáticas sobre columnas indexadas.

miércoles, 12 de agosto de 2015

Monitorear operaciones de Larga Duracion

La vista V$SESSION_LONGOPS nos indica en detalle cuales son las operaciones que estan siendo realizadas en el motor oracle. Aqui podemos obtener informacion acerca de el usuario, la terminal y la operacion que esta realizando en la base de datos. Con esta informacion podemos identificar aquellas operaciones que estan causando problemas de Performance o consumo de memoria excesivos, pudiendo aplicar filtros por usuario (como indica el codigo sql adjunto).

SELECT
V.USERNAME AS 'USUARIO',
AD.MACHINE,
AD.TERMINAL,
V.OPNAME  AS 'OPERACION',
V.TARGET  AS 'OBJETO',
V.START_TIME AS  'HORA_INICIO',
V.LAST_UPDATE_TIME  AS 'ULTIMO_UPDATE',
V.ELAPSED_SECONDS  AS 'TIEMPO_TRANSCURRIDO',
V.MESSAGE
FROM
V$SESSION_LONGOPS  V, ALL_USERS AD

WHERE 1=1
AND V.USERNAME ='USERNAME'
AND V.USERNAME=AD.USERNAME

martes, 24 de febrero de 2015

Copias Inconsistentes de Base de Datos

Una copia inconsistente, online o caliente se realiza mientras la base de datos está en uso.
Un fichero de datos copiado de forma online no estará sincronizado con ningún SCN particular, se copia mientras está en uso, siendo leido por los procesos de servidor y escrito por DBWn. No es posible hacer una copia incosistente en modo <<noarchivelog>>.

Una base de datos puede permancecer abierta siempre y estar correctamente protegida por copias insonsistentes.

Existen varios pasos para  hacer una copia inconsistente gestionada por el usuario:

-Copiar el controlfile
-Copiar los ficheros de datos, mientras estan en modo copia.
-Archivar los ficheros de redo log online

Para copiar el controlfile mientras la base de datos está abierta, tenemos 2 opciones:

ALTER DATABASE BACKUP CONTROLFILE TO 'fichero';
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS 'fichero';

El primer comando realiza una copia binaria byte a byte similar al controlfile actual: es una instantanea consistente en lectura del controlfile.

El segundo construye un comando CREATE CONTROLFILE y lo almacena en el script determinado por fichero. Está escrito en ASCII y puede editarse con cualquier editor de texto. Este script se puede utilizar mientras la instancia está en modo NOMOUNT para crear un nuevo controlfile con los mismos contenidos que el original del que fue generado.

Si no se especifica la clausula <<AS fichero>> se generará en el directorio <<USER_DUMP_DEST>> y su nombre vendrá determinado por el de la instancia y por el ID del proceso de servidor que atiende a nuestra sesión.

Los ficheros de datos antes de copiarlos, hay que ponerlos en modo copia con el siguiente comando:

ALTER TABLESPACE nombre_tablespace BEGIN BACKUP;

Este comando fuerza un checkpoint parcial. Todos los buffers del buffer caché que contienen bloques de fichero de datos del tablespace nombre_tablespace se escribirán en disco. Este comando, además, permite ajustar el mecanismo de generación de redo para los cambios que se apliquen en los bloques de esos ficheros de datos, ya que es necesario tener en cuenta la situacion en la que un bloque se modifica mientras se copia.