MSSQLSERVER_17204

Si applica a:SQL Server

Dettagli

Attributo Valore
Nome prodotto SQL Server
ID evento 17204
Origine evento MSSQLSERVER
Componente SQLEngine
Nome simbolico DBLKIO_DEVOPENFAILED
Testo del messaggio %ls: Impossibile aprire il file %ls per il numero di file %d. Errore del sistema operativo: %ls.

Spiegazione

SQL Server non è riuscito ad aprire il file specificato a causa dell'errore del sistema indicato.

È possibile che venga visualizzato l'errore 17204 nell'evento dell'applicazione Windows o nel log degli errori di SQL Server quando SQL Server non è in grado di aprire un database e/o file di log delle transazioni. L'errore può avere un aspetto simile al seguente:

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.).

Questi errori possono verificarsi durante il processo di avvio dell'istanza di SQL Server o qualsiasi operazione di database che tenta di avviare il database, ad esempio ALTER DATABASE. In alcuni scenari è possibile che vengano visualizzati sia errori 17204 che errori 17207, in altre occasioni è possibile che ne venga visualizzato solo uno.

Se questi errori si verificano in un database utente, il database viene lasciato nello stato RECOVERY_PENDING e le applicazioni non potranno accedere al database stesso. Se si verificano questi errori in un database di sistema, l'istanza di SQL Server non verrà avviata e non sarà possibile connettersi a questa istanza di SQL Server. Un errore con un database di sistema potrebbe comportare anche la modalità offline di una risorsa del cluster di failover di SQL Server.

Causa

Prima di poter usare qualsiasi database di SQL Server, è necessario avviare il database. Il processo di avvio del database implica quanto segue:

  1. Inizializzazione di varie strutture di dati che rappresentano il database e i file di database
  2. Apertura di tutti i file che appartengono al database
  3. Esecuzione del ripristino sul database

SQL Server usa la funzione API Windows CreateFile per aprire i file appartenenti a un database.

I messaggi 17204 (e 17207) indicano che si è verificato un errore durante il tentativo di aprire i file di database durante il processo di avvio.

Questi messaggi di errore includono le informazioni seguenti:

  1. Nome della funzione di SQL Server che tenta di aprire il file. Il nome della funzione che viene visualizzato normalmente in questi messaggi di errore è uno dei seguenti:

    • FCB::Open - Errore durante il tentativo di apertura del file in SQL Server
    • FileMgr::StartPrimaryDataFiles: un file di dati primario o un file appartenente al gruppo di file primario
    • FileMgr::StartSecondaryDataFiles: un file appartenente a un gruppo di file secondario
    • FileMgr::StartLogFiles: un file registro transazioni
    • STREAMFCB::Startup: un contenitore SQL FileStream
    • FCB::RemoveAlternateStreams
  2. Le informazioni sullo stato distinguono più posizioni all'interno di una funzione che possono generare questo messaggio di errore

  3. Il percorso fisico completo del file

  4. L'ID file corrispondente al file

  5. Il codice di errore del sistema operativo e la descrizione dell'errore. In alcuni casi viene visualizzato solo il codice di errore.

Le informazioni sull'errore del sistema operativo visualizzate in questi messaggi di errore indicano la causa principale all'origine dell'errore 17204. Sono cause comuni di questi messaggi di errore un problema di autorizzazione o un percorso del file errato.

Azione utente

  1. Per la risoluzione dell'errore 17204 è necessario comprendere il codice di errore del sistema operativo associato e diagnosticare l'errore corrispondente. Dopo aver risolto la condizione di errore del sistema operativo, è possibile tentare di riavviare il database (ad esempio usando ALTER DATABASE SET ONLINE) o l'istanza di SQL Server per portare online il database interessato. In alcuni casi potrebbe non essere possibile risolvere l'errore del sistema operativo. In questi casi è necessario eseguire azioni correttive specifiche. Le azioni sono illustrate in questa sezione.

  2. Se il messaggio di errore 17204 contiene solo un codice di errore e non una descrizione dell'errore, è possibile provare a risolvere il codice di errore usando il comando da una shell del sistema operativo: net helpmsg <codice> di errore . Se si riceve come codice di errore un codice di stato a 8 cifre, vedere fonti di informazioni come How do I convert an HRESULT to a Win32 error code? (Come convertire uno stato HRESULT in un codice di errore Win32?) per convertire questi codici di stato in errori del sistema operativo.

  3. Se si riceve l'errore del sistema operativo Access is Denied = 5, prendere in considerazione questi metodi:

    • Controllare le autorizzazioni impostate per il file esaminando le proprietà del file in Esplora risorse. SQL Server usa gruppi di Windows per effettuare il provisioning del controllo di accesso nelle varie risorse file. Verificare che il gruppo appropriato [con nomi come SQLServerMSSQLUser$ComputerName$MSSQLSERVER o SQLServerMSSQLUser$ComputerName$InstanceName] abbia le autorizzazioni necessarie per il file di database indicato nel messaggio di errore. Per altre informazioni, vedere Configurare le autorizzazioni del file system per l'accesso al motore di database. Assicurarsi che il gruppo di Windows includa effettivamente l'account di avvio del servizio SQL Server o il SID del servizio.

    • Esaminare l'account utente in cui è in esecuzione il servizio SQL Server. È possibile ottenere queste informazioni tramite Gestione attività di Windows. Cercare il valore "User Name" (Nome utente) nel file eseguibile "sqlservr.exe". Inoltre, se di recente è stato modificato l'account del servizio SQL Server, tenere presente che il modo supportato per eseguire questa operazione è tramite l'utilità Gestione configurazione SQL Server. Per altre informazioni su questo aspetto, vedere Gestione configurazione SQL Server.

    • A seconda del tipo di operazione (apertura dei database durante l'avvio del server, collegamento di un database, ripristino del database e così via), l'account usato per la rappresentazione e l'accesso al file di database può variare. Vedere l'argomento Sicurezza dei dati e dei file di log per informazioni sulle interazioni tra operazioni, autorizzazioni e account. Usare uno strumento come Process Monitor di Windows SysInternals per determinare se l'accesso ai file avviene nel contesto di sicurezza dell'account di avvio del servizio dell'istanza di SQL Server (o SID del servizio) o di un account rappresentato.

      Se SQL Server rappresenta le credenziali dell'utente che esegue l'operazione ALTER DATABASE o CREATE DATABASE, si noteranno le informazioni seguenti nello strumento Monitoraggio processi (esempio):

      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 si riceve l'errore del sistema operativo The system cannot find the file specified = 3:

    • Esaminare il percorso completo indicato nel messaggio di errore.
    • Verificare che l'unità disco e il percorso della cartella siano visibili e accessibili da Esplora risorse.
    • Esaminare il registro eventi di Windows per verificare se esistono problemi con questa unità disco.
    • Se il percorso non è corretto e questo database esiste già nel sistema, è possibile modificare i percorsi dei file di database usando i metodi descritti nell'articolo Spostare file di database. Può essere necessario usare questa procedura, in particolare per i file di database di sistema in cui si verificano gli errori 17204 o 17207 e se si usa uno scenario di ripristino di emergenza in cui le unità disco specificate non sono disponibili. In questo argomento viene inoltre illustrato come identificare il percorso corrente dei diversi database di sistema [master, model, tempdb, msdb e mssqlsystemresource].
    • Se questo errore viene visualizzato perché mancano i file di database, è necessario ripristinare il database da un backup valido.
      • Se il file di database associato all'errore appartiene a un filegroup secondario, è possibile contrassegnare il filegroup come offline, portare online il database e quindi eseguire un ripristino solo di quel filegroup. Per altre informazioni, vedere la sezione OFFLINE dell'argomento Opzioni per file e filegroup ALTER DATABASE (Transact-SQL).
      • Se il file che ha generato l'errore è un file di log delle transazioni, esaminare le informazioni riportate nelle sezioni "FOR ATTACH" e "FOR ATTACH_REBUILD_LOG" dell'argomento CREATE DATABASE (Transact-SQL) per capire in che modo ricreare i file di log delle transazioni mancanti.
    • Assicurarsi che qualsiasi disco o percorso di rete [come l'unità iSCSI] sia disponibile prima che SQL Server tenti di accedere ai file di database in questi percorsi. Se necessario, creare le dipendenze richieste in Amministrazione del cluster o Gestione controllo servizi.
  5. Se si riceve l'errore del sistema operativo The process cannot access the file because it is being used by another process = 32:

    • Usare uno strumento come Esplora processi o Handle da Windows Sysinternals per verificare se un altro processo o servizio ha acquisito un blocco esclusivo per questo file di database.
    • Arrestare il processo dall'accesso ai file di database di SQL Server. Esempi comuni includono i programmi antivirus. Vedere il materiale sussidiario per le esclusioni di file nell'articolo KB che segue.
    • In un ambiente cluster assicurarsi che il processo sqlservr.exe del nodo proprietario precedente abbia effettivamente rilasciato gli handle per i file di database. Normalmente questa situazione non si verifica, ma configurazioni errate del cluster o dei percorsi I/O possono causare problemi di questo tipo.