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