恢复Berkeley DB数据库
你的版本库没有坏掉,数据也没有丢失。当你的进程直接访问版本库(mod_dav_svn、svnlook、svnadmin,或通过‘file://’)的时候,进程将直接通过Berkeley DB来访问版本库。Berkekey DB包含日志系统,也就是说所有的操作在执行前都被记录在日志中。当你的进程崩溃(Control-C,或段错误),遗留下文件锁,它记录了所有未完成操作的信息。此时所有试图访问数据库的进程将因为要访问文件锁而被挂起。要想解除文件锁,你可以调用Berkeley DB来完成所有未完成的操作或者回退到前一个正常状态。
警告:当一个进程正在访问版本库,而你又试图恢复版本库的时候,版本库可能会严重损坏。
在你恢复数据库之前,请确保没有其他进程在访问版本库(关闭Apache, 去掉'svn'的执行权限) 。确认你是以数据库所有者及管理员的用户进行操作的,而不是root用户。否则数据库将只能被root用户访问,而其他用户(你自己或Apache)将无法对数据库进行操作。同时,还要确保umask被正确设置,否则其他隶属与可以访问该数据库的组的用户可能无法对数据库进行操作。
执行:
svnadmin recover /path/to/repos
当命令执行完毕, 检查版本库db
目录的访问权限
具体操作如下:
1.停止一切对SVN的访问,apache, svnserve
2.提高db/DB_CONFIG文件中锁设置(set_lk_max_locks、set_lk_max_lockers和set_lk_max_objects)的默认值为2000,我备份后修改为了5000,同样要注意权限
3.恢复SVN repo
4.修改版本库db目录的访问权限
5.启服务
这里版本库db已经成功恢复,我以为服务正常了,当启动了apache后,发现即使输入正确了用户名和密码也不能看到代码分支,返回了160029的状态码
SVN 160029 Could not open the requested SVN filesystem
仔细看了下步骤,发现漏了个重要步骤---修改版本库db目录的访问权限
因为svnadmin recover是用root来执行的,恢复后的数据库的权限及拥有人和组变为了root,apache就没有了访问权限,所以什么都看不到,调整权限(rwx)及拥有人/组后,一切恢复正常,特此小记,供朋友参考下