लिकिबेस लॉक - कारण?


261

ओरेकल-सर्वर के खिलाफ बहुत सारे लिबास-स्क्रिप्ट चलाने पर मुझे यह मिलता है। SomeComputer मैं हूँ।

Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Waiting for changelog lock....
Liquibase Update Failed: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
SEVERE 2013-03-20 16:59:liquibase: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
liquibase.exception.LockException: Could not acquire change log lock.  Currently locked by SomeComputer (192.168.15.X) since 2013-03-20 13:39
        at liquibase.lockservice.LockService.waitForLock(LockService.java:81)
        at liquibase.Liquibase.tag(Liquibase.java:507)
        at liquibase.integration.commandline.Main.doMigration(Main.java:643)
        at liquibase.integration.commandline.Main.main(Main.java:116)

क्या ऐसा हो सकता है कि एक साथ सत्र / लेनदेन की संख्या तक पहुँच जाए? किसी के पास कोई विचार है?


2
क्या आपने जेवीएम को मार दिया था, जबकि शराबबंदी ने ताला लगा रखा था? यही एकमात्र मामला है जहां मेरे लिए ऐसा होता है।
क्रिस्टोफ लेटर

वहाँ एक और पीसी शामिल होने लगता है: Konsultpc74। हो सकता है कि आपने एक ही समय पर अलग-अलग पीसी से एल्कोहल चलाया हो? यदि आपके पास अन्य पीसी के लिए स्पष्टीकरण नहीं है?
जेन्स

मैंने लॉग्स को संपादित किया और मैं गलती से कुछ कॉमप्यूटर में बदलना भूल गया
पीटर इस्बर्ग

क्या आप एक साथ बदलावों को अंजाम दे रहे हैं? मैंने सोचा कि प्रत्येक फ़ाइल और उसमें प्रत्येक बदलाव को एक-एक करके निष्पादित किया जाता है। कम से कम मैं इसका इस तरह उपयोग करता हूं। मेरे पास एक मास्टर परिवर्तनक फ़ाइल है, जो अन्य सभी को पसंद करती है और कभी भी एक-एक करके चलती है।
जेन्स

जवाबों:


571

कभी-कभी यदि अपडेट एप्लिकेशन को अचानक रोक दिया जाता है, तो लॉक अटका रहता है।

फिर दौड़ रहा है

UPDATE DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

डेटाबेस के खिलाफ मदद करता है।

या आप बस DATABASECHANGELOGLOCKतालिका को गिरा सकते हैं , इसे फिर से बनाया जाएगा।


24
मैं बाहर स्विच करने के लिए आवश्यक 0के लिए FALSEहै, लेकिन उस के अलावा अन्य, यह ठीक काम किया। धन्यवाद
मैटालक्संड्र

7
लिलीबेस में एक अंतर्निहित कमांड है जिसे रिलीज़लॉक्स कहा जाता है जो @ एड्रियन बेर ने उत्तर दिया था लेकिन मुझे लगता है कि यह डेटाबेस अज्ञेयवादी है।

1
मुझे यह त्रुटि मेरे विकास के वातावरण में मिल रही थी। DATABASECHANGELOGLOCK तालिका को ठीक करने से इसे हल किया गया।
नवमेश मिस्त्री

1
मैं बाहर स्विच करने के लिए आवश्यक FALSEके लिएb'0'
OrangePot

2
यह सही समाधान है, तालिका को खाली करने का प्रयास न करें क्योंकि इससे मदद नहीं मिलेगी। या तो इसे ड्रॉप करें या 'FALSE ’को LOCKED फ्लैग को UPDATE करें
आदित्य टी

55

संपादित करें जून 2020

इस सलाह का पालन न करें। यह वर्षों में कई लोगों के लिए परेशानी का कारण है। इसने मेरे लिए बहुत समय पहले काम किया था और मैंने इसे अच्छे विश्वास में पोस्ट किया था, लेकिन यह स्पष्ट रूप से इसे करने का तरीका नहीं है। DATABASECHANGELOCK तालिका में सामान रखने की आवश्यकता है, इसलिए यह सब कुछ से इसे हटाने के लिए एक बुरा विचार है।

उदाहरण के लिए, लीओस लिटरक ने इन निर्देशों का पालन किया और सर्वर शुरू होने में विफल रहा।

मूल उत्तर

संभवत: यह एक मारे गए शराबी की प्रक्रिया के कारण DATABASECHANGELOGLOCK टेबल पर अपना लॉक जारी नहीं करना है। फिर,

DELETE FROM DATABASECHANGELOGLOCK;

आपकी मदद कर सकता है।

संपादित करें: @ एड्रियन बेर का उत्तर इससे बेहतर समाधान प्रदान करता है। ऐसा तभी करें जब आपको उसका समाधान करने में कोई समस्या हो।


1
यह प्रश्न का उत्तर प्रदान नहीं करता है। किसी लेखक से स्पष्टीकरण मांगने या उसका अनुरोध करने के लिए, उनके पोस्ट के नीचे एक टिप्पणी छोड़ दें।
राचछा

@ बच्चा मैंने इसे बेहतर तरीके से समझाया। आशा है कि आपको यह अधिक पसंद आएगी।
e18r

12
उपरोक्त सलाह का पालन न करें। DATABASECHANGELOGLOCK में बिना किसी पंक्तियाँ वाली पंक्तियाँ होनी चाहिए, आपको एक अपवाद मिलेगा
odedsh

यह मदद नहीं करता है, मैंने टेबल को छोड़ने या लॉक स्टेट को 'गलत' अपडेट करने के बजाय यह कोशिश की। यह काम नहीं किया।
आदित्य टी

यदि आप इस उत्तर का पालन करते हैं तो एक अच्छा मौका है भविष्य की स्क्रिप्ट नहीं चलेंगी क्योंकि वे लॉक के अस्तित्व की उम्मीद करते हैं। यदि आपने ऐसा पहले ही कर लिया है तो आप इस समस्या को ठीक करने के लिए एक खाली ताला जोड़ सकते हैं INSERT INTO yourdb.DATABASECHANGELOGLOCK VALUES (1, 0, null, null);
रूडी केरशव

24

समस्या लिबास में SequenceExists के छोटी गाड़ी के कार्यान्वयन की थी। चूंकि इन बयानों के साथ बदलावों में बहुत लंबा समय लगा और उनका आकस्मिक निधन हो गया। इसके बाद अगली कोशिश यह हुई कि लिबास-स्क्रिप्ट्स को लॉक किया जाए।

  <changeSet author="user" id="123">
    <preConditions onFail="CONTINUE">
      <not><sequenceExists sequenceName="SEQUENCE_NAME_SEQ" /></not>
    </preConditions>
    <createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
  </changeSet>

इसके बजाय इसे जांचने के लिए एक कार्य सादा SQL का उपयोग कर रहा है:

  <changeSet author="user" id="123">
    <preConditions onFail="CONTINUE">
            <sqlCheck expectedResult="0">
              select count(*) from user_sequences where sequence_name = 'SEQUENCE_NAME_SEQ';
            </sqlCheck>
    </preConditions>
    <createSequence sequenceName="SEQUENCE_NAME_SEQ"/>
  </changeSet>

Lockdata तालिका DATABASECHANGELOCK में संग्रहीत है। लॉक से छुटकारा पाने के लिए आप बस 1 से 0 को बदलें या उस टेबल को छोड़ दें और फिर से बनाएं।


1
शराबखाना 3.0.2 में (जिस संस्करण का मैं उपयोग कर रहा हूं), अगली बार लॉक टेबल से एक लाइन को न हटाएं, या अगली बार शराबखाना चलाते समय आपको एक अलग त्रुटि होगी, क्योंकि शराबबंदी को उम्मीद है कि एक पंक्ति वहां होगी (या) पूरी मेज गायब)। वास्तव में, जैसा कि पीटर ने कहा, बस उस जानकारी को जोड़ना चाहते थे, क्योंकि पुराने संस्करणों में लगता है कि पंक्ति को हटाने के लिए भी काम किया है।
कारीम

7

लिकरिब को निष्पादित करने के लिए किस वातावरण का उपयोग किया जाता है इसका उल्लेख नहीं किया गया है। मामले में यह स्प्रिंग बूट 2 है liquibase.lockservice.StandardLockServiceप्रत्यक्ष एसक्यूएल बयानों को चलाने की आवश्यकता के बिना विस्तार करना संभव है जो कि बहुत क्लीनर है। उदाहरण के लिए:

/**
 * This class is enforcing to release the lock from the database.
 *
 */
 public class ForceReleaseLockService extends StandardLockService {

    @Override
    public int getPriority() {
        return super.getPriority()+1;
    }

    @Override
    public void waitForLock() throws LockException {
        try {
            super.forceReleaseLock();
        } catch (DatabaseException e) {
            throw new LockException("Could not enforce getting the lock.", e);
        }
        super.waitForLock();
    }
}

कोड लॉक की रिहाई को लागू कर रहा है। यह परीक्षण सेट-अप में उपयोगी हो सकता है, जहां त्रुटियों के मामले में रिलीज़ कॉल को कॉल नहीं किया जा सकता है या डिबगिंग समाप्त होने पर।

वर्ग को liquibase.extपैकेज में रखा जाना चाहिए और स्प्रिंग बूट 2 ऑटो कॉन्फ़िगरेशन द्वारा उठाया जाएगा।


