Access löscht willkürlich Tabellenzeilen

Hallo,

habe eine Accessdatenbank seit 2003 in Betrieb. Heute ist beim Öffnen etwas verrücktes passiert:
Aus einer der vorhandenen Tabellen wurden einfach alle Zeilen ab Tabellenzeile 13000 vollständig gelöscht; kalten Blutes, ohne Grund ganz still und heimlich.
Habe das dann später entdeckt und die Datensicherung von gestern aktiviert.

Meine Frage ist nun, wie das überhaupt sein kann?
Löscht eine Datenbank einfach Tabellenzeilen, ist das katastrophal.
Warum macht die sowas nach 8 Jahren tadellosen Betriebes?
Und genau ab Tabellenzeile 13000? Wirds jetzt mystisch?

Gruß
Eva

Hallo,

es kommt schon vor, dass eine (access-) DB zerschossen wird. Dass das genau bei Zeile 13000 passiert (ist), halte ich für einen Zufall, wenn der Verlust der Daten tatsächlich nicht durch irgendeinen User-Eingriff provoziert wurde.

Die Ursachen für einen solchen Effekt sind mannigfaltig:

-Netzwerk-Unterbrechnungen
-Rechner-Absturz
-Jet-Engine-Bugs
-Import/Eingabe von „falschen“ Zeichen

Versuch, die Tabelle in einer neuen leeren DB zu importieren.
Wenn die DAten dann wieder voranden sein sollten, kann die alte Tabelle gelöscht und die neue „reimportiert“ werden.

Evtl. vorhandene Beziehungen müssen neu definiert werden.

Viele Grüße vom Bodensee
Franz, DF6GL

Hi Franz
und vielen Dank für deine Antwort :smile:

Daß es eine Datenbank zerschießen kann, war mir klar, doch dachte ich, die ganze DB wäre dann betroffen und man würde das sofort merken.
Daß es aber passieren kann, daß ganz still und heimlich aus einer einzigen der zahlreichen Tabellen einfach so einige Zeilen gelöscht werden, war mir nicht klar.

Ist solch eine Datenbank denn dann eigentlich überhaupt einsetzbar?
Man weiß ja nie, was gerade alles gelöscht wurde.

Ich muß mir also eine Routine einfallen lassen, die bei jedem Start prüft, ob auch alle Tabellen vollständig sind.

Weißt du da vielleicht, ob dieses Problem bereits gelöst wurde?
Eigentlich müßte das doch sogar eine Standard-Routine sein, da es ja schließlich niemandem egal sein kann, wenn der Access-Kobold willkürlich zuschlägt.

Gruß Eva

Hi Eva,

und vielen Dank für deine Antwort :smile:

Daß es eine Datenbank zerschießen kann, war mir klar, doch
dachte ich, die ganze DB wäre dann betroffen und man würde das
sofort merken.

Es gibt halt veschiedene „Schussklassen“ …

Daß es aber passieren kann, daß ganz still und heimlich aus
einer einzigen der zahlreichen Tabellen einfach so einige
Zeilen gelöscht werden, war mir nicht klar.

das sieht nur für Dich so aus, als wäre es so gewollt. Wenn die DB korrumpiert wird, ist nicht vorherzusagen, an welcher Stelle das passiert.

Ist solch eine Datenbank denn dann eigentlich überhaupt
einsetzbar?

Mit Restrisiko ist überall und jederzeit zu rechnen. Es kommt darauf an, welchen Riskolevel man akzeptiert.

Man weiß ja nie, was gerade alles gelöscht wurde.

Tja, da kann Dir niemand helfen…

Ich muß mir also eine Routine einfallen lassen, die bei jedem
Start prüft, ob auch alle Tabellen vollständig sind.

Und wie soll das gehen? Hast Du einen Vergleich?

Weißt du da vielleicht, ob dieses Problem bereits gelöst
wurde?

Das kann man so nicht lösen. Man kann höchsten versuchen, „kaputte“ Daten wieder her zu stellen. Darauf haben sich einige Datenrettungs-Firmen spezialisiert.

Eigentlich müßte das doch sogar eine Standard-Routine sein, da
es ja schließlich niemandem egal sein kann, wenn der
Access-Kobold willkürlich zuschlägt.

Da gibt es keinen Access-Kobold. Das Ganze ist ein Effekt einer nicht vorhandenen 100%-Sicherheit auf allen Ebenen, Hardware und Software.

Du hast aus diesem Grunde (zu Deinem Glück) ja auch ein Backup gemacht…

