Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

geöffnete Datenbank A2003 kopieren

Begonnen von Optiplex, November 05, 2010, 09:29:08

⏪ vorheriges - nächstes ⏩

Optiplex

Hallo zusammen,
ich schreibe gerade an einer Turnierdatenbank, nun habe ich folgendes Problem. Da die Datenbank während des Turnier ständig eingaben hat, sollte sie bei bestimmten Aktionen kopiert werden, um bei einem Stromausfall auch auf dem neusten stand zu sein. Stellt euch mal vor die Datenbank wird durch einen Stromausfall beschädigt und man kann das Turnier nicht fortsetzen an dem hundert oder mehr Spieler beteiligt sind. Da ist eine Sicherheitskopie die ständig erneuert wird schon erforderlich, nur wie kopiert man eine geöffnete Datenbank aus der sich selbst. Weis das jemand von euch.

Gruß Dieter

MzKlMu

Hallo,
wenn Du mit gebundenen Formularen arbeitest, wozu ich Dir dringend raten würde, spielt im Normalfall ein Stromausfall keine Rolle. Wenn Du dafür sorgst, dass in jedem Feld der Datensatz gespeichert wird (z.B. im Ereignis "Nach Aktualisierung" geht bei einem Stromausfall nichts verloren. Wenn Du wegen eines Stromausfalls Kopien anlegen willst, müsstest Du ja fast minütlich die DB sichern. Wenn Dann während der Sicherung der Strom ausfällt (was ja wegen der Häufigkeit wahrscheinich sein könnte) ist das Original und die Kopie im Eimer.

Mal von der Problematik abgesehen, geöffnete Dateien zu kopieren. Das geht 100x gut oder auch nur 10x. Und wenn es schief geht, sind beide DBs im Eimer. Sorge also besser dafür, dass die Daten immer gleich gespeichert werden. Was beim Wechsel eines datensatzes eh automatisch passiert.
Gruß Klaus

Optiplex

Hallo MzKlMu,
und Danke für die doch recht schnelle Antwort.
Mir stellt sich nun die Frage wann kann eigentlich die Datenbank beschädigt werden?  Ich verstehe auch nicht ganz warum die Sicherheitskopie ebenfalls beschädigt wird, ich dachte daran, dass eine Sicherung alle 5 Minuten oder bei ganz bestimmten Aktionen durchgeführt werden soll, nicht bei jeder Aktuallisierung. Außerdem schreibst du, dass die Sicherung nicht immer richtig funktionieren soll, was soll daran schief gehen?

Gibt es überhaupt eine Möglichkeit aus der geöffneten mdb eine Sicherheitskopie von sich selbst zu erstellen?

Sorry für die vielen Fragen, aber ich bin noch nicht so gut in VBA.

Gruß Dieter

MzKlMu

Hallo,
ich halte das ganze Vorhaben als Absicherung für einen Stromausfall für ziemlich überflüssig. Sorge dafür, dass die Daten immer gleich gespeichert werden und es passiert nichts.

Wenn Du z.B. einen Datensatz anlegst und diesen sofort speicherst (das passiert bereits durch Wechseln zu einem anderen Datensatz) kann direkt ein Stromausfall folgen, da ist nichts verloren. Wenn der Strom kommt, ist alles wieder da.

Es war schon immer problematisch geöffnete Dateien zu kopieren, nicht nur bei Access.
Gruß Klaus

Shai

#4
Folgende Routine kopiert die gerade geöffnete Datenbank.
Benutzt wird das FileSystemObject von Windows
Die Backup-Datei sind Namensgleich der aktuellen DB, allerdings mit einer angehängten, 4-Stelligen Laufenden Nr.
Aus
C:\Projekte\Test.mdb
werden
C:\Projekte\Test0001.mdb
C:\Projekte\Test0002.mdb
C:\Projekte\Test0003.mdb
[...]
Bei jedem Sichern wird eine Nr hochgezählt.

Public Sub DBKopieren()
   
   Dim fso As Object
   Dim objFolder As Object
   Dim objFile As Object

   Dim strFiles As String
   Dim strFile As String
   Dim intAnzFiles As Integer
       
   Dim strDbName As String
   Dim strDatei As String
   Dim strPfad As String
   Dim strExt As String
   
   Dim strNewName As String

   Set fso = CreateObject("Scripting.FileSystemObject")
     
   ' DatenbankDateiNamen und Pfad ermitteln
   strDbName = CurrentDb.Name
   ' Datenbankname herausschneiden
   strDatei = Dir(strDbName)
   strPfad = Left(strDbName, Len(strDbName) - Len(strDatei))
   strExt = Right$(strDatei, Len(strDatei) - (InStr(1, strDatei, ".", vbTextCompare)) + 1)
   strDatei = Left$(strDatei, Len(strDatei) - Len(strExt))
   strFiles = ""
   intAnzFiles = 0
   If Not fso.FolderExists(strPfad) Then
       MsgBox ("Das Verzeichnis " & strPfad & " existiert nicht!")
   Else
       Set objFolder = fso.GetFolder(strPfad)
       
       ' Herausfinden, ob schon Backups existieren
       For Each objFile In objFolder.Files
           strFile = objFile.Name
           If Left$(strFile, Len(strDatei)) = strDatei Then
               If Right$(strFile, Len(strExt)) = strExt Then
                   intAnzFiles = intAnzFiles + 1
                   ' Filenamen auflisten ... brauchen wir nicht.
                   ' strFiles = strFiles & objFile.Name & vbCrLf
               End If
           End If
       Next
       
       ' Neuen Dateinamen generieren. Dateiname + Laufende Nr
       strNewName = strPfad & strDatei & Right$("000" & intAnzFiles, 4) & strExt
       
       ' Alte Datei einlesen und kopieren
       Set objFile = fso.GetFile(strPfad & strDatei & strExt)
       objFile.Copy (strNewName)
               
   End If
   Set objFolder = Nothing
   Set objFile = Nothing
   Set fso = Nothing
   
End Sub


Du verstehst nicht, warum die Sicherungskapie mitbeschädigt wird?
Wenn das Original beschädigt ist, dann ist die Kopie der kaputten Datei das natürlich auch.
zu viele Leute denken in Excel.

Optiplex

#5
Mensch das geht ja hier Ruckzuck

Danke Shai für den Code, werde diesen heute Abend mal in aller Ruhe testen.
ich gehe eigentlich davon aus, dass die Datenbank vor dem Stromausfall in Ordnung war und sich danach nicht mehr öffnen läßt (was einem Supergau gleicht) deshalb eine Sicherheitskopie die eigentlich in Ordnung sein sollte, damit man mit dieser weiterarbeiten kann. Das müsste mit deinem Code zu bewerkstelligen sein, soweit wie ich das bis jetzt sehe.

@MzKlMu
ich gebe zu ,dass die Wahrscheinlichkeit dass was passiert sehr gering ist, aber bei so einem Turnier mit sehr vielen Mitspielern möchte ich auch das kleinst Risiko ausschließen.

Gruß Dieter


oma

Hallo,

eine "heiße Kopie" ist immer problematisch, da ja gerade Schreibvorgänge getätigt werden können.

Nach meiner Erfahrung kann es kann zu defekten Sicherungskopien kommen, während die Original-DB nicht beschädigt wird.
Das ist aber nur eine Erfahrungsaussage.

Gruß Oma
nichts ist fertig!

Optiplex

Hallo zusammen

@Oma
OK diese Begründung lasse ich gelten.

Gibt es vielleicht noch eine andere Möglichkeit eine Art Sicherheitskopie zu erstellen.

z.b. erstelle neue Datenbank – kopiere alle Tabellen Formulare usw. dort hinein. Das ganze zeitgesteuert alle 10 min oder Direkt über einen Button.
Würde dieses vorgehen eher euren Vorstellungen entsprechen. und was ist dabei zu beachten?

Ich bin für jeden Guten Vorschlag offen.

Gruß Dieter

Hondo

Hallo,
mit Access als Backend kann man hier nur tricksen.
Sicherungskopie ist dann OK wenn alle Frontends geschlossen sind.
Per Timer könnte man steuern dass zu einer bestimmten Uhrzeit gesichert werden soll.
Dann im Event den User aufzufordern die Anwendung zu Schließen. damit man wenig später danach sichern kann.

Man könnte auch im Close-Event eines versteckten Startformulares das Schließen in einer Backend-Tabelle erfassen und wenn alle geschlossen sind dann DB sichern.

Andreas

MzKlMu

#9
Hallo,
ich bin nach wie vor der Meinung, wegen eines möglichen Stromausfalls ist eine Kopie der DB überflüssig. Dass man natürlich regelmäßig Backups anlegen soll ist klar. Ein Stromausfall führt bei Access nicht zwangsläufig zu einem Datenverlusst. Wenn Du also immer dafür sorgst, dass ein Datensatz immer gleich gespeichert wird, gibt es bei einem Stromausfall keinen Datenverlust. Bei gebundenen Formularen geht das Speichern fast automatisch.
Wenn Du häufig kopierst, ist die Wahrscheinlichkeit dass der Stromausfall während eines Kopiervorgangs passiert auch größer, dann hast Du keine Daten in der Kopie und bist auch auf das Original angewiesen.

Wenn Dir das wirklich so wichtig ist (nach Deiner Schilderung sehe ich das auch so) würde ich mir lieber eine USV (unterbrechungfreie Stromversorgung) zulegen. Die gibt es für eine Überbrückungszeit von 5 Minuten schon für ca. 150.-€. Und 5 Minuten reichen zum ordnungsgemäßen schließen der DB allemal.

Hier mal ein Link:
3 Minuten Überbrückungszeit, das reicht zum Speichern allemal. Preis ca. 110.-€, da kann man nicht meckern.
http://www.it-budget.de/multimatic-usv-800-va-p-6500-3.html?sessID=9b943571e742c5cabd739bde32d7aa66
Gruß Klaus

Optiplex

Hallo zusammen,
sorry dass ich mich erst heute wieder melde und danke für eure Antworten.

An eine USV hatte ich auch schon gedacht, aber die kostet Geld und diese Turnierdatenbank ist eigentlich für Vereine und dem Verein der diese Datenbank benutzen, wollte ich das ersparen. Zumal die Wahrscheinlichkeit sehr gering ist, aber ihr kennt ja den Spruch 'was passieren kann ,passiert'. Frei nach den Motto 'geht nicht gibt es nicht' dachte ich, dass man das Problem, mit ein paar Zeilen Code erschlagen kann. Nun ratet Ihr mir hier, mehr oder minder alle davon ab. Was ich wollte ist eigentlich eine zusätzliche Sicherheit falls etwas mit der Originaldatenbank nicht stimmt, worauf man dann zurückgreifen kann, auch wenn man ein paar Ergebnisse wieder nachführen muss, und nicht eine 1 zu 1 Kopie die ständig auf den aktuellsten Stand ist(was natürlich schön gewesen wäre), aber davon habt ihr mich schon abgebracht (überzeugt), daß durch die ständigen Schreibzugriffe die Fehlerwahrscheinlichkeit der Kopie sich erhöht.

Den Code von Shai werden ich noch testen ( bin leider noch nicht dazu gekommen ),wobei mir das einbinden von Scripting nicht so sonderlich gut gefällt. Ich dacht mehr an eine Accessinterne Lösung.

Vielleicht fällt jemanden noch eine ander Lösung ein?

Auf jeden Falls werde ich in der Anleitung zur Datenbank die Benutzung einer USV anraten

Danke und Gruß Dieter

Shai

Eine Access-interne Lösung hast Du also erwartet? *lacht*

Ich manage jährlich ein großes Bogensportturnier mit so an die 40-60 Teilnehmern. Ich habe ein Auswerteprogramm dafür geschrieben.
Du willst nicht das kleinste Risiko eingehen, dass irgendwas nicht klappt bei dem Turnier? Vergiss es! Ich mache das jetzt schon 10 Jahre, und irgendwas ist immer. Die meisten Probleme haben aber nichts mit der EDV zu tun, aber Ich habe auch schon während des Turniers nach einem hartnäckigem Fehler gesucht.

Dabei vertraue ich dem Laptop ganz und gar. Der wird das schon richten - so lange keiner Cola über ihn giesst.
Die Ausdrucke werden schon rauskommen - so lange der Strom nicht ausfällt.

Wenn man bei Access mehr Sicherheit vor Datenverlust haben möchte, dann muss man Frontend (das Programm) und Backend (die Daten) voneinander trennen.
Um das zu schaffen, gibt es ja diesen wunderschönen Assistenten zur Datenbankaufteilung. Der erzeugt dann eine 2. Access-Datei, die nur die Tabellen enthält, und eine weitere für das Programm selbst. Oder man nimmt gleich die professionelle Version und besorgt sich kostenfrei von Microsoft den SQL-Server Express. Da hinein mit den Tabellen, dann via ODBC oder ADO die Daten mit dem Access verbinden und Du hast neben einem turbomäßigen Performance-Schub auch eine Menge Datensicherheit. Der SQL-Server könnte auch auf einem anderen Rechner laufen, fernab von allen Kaffeetassen, Schussprojektilen oder Baseballschlägern, und du würdest dann per Netzwerk auf die Daten zugreifen. Das Programm selbst ist 100%g austauschbar, wenn es sich mal zerstören sollte, kopierst du es einfach vom USB-Stick nochmal drauf. Die Daten sind ja auf dem Server.

Wenn Du einen guten Computer hast, am besten einen, der notfalls auf Batterie läuft, und wenn Du ein gutes Programm hast, dann passiert Dir ansonsten so schnell nichts.
zu viele Leute denken in Excel.

Optiplex

Hallo Shai,
dann kennst du ja die Problematik. Ich selbst bin in der Turnierleitung einer Dartliga und habe bei unseren größeren Event ca 40 Mannschaften (200-250 Teilnehmer) am Start. Bei so einem Event werden mehrere Turniere in verschiedenen Klassen gleichzeitig gespielt (Einzel, Doppel, Team). Das ist Stress pur und glaube mir, ich weis was alles während eines Turniers passieren kann. Wir arbeiten die ganze Zeit noch mit Papierplänen und es ist nicht leicht die Übersicht zu behalten, welcher Spieler spielt gerade am welchem Automaten und welcher ist frei. Um mir und meinen Mitstreitern die Arbeit zu erleichtern dachte ich an eine Datenbank die uns diese Übersicht erleichtert. Nun ich habe schon ein paar kleine Datenbanken erstellt aber das ist nichts gegen das was ich mir da vorgenommen habe. Ich bin auch nicht der Access/VBA Experte, das merkt man schon daran, dass ich die internen Abläufe von Access nicht richtig kenne. Deshalb sei mir nicht böse wenn ich eine Frage stelle, die in Access, vielleicht nicht umsetzbar ist.

Gruß Dieter

Hondo

Hallo,
die imo einzig sinnvolle Sicherung ist die, die Ergebnisse auf Papier mitprotokollieren.
Im schlimmsten Falle wenn die Datenbank abraucht kannst du die Daten immer noch relativ schnell in eine Sicherungskopie eingeben bzw. kontrollieren.
Ansonsten regelmäßig Datenbank schließen, Sicherungskopie machen (alle Sicherungskopien aufbewahren) und Datenbank wieder starten.

Andreas

database

Hallo,
dann darf ich auch noch rasch ein paar Worte hir ablegen .. :)

