2013-05-07 13 views
5

अनलॉक करने के लिए मेरे पास एक प्रोग्राम है जो अक्सर SQL सर्वर को लॉक कर देता है और पुनरारंभ किए गए प्रोग्राम द्वारा उपयोग के लिए पहुंच योग्य नहीं है जब तक कि मैं रीबूट नहीं करता (जिसे मैं वास्तव में टालना चाहता हूं)। तो यह (मेरे मामले में वास्तविक फ़ाइल के स्थान पर सामान्य नाम, db.sqlite का उपयोग कर, zotero.sqlite) काम नहीं करता है:प्रभावी ढंग से एक SQLite डेटाबेस

sqlite3 db.sqlite 
sqlite> .backup main backup.sqlite 
Error: database is locked 

एक जवाब here के आधार पर, मैंने कोशिश की:

echo ".dump" | sqlite3 db.sqlite | sqlite3 db.sqlite2 
mv db.sqlite2 db.sqlite 

db.sqlite2 है 0 केबी तो यह स्पष्ट रूप से काम नहीं किया। another thread से प्रेरित होकर, मैं भी

echo '.dump' | sqlite3 db.sqlite > db.dump 
cat db.dump | sqlite3 db.sqlite2 
mv db.sqlite2 db.sqlite 

जो db.sqlite2 जो db.sqlite को फ़ाइल आकार में थोड़ा छोटा होता है की ओर जाता है की कोशिश की, और Zotero (फ़ाइल जो डेटाबेस की आवश्यकता है) उसकी सामग्री को पहचान करने में सक्षम नहीं था।

तो यह यह करने का एक बहुत जानवर बल रास्ता की तरह लगता है, लेकिन काम किया:

cp -pv db.sqlite db.sqlite2 
rm -f db.sqlite 
mv db.sqlite2 db.sqlite 

मुझे आश्चर्य है कि अगर वहाँ इस समाधान के लिए किसी भी कमियां हैं और क्यों अन्य तरीकों इस एक से पहले प्रस्तावित हैं।

+2

क्या आप वाकई दुर्घटनाग्रस्त प्रक्रिया अभी भी लटक रहे नहीं हैं? –

+0

ठीक है, 'ps -aux | grep zotero' मुझे '(zotero-bin) 'देता है जो एक ज़ोंबी प्रक्रिया प्रतीत होता है, और इसकी मूल प्रक्रिया' 1' है इसलिए मैं इसे मार नहीं सकता। यह बताता है कि मुझे इसे 'आरएम-एफ' क्यों करना है? – hatmatrix

+0

'init' स्वचालित रूप से लाश को वापस लाता है। उस ज़ोटरो प्रक्रिया की स्थिति ('STAT') क्या है? –

उत्तर

2

यह हो सकता है कि लेनदेन नियंत्रण के लिए ज़ोटरो समवर्ती पहुंच के दौरान डेटाबेस असंगतताओं को रोकने के लिए टेबल आधारित लॉकिंग का उपयोग करता है। जब कोई उपयोगकर्ता डेटाबेस का उपयोग करता है तो यह टेबल को लॉक करता है, इसलिए केवल वे इसका उपयोग कर सकते हैं और डेटाबेस को असंगत स्थिति में देख सकते हैं। हालांकि जब यह दुर्घटनाग्रस्त हो जाता है तो यह इन ताले को रिहा नहीं कर रहा है।

लेनदेन को दुर्घटनाग्रस्त करने पर एक अच्छी तरह से सेटअप डेटाबेस में वापस एक असंगत स्थिति में छोड़े जाने वाले डेटा को रोकने के लिए जारी किए गए लॉक (पूर्ववत) और लॉक को लॉक किया जाना चाहिए और आपको लॉक होने वाली टेबल को मैन्युअल रूप से रिलीज़ करना होगा।

मैंने इंटरनेट पर पढ़ा है जो किसी नेटवर्क फ़ाइल सिस्टम पर डेटाबेस संग्रहीत कर सकता है, किसी भी नेटवर्क स्थान पर डेटाबेस स्थान को बदलकर, SQL सर्वर लॉकिंग तंत्र में हस्तक्षेप कर सकता है, जब तक कि यह कहीं और नहीं है, तब तक इन समस्याओं से बचने में सक्षम होना चाहिए।

तो इसे कहीं और है मैं अपने डेटाबेस की एक प्रति बनाने और कोशिश करते हैं और आदि की स्थापना की है कि इस का कारण बन सकता में किसी भी दोष पहचान करने और उन्हें मरम्मत के लिए Zotero डेटाबेस मरम्मत उपकरण का उपयोग कर की सिफारिश करेंगे: https://www.zotero.org/utils/dbfix/

मुझे आशा है कि इससे मदद मिलती है।

संबंधित मुद्दे