我有一个似乎决定不允许登录的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并不是我的主要专业领域。
谢谢!
答案 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并从中恢复。我进去的唯一原因 和数据库混淆是我不知道的。