【怎样解决 SVN 中 “database disk image is malformed“ 错误】 ...

打印 上一主题 下一主题

主题 994|帖子 994|积分 2982

怎样解决 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 文件夹。
    1. cd /path/to/your/project/.svn
    复制代码
  • 运行 SQLite3 下令进行修复
    使用 SQLite3 进行数据库完备性检查和重新索引。

    • 完备性检查:
      1. sqlite3 wc.db "pragma integrity_check"
      复制代码
    • 重新索引节点(nodes)和原始文件(pristine):
      1. sqlite3 wc.db "reindex nodes"
      2. sqlite3 wc.db "reindex pristine"
      复制代码
    通常,这一步操作完成后,问题就会得到解决。如果问题仍未解决,可以进一步排查数据库布局。

  • 进一步排盘问题
    如果上述步骤没有解决问题,可以使用以下 SQL 查询来检查数据库表的布局和内容:

    • 检查 NODES 表的 SQL 语句:
      1. sqlite3 wc.db "select sql from sqlite_master where name='NODES'"
      复制代码
    • 检查 I_NODES_PARENT 索引的 SQL 语句:
      1. sqlite3 wc.db "select sql from sqlite_master where name='I_NODES_PARENT'"
      复制代码

  • 修复 NODES 表
    如果数据库布局确实有问题,你可以通过以下步骤修复 NODES 表。

    • 创建 NODES_COPY 表
      1. sqlite3 wc.db "CREATE TABLE NODES_COPY (
      2.     wc_id INTEGER NOT NULL REFERENCES WCROOT (id),
      3.     local_relpath TEXT NOT NULL,
      4.     op_depth INTEGER NOT NULL,
      5.     parent_relpath TEXT,
      6.     repos_id INTEGER REFERENCES REPOSITORY (id),
      7.     repos_path TEXT,
      8.     revision INTEGER,
      9.     presence TEXT NOT NULL,
      10.     moved_here INTEGER,
      11.     moved_to TEXT,
      12.     kind TEXT NOT NULL,
      13.     properties BLOB,
      14.     depth TEXT,
      15.     checksum TEXT REFERENCES PRISTINE (checksum),
      16.     symlink_target TEXT,
      17.     changed_revision INTEGER,
      18.     changed_date INTEGER,
      19.     changed_author TEXT,
      20.     translated_size INTEGER,
      21.     last_mod_time INTEGER,
      22.     dav_cache BLOB,
      23.     file_external TEXT,
      24.     PRIMARY KEY (wc_id, local_relpath, op_depth)
      25. )"
      复制代码
    • 将 NODES 表的内容复制到 NODES_COPY:
      1. sqlite3 wc.db "insert into NODES_COPY select * from NODES"
      复制代码
    • 删除 NODES 表:
      1. sqlite3 wc.db "drop table NODES"
      复制代码
    • 重新创建 NODES 表:
      1. sqlite3 wc.db "CREATE TABLE NODES (
      2.     wc_id INTEGER NOT NULL REFERENCES WCROOT (id),
      3.     local_relpath TEXT NOT NULL,
      4.     op_depth INTEGER NOT NULL,
      5.     parent_relpath TEXT,
      6.     repos_id INTEGER REFERENCES REPOSITORY (id),
      7.     repos_path TEXT,
      8.     revision INTEGER,
      9.     presence TEXT NOT NULL,
      10.     moved_here INTEGER,
      11.     moved_to TEXT,
      12.     kind TEXT NOT NULL,
      13.     properties BLOB,
      14.     depth TEXT,
      15.     checksum TEXT REFERENCES PRISTINE (checksum),
      16.     symlink_target TEXT,
      17.     changed_revision INTEGER,
      18.     changed_date INTEGER,
      19.     changed_author TEXT,
      20.     translated_size INTEGER,
      21.     last_mod_time INTEGER,
      22.     dav_cache BLOB,
      23.     file_external TEXT,
      24.     PRIMARY KEY (wc_id, local_relpath, op_depth)
      25. )"
      复制代码
    • 创建索引:
      1. sqlite3 wc.db "create index I_NODES_PARENT on NODES (wc_id, parent_relpath, op_depth)"
      复制代码
    • 将 NODES_COPY 的内容复制回 NODES 表:
      1. sqlite3 wc.db "insert into NODES select * from NODES_COPY"
      复制代码
    • 删除临时表 NODES_COPY:
      1. sqlite3 wc.db "drop table NODES_COPY"
      复制代码

  • 修复 PRISTINE 表
    类似地,你还需要修复 PRISTINE 表。以下是相应的操作步骤:

    • 检查 PRISTINE 表:
      1. sqlite3 wc.db "select sql from sqlite_master where name='PRISTINE'"
      复制代码
    • 创建 PRISTINE_COPY 表并复制数据:
      1. sqlite3 wc.db "CREATE TABLE PRISTINE_COPY (...)"  # 创建结构类似于 NODES_COPY
      2. sqlite3 wc.db "insert into PRISTINE_COPY select * from PRISTINE"
      复制代码
    • 删除 PRISTINE 表并重新创建:
      1. sqlite3 wc.db "drop table PRISTINE"
      2. sqlite3 wc.db "CREATE TABLE PRISTINE (...)"  # 创建与原表相同的表结构
      复制代码
    • 将 PRISTINE_COPY 的内容复制回 PRISTINE:
      1. sqlite3 wc.db "insert into PRISTINE select * from PRISTINE_COPY"
      复制代码
    • 删除临时表 PRISTINE_COPY:
      1. sqlite3 wc.db "drop table PRISTINE_COPY"
      复制代码

结语

通过以上两种方法,你应该能够解决 SVN 中遇到的 database disk image is malformed 错误。如果这些方法都没有解决问题,可能需要考虑重新检出代码或进一步检查磁盘和硬件问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表