मैं SQLite डेटाबेस को कैसे अनलॉक करूं?


269
sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked

मैं डेटाबेस को कैसे अनलॉक करूंगा ताकि यह काम करे?


डेटाबेस फ़ाइल तक पहुँचने की एक और प्रक्रिया हो सकती है - क्या आपने lsof की जाँच की है?
अप्रार्थी

मेरे पास एक ही समस्या थी, समस्या एंटीवायरस में थी जब मैं इसे अपने ऐप को निष्क्रिय कर देता हूं तो यह अच्छा है, लेकिन जब मैं इसे सक्रिय करता हूं तो मुझे लगता है कि कुछ त्रुटि "डेटाबेस लॉक है", मुझे आशा है कि आपकी मदद करेगा।
user8510915

जवाबों:


267

खिड़कियों में आप इस कार्यक्रम की कोशिश कर सकते हैं http://www.nirsoft.net/utils/opened_files_view.html यह पता लगाने के लिए कि प्रक्रिया db फ़ाइल को संभाल रही है। अनलॉक डेटाबेस के लिए उस प्रोग्राम को बंद करने का प्रयास करें

लिनक्स और macOS में आप कुछ ऐसा ही कर सकते हैं, उदाहरण के लिए, यदि आपकी लॉक की गई फ़ाइल का विकास है।

$ fuser development.db

यह कमांड दिखाएगा कि कौन सी प्रक्रिया फ़ाइल को लॉक कर रही है:

> development.db: 5430

बस प्रक्रिया को मार डालो ...

मार-९ ५४३०

... और आपका डेटाबेस अनलॉक हो जाएगा।


19
... स्पष्ट चेतावनी के साथ कि आपको यह जानना होगा कि आप क्या कर रहे हैं। यदि यह एक महत्वहीन प्रक्रिया है, तो killठीक होना चाहिए, लेकिन आपको इसे ठीक से मारने के लिए सावधान रहने की आवश्यकता है, और kill -9शायद गलत है और / या ओवरकिल है। यदि प्रक्रिया लटका दी गई है और अन्यथा नहीं मर जाएगी, तो कभी-कभी आपको ज़रूरत होती है kill -9। लेकिन आप मुख्य प्रोडक्शन जॉब को जाना और मारना नहीं चाहते हैं, इसलिए आप रिपोर्ट कर सकते हैं कि डेटाबेस अब लॉक नहीं है!
त्रिकाल

सरल उपाय सिर्फ अपने कंप्यूटर को पुनरारंभ करना होगा।
चाचम

7
@ chacham15: आप मानते हैं कि डेटाबेस "मेरे" कंप्यूटर पर है, और आप एक ही कंप्यूटर पर लॉक किए गए डेटाबेस के साथ चलने वाली बहुत सारी महत्वपूर्ण प्रक्रियाओं की संभावना को अनदेखा करते हैं। "सरल" समाधान कभी इतना आसान नहीं होता है;)
tzot

1
@KyleCarlson - sqlite और mysql उस पहलू में मौलिक रूप से भिन्न है। SQLite-db-browser में विशेष रूप से कुछ भी गलत नहीं है।
बेरी त्सकाला

6
यह समाधान मानता है कि फ़ाइल को लॉक करने की एक प्रक्रिया है। यह संभव है कि SQLite फ़ाइल को अनुपयोगी स्थिति में छोड़ते हुए कोई प्रक्रिया क्रैश हो जाए। उस मामले में, मेरा जवाब देखें।
रॉबर्ट

90

मैंने एक लेखन के दौरान एक ऐप को क्रैश करके अपने साइक्लाइट डीबी को लॉक कर दिया। यहां बताया गया है कि मैंने इसे कैसे तय किया:

echo ".dump" | sqlite old.db | sqlite new.db

से लिया गया: http://random.kakaopor.hu/how-to-repair-an-sqlite.dadabase


4
sqlite3:sqlite> .dump PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; /**** ERROR: (5) database is locked *****/ ROLLBACK; -- due to errors
woky

के लिए काम नहीं कर रहा हैFOREIGN KEY constraint failed (RELEASE RESTOREPOINT)
gies0r

