2016-09-28 6 views
0

로그인을 허용하지 않기로 결정한 것으로 보이는 trac 위키가 있습니다. "로그인"을 선택해도 사용자가 로그인 세부 정보를 입력 할 수있는 텍스트 상자로 연결되지 않습니다.trac 위키가 갑자기 로그인에 실패했습니다

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 

그러나 문제는 지속된다. 우리는 tracd보다는 웹 서버를 사용하여 이것을 실행합니다. 이 문제를 해결하는 방법이나 위키 페이지를 추출하고 사용자 로그인을 다시 작성하는 방법은 무엇입니까? 나는 CentOS에서 실행 중이다. 이것은 갑자기 일이 멈춘 것처럼 보이고 trac이 실제로 나의 전문 분야가 아니기 때문에 당황한 것입니다.

감사합니다.

답변

0

이 문제가 해결되어 향후 더 나은 방법을 찾아 냈습니다.

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

파일 tableList.new을 다음 : 나는 다음 .schema 명령을 실행하고 분석하여 데이터베이스에있는 테이블의 목록을 만들어

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

: 나는 데이터베이스의 복사본을 만든 나열된 테이블 : 문제가 테이블의 auth_cookie, session_attribu에 가능성이처럼

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

데이터베이스에 주위를 파고 후에는 듯 te, 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 

큰 것,하지만, 그 복사는 IS * .db 테이블은 데이터베이스에 액세스하지 않고 인 경우에만 작동합니다. 정말, 당신이 백업을 수행해야합니다 작업이 들어

$ trac-admin /var/www/trac hotcopy /var/www/tracBackup 

, 디렉토리는/var/www /에서 tracBackup이 (가 생성됩니다) 존재해서는 안된다. 이렇게하면 복사하는 동안 데이터베이스가 잠 깁니다. 그런 다음 의 백업을/var/www/tracBackup에서 복원하십시오. 제가 에 갔다가 데이터베이스가 망연자실 한 유일한 이유는 그 사실을 모르는 것입니다.

관련 문제