Dein Vorhaben ist nicht eines, das in 1-2 Tagen so mal schnell nebenher erstellt werden kann.
Der Vorschlag mit dem SQL Server Expr. ist nicht schlecht - wobei bei der zu erwartenden Datenmenge in Richtung Geschwindigkeit auch mit Access kein Problem entstehen wird.
Wenn du aber mit dem SQL-Server arbeitest und da mit Transaktionen beim Schreiben der Daten, sollte nichts passieren.
Backend auf eine 2. Maschine ausgelagert dann gibts m.E. nicht mehr viel was passieren kann - ja ich weiß ... aber gegen ALLE Eventualitäten kann man sich sowieso nie versichern.
Ausgelagerte Frontends sind dann auch mit Access schon eine hohe Risikoversicherung.
Und bei Laptops mit intaktem Akku darf der Strom schon mal ausfallen - da hast die USV schon mit eingebaut - zudem spielt eh keiner mehr weiter wenns keinen Strom mehr gibt oder?  ;)
Stolperfalle bei der Stromzufuhr - Verlängerungskabel ... hochlegen hilft

Du gibst hier an, dass du (noch) nicht viel Expertenwissen über Access hast - bevor du beginnst solltest du auf jeden Fall mit höchster Priorität deine Grundkenntnisse im Datenbankdesign überprüfen - Tabellenaufbau, Datentypen, Normalisierung ... dann erst solltest du über Access als solches und VBA nachdenken  ;)

Gutes Gelingen

Peter