52

नीचे सूचीबद्ध DatabaseIsLocked पृष्ठ अब उपलब्ध नहीं है। फ़ाइल लॉकिंग और कॉन्सैरेसी पेज v3 में शुरू की गई फ़ाइल लॉकिंग से संबंधित परिवर्तनों का वर्णन करता है और भविष्य के पाठकों के लिए उपयोगी हो सकता है। https://www.sqlite.org/lockingv3.html

SQLite wiki DatabaseIsLocked पृष्ठ इस त्रुटि संदेश की एक अच्छी व्याख्या प्रदान करता है। यह बताता है कि भाग में, विवाद का स्रोत आंतरिक है (त्रुटि को छोड़ने वाली प्रक्रिया के लिए)।

यह पृष्ठ जो यह नहीं समझाता है कि SQLite यह कैसे तय करता है कि आपकी प्रक्रिया में कोई चीज लॉक है और किन स्थितियों के कारण झूठी सकारात्मक हो सकती है।


2
समस्या यह है कि पृष्ठ गलत है या पुराना है: मेरे पास एक ऐसी प्रक्रिया है जिसका शाब्दिक अर्थ कुछ भी नहीं है, लेकिन एक भी INSERT जो उस बंद संदेश को प्राप्त कर रहा है: इस प्रक्रिया के कारण ताला लगाना संभव नहीं है। समस्या उसी डीबी से बात करने वाली एक अन्य प्रक्रिया में थी।
डैन जेम्सन

4
@ conj42 लिंक टूट गया।
ओले तांगे

32

-Journal फ़ाइल को हटाना एक भयानक विचार की तरह लगता है। यह एक दुर्घटना के बाद डेटाबेस को एक सुसंगत स्थिति में वापस रोल करने की अनुमति देने के लिए है। यदि आप डेटाबेस को असंगत स्थिति में रखते हुए इसे हटा देते हैं, तो आपको एक दूषित डेटाबेस के साथ छोड़ दिया जाता है। साइक्लाइट साइट से एक पृष्ठ का हवाला देते हुए :

यदि कोई क्रैश या पावर लॉस होता है और डिस्क पर एक हॉट जर्नल छोड़ दिया जाता है, तो यह आवश्यक है कि मूल डेटाबेस फ़ाइल और हॉट जर्नल डिस्क पर अपने मूल नामों के साथ तब तक रहें जब तक कि डेटाबेस फ़ाइल को किसी अन्य SQLite प्रक्रिया द्वारा खोला और वापस रोल न किया जाए। । [...]

हमें संदेह है कि SQLite वसूली के लिए एक सामान्य विफलता मोड इस तरह होता है: एक बिजली विफलता होती है। बिजली बहाल होने के बाद, एक अच्छी तरह से अर्थ वाला उपयोगकर्ता या सिस्टम व्यवस्थापक क्षति के लिए डिस्क पर चारों ओर देखना शुरू कर देता है। वे अपने डेटाबेस फ़ाइल को "important.data" नाम से देखते हैं। यह फ़ाइल शायद उनसे परिचित है। लेकिन दुर्घटना के बाद, "important.data-journal" नाम का एक हॉट जर्नल भी है। उपयोगकर्ता तब हॉट पत्रिका को हटा देता है, यह सोचकर कि वे सिस्टम को साफ करने में मदद कर रहे हैं। हम उपयोगकर्ता शिक्षा के अलावा इसे रोकने का कोई तरीका नहीं जानते हैं।

अगली बार डेटाबेस खोले जाने पर रोलबैक स्वचालित रूप से होने वाला है, लेकिन यह विफल हो जाएगा यदि प्रक्रिया डेटाबेस को लॉक नहीं कर सकती है। जैसा कि दूसरों ने कहा है, इसका एक संभावित कारण यह है कि वर्तमान में एक और प्रक्रिया खुली है। एक और संभावना एक बासी एनएफएस लॉक है, अगर डेटाबेस एनएफएस वॉल्यूम पर है। उस स्थिति में, डेटाबेस फ़ाइल को NFS सर्वर (mv database.db original.db; cp original.db database.db) पर लॉक नहीं की गई ताज़ा प्रतिलिपि के साथ बदलना है। ध्यान दें कि NFS फ़ाइल लॉकिंग के छोटे कार्यान्वयन के कारण, SQLLIT FAQ, NFS वॉल्यूम पर डेटाबेस के समवर्ती पहुँच के बारे में सावधानी बरतने की सलाह देता है।

