none
Errore durante rigenerazione di uno snapshot partizionato RRS feed

  • Domanda

  • Buongiorno, durante la rigenerazione di uno snapshot partizionato a volte capita che sull'operazione flushing cabinet file al 99% viene generato l'errore "Si è verificato un errore nella libreria per la compressione di file (CAB) durante la chiamata a 'FCIFlushCabinet()' con dettaglio seguente

    Messaggi di errore:
    Message: Si è verificato un errore nella libreria per la compressione di file (CAB) durante la chiamata a 'FCIFlushCabinet()'.
    Stack:    at Microsoft.SqlServer.Replication.CabCreator.ThrowWrappedFciException(String strFormattedFCIAPIString)
       at Microsoft.SqlServer.Replication.Snapshot.SnapshotFileProcessor.DoFlushCabinet()
       at Microsoft.SqlServer.Replication.Snapshot.SnapshotFileProcessor.AgentThreadProc()
       at Microsoft.SqlServer.Replication.AgentCore.BaseAgentThread.AgentThreadProcWrapper() (Origine: MSSQL_UNKNOWN, numero errore: 6)
    Visualizza la Guida: http://help/6
    Message: Impossibile accedere al file. Il file è utilizzato da un altro processo.

    Stack:    at Microsoft.SqlServer.Replication.CabCreator.ThrowFCIException()
       at Microsoft.SqlServer.Replication.CabCreator.ThrowWrappedFciException(String strFormattedFCIAPIString) (Origine: MSSQL_UNKNOWN, numero errore: 32)
    Visualizza la Guida: http://help/32

    Le repliche sono di tipo pull eseguite lato client con un batch che richiama replmerg.exe. Il recupero dei file di snapshot avviene tramite FTP e i file sono compressi.

    Sul server è montato SQL Server 2008 Standard 10.50.4000.0

    Qualcuno ha avuto situazioni simili? Grazie.


    • Modificato ayeaye lunedì 29 ottobre 2012 13:28
    lunedì 29 ottobre 2012 13:25

Risposte

  • A questo punto l'unico dubbio è che un processo di replica precedente sia rimasto ancora in esecuzione mentre il servizio richiama nuovamente il comando. L'errore non si verifica sempre perchè in alcuni casi l'intervallo di tempo può essere sufficiente (la velocità nell'esecuzione può dipendere da molti fattori come ad esempio il carico di lavoro del server, la latenza di rete, ecc...).

    Come test secondo me dovresti provare a modificare la temporizzazione nell'esecuzione del servizio, utilizzando un intervallo di tempo più elevato.

    • Contrassegnato come risposta ayeaye lunedì 7 gennaio 2013 11:38
    lunedì 7 gennaio 2013 11:11
    Moderatore

Tutte le risposte

  • Ciao, guardando l'errore sembrebbe un problema relativo a Microsoft Cabinet API (utilizzato per la compressione dello snapshot). La maggior parte delle volte questo si verifica se sono stati utilizzati caratteri Unicode per il nome delle tabelle, mentre le API utilizzano ANSI.

    Per risolvere il problema della codifica dei caratteri si può provare a seguire questa procedura: andare in "Pannello di controllo > Paese e lingua > Opzioni di amministrazione > Lingua per programmi non Unicode" e selezionare la lingua utilizzata per i nomi delle tabelle (ad esempio se sono stati utilizzate lettere accentate italiane, selezionare Italiano, indipendentemente dal linguaggio utilizzato dal sistema operativo). In alternativa basterebbe non utilizzare caratteri speciali per i nomi.

    Altrimenti come workaround si può semplicemente disabilitare la compressione degli snapshot...

    mercoledì 31 ottobre 2012 17:11
    Moderatore
  • Grazie per il suggerimento.

    L'idea era di evitare di disabilitare la compressione degli snapshot. In realtà non ci sono neanche articoli con caratteri particolari, i nomi delle tabelle contengono al massimo il carattere underscore, nessun carattere particolare o nessuna lettera accentata, solo lettere maiuscole e _.

    Non capiamo perchè il problema non si presenti ogni volta ma saltuariamente. Altre idee? Grazie ancora.

    lunedì 5 novembre 2012 12:16
  • Non è per caso che in alcune situazioni lo snapshot supera (anche di poco) i 2 GB?
    lunedì 5 novembre 2012 15:21
    Moderatore
  • Non compresso è sui 150 mb, compresso sui 25 mb
    lunedì 5 novembre 2012 17:17
  • OK, adesso che sto leggendo meglio l'errore vedo però che il Microsoft cabinet API ti restituisce anche un errore 32 (Impossibile accedere al file. Il file è utilizzato da un altro processo) quindi penso che bisognerebbe vedere prima di tutto perchè in alcune situazioni risulta non accessibile. Utilizzi per caso qualche software antivirus sul server?
    martedì 6 novembre 2012 12:47
    Moderatore
  • Sul subscriber c'è installato un antivirus ma sul publicator/distributor no
    venerdì 9 novembre 2012 12:41
  • Prova a disabilitare l'antivirus anche sul subscriber.
    sabato 1 dicembre 2012 13:06
    Moderatore
  • Purtroppo abbiamo lo stesso problema anche su subscriber che non hanno alcun antivirus installato
    giovedì 13 dicembre 2012 09:55
  • Hai un qualche sistema di sincronizzazione/backup che potrebbe accedere al file durante la compressione? Prova anche ad eseguire un monitoraggio con Process Explorer: http://technet.microsoft.com/en-us/sysinternals/bb896653
    giovedì 13 dicembre 2012 13:11
    Moderatore
  • Ci sono dei backup pianificati nelle ore notturne, solitamente il problema capita quando siamo operativi in ufficio e nn ci sono procedure che interferiscono con le repliche.

    lunedì 17 dicembre 2012 09:28
  • Potresti inserire il batch con replmerg.exe che stai utilizzando (oscurando ovviamente i dati "sensibili")?

    A questo punto penso che potrebbe essere un problema di temporizzazione dovuto all'esecuzione simultanea dei comandi. In alcuni casi la procedura precedente termina in tempo, quindi non si ha una sovrapposizione nell'accesso ai file, mentre in altri no e quindi viene mostrato quel messaggio.

    • Contrassegnato come risposta ayeaye lunedì 7 gennaio 2013 10:13
    • Contrassegno come risposta annullato ayeaye lunedì 7 gennaio 2013 10:13
    lunedì 17 dicembre 2012 13:32
    Moderatore
  • In pratica c'è un servizio windows che viene eseguito ogni tot minuti, tra le altre cose richiama il replmerg.exe in questo modo

                        'PROCESSO PER ESECUZIONE REPLICA
                        Dim prc As Process = New Process()
                        'IMPOSTA CARTELLA DI LAVORO
                        prc.StartInfo.WorkingDirectory = ConfigurationManager.AppSettings("PathReplMerg").ToString
                        'IMPOSTA PROGRAMMA DA ESEGUIRE PER LE REPLICHE (REPLMERG)
                        prc.StartInfo.FileName = "REPLMERG.EXE"
                        'IMPOSTA ARGOMENTI REPLICA
                        prc.StartInfo.Arguments = " -Publication %replica%  "
                        prc.StartInfo.Arguments &= " -Distributor %pubblicatore%  -Publisher %pubblicatore%  -PublisherDB %pubblicatoredb%  "
                        prc.StartInfo.Arguments &= " -Subscriber  %sottoscrittore%  -SubscriberDB %sottoscrittoredb%  "
                        prc.StartInfo.Arguments &= " -DistributorSecurityMode = 0 -PublisherSecurityMode = 0 "
                        prc.StartInfo.Arguments &= " -SubscriberSecurityMode = 0  -SubscriptionType 1 "
                        prc.StartInfo.Arguments &= " -SubscriberLogin %sottoscrittoreutente% -SubscriberPassword %sottoscrittorepassword% "

    lunedì 7 gennaio 2013 10:16
  • A questo punto l'unico dubbio è che un processo di replica precedente sia rimasto ancora in esecuzione mentre il servizio richiama nuovamente il comando. L'errore non si verifica sempre perchè in alcuni casi l'intervallo di tempo può essere sufficiente (la velocità nell'esecuzione può dipendere da molti fattori come ad esempio il carico di lavoro del server, la latenza di rete, ecc...).

    Come test secondo me dovresti provare a modificare la temporizzazione nell'esecuzione del servizio, utilizzando un intervallo di tempo più elevato.

    • Contrassegnato come risposta ayeaye lunedì 7 gennaio 2013 11:38
    lunedì 7 gennaio 2013 11:11
    Moderatore