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 / 50127
Accepted
Paul
Paul
Asked: 2013-09-19 04:54:59 +0800 CST2013-09-19 04:54:59 +0800 CST 2013-09-19 04:54:59 +0800 CST

Quando a detecção de página rasgada e a soma de verificação foram introduzidas no SQL Server e quais são os comportamentos de atualização?

  • 772

Existem duas opções diferentes no SQL Server moderno para verificação de página; sendo detecção de página rasgada e soma de verificação . Nenhum também é, obviamente, uma opção.

Acredito que Checksum foi introduzido no SQL Server 2005 e que atualizar ou restaurar um banco de dados de uma versão anterior manteria seu método de verificação de página anterior. ou seja, não houve atualização implícita.

O problema envolvido é que temos um banco de dados de produção que entrou em produção usando o SQL Server 2000 e, desde então, mudou para um servidor SQL Server 2008 R2. A verificação de página está definida como Nenhuma quando eu esperava que fosse Detecção de página rasgada . Voltando a esse período de tempo, parece que o banco de dados foi originalmente desenvolvido no SQL Server 7.0 e depois migrou para o SQL Server 2000 e isso pode explicar o resultado observado.

Eu queria saber quando Torn Page Detection e Checksum se tornaram um recurso do SQL Server e como eles se comportaram quando migrados ou atualizados para versões mais recentes.

Edit: Resumindo algumas das respostas:

Há uma pequena discrepância sobre algumas das datas de quando a Detecção de página rasgada entrou no SQL Server.
Link 1: http://support.microsoft.com/kb/230785
Link 2: http://technet.microsoft.com/en-us/library/aa337525(v=sql.90).aspx

O primeiro link indica SQL 7.0 e o segundo SQL2000. Costumo colocar minha fé na sugestão do SQL7.0 e esse link dois estava confuso por estar desativado por padrão no SQL7.0 e ativado por padrão no SQL2000.

sql-server
  • 4 4 respostas
  • 8113 Views