मैं स्पष्ट नहीं कर सकता कि -journal फ़ाइल को हटाने से आप एक डेटाबेस को लॉक कर देंगे जो आप पहले नहीं कर सकते थे। क्या वह प्रजनन योग्य है?

वैसे, एक -journal फ़ाइल की उपस्थिति का मतलब यह नहीं है कि कोई दुर्घटना हुई थी या कि वापस रोल करने के लिए परिवर्तन हैं। Sqlite में कुछ अलग जर्नल मोड हैं, और PERSIST या TRUNCATE मोड में यह -journal फ़ाइल को हमेशा जगह पर छोड़ता है, और यह इंगित करने के लिए सामग्री को बदलता है कि वापस रोल करने के लिए आंशिक लेनदेन हैं या नहीं।


23

यदि आप "डेटाबेस लॉक है" त्रुटि को दूर करना चाहते हैं तो इन चरणों का पालन करें:

  1. अपनी डेटाबेस फ़ाइल को किसी अन्य स्थान पर कॉपी करें।
  2. डेटाबेस को कॉपी किए गए डेटाबेस से बदलें। यह उन सभी प्रक्रियाओं को रोक देगा जो आपकी डेटाबेस फ़ाइल तक पहुँच रही थीं।

2
मैंने ऊपर वर्णित के रूप में 'फ्यूज़र <DB>' की कोशिश की, लेकिन काम नहीं किया। यह सरल कदम मेरे लिए काम करते हैं।
जैकी ये

मेरे मामले में मुझे अपने ज्यूपिटर नोटबुक को पुनः आरंभ करना पड़ा।
विक्टर

15

यदि किसी प्रोसेस में SQLite DB पर लॉक होता है और क्रैश हो जाता है, तो DB स्थायी रूप से लॉक हो जाता है। यही समस्या है। ऐसा नहीं है कि किसी अन्य प्रक्रिया में ताला है।


48
तो कैसे DB अनलॉक करने के लिए?
एरिक कपलुन

4
यह सिर्फ सच नहीं है। ओएस द्वारा ताले बनाए रखे जाते हैं। जवाब नीचे पढ़ें।
जेजे

13

SQLite db फाइलें सिर्फ फाइलें हैं, इसलिए यह सुनिश्चित करने के लिए पहला कदम होगा कि यह केवल पढ़ने के लिए नहीं है। दूसरी बात यह सुनिश्चित करना है कि आपके पास किसी प्रकार का GUI SQLite DB दर्शक DB ओपन के साथ नहीं है। आप किसी अन्य शेल में DB ओपन कर सकते हैं, या आपके कोड में DB ओपन हो सकता है। आमतौर पर आप यह देखेंगे कि यदि कोई अलग धागा, या एप्लिकेशन जैसे कि SQLite डेटाबेस ब्राउज़र में लिखने के लिए DB खुला है।


4
मेरे अनुभव में, SQLite Database Browser (SDB) प्रतिलिपि प्रस्तुत करने योग्य डेटाबेस को बंद कर देता है यदि आप इसके साथ डेटा संपादित करते हैं, लेकिन फिर इसे SDB में सेव नहीं करते हैं। यदि आप इसे सहेजते हैं, तो यह लॉक रिलीज़ करता है।
चेलोनियन

मैं सम्मिलित कर सकता हूं लेकिन मैं हटा नहीं सकता।
वेनी

10

मुझे अभी यह समस्या थी, एक NFS माउंट पर संग्रहीत रिमोट सर्वर पर SQLite डेटाबेस का उपयोग करके। SQLite दूरस्थ खोल सत्र के बाद एक लॉक प्राप्त करने में असमर्थ था जो डेटाबेस के खुले रहने पर दुर्घटनाग्रस्त हो गया था।

