AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 55384
Accepted
kupa
kupa
Asked: 2013-12-21 08:06:49 +0800 CST2013-12-21 08:06:49 +0800 CST 2013-12-21 08:06:49 +0800 CST

Elimine a tabela sem suas dependências e resolva a corrupção do bloco

  • 772

Encontrei alerta sobre bloco corrompido no log de alerta. O bloco corrompido pertencia à tabela chamada DOCS. Como não tenho nenhum backup desse banco de dados, decidi recriar a tabela DOCS para resolver a corrupção. E aqui está um problema.

Gerou todos os scripts:

1. DDL for table.
2. DDL for constraints,triggers,indexes on the table.
3. DDL for the constraints that references this table.
4. Saved grants on this table.

Agora eu quero descartar a tabela, mas deixar suas dependências e, em seguida, recriar a tabela com suas restrições, gatilhos, índices.

Como eu posso fazer isso?

------------------------Editar

Parece ser muito simples.

  1. Salvar dados desta tabela

    criar tabela new_table como select * from my_table;

  2. Salvar DDL para tabela e seus comentários
  3. DDL para índices nesta tabela
  4. DDL para restrições nesta tabela
  5. DDL para chaves estrangeiras que fazem referência a esta tabela
  6. Salve subsídios nesta tabela
  7. Eliminar eliminação da tabela
  8. Recrie tabela, comentários, restrições, índices, chaves estrangeiras que fazem referência a esta tabela
  9. Dar subsídios
  10. inserir dados

    insira em my_table como select * from new_table

Esta solução funciona para recriar a tabela (é uma maneira correta de recriar uma tabela). Mas a corrupção não resolveu, durante a inserção na tabela no Alert.log gerou o mesmo erro sobre a corrupção do bloco.

Nos comentários @Mindaugas Riauba escreveu uma solução e funcionou. Eu só quero saber por que minha solução sobre mesa de recriação não funcionou e a solução de @Mindaugas Riauba funcionou?

Obrigado @Mindaugas Riauba novamente!

oracle oracle-10g
  • 1 1 respostas
  • 1771 Views

1 respostas

  • Voted
  1. Best Answer
    Mindaugas Riauba
    2013-12-22T07:34:13+08:002013-12-22T07:34:13+08:00

    Aparentemente você já derrubou o objeto. Agora, para acalmá-lo - os blocos corrompidos agora provavelmente estão no espaço livre e não causam danos. Eles apenas o incomodam durante os backups. Para verificar isso:

    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#;
    

    Se realmente aparecer aqui, você tem duas opções. Você pode simplesmente ignorá-lo. Assim que o bloco for atribuído a algum objeto, ele será reformatado e a corrupção desaparecerá. Se você quiser consertar blocos corrompidos, terá que criar o objeto que ocuparia seus blocos corrompidos.

    Digamos que seu bloco corrompido exista em tablespace USERSe datafile /ora/users01.dbf. Primeiro, você deve tornar os arquivos de dados do espaço de tabela não autoextensíveis. Isso não é para aumentar o tamanho do arquivo de dados. E então você criará a tabela de preenchimento.

    create table filler (
      padding varchar2(1000)
    ) tablespace users nologging pctfree 90 pctused 10;
    

    Então você tem que estender o segmento da tabela para que incorpore blocos corrompidos:

    alter table filler allocate extent
      (datafile '/ora/users01.dbf' size 100m);
    

    Desta forma você pode adicionar várias extensões ajustando seus tamanhos. Depois de verificar que os blocos corrompidos agora pertencem ao espaço livre, você pode preencher a tabela:

    insert /*+append */ into filler  select rpad('x',1000) from
    dba_objects
    --  filler
    where rownum <= 50000;
    

    Primeiro inserir/selecionar vai de dba_objects então é mais rápido inserir/selecionar da própria tabela de preenchimento.

    Agora você só precisa verificar o arquivo de dados usando o RMAN:

    RMAN> BACKUP VALIDATE CHECK LOGICAL DATAFILE 333;
    

    E solte a tabela de preenchimento:

    DROP TABLE filler PURGE;
    

    Fácil. :)

    • 3

relate perguntas

  • Backups de banco de dados no Oracle - Exportar o banco de dados ou usar outras ferramentas?

  • ORDER BY usando prioridades personalizadas para colunas de texto

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve