Backup database e ripristino

di il
9 risposte

Backup database e ripristino

Ciao a tutti,
sto cercando di aggiungere una funzione di backup/ripristino database al mio programma. Tutto sembra funzionare ma ho un piccolo problema nel visualizzare all'utente la data a cui è stato riportato il database dopo il ripristino.
In pratica uso la seguente procedura: sono ammessi al massimo 5 backup. Al primo backup viene creato backup_1, al secondo backup_1 diventa backup_2 e il database viene copiato in backup_1, e così via. Quando ne ho 5 il quinto viene perso e gli altri scalano. Nel codice ho messo:

Private Sub BackupDatabaseToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BackupDatabaseToolStripMenuItem.Click
        Dim risposta As MsgBoxResult
        risposta = MsgBox("Stai per effettuare il backup del database. Procedere?", MsgBoxStyle.YesNo, "Confermare")
        If risposta = MsgBoxResult.Yes Then
            Dim origine As String = "golf.accdb"

            If System.IO.File.Exists("backup_5.accdb") Then       'se esiste il quinto backup allora
                System.IO.File.Delete("backup_5.accdb")             'elimino il vecchio backup_5
                Rename("backup_4.accdb", "backup_5.accdb")          'scalo gli altri...
                Rename("backup_3.accdb", "backup_4.accdb")
                Rename("backup_2.accdb", "backup_3.accdb")
                Rename("backup_1.accdb", "backup_2.accdb")
                System.IO.File.Copy("golf.accdb", "backup_1.accdb")     'e copio il database in backup_1
            ElseIf Not System.IO.File.Exists("backup_1.accdb") Then
                System.IO.File.Copy("golf.accdb", "backup_1.accdb")
            Else
                For i As Byte = 1 To 5
                    If Not System.IO.File.Exists("backup_" & i & ".accdb") Then     'se uno dei 5 backup non esiste, scalo gli altri e copio il db in backup_1
                        For j As Int16 = i To 2 Step -1
                            Rename("backup_" & j - 1 & ".accdb", "backup_" & j & ".accdb")
                        Next
                        System.IO.File.Copy("golf.accdb", "backup_1.accdb", True)
                        Exit For
                    End If
                Next
            End If

            MsgBox("Backup eseguito.", MsgBoxStyle.Information, "Conferma")

        End If

    End Sub

    Private Sub RipristinaUltimoBackupToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RipristinaUltimoBackupToolStripMenuItem.Click
        If Form3.modalita = "gestore" Then
            Dim risposta As MsgBoxResult
            risposta = MsgBox("Ripristinare l'ultimo backup del database?", MsgBoxStyle.YesNo, "Confermare")
            If risposta = MsgBoxResult.Yes Then
                Dim origine As String = "backup_1.accdb"
                Dim destinazione As String = "golf.accdb"
                If System.IO.File.Exists(origine) Then
                    System.IO.File.Copy(origine, destinazione, True)
                    'RIVEDERE DATA RIPRISTINO
                    MsgBox("Ripristino effettuato." & vbCr & "Il gestionale è stato riportato alla data " & System.IO.File.GetCreationTime("backup_1.accdb"), MsgBoxStyle.Information, "Conferma")
                Else
                    MsgBox("Backup non trovato", MsgBoxStyle.Exclamation, "Errore")
                End If
            End If
        Else
            MsgBox("Per eseguire il ripristino del gestionale contattare un'amministratore del sistema", MsgBoxStyle.Exclamation, "Permesso negato")
        End If
    End Sub
Il problema nasce quando cerco di visualizzare all'utente la data alla quale ho ripristinato il db: se creo il backup_1 alle 19.20 e poi faccio un altro backup alle 19.30 quando ripristino mi aspetto di vedere 19.30 ma viene scritto comunque 19.20
Come mai?
PS. Non è un problema enorme ma sono curioso (e poi non vorrei che ci fossero problemi con i ripristini )

9 Risposte

  • Re: Backup database e ripristino

    Piccolo dettagio in più: ho provato a guardare da "Esplora risorse" di Windows e in effetti la data di creazione è uguale per tutti i file, anche se in realtà sono stati creati in momenti diversi.
    Ho forse fatto qualche errore nel codice e la gestione dei vari backup (rotazioni, eliminazioni, ecc) è sbagliata?
  • Re: Backup database e ripristino

    Ciao minomic,
    la data del file è un' entità sulla quale ho sempre fatto poco affidamento di solito scrivo data e ora del backup nel nome del file, è un pò più complesso ma poi li muovi come vuoi.

    So che non ho risposto alla tua domanda, ma vista l' ora ho difficoltà di concentrazione era solo per parlare un po.
  • Re: Backup database e ripristino

    Ma certo, fa sempre piacere fare due chiacchiere
    Quindi come dici che potrei fare? Perchè vorrei dire all'utente "Ti ho riportato il db alla situazione del......" e mettere la data dell'ultimo backup (che dovrebbe essere la data di creazione dell'ultimo file). Scrivere data e ora nel nome posso farlo, però poi mi sembra che diventi difficile la gestione di quelle "rotazioni" per capire chi è il primo, chi il secondo, eccetera, o sbaglio?
  • Re: Backup database e ripristino

    Si, diventa complesso, però una volta fatto ce l' hai e poi è comodo.

    Se ne hai voglia domani possiamo parlare di un simpatico sistema per archiaviare i backup spaziati nel tempo, ad esempio averne 4 o 5 distaziati di un giorno, altri 2 o 3 distanziati di un settinama e altri di un mese. Questo perchè a volte ti sorge la necessità di guardare un backup vecchio e se li butti via dopo 5 giorni magari è un problema.
  • Re: Backup database e ripristino

    Ok proverò

    barba59 ha scritto:


    se li butti via dopo 5 giorni magari è un problema
    io non volevo buttarli via dopo 5 giorni, io volevo che si potessero salvare al massimo 5 backup, cioè backup_1, backup_2, ..., backup_5 e poi al sesto tentativo si doveva eliminare il quinto e scalare gli altri
  • Re: Backup database e ripristino

    Ciao minomic,
    Stato facendo un discorso del genere: supponiamo di fare un backup al giorno e di volerne al massimo 10. Il backup più vecchio che hai ha 10 giorni, se per caso ti servisse di esaminare un dato di un mese fà o di un anno fà non è più possibile.

    Esistono dei sistemi per archiviare sempre un numero limitato di backup però tenendoli opportunamente spaziati nel tempo per cui nel tuo gruppo di 10 backup ritrovi quelli degli ultimi giorni più qualcuno di qualche settimana fa e altri di un mese o un anno dipende da come lo configuri.

    Se ti interessa ne parliamo altrimenti ritorniamo al tuo problema.
  • Re: Backup database e ripristino

    Ah ok ho capito. In realtà non credo sia una soluzione molto adatta al mio problema perchè i backup vengono fatti manualmente cliccando su "backup database". Poi in ogni caso non vorrei fare cose troppo complicate, anche perchè non mi sembrano necessarie per il livello (basso) del mio programma.
    Comunque ho controllato, ho fatto diverse prove e le rotazioni/sostituzioni dei backup mi sembrano giuste. L'unico problema è quello della data di creazione del file. Cercando in rete mi sembra di aver capito che sia un problema conosciuto: se prendi un file chiamato file_1, lo rinomini in file_2 e crei subito un altro file che si chiama file_1 questo avrà la stessa data di creazione del vecchio file_1 come se windows non si fosse accorto della sostituzione.
    Non ho trovato soluzioni, spero che tu mi possa aiutare!
    Grazie ancora
  • Re: Backup database e ripristino

    Perchè non provi con le altre funzioni della classe File ad esempio GetLastWriteTime o GetLastAccessTime?
  • Re: Backup database e ripristino

    Perfetto, con GetLastAccesTime funziona!
    Posto il codice per completezza, anche perchè così se vedi qualche errore me lo puoi dire
    
    Private Sub BackupDatabaseToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BackupDatabaseToolStripMenuItem.Click
            Dim risposta As MsgBoxResult
            risposta = MsgBox("Stai per effettuare il backup del database. Procedere?", MsgBoxStyle.YesNo, "Confermare")
            If risposta = MsgBoxResult.Yes Then
                Dim origine As String = "golf.accdb"
    
                If System.IO.File.Exists("backup_5.accdb") Then       'se esiste il quinto backup allora
                    System.IO.File.Delete("backup_5.accdb")             'elimino il vecchio backup_5
                    Rename("backup_4.accdb", "backup_5.accdb")          'scalo gli altri...
                    Rename("backup_3.accdb", "backup_4.accdb")
                    Rename("backup_2.accdb", "backup_3.accdb")
                    Rename("backup_1.accdb", "backup_2.accdb")
                    System.IO.File.Delete("backup_1.accdb")
                    System.IO.File.Copy("golf.accdb", "backup_1.accdb")     'e copio il database in backup_1
                ElseIf Not System.IO.File.Exists("backup_1.accdb") Then
                    System.IO.File.Delete("backup_1.accdb")
                    System.IO.File.Copy("golf.accdb", "backup_1.accdb")
                Else
                    For i As Byte = 1 To 5
                        If Not System.IO.File.Exists("backup_" & i & ".accdb") Then     'se uno dei 5 backup non esiste, scalo gli altri e copio il db in backup_1
                            For j As Int16 = i To 2 Step -1
                                Rename("backup_" & j - 1 & ".accdb", "backup_" & j & ".accdb")
                            Next
                            System.IO.File.Delete("backup_1.accdb")
                            System.IO.File.Copy("golf.accdb", "backup_1.accdb", True)
                            Exit For
                        End If
                    Next
                End If
    
                MsgBox("Backup eseguito.", MsgBoxStyle.Information, "Conferma")
    
            End If
    
        End Sub
    
        Private Sub RipristinaUltimoBackupToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles RipristinaUltimoBackupToolStripMenuItem.Click
            If Form3.modalita = "gestore" Then
                Dim risposta As MsgBoxResult
                risposta = MsgBox("Ripristinare l'ultimo backup del database?", MsgBoxStyle.YesNo, "Confermare")
                If risposta = MsgBoxResult.Yes Then
                    Dim origine As String = "backup_1.accdb"
                    Dim destinazione As String = "golf.accdb"
                    If System.IO.File.Exists(origine) Then
                        Dim data_ultimo_backup As DateTime = System.IO.File.GetLastAccessTime(origine)
                        System.IO.File.Copy(origine, destinazione, True)
                        'RIVEDERE DATA RIPRISTINO!!!
                        MsgBox("Ripristino effettuato." & vbCr & "Il gestionale è stato riportato alla data " & data_ultimo_backup, MsgBoxStyle.Information, "Conferma")
                    Else
                        MsgBox("Backup non trovato", MsgBoxStyle.Exclamation, "Errore")
                    End If
                End If
            Else
                MsgBox("Per eseguire il ripristino del gestionale contattare un'amministratore del sistema", MsgBoxStyle.Exclamation, "Permesso negato")
            End If
        End Sub
    
    Grazie mille!
Devi accedere o registrarti per scrivere nel forum
9 risposte