Aktualizace serveru selže při zálohování databáze

Popis

Aktualizace serverové komponenty probíhá v podstatě v těchto krocích:

  1. Odsouhlasení updatu
  2. Stažení a ověření souborů
  3. Vypnutí webové služby a služby eWayTimer
  4. Záloha databáze
  5. Aktualizace aplikačních souborů
  6. Aktualizace databáze
  7. Vytváření CLR procedur
  8. Zapnutí webové služby a služby eWayTimer

Nejčastější krok aktualizace serverové části, který se nezdaří, je zálohování databáze. V administrační aplikaci se objeví chybová hláška s tímto obsahem:

eWay.ServerUpdater.Exceptions.CommandRunningException: Command 'eWay.WebServiceDeploy.Wizard.WizardFormCommands.BackupDatabaseCommand' wasn't successful. The result was 'Error'.
at eWay.ServerUpdater.DeployWizard.RunnedCommand.Run(ExceptionCatcher exceptionCatcher)
at eWay.ServerUpdater.Executables.Executable.RunCommands(IEnumerable`1 commands)
at eWay.ServerUpdater.Executables.ProcessTheUpdateExecutable.Execute()
at eWay.ServerUpdater.Program.Main(String[] args)

Případně se může objevit hláška s tímto obsahem:

eWay.ServerUpdater.Exceptions.CommandRunningException: Command 'eWay.WebServiceDeploy.Wizard.WizardFormCommands.BackupDatabaseByEwayProcedureCommand' wasn't successful. The result was 'Error'.
   at eWay.ServerUpdater.DeployWizard.RunnedCommand.Run(ExceptionCatcher exceptionCatcher) in C:\CC.NET\Projects\NAnt\Sources\DeployManagement\ServerUpdater\ServerUpdater\DeployWizard\RunnedCommand.cs:line 38
   at eWay.ServerUpdater.Executables.Executable.RunCommands(IEnumerable`1 commands) in C:\CC.NET\Projects\NAnt\Sources\DeployManagement\ServerUpdater\ServerUpdater\Executables\Executable.cs:line 73
   at eWay.ServerUpdater.Executables.ProcessTheUpdateExecutable.Execute() in C:\CC.NET\Projects\NAnt\Sources\DeployManagement\ServerUpdater\ServerUpdater\Executables\ProcessTheUpdateExecutable.cs:line 73
   at eWay.ServerUpdater.Program.Main(String[] args) in C:\CC.NET\Projects\NAnt\Sources\DeployManagement\ServerUpdater\ServerUpdater\Program.cs:line 61

CommandRunningException říká, že spadl jeden z kroků (command). Důležité je vidět který. To je patrné z eWay.WebServiceDeploy.Wizard.WizardFormCommands.BackupDatabaseCommand - chybovalo zálohování databáze. Ve druhém případě je to způsobeno skutečností, která je označena jako BackupDatabaseByEwayProcedureCommand - jedná se o chybu danou nastavením zálohování.

V dialogu administrační aplikace není už dále vidět, jaká byla příčina chyby zálohování. Tu se dozvíme z logů aktualizačního procesu, fáze 2 - např. Update_2017-12-14_Phase2.txt. Ten vypadá například takto:

2017-12-11 13:56:40: ERROR: : [MessageProcessor] [Error, ] Backups database '' to 'eWay_beforeUpdate_2017-12-11_13-56-34.bak'. Exception message: Simple Sql command 'backup database eWay' failed with messaqge: Cannot open backup device 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.EWAYSQL\MSSQL\Backup\eWay_beforeUpdate_2017-12-11_13-56-34.bak'. Operating system error 3(failed to retrieve text for this error. Reason: 15100).
BACKUP DATABASE is terminating abnormally.
Ex. stacktrace:
  at eWay.WebServiceDeploy.Wizard.Utils.DatabaseUtils.RunSimpleSqlNonQueryCommand(String connectionString, String sqlText, Int32 commandTimeout)
  at eWay.WebServiceDeploy.Wizard.Utils.DatabaseUtils.BackupDbToFile(String instanceConnectionString, String databaseName, String filePath)
  at eWay.WebServiceDeploy.Wizard.WizardFormCommands.BackupDatabaseCommand.Run()
Inner ex. stacktrace:
  at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
  at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
  at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
  at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
  at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry)
  at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
  at eWay.WebServiceDeploy.Wizard.Utils.DatabaseUtils.RunSimpleSqlNonQueryCommand(String connectionString, String sqlText, Int32 commandTimeout): 
2017-12-11 13:56:40: DEBUG: : Result: None, : 
2017-12-11 13:56:40: ERROR: : The updater execution ended with an exception.: Command 'eWay.WebServiceDeploy.Wizard.WizardFormCommands.BackupDatabaseCommand' wasn't successful. The result was 'Error'.

Verze

Všechny verze eWay-CRM®

Obtížnost řešení

Střední

Postup řešení

Ještě předtím než ServerUpdater konstatuje, že BackupDatabaseCommand nebyl úspěšný, je zalogována chyba přímo z provádění příkazu (command). V našem konkrétním případě šlo o to, že SQL Server nemohl realizovat přístup k souboru c:\Program Files\Microsoft SQL Server\MSSQL10_50.EWAYSQL\MSSQL\Backup\eWay_beforeUpdate_2017-12-11_13-56-34.bak. Důvodem byla chybějící složka na cestě.

Další běžné důvody selhání zálohy databáze jsou:

  • Chybějící oprávnění zápisu na disk
  • Nedostatek místa na cílovém disku
  • Špatně nastavený recovery model SQL serveru (eWay-CRM® vyžaduje FULL)

Danou chybu je potřeba řešit na serveru dle jejího charakteru. Většinou se jedná o jednoduchý úkon (uvolnění místa, nastavení práv, změna / vytvoření cílové složky, apod.). Po opravě je potřeba proces aktualizace opakovat.

Z postupu aktualizace výše je patrné, že při zastavení na kroku zálohování ještě nedošlo k provedení žádné změny eWay-CRM® na serveru. Aplikační soubory ani data nejsou tedy v nekonzistentním stavu. Serverovou komponentu je tedy možno opět nastartovat:

  • Zapnout webovou službu - přejmenovat soubor App_Offline.htm na _App_Offline.htm
  • Zapnout službu eWayTimer

Nyní je eWay-CRM® ve stejném stavu jako byla před pokusem o aktualizaci. Další krok tedy vede do administrační aplikace, kde můžeme aktualizaci spustit znovu.