Oracle fornece métodos diferentes para detectar e corrigir a corrupção do bloco de dados. Um método é soltar e recriar um objeto após a detecção da corrupção; no entanto, isso nem sempre é possível ou desejável. Se a corrupção do bloco de dados For limitada a um subconjunto de linhas, outra opção é reconstruir a tabela selecionando todos os dados, exceto as linhas corrompidas.
outra maneira de gerenciar a corrupção do bloco de dados é usar o pacote DBMS_REPAIR. Você pode usar DBMS_REPAIR para detectar e reparar blocos corrompidos em tabelas e índices. Usando essa abordagem, você pode resolver corrupções sempre que possível e também continuar a usar objetos enquanto tenta reconstruí-los ou repará-los. DBMS_REPAIR usa a seguinte abordagem para o endereço de corrupções:
- Passo 1: Detectar e Relatório de Corrupções
- Passo 2: Avaliar os Custos e Benefícios do Uso de DBMS_REPAIR
- Passo 3: Fazer com que os Objetos Utilizáveis
- Passo 4: Reparação de Danos e Reconstrução de Dados Perdidos
Nota:Qualquer corrupção que envolva a perda de dados requer análise e compreensão de como esses dados se encaixam no sistema geral de banco de dados. Portanto, DBMS_REPAIR não é uma varinha mágica-você ainda deve determinar se a abordagem de reparo fornecida por este pacote é a ferramenta apropriada para cada problema específico de corrupção. Dependendo da natureza do reparo, você pode perder dados e inconsistências lógicas podem ser introduzidas; portanto, você precisa pesar os ganhos e perdas associados ao uso de DBMS_REPAIR.
DBMS_REPAIR Conteúdo do Pacote
Tabela 19-1 descreve os procedimentos que compõem o DBMS_REPAIR pacote.
Tabela 19-1 DBMS_REPAIR Procedimentos
Nome do Procedimento | Descrição |
---|---|
|
Detecta e comunica corrupções em uma tabela ou índice. |
|
Blocos de marcas (que foram previamente identificados pelo procedimento |
|
relata entradas de índice que apontam para linhas em blocos de dados corrompidos. |
|
Recria um objeto freelists. |
|
quando usado, ignora os blocos marcados como corrompidos durante as verificações de tabela e índice. Se não for usado, você obtém o erro ORA-1578 ao encontrar blocos marcados como corrompidos. |
|
fornece funções administrativas (create, drop, purge) para reparo DBMS_REPAIR e tabelas de teclas órfãs. Observação: essas tabelas são sempre criadas no esquema SYS. |
Passo 1: Detectar e Relatório de Corrupções
a Sua primeira tarefa, antes de usar DBMS_REPAIR, deve ser a detecção e notificação de corrupções. O relatório não apenas indica o que há de errado com um bloco, mas também identifica a diretiva de reparo associada. Você tem várias opções, além de DBMS_REPAIR, para detectar corrupções. A tabela 19-2 descreve as diferentes metodologias de detecção.
Tabela 19-2 Comparação de Métodos de Detecção de Corrupção
o Método de Detecção | Descrição |
---|---|
DBMS_REPAIR |
Executa bloco de verificação para uma tabela especificada, ou partição de índice. preenche uma tabela de reparo com resultados. |
DB_VERIFY |
Externo utilitário de linha de comando que executa o bloco de verificação em um banco de dados offline. |
ANALISAR |
Usado com a VALIDAR a ESTRUTURA opção, verifica a integridade da estrutura de um índice, tabela ou cluster; cheques ou verifica se as suas tabelas e índices estão em sincronia. |
DB_BLOCK_CHECKING |
identifica blocos corrompidos antes de serem marcados como corrompidos. As verificações são realizadas quando as alterações são feitas em um bloco. |
DBMS_REPAIR: Usando o check_object e admin_tables Procedimentos
O check_object
procedimento de cheques e relatórios de corrupções de bloco para um objeto especificado. Semelhante à análise…Valide a instrução STRUCTURE para Índices e tabelas, a verificação de blocos é realizada para blocos de índice e dados, respectivamente.
não apenas relata corrupções, mas também identifica quaisquer correções que ocorreriam se fix_corrupt_blocks
fosse posteriormente executado no objeto. Essas informações são disponibilizadas preenchendo uma tabela de reparo, que deve primeiro ser criada pelo procedimento admin_tables
.
depois de executar o procedimento check_object
, uma consulta simples na tabela de reparo mostra as Diretrizes de corrupções e reparo para o objeto. Com essas informações, você pode avaliar a melhor forma de resolver os problemas relatados.
DB_VERIFY: realizando uma verificação de banco de dados Offline
normalmente, você usa DB_VERIFY como um utilitário de diagnóstico offline quando encontra problemas de corrupção de dados.
Ver Também: Para obter mais informações sobre DB_VERIFY, consulte utilitários Oracle8i.
analisar: relatórios de corrupção
a tabela analisar…VALIDATE STRUCTURE declaração valida a estrutura do objeto analisado. Se o Oracle validar com êxito a estrutura, uma mensagem confirmando sua validação será retornada a você. Se o Oracle encontrar corrupção na estrutura do objeto, uma mensagem de erro será retornada a você. Nesse caso, você soltaria e recriaria o objeto.
Veja Também: para obter mais informações sobre a instrução ANALYZE, consulte a Referência SQL Oracle8i.
DB_BLOCK_CHECKING (parâmetro de inicialização de verificação de bloco)
você pode definir a verificação de bloco para instâncias através do parâmetro DB_BLOCK_CHECKING (o valor padrão é verdadeiro); isso verifica dados e blocos de índice sempre que eles são modificados. DB_BLOCK_CHECKING é um parâmetro dinâmico, modificável pela instrução ALTER SYSTEM SET. Etapa 2: avalie os custos e Benefícios do uso do DBMS_REPAIR
Antes de usar o DBMS_REPAIR, você deve pesar os benefícios de seu uso em relação aos passivos; você também deve examinar outras opções disponíveis para abordar objetos corrompidos.
um primeiro passo é responder às seguintes perguntas:
- Qual é a extensão da corrupção?
para determinar se há corrupções e ações de reparo, execute o procedimento
check_object
e consulte a tabela de reparo. - que outras opções estão disponíveis para abordar corrupções de bloco?
assumindo que os dados estão disponíveis a partir de outra fonte, solte, recriar e re-preencher o objeto. Outra opção é emitir a tabela CREATE…Como instrução SELECT da tabela corrupt para criar uma nova.
você pode ignorar a corrupção excluindo linhas corrompidas de instruções select.
executar Recuperação de mídia.
- quais corrupções lógicas ou efeitos colaterais serão introduzidos quando você usar DBMS_REPAIR para tornar um objeto utilizável? Estes podem ser abordados? Qual é o esforço necessário para fazê-lo?
você pode não ter acesso a linhas em blocos marcados como corrompidos. No entanto, um bloco pode ser marcado como corrompido, embora ainda haja linhas que você possa acessar validamente.
restrições de integridade referencial podem ser quebradas quando os blocos são marcados como corrompidos. Se isso ocorrer, desative e reative a restrição; quaisquer inconsistências serão relatadas. Depois de corrigir todos os problemas, você deve ser capaz de reativar com êxito a restrição.
a corrupção lógica pode ocorrer quando há gatilhos definidos na tabela. Por exemplo, se as linhas forem reinseridas, os gatilhos insert devem ser disparados ou não? Você pode resolver esses problemas apenas se entender os gatilhos e o uso deles em sua instalação.
os blocos Freelist podem estar inacessíveis. Se um bloco corrompido estiver na cabeça ou na cauda de um freelist, o space management reinicializa o freelist. Em seguida, pode haver blocos que devem estar em um freelist, que não são. você pode resolver isso executando o procedimento
rebuild_freelists
.Índices e tabelas podem estar fora de sincronia. Você pode resolver isso executando primeiro o procedimento
dump_orphan_keys
(para obter informações das chaves que podem ser úteis na reconstrução de dados corrompidos). Em seguida, emita a instrução ALTER INDEX REBUILD ONLINE para obter a tabela e seus índices de volta em sincronia. - se o reparo envolver perda de dados, esses dados podem ser recuperados?
você pode recuperar dados do Índice quando um bloco de dados está marcado como corrompido. Os procedimentos
dump_orphan_keys
podem ajudá-lo a recuperar essas informações. Obviamente, recuperar dados dessa maneira depende da quantidade de redundância entre os índices e a tabela.
Etapa 3: torne os objetos utilizáveis
nesta etapa, DBMS_REPAIR torna o objeto utilizável ignorando corrupções durante as varreduras de tabela e índice.
Reparação De Corrupção: Usando os procedimentos fix_corrupt_blocks e skip_corrupt_blocks
, você torna um objeto corrompido utilizável estabelecendo um ambiente que ignora corrupções que permanecem fora do escopo dos recursos de reparo do DBMS_REPAIR.
se as corrupções envolverem uma perda de dados, como uma linha ruim em um bloco de dados, todos esses blocos são marcados corrompidos pelo procedimento fix_corrupt_blocks
. Em seguida, você pode executar o procedimento skip_corrupt_blocks
, que irá pular blocos marcados como corrompidos para o objeto. Quando o skip é definido, as varreduras de tabela e índice ignoram todos os blocos marcados como corrompidos. Isso se aplica a blocos corrompidos de mídia e software.
Implicações ao Ignorar Corruptos Blocos
Se um índice de mesa e estão fora de sincronia, em seguida, um CONJUNTO de TRANSAÇÕES SOMENTE LEITURA de transação podem ser inconsistentes em situações em que uma consulta sondas apenas o índice e, em seguida, uma consulta subsequente sondas o índice e a tabela. Se o bloco de tabela estiver marcado como corrompido, as duas consultas retornarão resultados diferentes, quebrando assim as regras de uma transação somente leitura. Uma maneira de abordar isso é não pular corrupções quando em uma transação definida somente leitura transação.
um problema semelhante ocorre ao selecionar linhas encadeadas. Essencialmente, uma consulta da mesma linha pode ou não acessar a corrupção-dando resultados diferentes.
Passo 4: reparar corrupções e reconstruir dados perdidos
depois de tornar um objeto utilizável, Você pode executar as seguintes atividades de reparo.
recuperar dados usando os procedimentos dump_orphan_keys
o procedimento dump_orphan_keys
relata entradas de índice que apontam para linhas em blocos de dados corrompidos. Todas essas entradas de índice são inseridas em uma tabela de chaves órfãs que armazena a chave e o rowid da corrupção.
depois que as informações de entrada do Índice forem recuperadas, você poderá reconstruir o índice usando a instrução ALTER INDEX REBUILD ONLINE.
Reparação Freelists Usando o rebuild_freelists Procedimento
Quando um bloco marcado “corrupto” é encontrada na cabeça ou cauda de um freelist, o freelist é reinicializado e é devolvido um erro. Embora isso tire o bloco ofensivo do freelist, ele faz com que você perca o acesso freelist a todos os blocos que seguiram o bloco corrompido.
você pode usar o procedimento rebuild_freelists
para reinicializar os freelists. O objeto é escaneado e, se for apropriado que um bloco esteja no freelist, ele é adicionado ao freelist mestre. Os grupos Freelist são tratados encontrando os blocos de forma equitativa-um bloco de cada vez. Quaisquer blocos marcados como “corrompidos” no objeto são ignorados durante a reconstrução.
Limitações e Restrições
DBMS_REPAIR procedimentos têm as seguintes limitações:
- Tabelas com LOBS, tabelas aninhadas, e VARRAYS são suportados, mas fora da linha de colunas são ignoradas.
- os Clusters são suportados nos procedimentos
skip_corrupt_blocks
erebuild_freelist
, mas não no procedimentocheck_object
. - tabelas organizadas por índice e índices LOB não são suportados.
- o procedimento
dump_orphan_keys
não opera em índices de bitmap ou índices baseados em funções. - o procedimento
dump_orphan_keys
processa chaves com, no máximo, 3.950 bytes de comprimento.
procedimentos DBMS_REPAIR
esta seção contém descrições detalhadas dos procedimentos DBMS_REPAIR.
check_object
o procedimento check_object
verifica os objetos especificados e preenche a tabela de reparo com informações sobre corrupções e diretrizes de reparo. A validação consiste em bloquear a verificação de todos os blocos no objeto. Opcionalmente, você pode especificar um intervalo, nome da partição ou nome da subpartição quando desejar verificar uma parte de um objeto.
procedure check_object(schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT TABLE_OBJECT, repair_table_name IN varchar2 DEFAULT 'REPAIR_TABLE', flags IN binary_integer DEFAULT NULL, relative_fno IN binary_integer DEFAULT NULL, block_start IN binary_integer DEFAULT NULL, block_end IN binary_integer DEFAULT NULL, corrupt_count OUT binary_integer)
Tabela 19-3 O check_object Procedimento
o Argumento | Descrição |
---|---|
|
nome do Esquema do objeto a ser verificado. |
|
Nome da tabela ou índice a ser verificado. |
|
nome da partição ou subpartição a ser verificado. Se este for um objeto particionado e |
|
Tipo de objeto a ser processado. Deve ser TABLE_OBJECT ou INDEX_OBJECT. O padrão é TABLE_OBJECT. |
|
nome da tabela de reparo a ser preenchida. A tabela deve existir no esquema SYS. Use o procedimento |
|
Reservado para uso futuro. |
|
número relativo do arquivo. Usado ao especificar um intervalo de blocos. |
|
o primeiro bloco a ser processado se especificar um intervalo de bloco. Pode ser especificado somente se o objeto for uma única tabela, partição ou subpartição. |
|
o último bloco a ser processado se especificar um intervalo de bloco. Pode ser especificado somente se o objeto for uma única tabela, partição ou subpartição. se apenas um de block_start ou block_end for especificado, o outro padrão será o primeiro ou último bloco no arquivo, respectivamente. |
|
O número de corrupções relatado. |
fix_corrupt_blocks
Use este procedimento para corrigir o corrupto blocos de objetos especificados com base nas informações do repair table que foi gerado anteriormente pelo check_object
procedimento. Antes de efetuar qualquer alteração em um bloco, o bloco é verificado para garantir que o bloco ainda esteja corrompido. Os blocos corrompidos são reparados marcando o software do bloco corrompido. Quando um reparo é efetuado, a linha associada na tabela de reparo é atualizada com um carimbo de data / hora de correção.
procedure fix_corrupt_blocks( schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT TABLE_OBJECT, repair_table_name IN varchar2 DEFAULT 'REPAIR_TABLE', flags IN boolean DEFAULT NULL, fix_count OUT binary_integer)
Tabela 19-4 O fix_corrupt_blocks Procedimento
o Argumento | Descrição |
---|---|
|
nome do Esquema. |
|
Nome do objeto com corruptos blocos de ser corrigido. |
|
Partição ou subpartition nome para ser processado. Se este for um objeto particionado e |
|
Tipo de objeto a ser processado. Deve ser TABLE_OBJECT ou INDEX_OBJECT. O padrão é TABLE_OBJECT. |
|
nome da tabela de reparo com as diretivas de reparo. Deve existir no esquema SYS. |
|
Reservado para uso futuro. |
|
O número de blocos fixos. |
dump_orphan_keys
Relatórios sobre as entradas de índice que aponte para linhas em corrompido blocos de dados. Para cada entrada de índice encontrada, uma linha é inserida na tabela órfã especificada.
se a tabela de reparo for especificada, todos os blocos corrompidos associados à tabela base serão tratados além de todos os blocos de dados marcados como software corrompido. Caso contrário, apenas blocos marcados como corrompidos são tratados.
esta informação pode ser útil para reconstruir linhas perdidas na tabela e para fins de diagnóstico.
procedure dump_orphan_keys( schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT INDEX_OBJECT, repair_table_name IN varchar2 DEFAULT 'REPAIR_TABLE', orphan_table_name IN varchar2 DEFAULT 'ORPHAN_KEY_TABLE', key_count OUT binary_integer)
Tabela 19-5 O dump_orphan_keys Procedimento
o Argumento | Descrição |
---|---|
|
nome do Esquema. |
|
nome do Objeto. |
|
Partição ou subpartition nome para ser processado. Se este for um objeto particionado e |
|
Tipo de objeto a ser processado. O padrão é INDEX_OBJECT. |
|
nome da tabela de reparo que possui informações sobre blocos corrompidos na tabela base. A tabela especificada deve existir no esquema SYS. O procedimento |
|
Nome do órfão de tabela de chave para preencher com informações sobre cada entrada de índice que se refere a uma linha, em um corrupto bloco de dados. A tabela especificada deve existir no esquema SYS. O procedimento |
|
Número de entradas de índice processados. |
rebuild_freelists
Recria o freelists para o objeto especificado. Todos os blocos gratuitos são colocados no mestre freelist. Todos os outros freelists são zerados. Se o objeto tiver vários grupos freelist, os blocos livres serão distribuídos entre todos os freelists, alocando para os diferentes grupos de Forma Round-robin.
procedure rebuild_freelists( schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT TABLE_OBJECT);
Tabela 19-6 O rebuild_freelists Procedimento
o Argumento | Descrição |
---|---|
|
nome do Esquema. |
|
Nome do objeto cujo freelists são para ser reconstruído. |
|
nome de partição ou subpartição cujos freelists devem ser reconstruídos. Se este for um objeto particionado e |
|
Tipo de objeto a ser processado. Deve ser TABLE_OBJECT ou INDEX_OBJECT. O padrão é TABLE_OBJECT. |
skip_corrupt_blocks
Activa ou desactiva a ignorar corruptos de blocos durante o índice e verificações de tabela do objeto especificado. Quando o objeto é uma tabela, skip se aplica à tabela e seus índices. Quando o objeto é um cluster, ele se aplica a todas as tabelas do cluster e seus respectivos índices.
procedure skip_corrupt_blocks( schema_name IN varchar2, object_name IN varchar2, partition_name IN varchar2 DEFAULT NULL, object_type IN binary_integer DEFAULT TABLE_OBJECT, flags IN boolean DEFAULT SKIP_FLAG);
Tabela 19-7 O skip_corrupt_blocks Procedimento
o Argumento | Descrição |
---|---|
|
nome do Esquema do objeto a ser processado. |
|
Nome do objeto. |
|
Partição ou subpartition nome para ser processado. Se este for um objeto particionado e |
|
Tipo de objeto a ser processado. Deve ser TABLE_OBJECT ou CLUSTER_OBJECT. O padrão é TABLE_OBJECT. |
|
se SKIP_FLAG for especificado, ativa o salto de blocos corrompidos de software para o objeto durante as varreduras de índice e tabela. Se NOSKIP_FLAG for especificado, as varreduras que encontram blocos corrompidos de software retornam um ORA-1578. |
admin_tables
Fornece funções administrativas para reparação e órfãos da chave de tabelas.
procedure admin_tables( table_name IN varchar2, table_type IN binary_integer, action IN binary_integer, tablespace IN varchar2 DEFAULT NULL);
Tabela de 19-8 O admin_tables Procedimento
o Argumento | Descrição |
---|---|
|
Nome da tabela a ser processado. O padrão é ‘ORPHAN_KEY_TABLE ‘ ou’ REPAIR_TABLE ‘ com base no table_type especificado. Quando especificado, o nome da tabela deve ter o prefixo apropriado, ‘ORPHAN_’ ou ‘REPAIR_’. |
|
Tipo de tabela, deve ser um dos ORPHAN_TABLE ou REPAIR_TABLE. |
|
indica qual ação administrativa executar. Deve ser CREATE_ACTION, PURGE_ACTION ou DROP_ACTION. Se a tabela já existir e CREATE_ACTION for especificada, um erro será retornado. PURGE_ACTION indica excluir todas as linhas da tabela associadas a objetos inexistentes. Se a tabela não existir e DROP_ACTION for especificada, um erro será retornado. quando CREATE_ACTION e DROP_ACTION são especificados, uma visualização associada chamada DBA_<table_name> é criada e descartada, respectivamente. A visualização é definida para que as linhas associadas a objetos inexistentes sejam eliminadas. criado no esquema SYS. |
|
indica o espaço de tabela a ser usado ao criar uma tabela. Por padrão, o tablespace padrão do SYS é usado. Um erro é retornado se o espaço de tabela for especificado e a ação não for CREATE_ACTION. |
DBMS_REPAIR Exceções
942 | repair table não existe |
1418 | índice especificado não existe |
24120 | parâmetro inválido |
24121 | não pode especificar CASCADE_FLAG e um bloco de gama |
24122 | bloco inválido gama |
24124 | acção inválido de parâmetro especificado |
24126 | CASCADE_FLAG especificado e o objeto não é uma tabela |
24127 | tablespace especificado e ação não é CREATE_ACTION |
24128 | partição especificada para não-objeto particionado |
24129 | inválido órfã de tabela de chave de nome – deve ter ‘ORPHAN_’ prefixo |
24129 | reparo especificado tabela não começar com “REPAIR_’ prefixo |
24131 | repair table tem colunas incorretas |
24132 | reparação de nome de tabela é demasiado longo |