{"id":592,"date":"2013-06-05T21:19:18","date_gmt":"2013-06-05T19:19:18","guid":{"rendered":"http:\/\/clemente.pamplona.name\/dba\/?p=592"},"modified":"2013-06-06T14:03:36","modified_gmt":"2013-06-06T12:03:36","slug":"detectando-bloques-corruptos-en-oracle-modo-noarchivelog","status":"publish","type":"post","link":"http:\/\/clemente.pamplona.name\/dba\/detectando-bloques-corruptos-en-oracle-modo-noarchivelog\/","title":{"rendered":"Detectando bloques corruptos en Oracle"},"content":{"rendered":"<p>Hoy vamos a ver como detectar que se nos ha roto en casos de problemas de bloques corruptos de Oracle.<\/p>\n<p>Lo primero que tenemos que tener en mente es tener la base de datos en modo archivelog y hacer copias peri\u00f3dicas con RMAN, pero , \u00bfque ocurre si no es as\u00ed y tenemos una corrupci\u00f3n de datos?<br \/>\nSeguramente habremos perdido esos bloques. Pero, lo primero va a ser el saber que objetos l\u00f3gicos tenemos corruptos .<\/p>\n<p>Tenemos dos maneras de detectar la corrupci\u00f3n de datos<\/p>\n<h1> RMAN<\/h1>\n<p>Si tenemos la base de datos en modo archivelog ejecutaremos<\/p>\n<pre>\r\n rman target \/ nocatalog\r\nrun {\r\nallocate channel d1 type disk;\r\nbackup check logical validate database;\r\nrelease channel d1;\r\n}\r\n<\/pre>\n<p>El comando <i>validate<\/i> de RMAN har\u00e1 un chequeo de los bloques inv\u00e1lidos y nos los dejar\u00e1 en la vista <b>v$database_block_corruption;<\/b><\/p>\n<h1> DBVERIFY<\/h1>\n<p>Si no tenemos la base de datos en modo archivelog, no podemos usar RMAN (a no ser que est\u00e9 en modo MOUNT), asi que,usaermos <b>dbv<\/b>.<\/p>\n<p>Oracle provee en todas las plataformas el comando de sistema operativo  DBVERIFY (dbv) que nos permite el llevar a cabo una comprobaci\u00f3n de la integridad f\u00edsica de los ficheros de la base de datos.Su gran ventaja es que no necesita corte de servicio y podemos ejecutarlo tranquilamente mientras los usuarios trabajan en la base de datos.<\/p>\n<p>La sintaxis la podemos ver en <a href=\" http:\/\/docs.oracle.com\/cd\/A97630_01\/server.920\/a96652\/ch13.htm\">http:\/\/docs.oracle.com\/cd\/A97630_01\/server.920\/a96652\/ch13.htm<\/a> , y su principal inconveniente es que debe lanzarse para cada uno de los datafiles de la base de datos.<\/p>\n<p>Una manera r\u00e1pida de automatizar el comando para toda la base de datos es mediante el siguiente script  ejecutado como sys o system<\/p>\n<pre>\r\nspool \/tmp\/datafiles_corruptos.sh\r\nset linesize 200\r\nset heading off\r\nset pagesize 200\r\nselect 'dbv  file=' || name || ' blocksize=' || block_size || \r\n       ' feedback=' || round(blocks*.10,0)||\r\n       '  logfile=' || file# || '.log'\r\n          from v$datafile;\r\n<\/pre>\n<p>Este script nos dejara un fichero <em>\/tmp\/datafiles_corruptos.sh<\/em>   con tantas l\u00edneas como datafiles tenga la base de datos  de la forma<\/p>\n<pre>\r\ndbv  file=\/opt\/oracle\/oradata\/pruebas\/tablespace_indices001.dbf blocksize=8192 feedback=3840  logfile=2\r\n<\/pre>\n<p>El comando dbv nos va a generar un fichero de log de nombre  DATAFILE#.log, con lo que, mi consejo es crear un subdirectorio y lanzar el script  \/tmp\/datafiles_corruptos.sh desde este subdirectorio, asi no llenaremos el path donde nos encontremos de ficheros de log.<\/p>\n<p>EL detectar lo bloques inv\u00e1lidos es muy sencillo, solamente tenemos que ordenar por tama\u00f1o de fichero en el subdirectorio que tenemos los logs. Los ficheros que no tienen bloques corruptos tendr\u00e1s un tama\u00f1o aproximado de 1 Km y su contenido ser\u00e1 similar a :<\/p>\n<pre>\r\nDBVERIFY: Release 11.2.0.3.0 - Production on Jue Jun 6 13:14:28 2013\r\nCopyright (c) 1982, 2011, Oracle and\/or its affiliates.  All rights reserved.\r\nDBVERIFY - Iniciando verificaci\u00f3n : FILE =\/opt\/oracle\/oradata\/pruebas\/tablespace_indices018.dbf\r\nDBVERIFY - Verificaci\u00f3n terminada\r\nTotal de P\u00e1ginas Examinadas     : 153600\r\nTotal de P\u00e1ginas Procesadas (Datos): 91682\r\nTotal de P\u00e1ginas con Fallos (Datos): 0\r\nTotal de P\u00e1ginas Procesadas (\u00cdndice): 28488\r\nTotal de P\u00e1ginas con Fallos (\u00cdndice): 0\r\nTotal de P\u00e1ginas Procesadas (Otras): 17288\r\nTotal de P\u00e1ginas Procesadas (Seg): 1\r\nTotal de P\u00e1ginas con Fallos (Seg): 0\r\nTotal de P\u00e1ginas Vac\u00edas         : 16142\r\nTotal de P\u00e1ginas Marcadas como Corruptas: 0\r\nTotal de P\u00e1ginas de Entrada     : 0\r\nTotal de P\u00e1ginas Cifradas        : 0\r\nSCN de Bloque Superior            : 1961026896 (9.1961026896)\r\n<\/pre>\n<p>Los datafiles con bloques corruptos tendr\u00e1n un tama\u00f1o mayor, y su contenido ser\u00e1<\/p>\n<pre>\r\nDBVERIFY: Release 11.2.0.3.0 - Production on Jue Jun 6 13:16:14 2013\r\nCopyright (c) 1982, 2011, Oracle and\/or its affiliates.  All rights reserved.\r\nDBVERIFY - Iniciando verificaci\u00f3n : FILE = \/opt\/oracle\/oradata\/pruebas\/SYSAUX01.DBF\r\nLa p\u00e1gina 45847 es de entrada - probablemente el medio f\u00edsico est\u00e9 corrupto\r\nCorrupt block relative dba: 0x00c0b317 (file 3, block 45847)\r\nFractured block found during dbv: \r\nData in bad block:\r\n type: 6 format: 2 rdba: 0x00c0b317\r\n last change scn: 0x0009.5a58966b seq: 0x1 flg: 0x06\r\n spare1: 0x0 spare2: 0x0 spare3: 0x0\r\n consistency value in tail: 0x00000000\r\n check value in block header: 0x5708\r\n computed block checksum: 0x48fd\r\n\r\nLa p\u00e1gina 45849 est\u00e1 marcada como corrupta\r\nCorrupt block relative dba: 0x00c0b319 (file 3, block 45849)\r\nCompletely zero block found during dbv: \r\n\r\nLa p\u00e1gina 45850 est\u00e1 marcada como corrupta\r\nCorrupt block relative dba: 0x00c0b31a (file 3, block 45850)\r\nCompletely zero block found during dbv: \r\n.\r\n.\r\n.\r\n.\r\n.\r\n.\r\n\r\nLa p\u00e1gina 117911 es de entrada - probablemente el medio f\u00edsico est\u00e9 corrupto\r\nCorrupt block relative dba: 0x00c1cc97 (file 3, block 117911)\r\nFractured block found during dbv: \r\nData in bad block:\r\n type: 0 format: 0 rdba: 0x00000000\r\n last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00\r\n spare1: 0x0 spare2: 0x0 spare3: 0x0\r\n consistency value in tail: 0xc90c0601\r\n check value in block header: 0x0\r\n block checksum disabled\r\n\r\nDBVERIFY - Verificaci\u00f3n terminada\r\nTotal de P\u00e1ginas Examinadas     : 141312\r\nTotal de P\u00e1ginas Procesadas (Datos): 41849\r\nTotal de P\u00e1ginas con Fallos (Datos): 0\r\nTotal de P\u00e1ginas Procesadas (\u00cdndice): 46801\r\nTotal de P\u00e1ginas con Fallos (\u00cdndice): 0\r\nTotal de P\u00e1ginas Procesadas (LOB)  : 3100\r\nTotal de P\u00e1ginas con Fallos (LOB)  : 0\r\nTotal de P\u00e1ginas Procesadas (Otras): 27154\r\nTotal de P\u00e1ginas Procesadas (Seg): 0\r\nTotal de P\u00e1ginas con Fallos (Seg): 0\r\nTotal de P\u00e1ginas Vac\u00edas         : 22352\r\nTotal de P\u00e1ginas Marcadas como Corruptas: 56\r\nTotal de P\u00e1ginas de Entrada     : 6\r\nTotal de P\u00e1ginas Cifradas        : 0\r\nSCN de Bloque Superior            : 1961026953 (9.1961026953)\r\n<\/pre>\n<p>Con esto tendremos tambi\u00e9n la informaci\u00f3n en la vista  <b>v$database_block_corruption;<\/b>, pero \u00bfque objetos son los que tenemos con problemas?<br \/>\nSi ejecut\u00e1is la consulta :<\/p>\n<pre>\r\nset linesize 200\r\nset pagesize 200\r\nSELECT e.owner, e.segment_type, e.segment_name, e.partition_name, c.file#\r\n, greatest(e.block_id, c.block#) corr_start_block#\r\n, least(e.block_id+e.blocks-1, c.block#+c.blocks-1) corr_end_block#\r\n, least(e.block_id+e.blocks-1, c.block#+c.blocks-1)\r\n- greatest(e.block_id, c.block#) + 1 blocks_corrupted\r\n, null description\r\nFROM dba_extents e, v$database_block_corruption c\r\nWHERE e.file_id = c.file#\r\nAND e.block_id <= c.block# + c.blocks - 1\r\nAND e.block_id + e.blocks - 1 >= c.block#\r\nUNION\r\nSELECT s.owner, s.segment_type, s.segment_name, s.partition_name, c.file#\r\n, header_block corr_start_block#\r\n, header_block corr_end_block#\r\n, 1 blocks_corrupted\r\n, 'Segment Header' description\r\nFROM dba_segments s, v$database_block_corruption c\r\nWHERE s.header_file = c.file#\r\nAND s.header_block between c.block# and c.block# + c.blocks - 1\r\nUNION\r\nSELECT null owner, null segment_type, null segment_name, null partition_name, c.file#\r\n, greatest(f.block_id, c.block#) corr_start_block#\r\n, least(f.block_id+f.blocks-1, c.block#+c.blocks-1) corr_end_block#\r\n, least(f.block_id+f.blocks-1, c.block#+c.blocks-1)\r\n- greatest(f.block_id, c.block#) + 1 blocks_corrupted\r\n, 'Free Block' description\r\nFROM dba_free_space f, v$database_block_corruption c\r\nWHERE f.file_id = c.file#\r\nAND f.block_id <= c.block# + c.blocks - 1\r\nAND f.block_id + f.blocks - 1 >= c.block#\r\norder by file#, corr_start_block#;\r\n\r\n<\/pre>\n<p>Obtendr\u00e9is un resultado similar a este<\/p>\n<pre>\r\n\r\nOWNER        SEGMENT_TYPE       SEGMENT_NAME                   PARTITION_NAME   CORR_START_BLOCK# CORR_END_BLOCK# BLOCKS_CORRUPTED DESCRIPTION\r\n----------- ------------------ ------------------------------------------------- ---------- ----------------- ---\r\nSYS           TABLE              WRH$_PGASTAT                       3             45847         45847                1\r\nSYSMAN        TABLE              MGMT_TARGET_ASSOC_ERROR            3             45851          45851             1 Segment Header\r\n<\/pre>\n<p>Como siempre, tenemos mas informaci\u00f3n y mas precisa  en soporte oracle en :<\/p>\n<ul>\n<li>OERR: ORA-1578 \u00abORACLE data block corrupted (file # %s, block # %s)\u00bb Master Note [ID 1578.1]\n<li>Note 28814.1 Handling Oracle Block Corruptions in Oracle7\/8\/8i\/9i\/10g\n<li>  Note 556733.1 DBMS_REPAIR script  y  Note 68013.1 DBMS_REPAIR example\n<li>Physical and Logical Block Corruptions. All you wanted to know about it. [ID 840978.1]\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Hoy vamos a ver como detectar que se nos ha roto en casos de problemas de bloques corruptos de Oracle. Lo primero que tenemos que tener en mente es tener la base de datos en modo archivelog y hacer copias &hellip; <a href=\"http:\/\/clemente.pamplona.name\/dba\/detectando-bloques-corruptos-en-oracle-modo-noarchivelog\/\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,66,41,4],"tags":[246,103,102,101,23],"class_list":["post-592","post","type-post","status-publish","format-standard","hentry","category-backup","category-errores-ora","category-sistema-operativo","category-tablespaces","tag-backup","tag-dbv","tag-dbverify","tag-ora-01578","tag-rman"],"_links":{"self":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/592","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/comments?post=592"}],"version-history":[{"count":11,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/592\/revisions"}],"predecessor-version":[{"id":606,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/posts\/592\/revisions\/606"}],"wp:attachment":[{"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/media?parent=592"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/categories?post=592"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/clemente.pamplona.name\/dba\/wp-json\/wp\/v2\/tags?post=592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}