怎样解决 SVN 中 “database disk image is malformed” 错误
在使用 SVN(Subversion)时,可能会遇到一个常见错误:svn: E200030: database disk image is malformed。这个错误通常出现在工作副本的数据库文件(.svn/wc.db)破坏时。此问题可能由于磁盘故障、客户端崩溃或其他缘故原由引起,导致 SVN 无法正常操作或更新代码。下面我们介绍两种常见的解决方案。
**在操作之前,务必备份 .svn/wc.db 文件,以防数据丢失**
一、最简单的方法:复制其他人的 .svn/wc.db 文件进行更换
如果你有其他同事的工作副本,可以实验最简单的方式:直接复制他们的 .svn/wc.db 文件,更换你当前工作副本中的 .svn/wc.db 文件。操作步骤如下:
- 找到其他正常的 .svn/wc.db 文件。
- 备份你当前的 .svn/wc.db 文件。
- 将其他人的 .svn/wc.db 文件复制到你的工作副本中。
这种方法适用于工作副本中的 .svn/wc.db 文件破坏,但你的当地代码更改没有被破坏的环境。如果有改动需要保留,发起先备份文件并考虑其他修复方法。
二、使用 SQLite3 修复数据库
如果你没有可用的 .svn/wc.db 文件或更复杂的破坏环境,你可以使用 SQLite3 工具来修复破坏的数据库。类 Unix 体系(如 macOS)通常会自带 SQLite3,而 Windows 体系则需要先下载 SQLite3。
操作步骤:
- 备份 .svn/wc.db 文件
在操作之前,务必备份 .svn/wc.db 文件,以防数据丢失。
- 进入 .svn 目录
打开下令行终端,进入项目的 .svn 文件夹。
- cd /path/to/your/project/.svn
复制代码 - 运行 SQLite3 下令进行修复
使用 SQLite3 进行数据库完备性检查和重新索引。
- 完备性检查:
- sqlite3 wc.db "pragma integrity_check"
复制代码 - 重新索引节点(nodes)和原始文件(pristine):
- sqlite3 wc.db "reindex nodes"
- sqlite3 wc.db "reindex pristine"
复制代码 通常,这一步操作完成后,问题就会得到解决。如果问题仍未解决,可以进一步排查数据库布局。
- 进一步排盘问题
如果上述步骤没有解决问题,可以使用以下 SQL 查询来检查数据库表的布局和内容:
- 检查 NODES 表的 SQL 语句:
- sqlite3 wc.db "select sql from sqlite_master where name='NODES'"
复制代码 - 检查 I_NODES_PARENT 索引的 SQL 语句:
- sqlite3 wc.db "select sql from sqlite_master where name='I_NODES_PARENT'"
复制代码
- 修复 NODES 表
如果数据库布局确实有问题,你可以通过以下步骤修复 NODES 表。
- 创建 NODES_COPY 表:
- sqlite3 wc.db "CREATE TABLE NODES_COPY (
- wc_id INTEGER NOT NULL REFERENCES WCROOT (id),
- local_relpath TEXT NOT NULL,
- op_depth INTEGER NOT NULL,
- parent_relpath TEXT,
- repos_id INTEGER REFERENCES REPOSITORY (id),
- repos_path TEXT,
- revision INTEGER,
- presence TEXT NOT NULL,
- moved_here INTEGER,
- moved_to TEXT,
- kind TEXT NOT NULL,
- properties BLOB,
- depth TEXT,
- checksum TEXT REFERENCES PRISTINE (checksum),
- symlink_target TEXT,
- changed_revision INTEGER,
- changed_date INTEGER,
- changed_author TEXT,
- translated_size INTEGER,
- last_mod_time INTEGER,
- dav_cache BLOB,
- file_external TEXT,
- PRIMARY KEY (wc_id, local_relpath, op_depth)
- )"
复制代码 - 将 NODES 表的内容复制到 NODES_COPY:
- sqlite3 wc.db "insert into NODES_COPY select * from NODES"
复制代码 - 删除 NODES 表:
- sqlite3 wc.db "drop table NODES"
复制代码 - 重新创建 NODES 表:
- sqlite3 wc.db "CREATE TABLE NODES (
- wc_id INTEGER NOT NULL REFERENCES WCROOT (id),
- local_relpath TEXT NOT NULL,
- op_depth INTEGER NOT NULL,
- parent_relpath TEXT,
- repos_id INTEGER REFERENCES REPOSITORY (id),
- repos_path TEXT,
- revision INTEGER,
- presence TEXT NOT NULL,
- moved_here INTEGER,
- moved_to TEXT,
- kind TEXT NOT NULL,
- properties BLOB,
- depth TEXT,
- checksum TEXT REFERENCES PRISTINE (checksum),
- symlink_target TEXT,
- changed_revision INTEGER,
- changed_date INTEGER,
- changed_author TEXT,
- translated_size INTEGER,
- last_mod_time INTEGER,
- dav_cache BLOB,
- file_external TEXT,
- PRIMARY KEY (wc_id, local_relpath, op_depth)
- )"
复制代码 - 创建索引:
- sqlite3 wc.db "create index I_NODES_PARENT on NODES (wc_id, parent_relpath, op_depth)"
复制代码 - 将 NODES_COPY 的内容复制回 NODES 表:
- sqlite3 wc.db "insert into NODES select * from NODES_COPY"
复制代码 - 删除临时表 NODES_COPY:
- sqlite3 wc.db "drop table NODES_COPY"
复制代码
- 修复 PRISTINE 表
类似地,你还需要修复 PRISTINE 表。以下是相应的操作步骤:
- 检查 PRISTINE 表:
- sqlite3 wc.db "select sql from sqlite_master where name='PRISTINE'"
复制代码 - 创建 PRISTINE_COPY 表并复制数据:
- sqlite3 wc.db "CREATE TABLE PRISTINE_COPY (...)" # 创建结构类似于 NODES_COPY
- sqlite3 wc.db "insert into PRISTINE_COPY select * from PRISTINE"
复制代码 - 删除 PRISTINE 表并重新创建:
- sqlite3 wc.db "drop table PRISTINE"
- sqlite3 wc.db "CREATE TABLE PRISTINE (...)" # 创建与原表相同的表结构
复制代码 - 将 PRISTINE_COPY 的内容复制回 PRISTINE:
- sqlite3 wc.db "insert into PRISTINE select * from PRISTINE_COPY"
复制代码 - 删除临时表 PRISTINE_COPY:
- sqlite3 wc.db "drop table PRISTINE_COPY"
复制代码
结语
通过以上两种方法,你应该能够解决 SVN 中遇到的 database disk image is malformed 错误。如果这些方法都没有解决问题,可能需要考虑重新检出代码或进一步检查磁盘和硬件问题。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |