none
Erro em Script de CheckDB RRS feed

  • Pergunta

  • Caros, bom dia.

    Tenho o seguinte script que é executado via JOB no SQL Server e que de vez em quando, não é sempre, falha com o erro descrito no final. Gostaria de saber se alguém tem idéia do que possa ser.

    CODE:

    SET

    ARITHABORT ON

    SET

    QUOTED_IDENTIFIER

    ON

     

    set nocount on
     

    IF

    EXISTS (SELECT name FROM tempdb..sysobjects WHERE name = N'##Resultado' AND type = 'U') DROP TABLE ##Resultado

    go

    IF

    EXISTS(SELECT name FROM tempdb..sysobjects WHERE name = N'##Erros' AND type = 'U') DROP TABLE ##Erros

    go

    declare

    @comando varchar(500)

    declare

    @banco varchar(80)

    declare

    @resultado varchar(8000)

    declare

    @nomeservidor varchar(50)

    set

    @nomeservidor = 'DBCC CHECKDB Results - ' + @@SERVERNAME

    create

    table ##Resultado

     

    ( Error INT, [Level] INT, State INT, MessageText VARCHAR(7000), RepairLevel INT, Status INT, DbId INT, [Id] INT, IndId INT, [File] INT, Page INT, Slot INT, RefFile INT, RefPage INT, RefSlot INT, Allocation INT )

    create

    table ##Erros

     

    (Banco varchar(80), MessageText varchar(7000))

    declare

    DBNames_cursor CURSOR FOR

     

    select name FROM master..sysdatabases (nolock) where name not in ('tempdb','master', 'model', 'msdb')

     

    order by name
     

    OPEN

    DBNames_cursor FETCH NEXT FROM DBNames_cursor

    INTO

    @banco

     

    WHILE (@@fetch_status <> -1)

     

    begin

     

    set @comando = 'insert into ##Resultado exec(' + '''' + 'DBCC CHECKDB([' + @banco + ']) WITH NO_INFOMSGS, TABLERESULTS ' + '''' + ')'

     

    exec(@comando)

     

    set @comando = 'insert into ##Erros (Banco, MessageText) select ' + '''' + rtrim(ltrim(@banco)) + '''' + ', rtrim(ltrim(MessageText)) from ##Resultado where MessageText like ' + '''' + '%errors%' + ''''

     

    exec(@comando)

     

    exec('delete ##Resultado')

     

    FETCH NEXT FROM DBNames_cursor INTO @banco

     

    end

    DEALLOCATE

    DBNames_cursor

    if

    (select count(*) from ##Erros) > 0

     

    begin

     

     

    print ''
     

     

    Select left(Banco, 20) Banco, left(rtrim(ltrim(MessageText)), 200) MessageText from ##Erros

     

    RAISERROR('DBCC CHECKDB found errors. Please check the LOG for details.',16,1)
     

     

    drop table ##Resultado

     

    drop table ##Erros

     

    end

    else

     

    begin

     

    print ''

     

    print '---- NO ERRORS HAVE BEEN FOUND ---'

     

    print ''

     

    drop table ##Resultado

     

    drop table ##Erros

     

    end

    set

    nocount off

    go

    ERROR MESSAGE:

     

    Job 'DB_OPTIMIZATION' : Step 3, 'DBCC CHECKDB' : Began Executing 2012-01-31 03:06:06

    Msg 2520, Sev 16, State 5, Line 1 : Could not find database '                                                                                '. The database either does not exist, or was dropped before a statement tried to use it. Verify if the database exists by querying the sys.databases catalog view. [SQLSTATE 42000]

    Porém nenhum banco foi excluído.

    Obrigado.

    terça-feira, 31 de janeiro de 2012 12:43

Respostas

  • Ronald,

     

    Testei aqui e não tive o erro nenhuma vez, todo caso, seja la o por que de estar ocorrendo, assim devera resolver.

     

    Para verificarmos o que ocorre exatamente, seria preciso ver o ambiente na hora da execução.

     

    IF EXISTS (SELECT name FROM tempdb..sysobjects WHERE name = N'##Resultado' AND type = 'U')

          DROP TABLE ##Resultado

     

    IF EXISTS(SELECT name FROM tempdb..sysobjects WHERE name = N'##Erros' AND type = 'U')

          DROP TABLE ##Erros

     

     

     

    declare @comando varchar(500)

     

    declare @banco varchar(80)

     

    declare @resultado varchar(8000)

     

    declare @nomeservidor varchar(50)

     

    set @nomeservidor = 'DBCC CHECKDB Results - ' + @@SERVERNAME

     

    create table ##Resultado 

    (

          Error INT,

          [Level] INT,

          State INT,

          MessageText VARCHAR(7000),

          RepairLevel INT,

          Status INT,

          DbId INT,

          [Id] INT,

          IndId INT,

          [File] INT,

          Page INT,

          Slot INT,

          RefFile INT,

          RefPage INT,

          RefSlot INT,

          Allocation INT

    )

     

    create table ##Erros

    (

          Banco varchar(80), MessageText varchar(7000)

    )

     

    declare DBNames_cursor CURSOR FOR

          select name FROM master..sysdatabases (nolock) where name not in ('tempdb','master', 'model', 'msdb')

          order by name  

     

    OPEN DBNames_cursor FETCH NEXT FROM DBNames_cursor

    INTO @banco

     

     

    WHILE (@@fetch_status <> -1)

    begin

          SET @banco = LTRIM(RTRIM(@banco))

          IF(LEN(@Banco)>0)

          BEGIN

                set @comando = 'insert into ##Resultado exec(' + '''' + 'DBCC CHECKDB([' + @banco + ']) WITH NO_INFOMSGS, TABLERESULTS ' + '''' + ')'

                exec(@comando)

                set @comando = 'insert into ##Erros (Banco, MessageText) select ' + '''' + rtrim(ltrim(@banco)) + '''' + ', rtrim(ltrim(MessageText)) from ##Resultado where MessageText like ' + '''' + '%errors%' + ''''

                exec(@comando)

                exec('delete ##Resultado')

          END

          FETCH NEXT FROM DBNames_cursor INTO @banco    

    end

     

     

    DEALLOCATE DBNames_cursor

     

    if(select count(*) from ##Erros) > 0

    begin

          print '' 

          Select left(Banco, 20) Banco, left(rtrim(ltrim(MessageText)), 200) MessageText from ##Erros

          RAISERROR('DBCC CHECKDB found errors. Please check the LOG for details.',16,1)

          drop table ##Resultado

          drop table ##Erros

          end

    else

    begin

          print ''

          print '---- NO ERRORS HAVE BEEN FOUND ---'

          print ''

          drop table ##Resultado

          drop table ##Erros

    end


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta Ronald Shonuff terça-feira, 31 de janeiro de 2012 13:14
    terça-feira, 31 de janeiro de 2012 13:06
    Moderador

Todas as Respostas

  • ROnaldo,

     

    Em algum momento ele tenta realizar um checkdb em um banco com o nome vaziu, o que gera erro obviamente.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    terça-feira, 31 de janeiro de 2012 12:48
    Moderador
  • Como banco com nome vazio? Tenho 4 bancos neste servidor e todos tem nomes descritos corretamente e sem espaços, acentos ou underline.

    Desculpa, mas creio que não é isto.

    terça-feira, 31 de janeiro de 2012 12:51
  • Ronald,

     

    Não que exista um banco com nome vazio, mas que voce esteja tentando rodar o checkdb com o nome vaziu, exemplo:

     

    DBCC CHECKDB ('   ')

    ERRO:

    No foi possvel localizar o banco de dados ' '. Ele no existe ou foi descartado antes que uma instruo tentasse utiliz-lo. Verifique se o banco de dados existe consultando a exibio do catlogo sys.databases.

     


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    terça-feira, 31 de janeiro de 2012 12:54
    Moderador
  • Pois é Fabrízzio, o problema é que é um cursor que percorre a sysdatabases...de onde o cursor pode estar "pegando" o espaço em branco?

    Tem idéia?

    terça-feira, 31 de janeiro de 2012 12:56
  • Ronald,

     

    Testei aqui e não tive o erro nenhuma vez, todo caso, seja la o por que de estar ocorrendo, assim devera resolver.

     

    Para verificarmos o que ocorre exatamente, seria preciso ver o ambiente na hora da execução.

     

    IF EXISTS (SELECT name FROM tempdb..sysobjects WHERE name = N'##Resultado' AND type = 'U')

          DROP TABLE ##Resultado

     

    IF EXISTS(SELECT name FROM tempdb..sysobjects WHERE name = N'##Erros' AND type = 'U')

          DROP TABLE ##Erros

     

     

     

    declare @comando varchar(500)

     

    declare @banco varchar(80)

     

    declare @resultado varchar(8000)

     

    declare @nomeservidor varchar(50)

     

    set @nomeservidor = 'DBCC CHECKDB Results - ' + @@SERVERNAME

     

    create table ##Resultado 

    (

          Error INT,

          [Level] INT,

          State INT,

          MessageText VARCHAR(7000),

          RepairLevel INT,

          Status INT,

          DbId INT,

          [Id] INT,

          IndId INT,

          [File] INT,

          Page INT,

          Slot INT,

          RefFile INT,

          RefPage INT,

          RefSlot INT,

          Allocation INT

    )

     

    create table ##Erros

    (

          Banco varchar(80), MessageText varchar(7000)

    )

     

    declare DBNames_cursor CURSOR FOR

          select name FROM master..sysdatabases (nolock) where name not in ('tempdb','master', 'model', 'msdb')

          order by name  

     

    OPEN DBNames_cursor FETCH NEXT FROM DBNames_cursor

    INTO @banco

     

     

    WHILE (@@fetch_status <> -1)

    begin

          SET @banco = LTRIM(RTRIM(@banco))

          IF(LEN(@Banco)>0)

          BEGIN

                set @comando = 'insert into ##Resultado exec(' + '''' + 'DBCC CHECKDB([' + @banco + ']) WITH NO_INFOMSGS, TABLERESULTS ' + '''' + ')'

                exec(@comando)

                set @comando = 'insert into ##Erros (Banco, MessageText) select ' + '''' + rtrim(ltrim(@banco)) + '''' + ', rtrim(ltrim(MessageText)) from ##Resultado where MessageText like ' + '''' + '%errors%' + ''''

                exec(@comando)

                exec('delete ##Resultado')

          END

          FETCH NEXT FROM DBNames_cursor INTO @banco    

    end

     

     

    DEALLOCATE DBNames_cursor

     

    if(select count(*) from ##Erros) > 0

    begin

          print '' 

          Select left(Banco, 20) Banco, left(rtrim(ltrim(MessageText)), 200) MessageText from ##Erros

          RAISERROR('DBCC CHECKDB found errors. Please check the LOG for details.',16,1)

          drop table ##Resultado

          drop table ##Erros

          end

    else

    begin

          print ''

          print '---- NO ERRORS HAVE BEEN FOUND ---'

          print ''

          drop table ##Resultado

          drop table ##Erros

    end


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta Ronald Shonuff terça-feira, 31 de janeiro de 2012 13:14
    terça-feira, 31 de janeiro de 2012 13:06
    Moderador
  • Pois é meu caro, isso que me intriga, pq o erro é intermitente...ás vezes roda por um mês inteiro sem dar problema, mas exporadicamente aparece...e eu gostaria de saber ao certo o que acontece....visto que o servidor em questão é praticamente "estático", nunca criamos novos bancos, pois ele hospeda alguns bancos de aplicações compradas, como o BESmgnt por exemplo.

    Mas sua solução resolve o problema...vou verificar e no WHERE vou excluir os espaços e tratar a coluna name com o RTRIM e o LTRIM.

    Obrigado pela ajuda.

    terça-feira, 31 de janeiro de 2012 13:14