Firefox IndexedDB:UnknownError:操作失败的原因与数据库本身无关,并且没有被任何其他错误代码覆盖。(错误代码0)

Firefox IndexedDB:UnknownError:操作失败的原因与数据库本身无关,并且没有被任何其他错误代码覆盖。(错误代码0),firefox,indexeddb,Firefox,Indexeddb,我正在尝试将IndexedDB数据库迁移到另一个Firefox实例 我只需将~/.mozilla/firefox/PROFILE/storage/default/file++++…复制到新名称,即可将其迁移到其他站点(或目录,用于文件URL) 我还可以在同一Firefox实例中迁移到不同的配置文件 但是如果我创建一个新的主目录(export home=/tmp/test home)并复制到该目录中,那么Firefox拒绝打开数据库,并给出错误: 未知错误:操作失败的原因与数据库本身无关,并且没有

我正在尝试将IndexedDB数据库迁移到另一个Firefox实例

我只需将
~/.mozilla/firefox/PROFILE/storage/default/file++++…
复制到新名称,即可将其迁移到其他站点(或目录,用于文件URL)

我还可以在同一Firefox实例中迁移到不同的配置文件

但是如果我创建一个新的主目录(
export home=/tmp/test home
)并复制到该目录中,那么Firefox拒绝打开数据库,并给出错误:

未知错误:操作失败的原因与数据库本身无关,并且没有被任何其他错误代码覆盖。(错误代码0))

(我实际上想迁移到一台新机器,但使用相同的机器、用户和FF版本进行测试可以缩小问题的范围)

FF执行哪些测试来决定是否允许打开数据库?我在“数据库”表中看到一个路径为的二进制
.metadata
文件,以及一个路径为的
.sqlite
文件(我尝试手动更新)

我正在用Firefox 40.0.3进行测试


更新:在Javascript控制台中找到:

Security Error: Content at file:///home/.../ may not load data from file:///cache.manifest.
Quota 'idb' is not a valid schema!: QuotaManager.cpp:4932 <unknown>
Quota Origin 'idb' failed to parse, handled tokens: : QuotaManager.cpp:4858 <unknown>
IndexedDB UnknownErr: ActorsParent.cpp:573
安全错误:内容位于file:///home/.../ 可能无法从中加载数据file:///cache.manifest.
配额“idb”不是有效的架构!:QuotaManager.cpp:4932
配额源“idb”无法分析,已处理令牌::QuotaManager.cpp:4858
IndexedDB未知者:ActorsParent.cpp:573

元数据文件提供了旧的来源。Firefox的QuotaManager加载元数据文件,读取旧源代码,并尝试在“idb”目录中扫描旧源代码。此目录不存在,因此将中止。如果元数据文件被删除,Firefox将使用正确的内容重新创建它


另外,确保目标Firefox实例至少与源实例一样新。Firefox 37试图从Firefox 40读取文件时,我也遇到了这个错误。

谢谢你的帖子,这很有帮助。 让我解释一下我在做什么,我想这至少会帮助你理解这个问题。据我所知,隐藏文件.元数据与此问题无关

我正在尝试将sqlite数据库从FFOS2.1移动到FFOS2.6。应用程序使用indexDB,就应用程序所知,没有任何更改(应用程序、代码、应用程序的数据库保持不变)。但是Firefox更改了存储应用程序数据库的数据库模式。此后端存储数据库与应用程序数据库无关

使用sqlite3和.schema命令,我可以解释这些差异:

旧版2.1

CREATE TABLE database (name TEXT PRIMARY KEY, origin TEXT NOT NULL, version INTEGER NOT NULL DEFAULT 0, last_vacuum_time INTEGER NOT NULL DEFAULT 0, last_analyze_time INTEGER NOT NULL DEFAULT 0, last_vacuum_size INTEGER NOT NULL DEFAULT 0) WITHOUT ROWID;
CREATE TABLE index_data( index_id INTEGER NOT NULL, value BLOB NOT NULL, object_data_key BLOB NOT NULL, object_store_id INTEGER NOT NULL, value_locale BLOB, PRIMARY KEY (index_id, value, object_data_key), FOREIGN KEY (index_id) REFERENCES object_store_index(id) , FOREIGN KEY (object_store_id, object_data_key) REFERENCES object_data(object_store_id, key) ) WITHOUT ROWID;
CREATE INDEX index_data_value_locale_index ON index_data (index_id, value_locale, object_data_key, value) WHERE value_locale IS NOT NULL;
CREATE TABLE object_store( id INTEGER PRIMARY KEY, auto_increment INTEGER NOT NULL DEFAULT 0, name TEXT NOT NULL, key_path TEXT);
CREATE TABLE unique_index_data( index_id INTEGER NOT NULL, value BLOB NOT NULL, object_store_id INTEGER NOT NULL, object_data_key BLOB NOT NULL, value_localeBLOB, PRIMARY KEY (index_id, value), FOREIGN KEY (index_id) REFERENCES object_store_index(id) , FOREIGN KEY (object_store_id, object_data_key) REFERENCES object_data(object_store_id, key) ) WITHOUT ROWID;
CREATE INDEX unique_index_data_value_locale_index ON unique_index_data (index_id, value_locale, object_data_key, value) WHERE value_locale IS NOT NULL;
CREATE TABLE file (id INTEGER PRIMARY KEY, refcount INTEGER NOT NULL);
CREATE TRIGGER file_update_trigger AFTER UPDATE ON file FOR EACH ROW WHEN NEW.refcount = 0 BEGIN DELETE FROM file WHERE id = OLD.id; END;
CREATE TABLE object_data ( object_store_id INTEGER NOT NULL, key BLOB NOT NULL, index_data_values BLOB DEFAULT NULL, file_ids TEXT, data BLOB NOT NULL, PRIMARY KEY (object_store_id, key), FOREIGN KEY (object_store_id) REFERENCES object_store(id) ) WITHOUT ROWID;
CREATE TRIGGER object_data_insert_trigger AFTER INSERT ON object_data WHEN NEW.file_ids IS NOT NULL BEGIN SELECT update_refcount(NULL, NEW.file_ids);END;
CREATE TRIGGER object_data_update_trigger AFTER UPDATE OF file_ids ON object_data WHEN OLD.file_ids IS NOT NULL OR NEW.file_ids IS NOT NULL BEGIN SELECT update_refcount(OLD.file_ids, NEW.file_ids);END;
CREATE TRIGGER object_data_delete_trigger AFTER DELETE ON object_data WHEN OLD.file_ids IS NOT NULL BEGIN SELECT update_refcount(OLD.file_ids, NULL);END;
CREATE TABLE object_store_index ( id INTEGER PRIMARY KEY, object_store_id INTEGER NOT NULL, name TEXT NOT NULL, key_path TEXT NOT NULL, unique_index INTEGER NOT NULL, multientry INTEGER NOT NULL, locale TEXT, is_auto_locale BOOLEAN, FOREIGN KEY (object_store_id) REFERENCES object_store(id) );
更新版2.6

