oracle

oracle: ALTER TABLE … MOVE

Это не руководство к действию. Пишу для того, чтобы не забыть. Довелось базу обрезать ORACLE 9i, и столкнулся с битыми блоками.

alter table MAGICASH5.ECFIL030 move lob (OUT_BLOB_LOCATOR) store as (tablespace MG_TABLE)
DECLARE
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 17, block # 187321)
ORA-26040: Data block was loaded using the NOLOGGING option
ORA-01110: data file 17: ‘C:\ORACLE\ORADATA\MAGICASH\MG_TABLE02.DBF’
ORA-06512: at line 210

Итак поехали

— создаём табличное пространство
CREATE TABLESPACE MG_TABLE_LOB
DATAFILE  ‘ C:\ORACLE\ORADATA\MAGICASH\MG_TABLE_LOB.dbf’ SIZE 1000M AUTOEXTEND ON;
— проверяем в каком tablespace таблица до MOVE
select * from dba_segments where segment_name=’ ECFIL030 ‘;
select * from dba_tables where table_name=’ ECFIL030′;
— проверяем индексы
— check index status
select index_name,status from dba_indexes where table_name
in (‘ECFIL030′,’CDR_UNBILLED’,’CDR_DATA_DUC’,’CDR_BILLED’);
— check index status for partition
select index_name,partition_name,status from dba_ind_partitions
where partition_name like ‘T%’ ;
— перемещаем таблицу в другое tablespace
alter table MAGICASH5.ECFIL030 move tablespace MG_TABLE_LOB;
— если много таблиц, то можно сгенерить команды
select ‘alter table quest.’|| table_name || ‘ move;’ from dba_tables where owner=’QUEST’;
— проверяем в каком tablespace таблица после MOVE
select * from dba_segments where segment_name=’ECFIL030′;
select * from dba_tables where table_name=’ECFIL030′;
— пересоздаём индексы таблицы, если они там были
 — в этом примере пересоздаём индексы и переносим их в другое табличное пространство
alter index MAGICASH5 .IND_ECFIL030_TYPE rebuild tablespace MG_TABLE_LOB online;
— если много таблиц, то можно сгенерить команды
select ‘alter index quest.’|| index_name || ‘ rebuild online;’ from dba_indexes where owner=’QUEST’;
— проверяем индексы
select index_name,status from dba_indexes where table_name=’ECFIL030′;
посмотреть сегмент
select segment_name, segment_type, bytes
from dba_segments
where segment_name = ‘SYS_LOB0000030667C00043$$’;
select table_name, column_name, segment_name, index_name
from dba_lobs
where segment_name = ‘SYS_LOB0000030667C00043$$’;
select index_name,status from dba_indexes where table_name
in (‘ECFIL030′,’CDR_UNBILLED’,’CDR_DATA_DUC’,’CDR_BILLED’);
select * from dba_segments where segment_name=’ECFIL030′;
select * from dba_tables where table_name=’ECFIL030′;
select index_name,status from dba_indexes where table_name=’ECFIL030′;

Пролистать наверх