4 respostas

  • Voted
  1. Best Answer
    Kin Shah
    2013-09-19T05:17:44+08:002013-09-19T05:17:44+08:00

    No SQL Server 2000, se você deseja identificar páginas corrompidas, a opção de banco de dados TORN_PAGE_DETECTION deve ser definida como TRUE.

    Mas no SQL 2005 e superior, uma nova configuração PAGE_VERIFY substituiu o antigo TORN_PAGE_DETECTION que permite escolher entre dois tipos diferentes de verificação de página: TORN_PAGE_DETECTION e CHECKSUM.

    Agora vem a pergunta qual definir - TORN_PAGE_DETECTION ou CHECKSUM ?

    TORN_PAGE_DETECTION - grava um bit para cada 512 bytes em uma página, permitindo detectar quando uma página não foi gravada com sucesso no disco. O problema é que ele não dirá se os dados armazenados nesses 512 byes estão realmente corretos ou não devido ao fato de que alguns bytes podem ter sido gravados incorretamente.

    CHECKSUM - irá calcular uma soma de verificação da página tanto quando uma página é escrita quanto quando uma página é lida, assumindo que tem checksum nela.

    O SQL Server calcula a soma de verificação com base no padrão de bits da página, armazena-a no cabeçalho da página e emite uma E/S para gravar a página. Quando o SQL Server lê a página, ele recalcula a soma de verificação usando a mesma lógica e a compara com o valor disponível no cabeçalho da página. Se o valor da soma de verificação corresponder, presume-se que a página não foi corrompida durante o ciclo de leitura e gravação.

    Como o custo de calcular a soma de verificação é incorrido em cada leitura e gravação de página, isso pode aumentar a sobrecarga da CPU e possivelmente afetar o rendimento de sua carga de trabalho. Outra coisa a ter em mente é que a soma de verificação não é exclusiva para um padrão de bits específico na página. Duas páginas podem ser mapeadas para o mesmo valor de checksum. Portanto, há uma possibilidade remota de que a corrupção da página não seja detectada.

    Referência: soma de verificação no SQL2005

    Para responder especificamente às suas perguntas:

    Acredito que Checksum foi introduzido no SQL2005 e que atualizar ou restaurar um banco de dados de uma versão anterior manteria seu método de verificação de página anterior. ou seja, não houve atualização implícita.

    Sim CHECKSUM foi introduzido no SQL Server 2005 e é o DEFAULT . Ao atualizar de 2000 para 2005, você precisa alterar explicitamente a opção do banco de dados Page Verify para usar CHECKSUM.

    Se você restaurar o banco de dados já criado no sql 2005 para outro servidor executando o sql 2005, não será necessário configurá-lo. Ele persistirá para o que você definiu na opção Verificar página.

    Não consegui pesquisar quando a detecção de página rasgada entrou

    De: http://support.microsoft.com/kb/230785

    Versões do SQL Server anteriores a 7.0

    Versões do SQL Server anteriores à 7.0 não forneciam paridade de log ou recursos de detecção de bits interrompidos. Na verdade, essas versões podem gravar a mesma página de log várias vezes até que os registros de log preencham a página de log de 2 KB. Isso pode expor transações que foram confirmadas com sucesso. Se a página de log estiver sendo reescrita durante uma falha, um setor com a transação confirmada pode não ser reescrito corretamente.

    Portanto, TORN_PAGE_DETECTION existe desde o SQL Server 7.0. Mesmo assim, o padrão era que não estava habilitado (mesmo link) .

    Observação A detecção de página interrompida não está habilitada por padrão no SQL Server 7.0. Consulte sp_dboption para saber como habilitar a detecção em seu sistema.

    Portanto, se o banco de dados foi desenvolvido em uma instância 7.0 e posteriormente atualizado, ele teria atualizado com a opção PAGE VERIFY existente de NONE (como @ThomasStringer observou em sua resposta).


    Editar: 24/09/2013 Para melhorar a resposta:

    Referindo-me às minhas notas internas do SQL Server de SQLSkills, descobri que, usando um despejo de página, você pode verificar se a detecção de bit interrompido - TORN_PAGE_DETECTION ou CHECKSUM foi ativado ou não:

    use database_name -- change here for your database !!
    checkpoint
    go 
    dbcc traceon (3604)   -- send output to screen
    go
    dbcc page (dbaalert, 1,1,0)
    dbcc traceoff (3604)  -- turn off the trace flag
    go
    

    m_tornBits : contém a soma de verificação da página ou os bits que foram deslocados pelos bits de proteção de página interrompida - dependendo de qual forma de proteção de página está ativada para o banco de dados.

    Observação : não tenho nenhuma versão mais antiga do SQL Server em execução. Abaixo está confirmado do sql server 2000 e superior . Se você tem um 7.0 ou 6.5 rodando, pode confirmar também :-)

    insira a descrição da imagem aqui

    • 15
  2. Thomas Stringer
    2013-09-19T05:17:33+08:002013-09-19T05:17:33+08:00

    Dê uma olhada na referência do BOL :

    Quando um usuário ou banco de dados do sistema é atualizado para SQL Server 2005 ou uma versão posterior, o valor PAGE_VERIFY (NONE ou TORN_PAGE_DETECTION) é retido. Recomendamos que você use CHECKSUM

    Isso determina que antes do SQL Server 2005 a opção TORN_PAGE_DETECTIONexistia, mas não CHECKSUM.

    E para responder ao seu segundo ponto:

    ... e que atualizar ou restaurar um banco de dados de uma versão anterior manteria seu método de verificação de página anterior.

    Sim, está correto. Você precisaria definir explicitamente o banco de dados para utilizar o CHECKSUMmétodo de verificação de página.

    • 6
  3. user507
    2013-09-19T14:22:48+08:002013-09-19T14:22:48+08:00

    Existem duas opções diferentes no SQL Server moderno para verificação de página

    Existem três como você afirmou: TORN_PAGE_DETECTION, CHECKSUM e NONE.

    Acredito que CHECKSUM foi introduzido no SQL Server 2005

    Conforme citado neste artigo do MSDN intitulado "Gerenciamento de Buffer": A detecção de página rasgada foi introduzida no SQL Server 2000. A soma de verificação foi introduzida no SQL Server 2005.

    Uma sinopse de outras coisas observadas neste artigo é que o mecanismo de verificação de página é especificado no momento da criação do banco de dados. Portanto, depende de quem e como eles criaram o banco de dados quanto ao que está definido, também pode ser controlado por qual modelo de banco de dados está configurado. Também é interessante observar que, se você alterar a configuração, ela não afetará todo o banco de dados, apenas quando a próxima página for gravada. Também de acordo com Paul Randal, isso só é feito quando a página é lida na memória, alterada e depois gravada de volta no disco; essa informação está aqui .

    Eu tenho um banco de dados de produção que entrou em produção usando o SQL Server 2000, embora possa ter sido desenvolvido no SQL Server 7.0 e, desde então, movido para um servidor SQL Server 2008 R2. A verificação de página está definida como NONE, embora eu esperasse que fosse DETECÇÃO DE PÁGINA RASGADA.

    Qualquer pessoa que tenha permissões para a instância do banco de dados pode modificar esse valor. Ele poderia ter persistido por meio de atualizações, conforme indicado no MSDN aqui :

    Quando um usuário ou banco de dados do sistema é atualizado para SQL Server 2005 ou uma versão posterior, o valor PAGE_VERIFY (NONE ou TORN_PAGE_DETECTION) é retido

    Também pode ter sido modificado posteriormente porque alguém interpretou mal a configuração e estava atirando no escuro para tentar resolver um problema.

    Eu queria saber quando a DETECÇÃO DE PÁGINA RASGADA se tornou um recurso de verificação de página

    SQL Server 2000 conforme indicado acima.

    como ele se comporta quando migrado ou atualizado para edições mais recentes.

    A configuração anterior é mantida durante a atualização conforme indicado acima.

    Agora, gostaria de apontar o fato de que outros links fornecidos por pessoas afirmam que o SQL Server 7.0 é quando a detecção de página interrompida estava disponível. O que, conforme declarado nesses artigos, é verdade, no entanto, é comprovado muitas vezes que a documentação da Microsoft não deve ser considerada verdadeira em todas as circunstâncias. Há muitos onde eles estão errados. Então, com isso dito, como você pode determinar qual resposta é aceitável? Todos nós fornecemos documentação da Microsoft para apoiar nossa resposta.

    Observe também que a detecção de página rasgada está na lista de depreciação a partir do SQL Server 2012, então qual é a preocupação com a forma como ela foi definida em seus bancos de dados para começar. Se eu o vir configurado para algo diferente de CHECKSUM, imediatamente o altero e passo para outra tarefa mais importante. Não tenho nenhuma preocupação sobre como uma configuração ruim foi implementada, é mais importante corrigi-la e, em seguida, garantir que aqueles que têm permissões para alterá-la sejam informados sobre o motivo pelo qual esse item de configuração não deve ser alterado para qualquer outra coisa. Apenas meus $ 0,02

    • 3
  4. DaniSQL
    2013-09-19T05:35:44+08:002013-09-19T05:35:44+08:00

    Como disseram @Thomas Stringer e @Kin, ele foi introduzido no SQL Server 2005 e acredito que funcione em todas as edições do SQL Server. Para TempDB, embora CHECKSUM tenha sido introduzido no SQL Server 2008

    Link

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

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