ऊपर सुझाई गई पुनर्प्राप्ति के लिए व्यंजनों ने मेरे लिए काम नहीं किया (विचार के लिए पहले कदम और फिर डेटाबेस को कॉपी करें)। लेकिन गैर-एनएफएस प्रणाली में इसे कॉपी करने के बाद, डेटाबेस प्रयोग करने योग्य नहीं हो गया और डेटा खो गया प्रतीत नहीं होता है।


9

मेरा लॉक सिस्टम के दुर्घटनाग्रस्त होने के कारण हुआ था न कि किसी हैंगिंग प्रक्रिया द्वारा। इसे हल करने के लिए मैंने केवल फ़ाइल का नाम बदला और फिर इसे मूल नाम और स्थान पर कॉपी कर दिया।

एक linux shell का उपयोग करना ...

mv mydata.db temp.db
cp temp.db mydata.db

बहुत आसान समाधान, एक नेटवर्क ड्राइव पर बंद डेटाबेस की मेरी समस्या को हल करना।
Maverick2805

7

मैंने Pooling=trueकनेक्शन स्ट्रिंग में " " जोड़ा और यह काम किया।


4

मैंने SQLite में लॉकिंग के विभिन्न राज्यों के प्रलेखन को बहुत मददगार पाया। माइकल, अगर आप पढ़ सकते हैं, लेकिन डेटाबेस में राइट्स नहीं कर सकते हैं, तो इसका मतलब है कि एक प्रक्रिया ने आपके डेटाबेस पर एक RESERVED लॉक प्राप्त कर लिया है, लेकिन अभी तक राइट को निष्पादित नहीं किया है। यदि आप SQLite3 का उपयोग कर रहे हैं, तो PENDING नामक एक नया लॉक है जहां कोई और प्रक्रिया कनेक्ट करने की अनुमति नहीं है, लेकिन मौजूदा कनेक्शन रीडिंग प्रदर्शन कर सकते हैं, इसलिए यदि यह वह समस्या है जिसे आपको इसके बजाय देखना चाहिए।


4

यदि फ़ाइल किसी दूरस्थ फ़ोल्डर में है, तो साझा फ़ोल्डर की तरह यह त्रुटि फेंकी जा सकती है। मैंने डेटाबेस को स्थानीय निर्देशिका में बदल दिया और इसने पूरी तरह से काम किया।


3

मुझे ऐप के भीतर ऐसी समस्या है, जो 2 कनेक्शन से SQLite तक पहुंचता है - एक केवल पढ़ने के लिए और लिखने और पढ़ने के लिए दूसरा था। ऐसा लगता है कि दूसरे कनेक्शन से रीड-ओनली कनेक्शन ब्लॉकिंग राइटिंग। अंत में, यह पता चला है कि उपयोग के बाद कम से कम, तैयार किए गए स्टेटमेंट IMMEDIATELY को अंतिम रूप देना या करना आवश्यक है। जब तक तैयार बयान नहीं खोला जाता है, तब तक यह डेटाबेस के कारण लेखन के लिए अवरुद्ध हो गया था।

मत भूलो कॉल:

sqlite_reset(xxx);

या

sqlite_finalize(xxx);

3

INDEX'ing जैसे कुछ कार्यों में बहुत लंबा समय लग सकता है - और यह चलते समय पूरे डेटाबेस को लॉक कर देता है। इस तरह के मामलों में, यह जर्नल फ़ाइल का उपयोग भी नहीं कर सकता है!

तो सबसे अच्छा / एकमात्र तरीका यह जांचने के लिए कि क्या आपका डेटाबेस लॉक है क्योंकि एक प्रक्रिया ACTIVELY इसे लिख रही है (और इस प्रकार आपको इसे तब तक अकेला छोड़ देना चाहिए जब तक कि इसका ऑपरेशन पूरा न हो जाए) md5 (या कुछ सिस्टम पर md5sum) फ़ाइल को दो बार । यदि आप एक अलग चेकसम प्राप्त करते हैं, तो डेटाबेस लिखा जा रहा है, और आप वास्तव में वास्तव में वास्तव में -9 को उस प्रक्रिया को मारना नहीं चाहते हैं क्योंकि आप आसानी से एक भ्रष्ट तालिका / डेटाबेस के साथ समाप्त कर सकते हैं यदि आप करते हैं।

