trac wiki在登录时突然失败

时间:2016-09-28 21:32:54

标签: sqlite wiki trac

我有一个似乎决定不允许登录的trac wiki。选择"登录"甚至没有用户访问允许他们输入登录详细信息的文本框。相反,似乎有一个超时,之后浏览器显示以下内容:

Traceback (most recent call last):
  File "build/bdist.linux-x86_64/egg/trac/web/api.py", line 436, in send_error
  File "build/bdist.linux-x86_64/egg/trac/web/chrome.py", line 803, in render_template
  File "build/bdist.linux-x86_64/egg/trac/web/api.py", line 212, in __getattr__
  File "build/bdist.linux-x86_64/egg/trac/web/main.py", line 298, in _get_session
  File "build/bdist.linux-x86_64/egg/trac/web/session.py", line 162, in __init__
  File "build/bdist.linux-x86_64/egg/trac/web/session.py", line 183, in get_session
  File "build/bdist.linux-x86_64/egg/trac/web/session.py", line 62, in get_session
  File "build/bdist.linux-x86_64/egg/trac/db/util.py", line 65, in execute
  File "build/bdist.linux-x86_64/egg/trac/db/sqlite_backend.py", line 78, in execute
  File "build/bdist.linux-x86_64/egg/trac/db/sqlite_backend.py", line 56, in execute
  File "build/bdist.linux-x86_64/egg/trac/db/sqlite_backend.py", line 48, in _rollback_on_error
OperationalError: database is locked

在此登录尝试期间,sqlite数据库似乎保持锁定状态。我尝试用以下内容重建数据库:

echo .dump | sqlite3 existing.db | sqlite3 new.db

但问题仍然存在。我们使用Web服务器而不是tracd来运行它。任何想法如何解决这个问题,或如何提取维基页面并重建用户登录?我在CentOS上运行。这让我感到困惑,因为事情似乎突然停止了工作,并且trac并不是我的主要专业领域。

谢谢!

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,并想出了一个更好的方法来继续。我制作了数据库的副本:

$ cp /var/www/trac/db/trac.db ./new.db

然后我通过发出.schema在数据库中列出了表 命令并解析它:

$ echo .schema | sqlite3 new.db | grep "CREATE TABLE" | awk '{ print $3 }' > tableList.new

文件tableList.new然后列出了表:

attachment
auth_cookie
cache
component
enum
milestone
node_change
permission
report
repository
revision
session
session_attribute
system
ticket
ticket_change
ticket_custom
version
wiki

在数据库中探索之后,似乎可能出现了问题 表auth_cookie,session_attribute,session,只是因为它们似乎 可能与登录有关。所以,我决定放弃这些 表并重新创建它们。首先,我将所有模式转储到数据库中 在逐个表格的基础上:

#!/bin/bash

/bin/rm -rf newSchemas
mkdir -p newSchemas

while read tn
do

 echo New $tn
 echo ".schema $tn" | sqlite3 new.db > newSchemas/$tn\.sql

done < tableList.new

exit 0

然后我删除了表并将它们重新创建为这三个表的空表 表:

#!/bin/bash

cp -v new.db fix.db
echo "DROP TABLE auth_cookie;" | sqlite3 fix.db
echo "DROP TABLE session_attribute;" | sqlite3 fix.db
echo "DROP TABLE session;" | sqlite3 fix.db

cat newSchemas/auth_cookie.sql | sqlite3 fix.db
cat newSchemas/session.sql | sqlite3 fix.db
cat newSchemas/session_attribute.sql | sqlite3 fix.db

exit 0

所以,这三个表在那里,但在新数据库中是空的。

然后我将固定数据库放在适当位置:

$ /bin/mv -vf /var/www/trac/db/trac.db /var/www/trac/db/trac.db.Save
$ /bin/mv fix.db /var/www/trac/db/trac.db

登录开始工作。

我学到的其他东西 - 除了转储模式之外,还可以转储 实际的SQL用于创建包含数据的表:

#!/bin/bash

/bin/rm -rf newTables
mkdir -p newTables

while read tn
do

 echo New $tn
 echo ".dump $tn" | sqlite3 new.db > newTables/$tn\.sql

done < tableList.new

exit 0

这可能会让您查看是否有任何表格中存在错误。

您可以检查数据库的完整性:

$ echo "PRAGMA integrity_check;" | sqlite3 new.db
ok

您甚至可以转储整个数据库并重新创建它:

$ echo .dump | sqlite3 existing.db  | sqlite3 fromDump.db

但重要的是,复制* .db表只能起作用 数据库未被访问。真的,你应该用:

进行备份
$ trac-admin /var/www/trac hotcopy /var/www/tracBackup

为了使它工作,目录/ var / www / tracBackup不应该存在(它会 被创造)。这会在复制期间锁定数据库。然后是你 备份/ var / www / tracBackup并从中恢复。我进去的唯一原因 和数据库混淆是我不知道的。