【怎样解决 SVN 中 “database disk image is malformed“ 错误】
怎样解决 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企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]