Fix it now
The database engine read the front of the file and did not find something it recognises as a database. That is a header problem rather than a data problem, so the tables inside are often intact. Work on a copy, repair the copy, then import the objects into a fresh container and use that from now on.
- Copy the file somewhere local and work only on the copy. Never troubleshoot the original, and never let a repair run against the only copy you have.
- Look beside the database for a lock file with the same name and a .laccdb or .ldb extension. If nobody has the database open, delete it.
- Start Access with no database open and run Compact and Repair against the copy, from the Database Tools group on the ribbon.
- Whether or not that succeeds, create a new blank database and import the objects into it: External Data, New Data Source, From Database, Access, then select the tables, queries, forms and reports in groups.
- If the import cannot see the objects either, stop and restore from your most recent backup. Everything after that point is guesswork with your data.
- Once you have a working file, move it off whatever it was living on. An Access database belongs on a file share or a local disk, never inside a folder a cloud client is synchronising.
Check the file size before you spend an hour on it. A database of a few kilobytes is a download that never finished, and no repair recovers data that was never written.
If the recovered file opens and the record counts look right, take a backup and stop here. The next section explains what the engine objects to and why the same database keeps doing it.
Why it happens
Microsoft publishes no error-number reference for the Access database engine, so treat 3343 and its companions as labels rather than as defined meanings – the article’s own codes table says so for each of them. What the number tells you is where the engine stopped: at the front of the file, before it got as far as your data. An Access file starts with a header identifying the format, followed by a catalogue describing every object in it, and both are read before anything else happens. If the header bytes are not what the engine expects, or the catalogue points at pages that do not hold what it was told they hold, it stops there and says the format is unrecognised.
It cannot tell you why, because at that point it genuinely does not know. A truncated file, a file written by a newer engine, a file that is not a database at all, and a file whose first pages were overwritten all look identical from where the engine is standing. That is worth holding on to, because it stops you reading the message as a verdict on your data.
The most common physical cause is a write that did not complete. Access holds pages open and writes them incrementally, so the link between the client and the file matters far more than it does for a document. A database on wireless, on a VPN, or inside a consumer file-sync folder is exposed to exactly this. Sync clients are the worst of it, because they upload a file that is still being written and can put a half-written version back over a good one.
An interrupted write damaged the file
You have this one if The database was in use over a network, a VPN or a sync folder when a client dropped, and it opened normally before that.
- Work on a copy and remove any stale lock file first.
- Run Compact and Repair against the copy.
- If the repair succeeds, still import everything into a new blank database and use that going forward, rather than trusting the repaired file.
- Move the database out of any synchronised folder permanently.
The file is newer than the engine opening it
You have this one if It opens on the machine that created it and fails on an older installation, with no history of network trouble.
- Establish which version created the file and which version is failing to open it.
- On the machine where it does open, use File > Save As and choose an older database format.
- Check for column types the older engine does not support and change them before saving down.
- Standardise the estate on one version rather than maintaining two formats indefinitely.
The file has been inflating for years
You have this one if A database that grows steadily, especially one where large numbers of records are added and deleted, and errors that arrive more often as it grows.
- Check the file size against how much data is actually in it. Deleted records leave space behind that only a compact reclaims.
- Compact and repair on a schedule rather than when something breaks.
- Split the database into a front-end and a back-end so the interface objects do not share the data file’s budget.
- If the data genuinely is that large, move the tables to SQL Server and keep Access as the front-end.
The VBA project rather than the data is damaged
You have this one if The data is readable but the application misbehaves, the file grows unpredictably, and errors differ between machines.
- Take a copy, then force the compiled VBA to be discarded and rebuilt from source.
- In the Visual Basic editor use Debug > Compile to rebuild the project cleanly and read the first error it stops on.
- Compact and repair afterwards to reclaim the space the old compiled code occupied.
- Import the objects into a new blank database if the project still misbehaves.
Full reference
What none of these codes are
Microsoft does not publish a meaning for 3343, 3049, 3011 or 3024. Pages that give you a confident one-line definition are repeating each other rather than the vendor. Describing them by what they stop you doing is honest and is enough to work with, and it keeps you from building a theory on a number somebody made up.
Recovering objects into a clean container
- Create a new blank database of the same format.
- Import in this order: tables first, then queries, then forms, then reports, then macros and modules.
- Import in small groups rather than all at once, so a failure tells you which object caused it.
- Skip any object that fails the import and note it; you can often rebuild one form faster than you can rescue it.
- Re-create relationships and indexes, and check them against the original design before anyone uses the result.
- Compact the new file, back it up, and only then let people work in it.
Why the same database keeps corrupting
- It is unsplit and several people open it at once, so every user’s session is writing to the same file.
- It lives in a synchronised folder, where a client uploads partial writes and can restore an old version over a newer one.
- It is reached over a VPN or wireless link that drops, which interrupts writes mid-page.
- Nobody compacts it, so it grows until it is slow enough to make a dropped session likely.
- There is no backup, which is not a cause of corruption but is what turns it into a disaster.
Splitting, and why it is not optional for shared databases
In a split design the tables live in one back-end file on a share, and every user runs their own local copy of the front-end holding the forms, reports and code. Only data crosses the network, each user’s interface objects are their own, and a client that drops takes far less with it. It also makes upgrades possible: you replace one front-end without touching anybody’s data. Any database more than one person opens should be split, and one that has already corrupted twice should be split this week.
Compact and repair rewrites the file in place. If it fails part way through you can be left with less than you started with, so run it against a copy and keep the original untouched until you have a result you trust.
Every code this article covers
| Code | What it points at | Source |
|---|---|---|
3343 |
The engine did not recognise the start of the file as a database format it can open | not published by the vendor |
3049 |
The engine cannot open the database, reporting it as damaged or beyond a format limit | not published by the vendor |
3011 |
The engine could not find an object it was asked for by name | not published by the vendor |
3024 |
A file the database depends on, typically a back-end it links to, could not be found | not published by the vendor |
Confirm the fix worked
- Open the recovered database and confirm every table, query, form and report is present.
- Compare record counts in the main tables against the last known good figures, not against what looks plausible.
- Run compact and repair once more and confirm it completes without an error.
- Open each form that writes data and save one test record through it.
- Take a backup of the recovered file before anyone else is let near it.
Questions people ask about this
Do I need to buy recovery software?
Usually not, and it costs nothing to try Access’s own tools first. Compact and repair followed by an import into a new database recovers most files that are recoverable. Third-party recovery is a last resort for a database with no backup, and nothing in Arco’s licence range makes a damaged file readable.
Why does this keep happening to the same database?
Because nothing about its situation has changed. An unsplit database on a share, used by several people over an unreliable link or held in a sync folder, will keep corrupting. Split it, host the back-end on a proper file share, and get it out of any sync client.
Is splitting really necessary?
For any multi-user database, yes. Each user runs their own copy of the forms, reports and code, only the data file is shared, and both corruption and network traffic drop substantially. It also means you can update the application without touching anyone’s data.
Can I recover just one table?
Often. The import route lets you pick individual objects, so you can pull the tables that matter even when forms or code are unrecoverable. Import the tables first and rebuild the interface afterwards if you have to.
Is 3343 definitely a corruption error?
It is a recognition error, which is not the same thing. Microsoft publishes no meaning for the number, and a file that is simply newer than your engine, or a download that never finished, produces it just as readily as real damage. Check the file size and the versions involved before you assume the worst.