Hast Du denn mal versucht, die Tabelle wie angegeben zu reparieren?

Und ist es wirklch ein technischer „Fehler“ gewesen, oder hat nicht doch irgendein User Unsinn gebaut?

Viele Grüße vom Bodensee
Franz, DF6GL

Hi Franz,

Hast Du denn mal versucht, die Tabelle wie angegeben zu reparieren?

War nicht nötig, lege ständig DB-Kopien an zwecks Datenrettung.

Und wie soll das gehen? Hast Du einen Vergleich?

Ich könnte doch zB jedesmal beim Schließen der DB automatisch irgendwo reinschreiben lassen, wieviele Datensätze eine jede Tabelle hat.
Dann beim Öffnen der DB könnte ich so abgleichen, ob zwischenzeitlich irgendwelche Datensätze verlorengegangen sind ->und ALARM!!!

Oder mir ist aufgefallen, daß es nur die neuesten Einträge erwischt hat.
Könnte also jedesmal beim Öffnen schauen, ob der neueste Eintrag das gestrige Datum enthält.

Gruß Eva
komme übrigens aus Singen/Hohentwiel :smile:

Hallo Eva,

meist besteht eine Datenbank aus drei unterschiedlichen Dateien:

In einer Datei ist das Schema, die Beschreibung der Datenbank, der Felder usw. abgelegt.

In einer zweiten Datei befinden sich die Indizes, die Schlüssel.

In der dritten und größten Datei die eigentlichen Daten(sätze).

Dieses Struktur hat diverse Vorteile, da man z.B. bei einer defekten Index-Datei diese wieder auf Grundlage der Daten aufbauen kann,

Access geht (zumindest bis vor einigen Jahren: Mein letzter Kontakt mit Access) einen anderen Weg und ist - so MEINE Erfahrung - nicht so stabil wie die klassischen relationalen Datenbank-Systeme.

Zu:

„Daß es aber passieren kann, daß ganz still und heimlich aus einer einzigen der zahlreichen Tabellen einfach so einige Zeilen gelöscht werden, war mir nicht klar.“

Es ist überhaupt nicht sicher, daß irgendwelche Daten gelöscht sind. Stelle dir einem Aktemordner oder in ein wissenschaftlichen Buch vor. Die Einträge fehlem im Index, im "Inhaltsverzeichnis. Die einzelnen Seiten mit dem Text sind aber noch da, werden aber auf Grund des defekten Inhaltsverzeichnisses nicht gefunden.

Über die Reparaturmechanismen der aktuellen Access-Versionen werden dir sicherlich die echten Access-Experten mehr sagen können.

Grüße

godam

Dank dir godam,
so tief bin ich nie in die Datenbankstrukturen eingestiegen.

Es geht mir gar nicht um Reparaturmechanismen, da ich eh ständig Kopien anlege. Mein Problem liegt darin, daß irgendwann einmal wieder Datensätze „verschwinden“ könnten, keiner das merkt und munter mit der DB weitergearbeitet wird.

Aufgrund der verschwundenen Datensätze werden vielleicht Waren geordert, Kunden angemahnt, fehlerhafte Rechnungen versendet, usw.
Stellt man dann irgendwann mal fest, daß da alles falsch lief, ist das Kind schon längst im Brunnen ersoffen, ohweh!

Gruß Eva

HAllo,

natürlich besteht „Access“ (die Tabellenstruktur der Jet-Engine) nicht nur aus den sichtbaren User-Tabellen. Es stimmt, dass es weitere Systemtabellen gibt. die diverse „Einstellungen“ der User-Tabellen speichern.

Aber diese Tabellen kann man lediglich teilweise lesen, aber nicht ändern/korrigieren. Einzige (user-relevante) Möglichkeit ist, „Reparieren/Komprimieren“ auszuführen, und danach, machmal auch vorher(!) , die Tabelle oder gleich die gesamte DB in eine neue leere DB zu importieren.

Dadurch werden die Strukturen neu geschrieben, was eben zu einer „Reparatur“ führt, falls die überhaupt mit diesem Mittel möglich ist.

Außerdem ist auf die Installation der neuesetn Updates bezgl. Office und der Jet-Engine zu achten.

Der beobachtete Effekt jedenfalls kann nicht durch irgendwelche user-bezogene Maßnahmen abgefangen werden, selbst dann nicht, wenn durch einen Vergleich mit der Anzahl DS ein „Löschen“ bemerkt werden würde, das dann eh nicht mehr rückgängig gemacht werden kann.

