SVN Berkeley DB Cannot allocate memory解决方案

SVN Berkeley DB Cannot allocate memory

SVN官方文档:

公司的SVN用了大几年,非常老的系统Red Hat Enterprise Linux AS release 4 (Nahant Update 7),一直都没什么问题,平时维护就加下svn账户什么的,今天突然有同事反映连不上,按常理我简单的重启了下,一看可以正常checkout代码,但问题来了,代码库里只剩下最近的分支了,当时就紧张了,就着手排查,从最表面的报错着手Berkeley DB Cannot allocate memory
SVN <wbr>Berkeley <wbr>DB <wbr>Cannot <wbr>allocate <wbr>memory解决方案


SVN <wbr>Berkeley <wbr>DB <wbr>Cannot <wbr>allocate <wbr>memory解决方案

这通常表示Berkeley DB版本库用光了所有数据库锁(FSFS版本库不会出现这种情况)。通常的运行过程中不应该出现这种情况,如果确实出现了,解决办法是用本文中描述的方法来恢复数据库。如果这种情况时常发生,你很可能应该提高db/DB_CONFIG文件中锁设置(set_lk_max_locksset_lk_max_lockersset_lk_max_objects)的默认值。改变已存在的版本库的DB_CONFIG配置后,记得恢复数据库。

恢复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.启服务

SVN <wbr>Berkeley <wbr>DB <wbr>Cannot <wbr>allocate <wbr>memory解决方案

这里版本库db已经成功恢复,我以为服务正常了,当启动了apache后,发现即使输入正确了用户名和密码也不能看到代码分支,返回了160029的状态码

SVN 160029 Could not open the requested SVN filesystem

仔细看了下步骤,发现漏了个重要步骤---修改版本库db目录的访问权限

因为svnadmin recover是用root来执行的,恢复后的数据库的权限及拥有人和组变为了root,apache就没有了访问权限,所以什么都看不到,调整权限(rwx)及拥有人/组后,一切恢复正常,特此小记,供朋友参考下

SVN <wbr>Berkeley <wbr>DB <wbr>Cannot <wbr>allocate <wbr>memory解决方案

SVN <wbr>Berkeley <wbr>DB <wbr>Cannot <wbr>allocate <wbr>memory解决方案

原文地址:https://www.cnblogs.com/lixuebin/p/10814301.html