Compartilhar via


MSSQLSERVER_17204

Aplica-se a: SQL Server

Detalhes

Atributo Valor
Nome do produto SQL Server
ID do evento 17204
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico DBLKIO_DEVOPENFAILED
Texto da mensagem %ls: Não foi possível abrir arquivo %ls para o número de arquivo %d. Erro de SO: %ls.

Explicação

O SQL Server não pôde abrir o arquivo indicado devido ao erro de sistema operacional especificado.

Você pode ver o erro 17204 no Evento de Aplicativo do Windows ou no log de erros do SQL Server quando o SQL Server não pode abrir um banco de dados e/ou arquivos de log de transações. Este é um exemplo da aparência do erro:

Error: 17204, Severity: 16, State: 1.
FCB::Open failed: Could not open file c:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\data\MyDB_Prm.mdf for file number 1.  OS error: 5(Access is denied.).

Você pode ver esses erros durante o processo de inicialização da instância do SQL Server ou qualquer operação de banco de dados que tente iniciar o banco de dados (por exemplo, ALTER DATABASE). Em alguns cenários, você poderá ver os erros 17204 e 17207 e, em outras ocasiões, poderá ver apenas um deles.

Se um banco de dados de usuário em execução encontrar esses erros, o banco de dados será deixado no estado de RECOVERY_PENDING, e os aplicativos não poderão acessar o banco de dados. Se um banco de dados do sistema encontrar esses erros, a instância do SQL Server não será iniciada e você não poderá se conectar a essa instância do SQL Server. Uma falha com um banco de dados do sistema também pode resultar em um recurso de cluster de failover do SQL Server ficar offline.

Causa

Antes que qualquer banco de dados do SQL Server possa ser usado, o banco de dados precisa ser iniciado. O processo de inicialização do banco de dados envolve:

  1. Inicializar várias estruturas de dados que representam o banco de dados e os arquivos do banco de dados
  2. Abrir todos os arquivos que pertencem ao banco de dados
  3. Executar a recuperação no banco de dados

O SQL Server usa a função CreateFile da API do Windows para abrir os arquivos que pertencem a um banco de dados.

As mensagens 17204 (e 17207) indicam que um erro foi encontrado enquanto o SQL Server tentava abrir os arquivos de banco de dados durante o processo de inicialização.

Essas mensagens de erro contêm as seguintes informações:

  1. Nome da função do SQL Server que está tentando abrir o arquivo. O nome da função que você normalmente observa nas mensagens de erro é um dos seguintes:

    • FCB::Open - o arquivo encontrou um erro quando o SQL Server tenta abri-lo
    • FileMgr::StartPrimaryDataFiles – um arquivo de dados primário ou um arquivo pertencente ao grupo de arquivo primário
    • FileMgr::StartSecondaryDataFiles – um arquivo pertencente a um grupo de arquivo secundário
    • FileMgr::StartLogFiles – um arquivo de log de transações
    • STREAMFCB::Startup – um contêiner de FileStream do SQL
    • FCB::RemoveAlternateStreams
  2. As informações de estado distinguem vários locais dentro de uma função que pode gerar essa mensagem de erro

  3. O caminho físico completo para o arquivo

  4. A ID do arquivo correspondente ao arquivo

  5. O código de erro do sistema operacional e a descrição do erro. Em alguns casos, você verá apenas o código de erro.

As informações de erro do sistema operacional impressas nessas mensagens de erro são a causa raiz que leva ao erro 17204. As causas comuns para essas mensagens de erro são um problema de permissão ou um caminho incorreto para o arquivo.