Ich glaube immer noch nicht, dass es ein wirklicher Access-Fehler ist. Ich würde zunächst akribisch nach Bedienungsfehler suchen UND nach fehlerhaften Programm_Code (bzw. Makros) .

Schade , dass der Import der fehlerhaften Tabelle nicht durchgeführt wurde. Man hätte (möglicherweise) dann auf einen wirklichen Defekt an der Tabelle schliessen können.

Viele Grüße vom Bodensee
Franz, DF6GL

Hallo,

Dank dir godam,
so tief bin ich nie in die Datenbankstrukturen eingestiegen.

Es geht mir gar nicht um Reparaturmechanismen, da ich eh
ständig Kopien anlege. Mein Problem liegt darin, daß
irgendwann einmal wieder Datensätze „verschwinden“ könnten,
keiner das merkt und munter mit der DB weitergearbeitet wird.

Aufgrund der verschwundenen Datensätze werden vielleicht Waren
geordert, Kunden angemahnt, fehlerhafte Rechnungen versendet,
usw.
Stellt man dann irgendwann mal fest, daß da alles falsch lief,
ist das Kind schon längst im Brunnen ersoffen, ohweh!

Einige Fragen hätte ich noch:

Ist die Db in Frontend/Backend aufgeteilt?
Ist die DB im Multiuser-Betrieb?
Hat jeder User in diesem Fall sein eigenes Frontend?
Wie groß ist (bzw. sind) die Datei(en)?

Viele Grüße vom Bodensee
Franz, DF6GL

Also ich glaub auch weniger, das daten einfach so verschwinden ohne das es access auffält. Ich würd auch sagen , das liegt am anwender , programm geschlossen, server ausgemacht wärend gerade gewerkelt wird.

Wer sagt denn das nicht einer selber eine backup zurückgespielt hat, klinkt doch schon komisch, das nur die neuesten datensätze weg sind ?

Hallo,

naja, sehr wahrscheinlich passiert während der Abschaltphase von Access eh nix… Der Fehler (oder was auch immer) passiert, wenn Access aktiv (gestartet) ist.

PS: wenn ich zum Fenster rausgucke , seh ich den Hohentwiel…

Viele Grüße vom Bodensee
Franz, DF6GL

Hi Thomas,

das liegt am anwender , programm geschlossen, server ausgemacht wärend gerade gewerkelt wird … Wer sagt denn das nicht einer selber eine backup zurückgespielt hat

Ich selbst sage das. Das hätte dann nämlich ich sein müssen, weil ich als einzige dran saß.
Außerdem sind alle anderen Tabellen tadellos geblieben mit allen Datensätzen. Nur in einer einzigen Tabelle sind Datensätze verschwunden. Und in dieser Tabelle wurde dabei nicht gewerkelt, diese wurde nicht verwendet weder aktiv noch passiv in irgendeiner Form darauf zugegriffen.

In diese Tabelle werden täglich Datensätze hineingeschrieben. Und verschwunden sind eben komischerweise alle Datensätze größer 13000. Der Datensatz 13000 hat das Datum 14.07.2011 - alle Datensätze von da ab bis zum 27.10.2011 sind verschwunden.

Also ich glaub auch weniger, das daten einfach so verschwinden ohne das es access auffält.

Ist schon irre. Wenn so etwas normal ist, wie soll man denn dann ruhigen Gewissens mit einer MS-Access-DB arbeiten?

Gruß Eva

Hi, ich versuche mal mein bestes:

Ist die Db in Frontend/Backend aufgeteilt?

Ohweh, ich denkmal: schon. Ist halt eine normal MS-Access-DB.
Mit Tabellen, Formularen, Berichten … und jeder Menge VB-Code

Ist die DB im Multiuser-Betrieb?

Ja. Bis zu drei Leute von drei Computern, im Windows7-Netzwerk verbunden.

Hat jeder User in diesem Fall sein eigenes Frontend?

Eigentlich doch schon oder nicht? Kommt drauf an, wie man Frontend definiert. Jeder hat natürlich an seinem Computer seine eigenen Eingabeformulare.

Wie groß ist (bzw. sind) die Datei(en)?

Wo steht das? Die gesamte DB hat 17 MB

Ich glaube immer noch nicht, dass es ein wirklicher Access-Fehler ist. Ich würde zunächst akribisch nach Bedienungsfehler suchen UND nach fehlerhaften Programm_Code (bzw. Makros).