क्या आप कृपया अपने समाधान का अधिक विस्तृत विवरण प्रदान कर सकते हैं? हम स्प्रिंग बूट 2 और शराबखोरी का उपयोग करते हैं और प्रत्येक बार मैन्युअल रूप से डीबी में लॉक-स्टेट को हटाना नहीं चाहते हैं। लेकिन मुझे समझ नहीं आया कि आप ForceReleaseLockService को शराबखोरी में कैसे इंजेक्ट करते हैं। डॉन `टी मैं इस वर्ग पर एक सेवा / घटक एनोटेशन डाल दिया है, कि वसंत यह एक प्राथमिक बीन के रूप में चुनें?
लेडी टिहोनोव

1
इसका अंतिम वाक्य में उल्लेख किया गया है: "क्लास को liquibase.ext पैकेज में रखा जाना चाहिए और स्प्रिंग बूट 2 ऑटो कॉन्फ़िगरेशन द्वारा उठाया जाएगा।"
k_o_

आप कक्षा को किस स्थान पर रखते हैं liquibase.ext, क्या मुझे अपनी परियोजना में उस पैकेज को परिभाषित करने की आवश्यकता है?
akuma8

मैंने अपनी परियोजना में उस पैकेज को परिभाषित किया, यह काम करने लगता है लेकिन मैं इसे सत्यापित नहीं कर सकता। मैंने @PostConstructलॉग संदेश के साथ एक विधि को परिभाषित किया है लेकिन मैं इसे मुद्रित नहीं देखता हूं।
akuma8

@ akuma8: हां, उस नाम के साथ अपनी परियोजना में एक पैकेज बनाएं। आपने @PostConstructविधि को कहां परिभाषित किया ? ForceReleaseLockService में? यह एक स्प्रिंग सेवा नहीं है, इसलिए यह लागू नहीं होगा।
k_o_

3

कभी-कभी तालिका को काट-छाँट या गिराने से DATABASECHANGELOGLOCK काम नहीं करता है। मैं PostgreSQL डेटाबेस का उपयोग करता हूं और इस मुद्दे पर बहुत बार आया। हल करने के लिए मैं जो कुछ करता हूं, वह उस डेटाबेस के लिए पृष्ठभूमि में चल रहे तैयार कथनों को रोलबैक करना है। सभी तैयार किए गए कथनों को रोलबैक करने की कोशिश करें और फिर से शराब के बदलाव की कोशिश करें।

एसक्यूएल:

SELECT gid FROM pg_prepared_xacts WHERE database='database_name';

यदि उपरोक्त विवरण किसी भी रिकॉर्ड को लौटाता है, तो उस SQL ​​कथन का अनुसरण करते हुए तैयार किए गए विवरण को रोलबैक करें।

ROLLBACK PREPARED 'gid_obtained_from_above_SQL';

1

आप तालिका को मैन्युअल रूप से या क्वेरी का उपयोग करके सुरक्षित रूप से हटा सकते हैं। यह स्वचालित रूप से फिर से बनाया जाएगा।

DROP TABLE DATABASECHANGELOGLOCK;

0

मैं सराहना करता हूं कि यह ओपी का मुद्दा नहीं था, लेकिन मैं इस मुद्दे पर हाल ही में एक अलग कारण से भाग गया। संदर्भ के लिए, मैं एसक्यूएल सर्वर के साथ लिक्विबेस मावेन प्लगइन (liquibase-maven-plugin: 3.1.1) का उपयोग कर रहा था।

फिर भी, मैंने गलती से प्रतिलिपि बनाई और एक SQL सर्वर "स्टेटस" स्टेटमेंट को अपनी स्क्रिप्ट में बदल दिया, जो कि डेटाबेस को स्विच करता है, इसलिए एल्कोहल चल रहा था और उसे अपडेट कर रहा था DATABASECHANGELOGLOCK, सही डेटाबेस में लॉक को प्राप्त कर रहा था , लेकिन तब बदलावों को लागू करने के लिए डेटाबेस को स्विच कर रहा था। न केवल मैं सही डेटाबेस में अपने परिवर्तन या शराबखोरी का ऑडिट नहीं देख सकता था, लेकिन निश्चित रूप से, जब मैं फिर से शराबखाना चलाता था, तो यह लॉक को अधिग्रहित नहीं कर सकता था, क्योंकि ताला "गलत" डेटाबेस में जारी किया गया था, और ऐसा ही था अभी भी "सही" डेटाबेस में बंद है। मैंने उम्मीद की थी कि इसे जारी करने से पहले भी लॉक की जाँच की जाएगी, और हो सकता है कि यह लिक्विड में बग हो (मैंने अभी तक जाँच नहीं की है), लेकिन बाद के संस्करणों में इसे अच्छी तरह से संबोधित किया जा सकता है! उस ने कहा, मुझे लगता है कि इसे एक विशेषता माना जा सकता है!

थोड़ा स्कूली त्रुटि, मुझे पता है, लेकिन मैं इसे यहाँ उठाता हूं अगर कोई भी उसी समस्या में चलता है!

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