Reference Omeka Classic plugin

Archive Format

Name

Archives made by the plugin are named:

omeka-backup-YYYYMMDD-HHMMSS-<32 hexadecimal characters>.zip

The random part keeps the name from being guessed. Uploaded and downloaded archives keep their own name (cleaned), with a date and a short random part added if the name is taken; archives copied into the backup directory keep their name.

Layout

omeka-backup-20261027-020000-3f9a1c7e5b2d8e04a1b2c3d4e5f60718.zip
├── manifest.json    what the archive holds (always present)
├── README.txt       how to restore it by hand
├── database.sql     the site's tables (when the database is included)
├── files/           Omeka's files folder (when files are included)
│   ├── original/
│   ├── fullsize/
│   ├── thumbnails/
│   ├── square_thumbnails/
│   └── theme_uploads/
├── plugins/         plugin folders (when included)
└── themes/          theme folders (when included)

files/ mirrors the stored paths, so it can be copied into Omeka's files folder as it is.

manifest.json

{
    "format": "omeka-classic-backup",
    "format_version": 1,
    "plugin_version": "1.0.0",
    "omeka_version": "3.2.2",
    "php_version": "8.3.12",
    "database_server": "8.0.39",
    "created": "2026-10-27T02:00:00+00:00",
    "site": { "title": "Wrenfield Museum of Art", "url": "https://wrenfield.example.org" },
    "table_prefix": "omeka_",
    "charset": "utf8mb4",
    "contents": { "database": true, "files": true, "code": false },
    "tables": { "items": 49, "files": 49, "element_texts": 571, "…": 0 },
    "files": {
        "storage": "Omeka_Storage_Adapter_Filesystem",
        "count": 206,
        "bytes": 40173820,
        "missing": []
    },
    "plugins": [ { "name": "ExhibitBuilder", "version": "3.7.2", "active": true } ],
    "themes": { "public": "plinth", "admin": "default" }
}

manifest.json identifies the archive: an upload or download without it is refused (and one with an Omeka S Backup metadata.json instead is recognized and refused). tables gives the rows in each table, without the prefix. files.missing lists stored paths that could not be downloaded from cloud storage. site.url is empty for archives made on the command line. An archive with a higher format_version than the plugin knows asks for a plugin update.

database.sql

Written by the plugin through Omeka's database connection, not by mysqldump:

  • a header with the table prefix, server version and time;
  • SET NAMES utf8mb4, SET FOREIGN_KEY_CHECKS = 0 and SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO';
  • for each table with the site's prefix: DROP TABLE IF EXISTS, the CREATE TABLE statement from SHOW CREATE TABLE, then INSERT statements of up to about 1 MB each, with column names. Binary columns are written in hexadecimal.

Left out: the sessions and processes tables and Backup's own backup_archives and backup_restores tables, which belong to the server rather than the site.

Every statement ends with ; at the end of a line, and values are escaped by the database server (newlines included), so the file loads line by line, with the plugin or with the mysql client. Rows are read in pages of 1,000, so memory use stays flat on large tables.

On restore, the plugin renames the tables when the site's prefix differs, and when the dump comes from MySQL 8 and the server does not know its utf8mb4_0900_* collations (MariaDB, MySQL 5.7), it uses utf8mb4_unicode_ci instead.

Checksums

Each archive's SHA-256 checksum is recorded when it is made or added, as sha256:<hex>, and compared again before every restore. Every file inside is also checked against the CRC-32 the ZIP stores for it: when an uploaded, downloaded or copied archive is added, and again before a restore changes anything.

Log in for Support