王海鱼 发表于 2025-3-7 00:30:28

【怎样解决 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]
查看完整版本: 【怎样解决 SVN 中 “database disk image is malformed“ 错误】