ELIMINANDO BLOCOS CORROMPIDOS
██████████████████████████████████████████
SQL> SELECT * FROM v$database_block_corruption;
FILE# BLOCK# BLOCKS CORRUPTION_CHANGE# CORRUPTIO
---------- ---------- ---------- ------------------ ---------
5 48466 1 0 CORRUPT
SQL> Select * from dba_free_space where file_id=5 and 48466 between block_id and
block_id + blocks -1;
no rows selected
SQL>
set lines 234
col owner for a15
col segment_type for a15
col segment_name format a30
col partition_name for a15
SELECT e.owner, e.segment_type, e.segment_name, e.partition_name, c.file#
, greatest(e.block_id, c.block#) corr_start_block#
, least(e.block_id+e.blocks-1, c.block#+c.blocks-1) corr_end_block#
, least(e.block_id+e.blocks-1, c.block#+c.blocks-1)
- greatest(e.block_id, c.block#) + 1 blocks_corrupted
, null description
FROM dba_extents e, v$database_block_corruption c
WHERE e.file_id = c.file#
AND e.block_id <= c.block# + c.blocks - 1
AND e.block_id + e.blocks - 1 >= c.block#
UNION
SELECT s.owner, s.segment_type, s.segment_name, s.partition_name, c.file#
, header_block corr_start_block#
, header_block corr_end_block#
, 1 blocks_corrupted
, 'Segment Header' description
FROM dba_segments s, v$database_block_corruption c
WHERE s.header_file = c.file#
AND s.header_block between c.block# and c.block# + c.blocks - 1
UNION
SELECT null owner, null segment_type, null segment_name, null partition_name,
c.file#
, greatest(f.block_id, c.block#) corr_start_block#
, least(f.block_id+f.blocks-1, c.block#+c.blocks-1) corr_end_block#
, least(f.block_id+f.blocks-1, c.block#+c.blocks-1)
- greatest(f.block_id, c.block#) + 1 blocks_corrupted
, 'Free Block' description
FROM dba_free_space f, v$database_block_corruption c
WHERE f.file_id = c.file#
AND f.block_id <= c.block# + c.blocks - 1
AND f.block_id + f.blocks - 1 >= c.block#
ORDER BY file#, corr_start_block#;
OWNER SEGMENT_TYPE SEGMENT_NAME PARTITION_NAME
FILE# CORR_START_BLOCK# CORR_END_BLOCK# BLOCKS_CORRUPTED DESCRIPTION
--------------- --------------- ------------------------------ ---------------
---------- ----------------- --------------- ---------------- --------------
SYSTEMUSER TABLE PESSOA_FISICA
5 48466 48466 1
SQL>
CREATE TABLE "SYSTEMUSER"."PESSOA_FISICA"
( "ID_PFI" NUMBER(9,0) NOT NULL ENABLE,
"CD_SITUACAO" NUMBER(1,0) NOT NULL ENABLE,
"NM_PFI" VARCHAR2(50) NOT NULL ENABLE,
"CD_SEXO" CHAR(1) DEFAULT '1' NOT NULL ENABLE,
"NR_CPF" NUMBER(11,0),
"NR_RG" VARCHAR2(13),
"CD_ORGAO_EMISSOR_RG" VARCHAR2(3),
"ID_EST_EMISSOR_RG" VARCHAR2(2),
"DT_EMISSAO_RG" DATE,
"DT_NASC" DATE,
"ID_CID_NATURAL" NUMBER(9,0),
"ID_PAI_NACIONAL" VARCHAR2(4),
"ID_PFS" NUMBER(4,0),
"CD_ESTADO_CIVIL" NUMBER(1,0) DEFAULT 1,
"VL_RENDA_MENSAL" NUMBER(15,2),
"NM_PSEUDONIMO" VARCHAR2(50),
"NM_PFI_COMPLETO" VARCHAR2(80),
"DT_ULT_ALTERACAO" DATE,
CONSTRAINT "PFI_PK" PRIMARY KEY ("ID_PFI")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 393216 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "INDICES" ENABLE,
CONSTRAINT "PFI_PFI2_UK" UNIQUE ("NR_CPF")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 327680 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "INDICES" ENABLE,
CHECK (cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 )) ENABLE,
CHECK (vl_renda_mensal BETWEEN 0 AND 9999999999999.99) ENABLE,
CHECK (cd_situacao IN ( 1 , 2 , 3 , 4 )) ENABLE,
CHECK (cd_sexo IN ( 'M' , 'F' )) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( vl_renda_mensal BETWEEN 0 AND 9999999999999.99 ) ENABLE,
CHECK ( cd_situacao IN ( 1 , 2 , 3 , 4 ) ) ENABLE,
CHECK ( cd_sexo IN ( 'M' , 'F' ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( vl_renda_mensal BETWEEN 0 AND 9999999999999.99 ) ENABLE,
CHECK ( cd_situacao IN ( 1 , 2 , 3 , 4 ) ) ENABLE,
CHECK ( cd_sexo IN ( 'M' , 'F' ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( vl_renda_mensal BETWEEN 0 AND 9999999999999.99 ) ENABLE,
CHECK ( cd_situacao IN ( 1 , 2 , 3 , 4 ) ) ENABLE,
CHECK ( cd_sexo IN ( 'M' , 'F' ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( vl_renda_mensal BETWEEN 0 AND 9999999999999.99 ) ENABLE,
CHECK ( cd_situacao IN ( 1 , 2 , 3 , 4 ) ) ENABLE,
CHECK ( cd_sexo IN ( 'M' , 'F' ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CHECK ( vl_renda_mensal BETWEEN 0 AND 9999999999999.99 ) ENABLE,
CHECK ( cd_situacao IN ( 1 , 2 , 3 , 4 ) ) ENABLE,
CHECK ( cd_sexo IN ( 'M' , 'F' ) ) ENABLE,
CHECK ( cd_estado_civil IN ( 1 , 2 , 3 , 4 , 5 , 6 , 7 ) ) ENABLE,
CONSTRAINT "PFI_PFS_FK" FOREIGN KEY ("ID_PFS")
REFERENCES "SYSTEMUSER"."PROFISSAO" ("ID_PFS") ENABLE
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 2097152 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "DADOS" ENABLE ROW MOVEMENT ;
SQL> Select BYTES/1024 KBYTES from dba_free_space where file_id=5 and 48466 between
block_id and block_id + blocks -1;
no rows selected
SQL>
SQL> select segment_name, segment_type, owner
from dba_extents
where file_id =5
and 48466 between block_id
and block_id + blocks -1 ;
SEGMENT_NAME SEGMENT_TYPE OWNER
------------------------------ --------------- ---------------
PESSOA_FISICA TABLE SYSTEMUSER
SQL> Select * from dba_free_space where file_id=5 and 48466 between block_id and
block_id + blocks -1;
no rows selected
SQL>
SQL> @segmap
Tablespace FILE_ID File Name
MAXEXTEND(MB) INCREMENT(MB) AE Total Bytes Used
Free
--------------- ---------- -------------------------------------------------------
---------------- ---------------- --- -------------------- --------------------
--------------------
DADOS 5 /usr/lib/oracle/xe/oradata/XE/dados.dbf
1,900 50 YES 1,681,915,904 923,205,632
758,710,272
INDICES 6 /usr/lib/oracle/xe/oradata/XE/indices01.dbf
1,800 50 YES 953,221,120 857,669,632
95,551,488
LOBS 4 /usr/lib/oracle/xe/oradata/XE/lobs01.dbf
100 5 YES 41,943,040 20,578,304
21,364,736
SYSAUX 3 /usr/lib/oracle/xe/oradata/XE/sysaux.dbf
1,024 10 YES 542,113,792 528,285,696
13,828,096
SYSTEM 1 /usr/lib/oracle/xe/oradata/XE/system.dbf
600 10 YES 443,613,184 426,311,680
17,301,504
UNDO 2 /usr/lib/oracle/xe/oradata/XE/undo.dbf
3,072 10 YES 300,941,312 53,149,696
247,791,616
6 rows selected.
Enter value for tbs: DADOS
old 16: WHERE tablespace_name = '&&TBS'
new 16: WHERE tablespace_name = 'DADOS'
old 26: WHERE tablespace_name = '&&TBS'
new 26: WHERE tablespace_name = 'DADOS'
Enter value for file_id: 5
old 28: WHERE file_id = &&FILE_ID
new 28: WHERE file_id = 5
...
...
48137 48264 .99 SYSTEMUSER CONTATO_CLIENTE
TABLE
48265 48304 .3 SYSTEMUSER LOG_ATUALIZA_CLIENTE_CLI
TABLE
48305 48392 .68 free
48393 48520 .99 SYSTEMUSER PESSOA_FISICA
TABLE <<<<<<
48521 48648 .99 SYSTEMUSER PESSOA_FISICA
TABLE
48649 48776 .99 SYSTEMUSER PESSOA_FISICA
TABLE
...
...
...
SQL> alter table SYSTEMUSER.PESSOA_FISICA move;
alter table SYSTEMUSER.PESSOA_FISICA move
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 48466)
ORA-01110: data file 5: '/usr/lib/oracle/xe/oradata/XE/dados.dbf'
SQL> exec dbms_repair.skip_corrupt_blocks (schema_name => '&schema_name',
object_name => '&object_name', object_type => dbms_repair.table_object, flags =>
dbms_repair.SKIP_FLAG);
Enter value for schema_name: SYSTEMUSER
Enter value for object_name: PESSOA_FISICA
PL/SQL procedure successfully completed.
SQL> alter table SYSTEMUSER.PESSOA_FISICA move;
Table altered.
SQL> alter table table_name move tablespace tablespace_name;^C
SQL> exec dbms_repair.skip_corrupt_blocks (schema_name => '&schema_name',
object_name => '&object_name', object_type => dbms_repair.table_object, flags =>
dbms_repair.NOSKIP_FLAG);
Enter value for schema_name: SYSTEMUSER
Enter value for object_name: PESSOA_FISICA
PL/SQL procedure successfully completed.
SQL>
SQL> !ls ../
autostart catnoawr.sql gera_zlixo1.sh gera_zlixo2.sh gera_zlixo3.sh
LIMPEZA_XE_4.0.sql LIMPEZA_XE_5.0.sql LIMPEZA_XE_6.0.sql scripts zlixo1.sql
zlixo2.sql zlixo3.sql
SQL> @../LIMPEZA_XE_6.0.sql
rman target /
Backup validate check logical datafile 5;
Starting backup at 28-MAR-23
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=528 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
input datafile fno=00006 name=/usr/lib/oracle/xe/oradata/XE/indices01.dbf
channel ORA_DISK_1: backup set complete, elapsed time: 00:01:05
Finished backup at 28-MAR-23
RMAN>
Recovery Manager complete.
sqlplus / as sysdba
Select * from v$database_block_corruption ;
no rows selected
SQL>