Newsletter – Noviembre 2013 Movimiento ONLINE de Archivos de Datos en Oracle 12c Contenido Página: 1 Movimiento ONLINE de Por Ing. Manuel Carrillo [email protected] Archivos de Datos en Oracle 12c 3 Duplicación de Base de Datos sin Conectarse al Origen o al Catálogo de RMAN en Oracle 11.2 5 Diagnóstico de Bajo En versiones anteriores a 12c, si se quería mover un archivo de datos a otra ubicación, ya sea en ASM o en sistema de archivos, era necesario colocar el tablespace correspondiente en modo "OFFLINE", copiar el archivo físicamente, renombrar el archivo lógicamente, y por último regresar el tablespace a modo "ONLINE". Esta operación crea un escenario de "no disponibilidad" para algunas aplicaciones o usuarios que necesiten acceder a la información que está siendo movida. A partir de Oracle Database 12c ya no es necesario pasar por la fase "OFFLINE". 5a. Ave. 5-55 Zona14,Edificio Euro Plaza Torre II, Nivel 12 Rendimiento de Aplicaciones Teléfono: (502)2364-5300Fax: (502)2364-5311 Como ejemplo, se crea un tablespace TEST: con trcsess y tkprof [email protected] SQL> create tablespace ts_test datafile '/u01/app/oracle/oradata/test_1.dbf' size 100M; Editores Generales Tablespace created. Francisco Barrundia Luego se crea una tabla y se inserta un registro: Alejandro Lau Debbie Morán Pagina 1/10 SQL> create table tab_test (id integer) tablespace ts_test; Table created. Autores Contribuyentes SQL> insert into tab_test values (1); 1 row created. Manuel Carrillo Augusto López SQL> commit; Alejandro Lau Commit complete. 5a Av. 5-55 Zona14, Europlaza World Business Center, Torre II, Nivel 12 PBX (502) 2364-5300 Fax (502) 2364-5311 [email protected] Página 1 Para mover el archivo de datos ejecutamos la siguiente instrucción, sin necesidad de colocar "OFFLINE" el tablespace: SQL> alter database move datafile '/u01/app/oracle/oradata/test_1.dbf' to '/u01/app/oracle/oradata/test_2.dbf'; Database altered. SQL> select * from tab_test; ID ---------1 El contenido del alert.log es el siguiente: Wed Sep 04 15:40:01 2013 create tablespace test datafile '/u01/app/oracle/oradata/test_1.dbf' size 100M Completed: create tablespace test datafile '/u01/app/oracle/oradata/test_1.dbf' size 100M alter database move datafile '/u01/app/oracle/oradata/test_1.dbf' to '/u01/app/oracle/oradata/test_2.dbf' Wed Sep 04 15:41:50 2013 Moving datafile /u01/app/oracle/oradata/test_1.dbf (14) to /u01/app/oracle/oradata/test_2.dbf Move operation committed for file /u01/app/oracle/oradata/test_2.dbf Completed: alter database move datafile '/u01/app/oracle/oradata/test_1.dbf' to '/u01/app/oracle/oradata/test_2.dbf' Físicamente se puede ver el archivo de datos que ha sido movido: [oracle@rac1 admin]$ cd /u01/app/oracle/oradata/ [oracle@rac1 oradata]$ ls -l test* -rw-r----- 1 oracle oinstall 104865792 Jun 26 15:41 test_2.dbf 5a Av. 5-55 Zona14, Europlaza World Business Center, Torre II, Nivel 12 PBX (502) 2364-5300 Fax (502) 2364-5311 [email protected] Página 2 Duplicación de Base de Datos sin Conectarse al Origen o al Catálogo de RMAN en Oracle 11.2 Por Ing. Augusto López [email protected] En versiones previas a Oracle Database 11.2, para duplicar una base de datos se requiere una conexión a la base de datos a duplicar (target) o al catálogo de recovery manager (rman). En la versión 11.2 de Oracle Database esto ya no es necesario. Esta funcionalidad recibe el nombre de duplicación basada en respaldos. Escenario Instancia y base de datos a duplicar: prod Servidor origen: srvprod Respaldos de la base de datos en /prod/backups Base de datos está en modo ARCHIVELOG y usa spfile. Instancia y base de datos duplicada: dup Servidor destino: srvdup Respaldos para el duplicado están en /dup/backups La clonación se hace entre servidores de la misma plataforma (arquitectura del CPU y sistema operativo) y entre versiones iguales del software de base de datos Oracle, instalado en /u01/app/oracle/product/11.2.0/dbhome_1. Ambas bases de datos se almacenan en ASM en el diskgroup +DATA. Procedimiento 1. Generar un respaldo de la base de datos prod y sus archivelogs. RMAN> backup database format '/prod/backups/db_%U.rman'; RMAN> sql 'alter system archive log current'; RMAN> backup archivelog all format '/prod/backups/arc_%U.rman'; 2. Crear un PFILE de la base de datos a duplicar. SQL> create pfile='/prod/backups/initdup.ora' from spfile; 3. Copiar los backupsets y el PFILE al servidor srvdup. $ scp /prod/backups/* srvdup:/dup/backups 5a Av. 5-55 Zona14, Europlaza World Business Center, Torre II, Nivel 12 PBX (502) 2364-5300 Fax (502) 2364-5311 [email protected] Página 3 4. En srvdup modificar initdup.ora para cambiar los siguientes parámetros: *.audit_file_dest='/u01/app/oracle/admin/dup/adump' #crear directorio *.control_files='+DATA' *.db_create_file_dest='+DATA' *.db_name='dup' 5. En srvdup generar SPFILE a partir del PFILE. SQL> create spfile='spfiledup.ora' from pfile='initdup.ora'; 6. Crear el archivo de claves para la instancia dup. $ orapwd file=orapwdup password=miclave 7. Arrancar la instancia dup. $ export ORACLE_SID=dup $ sqlplus / as sysdba $ startup nomount 8. En srvdup hacer la clonación. $ rman auxiliary / RMAN> duplicate database to 'dup' backup location '/dup/backups'; Tip Técnico del Mes ¿Puedo determniar cuándo fue creado un objeto dentro de la base de datos, sin necesidad de habilitar la auditoria? Efectivamente es posible, con el siguiente query: SELECT OWNER, OBJECT_NAME, CREATED, LAST_DDL_TIME FROM DBA_OBJECTS WHERE OWNER = 'DUEÑO' AND OBJECT_NAME = 'NOMBRE_OBJETO'; Por Lic. Francisco Barrundia [email protected] 5a Av. 5-55 Zona14, Europlaza World Business Center, Torre II, Nivel 12 PBX (502) 2364-5300 Fax (502) 2364-5311 [email protected] Página 4 Diagnóstico de Bajo Rendimiento de Aplicaciones con trcsess y tkprof Por Ing. Alejandro Lau [email protected] Cuando una aplicación presenta un rendimiento más bajo de lo esperado o de lo normal, se puede volver muy complicado o imposible determinar la causa, si abordamos el problema con una revisión manual de código. Este código puede estar "escondido" a simple vista por la complejidad de la aplicación, ya sea código local o en la base de datos Oracle (procedimientos almacenados, triggers). En estos casos, una estrategia más efectiva es generar y analizar uno o más archivos de rastreo (trace) para la aplicación. Podemos habilitar el rastreo para una sesión específica, para un servicio de base de datos o para toda la base de datos (esta última no es recomendable). Una vez generada esta información de rastreo, procesamos el (los) archivo(s) con las herramientas de Oracle trcsess y tkprof. Rastreo a nivel de sesión Si se puede hacer en un ambiente controlado y se tiene una sesión identificada, se sugiere este procedimiento por su simplicidad. 1. Habilitar rastreo para la sesión identificada: EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(sid,serial); 2. Al terminar la sesión o después de que se haya realizado al menos un ciclo del proceso, deshabilitar el rastreo. Si la sesión ya concluyó, no es necesario este paso. EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(sid,serial); 3. Ubicar el archivo generado según el parámetro USER_DUMP_DEST (9i o 10g) o DIAGNOSTIC_DEST (11g). Generalmente, USER_DUMP_DEST apunta a $ORACLE_BASE/admin/<dbname>/udump y DIAGNOSTIC_DEST apunta a $ORACLE_BASE/diag/rdbms/<dbname>/<instancename>/trace. El nombre del archivo es de la forma <dbname>_ora_######.trc. 4. Utilizando la herramienta tkprof, generamos un archivo de texto a partir del archivo .trc. Esto simplifica el análisis de la información. tkprof archivo.trc salida.txt En el ejemplo anterior, archivo.trc es el archivo generado con el rastreo y salida.txt es el archivo que genera tkprof. El archivo generado por tkprof contiene estadísticas y planes de ejecución para cada SQL ejecutado en la sesión. Acá podemos determinar en dónde está el problema de desempeño. 5a Av. 5-55 Zona14, Europlaza World Business Center, Torre II, Nivel 12 PBX (502) 2364-5300 Fax (502) 2364-5311 [email protected] Página 5 Principalmente hay que enfocarse en la columna "elapsed", que indica el tiempo total de ejecución de la sentencia SQL. Para cada SQL se presenta información similar al siguiente ejemplo, además del plan de ejecución. call count ------- -----Parse 0 Execute 0 Fetch 12968 ------- -----total 12968 cpu elapsed disk query current -------- ---------- ---------- ---------- ---------0.00 0.00 0 0 0 0.00 0.00 0 0 0 2941.94 16031.06 2269457 365439925 2 -------- ---------- ---------- ---------- ---------2941.94 16031.06 2269457 365439925 2 rows ---------0 0 64839200 ---------64839200 Misses in library cache during parse: 0 Parsing user id: 49 (???) Elapsed times include waiting on following events: Event waited on Times ---------------------------------------Waited SQL*Net more data to client 513731 db file scattered read 98547 SQL*Net message from client 12969 SQL*Net message to client 12968 db file sequential read 699291 Disk file operations I/O 10 db file parallel read 80 latch: cache buffers chains 29 latch: In memory undo latch 2 read by other session 2 latch: object queue header operation 48 resmgr:cpu quantum 79 Max. Wait ---------0.07 3.04 33.84 0.00 2.03 0.00 0.70 0.00 0.00 0.15 0.02 0.00 Total Waited -----------21.58 1961.32 55009.22 0.06 9361.58 0.00 7.93 0.00 0.00 0.22 0.06 0.07 Podemos ver del ejemplo que el tiempo de ejecución (elapsed) es muy alto para la fase Fetch del SQL. Por las columnas disk, query y row podemos deducir que este SQL está leyendo muchísima información de disco y memoria. Más abajo en las esperas, vemos que hay muchas esperas por envío de datos al cliente (SQL*Net more data to client) y por lecturas secuenciales (db file sequential read). En este caso conviene analizar el plan de ejecución y determinar si se pueden minimizar los costos con creación de índices, cálculo de estadísticas, hints, optimización del SQL. Rastreo a nivel de servicio Si no es factible identificar una sesión para el rastreo o se quiere habilitar por un período desatendido, es mejor realizar un rastreo del servicio de base de datos. Este enfoque funciona mucho mejor si utilizamos un servicio por aplicación, en vez de utilizar el servicio por defecto de la base de datos. Por ejemplo, si tenemos un servicio test, el plan de acción es el siguiente: 1. Habilitamos rastreo para el servicio test. EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(service_name => 'test'); 2. Luego de un tiempo definido, desactivamos el rastreo. EXEC DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(service_name => 'test'); 5a Av. 5-55 Zona14, Europlaza World Business Center, Torre II, Nivel 12 PBX (502) 2364-5300 Fax (502) 2364-5311 [email protected] Página 6 3. A diferencia del rastreo para una sesión, el rastreo a nivel de servicio generará tantos archivos como sesiones utilicen el servicio. Por esta razón, necesitamos unificar todos estos archivos de rastreo generados, para luego aplicarles tkprof. En el ejemplo de abajo, buscamos los archivos de rastreo generados para el servicio test, el 23 de mayo de 2013, generando el listado a un archivo. cd $ORACLE_BASE/admin/orcl/udump grep -lF test *trc | xargs grep -l 2013-05-23 > trcsess-test.sh 4. El listado generado se debe procesar con trcsess, con la finalidad de producir un archivo unificado de rastreo. Editamos el script trcsess-test.sh y agregamos el comando trcsess al inicio. Asimismo, pegamos todas las líneas, incluyendo el comando trcsess, de modo que quede una sola línea en el archivo. trcsess output=test.trc service=test arch1.trc arch2.trc ... archN.trc Grabamos y ejecutamos el script: sh trcsess-test.sh 5. Ahora ya podemos utilizar tkprof sobre el archivo generado test.trc, para generar un archivo test.txt, similar a salida.txt de la sección anterior: tkprof test.trc test.txt Finalmente, procedemos a la revisión y diagnóstico del archivo txt. 5a Av. 5-55 Zona14, Europlaza World Business Center, Torre II, Nivel 12 PBX (502) 2364-5300 Fax (502) 2364-5311 [email protected] Página 7