Ação do usuário

  1. A resolução do erro 17204 envolve a compreensão do código de erro do sistema operacional associado e o diagnóstico desse erro. Depois que a condição de erro do sistema operacional for resolvida, você poderá tentar reiniciar o banco de dados (usando ALTER DATABASE SET ONLINE, por exemplo) ou a instância do SQL Server para colocar o banco de dados afetado online. Em alguns casos, talvez você não consiga resolver o erro do sistema operacional. Portanto, precisará realizar ações corretivas específicas. Discutiremos tais ações nesta seção.

  2. Se a mensagem de erro 17204 contiver apenas um código de erro e não uma descrição de erro, você poderá tentar resolver o código de erro usando o comando de um shell do sistema operacional: net helpmsg <error code> . Se você receber um código de status de 8 dígitos como o código de erro, poderá consultar as fontes de informações em Como converter um HRESULT em um código de erro Win32? para decodificar quais são esses códigos de status em erros de sistema operacional.

  3. Se você receber o erro do sistema operacional Access is Denied = 5, considere estes métodos:

    • Verifique se as permissões estão definidas no arquivo examinando as propriedades dele no Windows Explorer. O SQL Server usa grupos do Windows para provisionar o Controle de Acesso nos vários recursos de arquivo. Verifique se o grupo apropriado [com nomes como SQLServerMSSQLUser$ComputerName$MSSQLSERVER ou SQLServerMSSQLUser$ComputerName$InstanceName] tem as permissões necessárias no arquivo de banco de dados mencionado na mensagem de erro. Para obter mais informações, confira Configurar permissões do sistema de arquivos para acesso ao Mecanismo de Banco de Dados. Verifique se o grupo do Windows realmente inclui a conta de inicialização do serviço SQL Server ou o SID do serviço.

    • Examine a conta de usuário na qual o serviço SQL Server está sendo executado no momento. Você pode usar o Gerenciador de Tarefas do Windows para obter essas informações. Procure o valor de "Nome de Usuário" para o executável "sqlservr.exe". Além disso, se você alterou recentemente a conta de serviço do SQL Server, saiba que a maneira com suporte de fazer essa operação é por meio do utilitário SQL Server Configuration Manager. Mais informações sobre isso estão disponíveis em SQL Server Configuration Manager.

    • Dependendo do tipo de operação – abrir bancos de dados durante a inicialização do servidor, anexar um banco de dados, restaurar o banco de dados etc. – a conta usada para representação e acesso ao arquivo de banco de dados pode variar. Examine o tópico Proteger arquivos de log e dados para entender qual operação define qual permissão e de quais contas. Use uma ferramenta como Monitor do Processo do SysInternals do Windows para entender se o acesso ao arquivo está acontecendo no contexto de segurança da conta de inicialização do serviço (ou SID do serviço) da instância do SQL Server ou de uma conta representada.

      Se o SQL Server estiver representando as credenciais do usuário que executa a operação ALTER DATABASE ou CREATE DATABASE, você observará as seguintes informações na ferramenta Monitor de Processo (um exemplo):

      Date & Time:      3/27/2010 8:26:08 PM
      Event Class:        File System
      Operation:          CreateFile
      Result:                ACCESS DENIED
      Path:                  C:\Program Files\Microsoft SQL Server\MSSQL10.SQL2008\MSSQL\DATA\attach_test.mdf
      TID:                   4288
      Duration:             0.0000366
      Desired Access:Generic Read/Write
      Disposition:        Open
      Options:            Synchronous IO Non-Alert, Non-Directory File, Open No Recall
      Attributes:          N
      ShareMode:       Read
      AllocationSize:   n/a
      Impersonating: DomainName\UserName
      
  4. Se você estiver obtendo o erro de SO The system cannot find the file specified = 3:

    • Examine o caminho completo da mensagem de erro
    • Verifique se a unidade de disco e o caminho da pasta estão visíveis e acessíveis no Windows Explorer
    • Examine o log de eventos do Windows para descobrir se existem problemas com essa unidade de disco
    • Se o caminho estiver incorreto e se esse banco de dados já existir no sistema, você poderá alterar os caminhos do arquivo de banco de dados usando os métodos explicados no tópico Mover arquivos de banco de dados. Talvez você precise usar este procedimento, especialmente para arquivos de banco de dados do sistema que encontrem 17204 ou 17207 e se você estiver trabalhando em um cenário de recuperação de desastre em que as unidades de disco especificadas não estão disponíveis. Este tópico também explica como você pode identificar a localização atual dos vários bancos de dados do sistema [mestre, modelo, tempdb, msdb e mssqlsystemresource].
    • Se você vir esse erro porque os arquivos de banco de dados estão ausentes, será necessário restaurar o banco de dados de um backup válido.
      • Se o arquivo de banco de dados associado ao erro pertencer a um grupo de arquivos secundário, você poderá, opcionalmente, marcar esse grupo de arquivos offline, colocar o banco de dados online e executar uma restauração somente desse grupo de arquivos. Para obter mais informações, confira a seção OFFLINE do tópico Opções de arquivo e grupo de arquivos ALTER DATABASE (Transact-SQL).
      • Se o arquivo que produziu o erro for um arquivo de log de transações, examine as informações nas seções "FOR ATTACH" e "FOR ATTACH_REBUILD_LOG" do tópico CRIAR BANCO DE DADOS (Transact-SQL) para entender como você pode recriar os arquivos de log de transações ausentes.
    • Verifique se qualquer disco ou local de rede [como a unidade iSCSI] está disponível antes que o SQL Server tente acessar os arquivos de banco de dados nesses locais. Se necessário, crie as dependências exigidas no Administrador de Cluster ou no Gerenciador de Controle de Serviço.
  5. Se você estiver recebendo o erro de sistema operacional The process cannot access the file because it is being used by another process = 32:

    • Use uma ferramenta como o Explorador de Processos ou o Identificador do Windows Sysinternals para descobrir se outro processo ou serviço adquiriu bloqueio exclusivo nesse arquivo de banco de dados
    • Impeça que esse processo acesse arquivos de banco de dados do SQL Server. Exemplos comuns incluem programas antivírus (confira as diretrizes para exclusões de arquivo no artigo da base de dados a seguir)
    • Em um ambiente de cluster, verifique se o processo sqlservr.exe do nó proprietário anterior realmente liberou os identificadores para os arquivos de banco de dados. Normalmente, isso não ocorre, mas as configurações incorretas do cluster ou dos caminhos de E/S podem levar a esses problemas.