मैं दोहराऊंगा, क्योंकि यह महत्वपूर्ण है - समाधान लॉकिंग प्रोग्राम को खोजने और इसे मारने के लिए नहीं है - यह पता लगाना है कि क्या डेटाबेस में अच्छे कारण के लिए राइट लॉक है, और वहां से जाएं। कभी-कभी सही समाधान सिर्फ एक कॉफी ब्रेक होता है।

इस बंद-से-नहीं-लेकिन-लिखित-स्थिति को बनाने का एकमात्र तरीका यह है कि यदि आपका कार्यक्रम चलता है BEGIN EXCLUSIVE, क्योंकि यह कुछ तालिका परिवर्तन या कुछ करना चाहता था, तो जो भी कारण कभी भी ENDबाद में नहीं भेजता है , और प्रक्रिया कभी भी समाप्त नहीं होती है । सभी तीन शर्तों को पूरा किया जा रहा है, किसी भी ठीक से लिखे गए कोड में अत्यधिक संभावना नहीं है, और 100 में से 99 बार जब कोई अपनी हत्या प्रक्रिया -9 को मारना चाहता है, तो लॉकिंग प्रक्रिया वास्तव में एक अच्छे कारण के लिए आपके डेटाबेस को लॉक कर रही है। प्रोग्रामर आमतौर पर इस BEGIN EXCLUSIVEशर्त को नहीं जोड़ते हैं जब तक कि उन्हें वास्तव में ज़रूरत न हो, क्योंकि यह संक्षिप्तता को रोकता है और उपयोगकर्ता की शिकायतों को बढ़ाता है। SQLite ही इसे तब जोड़ता है जब इसे वास्तव में आवश्यकता होती है (जैसे कि अनुक्रमण करते समय)।

अंत में, 'लॉक' स्थिति फ़ाइल के अंदर मौजूद नहीं है क्योंकि कई उत्तर बताए गए हैं - यह ऑपरेटिंग सिस्टम के कर्नेल में रहता है। BEGIN EXCLUSIVEOS से लॉक होने का अनुरोध करने वाली प्रक्रिया को फ़ाइल पर लॉक रखा जाना चाहिए। यहां तक ​​कि अगर आपकी अनन्य प्रक्रिया दुर्घटनाग्रस्त हो गई है, तो आपका ओएस यह पता लगाने में सक्षम होगा कि उसे फ़ाइल लॉक बनाए रखना चाहिए या नहीं !! एक डेटाबेस के साथ समाप्त होना संभव नहीं है जो बंद है लेकिन कोई भी प्रक्रिया सक्रिय रूप से इसे बंद नहीं कर रही है !! जब यह देखने की बात आती है कि कौन सी प्रक्रिया फ़ाइल को लॉक कर रही है, तो आमतौर पर fuser के बजाय lsof का उपयोग करना बेहतर होता है (यह क्यों का एक अच्छा प्रदर्शन है: /unix/94316/fuser-vs-lsof- करने के लिए चेक-इन-उपयोग )। वैकल्पिक रूप से यदि आपके पास DTrace (OSX) है, तो आप फ़ाइल पर iosnoop का उपयोग कर सकते हैं।


2

मेरे पास बस कुछ ऐसा ही था - मेरा वेब एप्लिकेशन डेटाबेस से पढ़ने में सक्षम था, लेकिन कोई आवेषण या अपडेट नहीं कर सका। अपाचे के रिबूट ने इस मुद्दे को कम से कम अस्थायी रूप से हल किया।

हालांकि, मूल कारण को ट्रैक करने में सक्षम होना अच्छा होगा।


2

मेरे लिनक्स वातावरण पर lsof कमांड ने मुझे यह पता लगाने में मदद की कि फाइल को खुला रखते हुए एक प्रक्रिया लटकी हुई थी।
प्रक्रिया को मार दिया और समस्या हल हो गई।


2

यह लिंक समस्या का समाधान करता है। : जब Sqlite देता है: डेटाबेस बंद त्रुटि यह मेरी समस्या को हल किया आप के लिए उपयोगी हो सकता है।

और आप भविष्य में डेटाबेस को लॉक नहीं करने के लिए लेनदेन शुरू करने और अंत लेनदेन का उपयोग कर सकते हैं।


2

डेटाबेस की आंतरिक समस्या होनी चाहिए ...
मेरे लिए "SQLite manager" के साथ डेटाबेस ब्राउज़ करने की कोशिश करने के बाद इसे प्रकट किया गया है ...
इसलिए, यदि आपको डेटाबेस से कनेक्ट होने वाली कोई अन्य प्रक्रिया नहीं मिल रही है और आप इसे ठीक नहीं कर सकते, तो डेटाबेस बस इस कट्टरपंथी समाधान की कोशिश करो:

  1. अपनी तालिकाओं को निर्यात करने के लिए प्रदान करें (आप फ़ायरफ़ॉक्स पर "SQLite प्रबंधक" का उपयोग कर सकते हैं)
  2. यदि माइग्रेशन बदल जाता है तो आपकी डेटाबेस स्कीम अंतिम विफल माइग्रेशन को हटा देती है
  3. अपनी "database.sqlite" फ़ाइल का नाम बदलें
  4. एक नया कार्य डेटाबेस बनाने के लिए "रेक डीबी: माइग्रेट" निष्पादित करें
  5. तालिका के आयात के लिए डेटाबेस को सही अनुमति देने के लिए प्रदान करें
  6. अपनी समर्थित तालिकाओं को आयात करें
  7. नया माइग्रेशन लिखें
  8. इसे " rake db:migrate" के साथ निष्पादित करें

1

मैं मैक ओएस एक्स 10.5.7 पर इसी समस्या में एक टर्मिनल सत्र से पायथन स्क्रिप्ट चला रहा था। हालाँकि मैंने स्क्रिप्ट्स को रोक दिया था और टर्मिनल विंडो कमांड प्रॉम्प्ट पर बैठा था, यह अगली बार चलने पर यह त्रुटि देगा। इसका समाधान टर्मिनल विंडो को बंद करना था और फिर इसे फिर से खोलना था। मेरे लिए कोई मतलब नहीं है, लेकिन यह काम किया।


1

मेरे पास बस वही त्रुटि थी। 5 मिनट के बाद गूगल-आईएनजी मैंने पाया कि मैंने एक शेल डायन को बंद नहीं किया था db का उपयोग कर रहा था। बस इसे बंद करें और पुन: प्रयास करें;)


1

मुझे भी यही समस्या थी। जाहिरा तौर पर रोलबैक फ़ंक्शन जर्नल के साथ db फ़ाइल को अधिलेखित करने के लिए लगता है जो db फ़ाइल के समान है लेकिन सबसे हाल के बदलाव के बिना। मैंने इसे नीचे दिए गए अपने कोड में लागू किया है और यह तब से ठीक काम कर रहा है, जबकि इससे पहले कि मेरा कोड लूप में फंस जाता, क्योंकि डेटाबेस लॉक रहता था।

उम्मीद है की यह मदद करेगा

मेरा अजगर कोड

##############
#### Defs ####
##############
def conn_exec( connection , cursor , cmd_str ):
    done        = False
    try_count   = 0.0
    while not done:
        try:
            cursor.execute( cmd_str )
            done = True
        except sqlite.IntegrityError:
            # Ignore this error because it means the item already exists in the database
            done = True
        except Exception, error:
            if try_count%60.0 == 0.0:       # print error every minute
                print "\t" , "Error executing command" , cmd_str
                print "Message:" , error

            if try_count%120.0 == 0.0:      # if waited for 2 miutes, roll back
                print "Forcing Unlock"
                connection.rollback()

            time.sleep(0.05)    
            try_count += 0.05