CREATE TABLE database (name TEXT NOT NULL, version INTEGER NOT NULL DEFAULT 0);
CREATE TABLE index_data (index_id INTEGER NOT NULL, value BLOB NOT NULL, object_data_key BLOB NOT NULL, object_data_id INTEGER NOT NULL, PRIMARY KEY (index_id,value, object_data_key), FOREIGN KEY (index_id) REFERENCES object_store_index(id) ON DELETE CASCADE, FOREIGN KEY (object_data_id) REFERENCES object_data(id) ONDELETE CASCADE);
CREATE INDEX index_data_object_data_id_index ON index_data (object_data_id);
CREATE TABLE object_store (id INTEGER PRIMARY KEY, auto_increment INTEGER NOT NULL DEFAULT 0, name TEXT NOT NULL, key_path TEXT, UNIQUE (name));
CREATE TABLE unique_index_data (index_id INTEGER NOT NULL, value BLOB NOT NULL, object_data_key BLOB NOT NULL, object_data_id INTEGER NOT NULL, PRIMARY KEY (index_id, value, object_data_key), UNIQUE (index_id, value), FOREIGN KEY (index_id) REFERENCES object_store_index(id) ON DELETE CASCADE FOREIGN KEY (object_data_id) REFERENCES object_data(id) ON DELETE CASCADE);
CREATE INDEX unique_index_data_object_data_id_index ON unique_index_data (object_data_id);
CREATE TABLE file (id INTEGER PRIMARY KEY, refcount INTEGER NOT NULL);
CREATE TRIGGER file_update_trigger AFTER UPDATE ON file FOR EACH ROW WHEN NEW.refcount = 0 BEGIN DELETE FROM file WHERE id = OLD.id; END;
CREATE TABLE object_data (id INTEGER PRIMARY KEY, object_store_id INTEGER NOT NULL, key_value BLOB DEFAULT NULL, file_ids TEXT, data BLOB NOT NULL, UNIQUE (object_store_id, key_value), FOREIGN KEY (object_store_id) REFERENCES object_store(id) ON DELETE CASCADE);
CREATE TRIGGER object_data_insert_trigger AFTER INSERT ON object_data FOR EACH ROW WHEN NEW.file_ids IS NOT NULL BEGIN SELECT update_refcount(NULL, NEW.file_ids); END;
CREATE TRIGGER object_data_update_trigger AFTER UPDATE OF file_ids ON object_data FOR EACH ROW WHEN OLD.file_ids IS NOT NULL OR NEW.file_ids IS NOT NULL BEGIN SELECT update_refcount(OLD.file_ids, NEW.file_ids); END;
CREATE TRIGGER object_data_delete_trigger AFTER DELETE ON object_data FOR EACH ROW WHEN OLD.file_ids IS NOT NULL BEGIN SELECT update_refcount(OLD.file_ids, NULL); END;
CREATE TABLE object_store_index (id INTEGER PRIMARY KEY, object_store_id INTEGER NOT NULL, name TEXT NOT NULL, key_path TEXT NOT NULL, unique_index INTEGER NOTNULL, multientry INTEGER NOT NULL, UNIQUE (object_store_id, name), FOREIGN KEY (object_store_id) REFERENCES object_store(id) ON DELETE CASCADE);
我一直找不到mozilla编写的解决这个问题的脚本。但我怀疑你可能会欺骗firefox为你修复这个问题——降级firefox插入旧数据库,然后升级firefox。允许升级脚本重写数据库


不幸的是,这些更改看起来比简单的添加/列更复杂,因此我怀疑您是否可以安全地更改或升级现有数据库。因此,除非Mozilla有人留下一个脚本,否则我相信没有其他解决方案。

2018年底,我在Firefox 63上遇到了这个错误

IndexedDB: UnknownError: The operation failed for reasons unrelated to the database itself and not covered by any other error code. (error code 0)
它来自于对同一用户配置文件的多次更新

调试器中的localStorage面板为空,键仍然可以访问

拒绝脱机安装,错误为indexedDB


解决方案:然后单击刷新Firefox按钮。

这将删除所有现有IndexedDb数据。