Backup automatico

di il
0 risposte

Backup automatico

Ripeto il contesto entro il quale chiedo, un vecchio applicativo molto grosso in Access che, dalla classica struttura Frontend/Backend tutta Access sto convertendo a Frontend/MySql. Ho avuto già passate esperienze di Frontend/SqlServer, per le quali non mi sono mai occupato del problema del backup, che era a carico dei sistemisti dell'azienda, che avevano già altri db SqlServer di cui occuparsi. Di questo devo occuparmi io e quindi chiedo lumi.

Ho già realizzato un sistema di backup/restore da maschera, con l'utente che decide quando effettuare il backup. Il problema è che vorrei rendere il backup una procedura batch. Quel che ho fatto adesso è generare un comando multiplo contenente una chiamata a mysqldump che genera un file SQL e una successiva a 7zip che comprime il file. Il nome del file risultante è comprensivo di data e ora, in modo da avere tanti backup separati da poter recuperare. Poi chiamo il Powershell che processa il comando. Analoga l'operazione di restore. Si poteva fare di meglio? E soprattutto mi domando cosa si può fare via bacth. Giusto per scrupolo posto sotto le due subroutine di Export e Import. Ci sono alcune variabili globali.


Private Function ExportDb(strDbName As String, strSqlName As String, Optional blnDataOnly As Boolean = False) As Boolean
 Dim strFileSql As String, strFile7z As String, strCmd As String, strTemp As String
 
 ''' credenziali
 strHost = SqlConnPar("SERVER")
 strUser = SqlConnPar("UID")
 strPsw = SqlConnPar("PWD")
 strFileSql = strDbDatPath & "\PassDbBackups\" & strSqlName & ".sql"
 strFile7z = strDbDatPath & "\PassDbBackups\" & strSqlName & ".7z"
 
 ''' diversifica caso con/senza dati
 If blnDataOnly Then
   strTemp = "--no-create-info=TRUE "
 Else
   strTemp = "--routines "
 End If
 
 ''' export
 strCmd = strUtilPath & "\mysqldump.exe" & _
          " --host=" & strHost  & _
          " --user=" & strUser & _
          " --password=" & strPsw & _
          " --single-transaction --quick " & _
          strTemp & _
          Chr(34) & strDbName & Chr(34) & _
          " --result-file=" & strFileSql & "; " & _
          strUtilPath & "\7zr.exe a " & strFile7z & " " & strFileSql
 PowerShell strCmd, True
   
 ''' elimina file sql
 DelFile strFileSql
 
 ''' controllo risultato
 strTemp = "": strTemp = FileProp(strFile7z)
 If strTemp = "" Then
   MsgBox "Procedure not successfull", vbCritical
 Else
   strTemp = "File created:" & vbCrLf & strFile7z & vbCrLf & vbCrLf & strTemp
   MsgBox strTemp
   ExportDb = True
 End If
End Function

--------------------------------------------------------------------------------------------------------
Private Function ImportDb(strDbName As String, strFileDump As String, blnNew As Boolean) As Boolean
  ''' strFileDump stringa completa di path ed ext
  Dim strCmd As String, strFileSql As String, strTempFile As String, bytUtNr As Byte
  Dim i As Integer, strTemp As String
  
  ''' scompatta se necessario
  If Right(strFileDump, 3) = ".7z" Then
    i = InStrLast(strFileDump, "\")
    strTemp = "-o" & Left(strFileDump, i - 1) & " "
    strCmd = strUtilPath & "\7zr.exe e " & strTemp & strFileDump & "; "
    strFileSql = Replace(strFileDump, ".7z", ".sql")
  Else
    strFileSql = strFileDump
  End If
  
  ''' preventiva eliminazione di DEFINER se necessario
  strTempFile = AppTempPath() & "\Temp.sql"
  If strTempFile <> strFileSql Then
    strCmd = strCmd & "(Get-Content -path " & Chr(39) & strFileSql & Chr(39) & ")" & _
             " -replace ' DEFINER=`[^`]*`@`[^`]*`',''" & _
             "| Out-File -FilePath " & Chr(39) & strTempFile & Chr(39) & _
             " -Encoding ascii; "
  End If
  
  ''' recupero credenziali
  strHost = SqlConnPar("SERVER")
  strUser = SqlConnPar("UID")
  strPsw = SqlConnPar("PWD")
  
  ''' eventuale creazione nuovo db (usare singolo apice, doppio non funziona)
  If blnNew Then
    strCmd = strCmd & strUtilPath & "\mysql.exe" & _
             " --host=" & strHost & _
             " --user=" & strUse & _
             " --password=" & strPsw & _
             " -e " & Chr(39) & "CREATE DATABASE " & strDbName & _
             " CHARACTER SET=utf8mb4" & Chr(39) & "; "
  End If

  ''' importazione
  strCmd = strCmd & "cmd.exe /c " & Chr(39) & strUtilPath & "\mysql.exe" & _
           " --host=" & strHost & _
           " --user=" & strUser & _
           " --password=" & strPsw & _
           " --database=" & strDbName & " < " & strTempFile & Chr(39)
  
  ''' chiama Powershell
  PowerShell strCmd, True
  
  ''' eventuale eliminazione file sql
  If Right(strFileDump, 3) = ".7z" Then Kill strFileSql
  
  ''' controllo buon fine
  bytUtNr = ReadAdm(strDbName)
  ImportDb = (bytUtNr > 0)

End Function
Devi accedere o registrarti per scrivere nel forum
0 risposte