def conn_comit( connection ):
    done        = False
    try_count   = 0.0
    while not done:
        try:
            connection.commit()
            done = True
        except sqlite.IntegrityError:
            # Ignore this error because it means the item already exists in the database
            done = True
        except Exception, error:
            if try_count%60.0 == 0.0:       # print error every minute
                print "\t" , "Error executing command" , cmd_str
                print "Message:" , error

            if try_count%120.0 == 0.0:      # if waited for 2 miutes, roll back
                print "Forcing Unlock"
                connection.rollback()

            time.sleep(0.05)    
            try_count += 0.05       




##################
#### Run Code ####
##################
connection = sqlite.connect( db_path )
cursor = connection.cursor()
# Create tables if database does not exist
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS fix (path TEXT PRIMARY KEY);''')
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS tx (path TEXT PRIMARY KEY);''')
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS completed (fix DATE, tx DATE);''')
conn_comit( connection )

1

इस अपवाद को प्राप्त करने का एक सामान्य कारण यह है कि जब आप पढ़े हुए ऑपरेशन के लिए संसाधनों को पकड़े हुए एक लेखन कार्य करने का प्रयास कर रहे हों। उदाहरण के लिए, यदि आप किसी तालिका से चयन करते हैं, और फिर पहले अपने ResultSet को बंद किए बिना आपके द्वारा चयनित कुछ को अपडेट करने का प्रयास करें।


1

मुझे बहु-थ्रेडेड एप्लिकेशन में "डेटाबेस लॉक है" त्रुटियां हो रही थीं, जो SQLITE_BUSY परिणाम कोड प्रतीत होता है , और मैंने इसे sqlite3_busy_timeout सेट करने के साथ हल किया 30000 की तरह लंबे समय तक कुछ करने के लिए ।

(एक साइड-नोट पर, कितना अजीब है कि 7 साल पुराने सवाल पर किसी को भी यह पता नहीं चला! SQLite वास्तव में एक अजीब और आश्चर्यजनक परियोजना है ...)


1

रिबूट विकल्प से नीचे जाने से पहले, यह देखने योग्य है कि क्या आप साइक्लाइट डेटाबेस के उपयोगकर्ता को ढूंढ सकते हैं।

लिनक्स पर, कोई fuserइसे अंत तक नियोजित कर सकता है :

$ fuser database.db

$ fuser database.db-journal

मेरे मामले में मुझे निम्नलिखित प्रतिक्रिया मिली:

philip    3556  4700  0 10:24 pts/3    00:00:01 /usr/bin/python manage.py shell

जिसमें पता चला कि मैंने डेटाबेस का उपयोग करते हुए pid 3556 (manage.py) के साथ एक और पायथन प्रोग्राम किया था।


1

एक पुराना सवाल, बहुत सारे जवाबों के साथ, यहाँ उन चरणों के बारे में बताया गया है, जिनका मैंने हाल ही में ऊपर दिए गए उत्तरों को पढ़ने के बाद किया है, लेकिन मेरे मामले में यह समस्या cifs के साझाकरण के कारण थी। यह मामला पहले रिपोर्ट नहीं किया गया है, इसलिए आशा है कि यह किसी की मदद करता है।

  • जांचें कि आपके जावा कोड में कोई कनेक्शन खुला नहीं है।
  • जांचें कि कोई अन्य प्रक्रिया आपकी SQLite db फ़ाइल को lsof के साथ उपयोग नहीं कर रही है।
  • अपने रनिंग jvm प्रक्रिया के उपयोगकर्ता स्वामी की फ़ाइल पर r / w अनुमतियां हैं।
  • कनेक्शन खोलने पर लॉक मोड को बल देने का प्रयास करें

    final SQLiteConfig config = new SQLiteConfig();
    
    config.setReadOnly(false);
    
    config.setLockingMode(LockingMode.NORMAL);
    
    connection = DriverManager.getConnection(url, config.toProperties());

यदि आपका NFS साझा फ़ोल्डर में अपनी SQLite db फ़ाइल का उपयोग कर रहा है, तो जाँच करें SQLite faq के इस बिंदु की करें , और अपने बढ़ते तालों को सुनिश्चित करने के लिए अपने बढ़ते कॉन्फ़िगरेशन विकल्पों की समीक्षा करें, जैसा कि यहाँ वर्णित है :

//myserver /mymount cifs username=*****,password=*****,iocharset=utf8,sec=ntlm,file,nolock,file_mode=0700,dir_mode=0700,uid=0500,gid=0500 0 0

1

मुझे यह त्रुटि इस परिदृश्य में मिली कि यहाँ वर्णन करने वाले लोगों से थोड़ा अलग है।

SQLite डेटाबेस 3 सर्वर द्वारा साझा एक NFS फाइल सिस्टम पर आराम करता है। सर्वरों में से 2 पर मैं सफलतापूर्वक डेटाबेस पर क्वेरीज़ चलाने में सक्षम था, तीसरे एक विचार पर मुझे "डेटाबेस लॉक किया गया" संदेश मिल रहा था।

इस 3rd मशीन की बात यह थी कि इसमें कोई जगह नहीं बची थी /var। हर बार जब मैंने इस फाइल सिस्टम में स्थित किसी भी SQLite डेटाबेस में एक क्वेरी चलाने की कोशिश की तो मुझे "डेटाबेस लॉक हो गया" संदेश मिल गया और लॉग पर यह त्रुटि भी:

अगस्त 8 10:33:38 server01 कर्नेल: लॉकड: 172.22.84.87 की निगरानी नहीं कर सकता

और यह भी एक:

अगस्त 8 10:33:38 server01 rpc.statd [7430]: सम्मिलित करने में विफल: /var/lib/nfs/statd/sm/other.server.name.com लिखना: डिवाइस पर कोई स्थान नहीं छोड़ा गया Aug 8 10:33 38 server01 rpc.statd [7430]: STAT_FAIL to server01 17_.22.84.87 के SM_MON के लिए

अंतरिक्ष की स्थिति को संभालने के बाद सब कुछ सामान्य हो गया।


1

यदि आप इसे SQLite के साथ देखने के लिए Chrome डेटाबेस को अनलॉक करने का प्रयास कर रहे हैं , तो बस क्रोम शट डाउन।

खिड़कियाँ

%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Web Data

or

%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Chrome Web Data

मैक

~/Library/Application Support/Google/Chrome/Default/Web Data

0

आपकी पिछली टिप्पणियों से आपने कहा था कि -journal फ़ाइल मौजूद थी।

इसका मतलब यह हो सकता है कि आपने खोला है और (EXCLUSIVE?) लेनदेन किया है और अभी तक डेटा नहीं किया है। क्या आपका कार्यक्रम या कोई अन्य प्रक्रिया -जूरनल को पीछे छोड़ गई ??

Sqlite प्रक्रिया को फिर से शुरू करने से जर्नल फ़ाइल दिखाई देगी और किसी भी अवांछित कार्रवाई को साफ करेगी और -journal फ़ाइल को हटा देगी।


0

जैसा कि सेउन ओसेवा ने कहा है, कभी-कभी एक ज़ोंबी प्रक्रिया टर्मिनल में ताला लगाकर बैठ जाएगी, भले ही आप इसे संभव न समझें। आपकी स्क्रिप्ट चलती है, क्रैश हो जाती है, और आप तुरंत वापस चले जाते हैं, लेकिन एक लाइब्रेरी कॉल द्वारा कहीं न कहीं एक ज़ोंबी प्रक्रिया शुरू हो जाती है, और उस प्रक्रिया में लॉक होता है।

आपके द्वारा (OSX पर) टर्मिनल को बंद करने से काम चल सकता है। रीबूटिंग से काम चल जाएगा। आप "अजगर" प्रक्रियाओं को देख सकते हैं (उदाहरण के लिए) जो कुछ भी नहीं कर रहे हैं, और उन्हें मार दें।


0

आप इसे आज़मा सकते हैं: .timeout 100टाइमआउट सेट करने के लिए। मुझे नहीं पता कि कमांड लाइन में क्या होता है लेकिन जब मैं ऐसा करता हूं तो C # .Net में: "UPDATE table-name SET column-name = value;"मुझे लगता है कि डेटाबेस लॉक है लेकिन यह"UPDATE table-name SET column-name = value" ठीक है।

जब आप जोड़ते हैं तो ऐसा लगता है;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.