Einen Bedienungsfehler schließe ich aus, da ich selbst dransaß :smile:
Fehlerhafter Code? Nach 8 Jahren tadellosen Arbeitens?
Die betroffene Tabelle wurde nicht verwendet weder aktiv noch passiv in irgendeiner Form darauf zugegriffen. In diese Tabelle werden täglich Datensätze hineingeschrieben. Und verschwunden sind eben komischerweise alle Datensätze größer 13000. Der Datensatz 13000 hat das Datum 14.07.2011 - alle Datensätze von da ab bis zum 27.10.2011 sind verschwunden.
Welcher Fehler welchen Codes könnte sowas machen?
(Makros gibts keine)

Gruß Eva

Gruß Eva

HAllo Eva,

naja, irgendwie widersprichst Du Dir ein bisschen:

Und in dieser Tabelle wurde dabei nicht gewerkelt, diese wurde nicht verwendet weder aktiv noch passiv in irgendeiner Form darauf zugegriffen.

In diese Tabelle werden täglich Datensätze hineingeschrieben. 


Woher weißt Du, dass nach dem 14.07.2011 überhaupt noch Datensätze in die Tabelle geschrieben wurden? 
Wurden solche definitiv mal angesehen/angezeigt? 
Wann hat wer als erstes bemerkt, dass Einträge fehlen?


Die Antwort auf die Fragen nach der Größe und Aufteilung der Db fehlt mir allerdings noch.

Wenn eine DB-Datei an die Grenze von 2GB hinanreicht, wird es allerdings tatsächlich kritisch mit der Zuverlässigkeit der Datenhaltung. 



Aller Unkerei zum Trotz müßte man erst mal den Sachverhalt feststellen, bevor man irgendwas oder irgenwen verdächtigt. Ich betriebe schon lange viele , auch komplexe Acces-Datenbanken, und da ist mir ein solcher Effekt wie Du ihn beschreibst, noch nicht untergekommen. Wohl gab es Abstürze und zerschossenen Tabellen, aber nicht in der von Dir beschrieben Form. (Heißt zwar nicht viel, läßt aber eine Nicht-Access-bezogene Manipulation an den Daten vermuten).

Wie auch immer, wenn Du die betroffene Tabelle nicht mehr hast, wird man vermutlich nicht mehr hinter den eigentlichen Grund kommen können.


Viele Grüße vom Bodensee
Franz, DF6GL

Hallo,

Hi, ich versuche mal mein bestes:

na, denn :smile:

(Habe im anderen Thread schon vor diesem hier geantwortet)

Ist die Db in Frontend/Backend aufgeteilt?

Ohweh, ich denkmal: schon.

Was heißt das? ist sie es oder nicht?
Frontend: Alle Objekte außer den Tabellen, aber mit Verknüpfung zu den Tabellen, die sich im Backend befinden.
Backend: separate MDB-Datei, in der sich NUR die Tabellen und deren Beziehungsdefinitionen befinden.

Ist halt eine normal MS-Access-DB.

Mit Tabellen, Formularen, Berichten … und jeder Menge
VB-Code

Wenn das alles in EINER MDB-Datei ist, ist die DB NICHT aufgeteilt.

Ist die DB im Multiuser-Betrieb?

Ja. Bis zu drei Leute von drei Computern, im Windows7-Netzwerk
verbunden.

Dann öffnen die User die Anwendung, in dem sie auf die gleiche MDB-Datei im Netzwerk doppelklicken??

Hat jeder User in diesem Fall sein eigenes Frontend?

Eigentlich doch schon oder nicht?

Definitiv NEIN, wenn Deine o. g. Aussage zutrifft.

Kommt drauf an, wie man

Frontend definiert.

siehe oben.

Jeder hat natürlich an seinem Computer

seine eigenen Eingabeformulare.

Naja, das sagt nur, dass die Anwendung auf seinem PC gestartet wurde. Die Formulare an ALLEN User-PCs werden aber aus der SELBEN MDB-Datei im Netzwerk geladen.

Wie groß ist (bzw. sind) die Datei(en)?

Wo steht das? Die gesamte DB hat 17 MB

OK, das ist jenseits aller Größengefahr…

Ich glaube immer noch nicht, dass es ein wirklicher Access-Fehler ist. Ich würde zunächst akribisch nach Bedienungsfehler suchen UND nach fehlerhaften Programm_Code (bzw. Makros).

Einen Bedienungsfehler schließe ich aus, da ich selbst dransaß

)

Na, Du hast ja starkes Selbstbewußtsein… :wink:

Fehlerhafter Code? Nach 8 Jahren tadellosen Arbeitens?

Tja, das sagt nix, es gibt immer ein erstes Mal…

Die betroffene Tabelle wurde nicht verwendet weder aktiv noch
passiv in irgendeiner Form darauf zugegriffen. In diese
Tabelle werden täglich Datensätze hineingeschrieben.

Wie im anderen Thread auch gesagt: das ist ein Widerspruch…

Und verschwunden sind eben komischerweise alle Datensätze größer
13000. Der Datensatz 13000 hat das Datum 14.07.2011 - alle
Datensätze von da ab bis zum 27.10.2011 sind verschwunden.
Welcher Fehler welchen Codes könnte sowas machen?
(Makros gibts keine)

Solcher:

Delete * from tblTabelle where Datum > #07/14/2011#

oder ein User hat aus Versehen (ich unterstelle keine böse Absichten), die Datensätze in der Tabellenansicht (oder sonstiger Anzeigemethode) markiert und die Taste Entf. gedrückt.

Insgesamt glaube ich jetzt, dass ein untragbares Risiko in der Netzwerk-Verwendung einer nicht aufgeteilten Datenbankanwendung vorliegt , auch wenn das Ding schon ein paar Jahre fehlerfrei läuft. Jetzt ist halt mal der Worst-Case eingetreten, dass solcher DB-Betrieb fehlerträchtig ist. (Meine Vermutung zur Fehlerursache konzentriert sich nach diesen neuen Erkenntnissen auf genau diese Tatsache der nicht aufgeteilten DB.)

Mein Rat: DRINGENDS die Db aufteilen in FE und BE. Es gibt dazu sogar einen Assistenten. Weiterhin MÜSSEN alle User das FE lokal auf deren PC kopiert bekommen, das sie zum Starten der Anwendung benutzen müssen. Dabei ist zu berücksichtigen, dass das BE von jedem User-PC aus gesehen auf dem selben Netzwerk-Pfad zu liegen kommt (Netzlaufwerke gleicherweise mappen oder UNC-Pfadnamen verwenden), damit die Tabellenverknüpfungen zum BE nicht bei jedem User anders aussehen und bei jedem Austausch des FE neu und individuell verlinkt werden müssen. Das Netzwerkverzeichnis, in dem das BE liegt, MUSS zudem ALLE Datei-Zugriffsrechte für die einzelnen User bereitstellen/aufweisen.

Viele Grüße vom Bodensee
Franz, DF6GL

Hi Franz,

Wie im anderen Thread auch gesagt: das ist ein Widerspruch…

In diese Tabelle werden zwar täglich Datensätze hineingeschrieben, jedoch erst am Nachmittag - nicht morgens.

Delete * from tblTabelle where Datum > #07/14/2011#

Ja, genau das ist passiert - aber von alleine ohne das es einen solchen Befehl überhaupt geben würde. Kann das sicher sagen, da ich allein im Büro saß. Bemerkt habe ich den Fehler sofort morgens nach dem Öffnen und da die Abendsicherung vollständig war, muß dies also beim Öffnen der DB geschehen sein.

Doch dein Tipp mit Aufteilen in FE und BE trifft es.
Male mir das Geschehen jetzt mit meinem gefährlichen Halbwissen so aus: Habe die DB vom Zweit-Rechner aus geöffnet. Da die nicht aufgeteilt ist, schiebt es ja auch die Tabellen rüber. Dabei ist ein Fehler aufgetreten, durch den die Datensätze ab 13000 nicht mit rüber kamen und als ich die DB am Zweit-Rechner wieder schloß, waren diese dann natürlich weg.

Deshalb ist

Mein Rat: DRINGENDS die Db aufteilen in FE und BE

absolut richtig! Niemals eine unaufgeteilte DB im Netzwerk benützen.
Werde das postwendend umsetzen, ist ja nicht allzu schwer.

Vielen Dank für all die Hilfe hier. Ich kenne kein anderes Forum, wo einem bei praktischen Problemen egal welcher Art so toll geholfen wird. Hoffe, daß auch ich einmal hier jemandem weiterhelfen kann :smile:

Viele Grüße an den Bodensee
Eva

Das hat ich ja schon gesagt :

programm geschlossen, server ausgemacht wärend gerade gewerkelt wird.

Danke für das konkrete Ablaufsbeispiel . Das werde ich doch glatt verwerten :smile:

viel spass noch bei der Arbeit (Fass an die Nase :smile: