লিকুইবেসের তালা - কারণ?


261

ওরাকল-সার্ভারের বিপরীতে প্রচুর পরিমাণে তরল পদার্থ-স্ক্রিপ্ট চালানোর সময় আমি এটি পেয়েছি। সামার কম্পিউটার আমি।

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
আপনি কি জেভিএমকে মেরে ফেলেছিলেন যখন তরলিবাসটি লকটি ধরেছিল? আমার ক্ষেত্রে এটিই একমাত্র ঘটনা।
ক্রিস্টোফ লেইটার

এতে আরও একটি পিসি জড়িত রয়েছে বলে মনে হচ্ছে: কানসল্টপেক .৪। আপনি একই সময়ে বিভিন্ন পিসি থেকে তরল পথে চালিত করতে পারেন? অন্য পিসির জন্য যদি আপনার কাছে ব্যাখ্যা থাকে না?
জেনস

আমি লগগুলি সম্পাদনা করেছি এবং আমি ঘটনাক্রমে সেটিকে সামার কম্পিউটারে পরিবর্তন করতে ভুলে গিয়েছি
পিটার

আপনি কি একই সাথে পরিবর্তনগুলি সম্পাদন করছেন? আমি ভেবেছিলাম প্রতিটি ফাইল এবং এর প্রতিটি পরিবর্তনটি একে একে কার্যকর করা হয়। কমপক্ষে আমি এটি এইভাবে ব্যবহার করি। আমার কাছে একটি মাস্টার চেঞ্জসেট ফাইল রয়েছে যা অন্য সকলকে অন্তর্ভুক্ত করে এবং সর্বদা একের পর এক চালিত হয়।
জেনস 21'13

উত্তর:


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
এটি সঠিক সমাধান, টেবিলটি খালি করার চেষ্টা করবেন না কারণ এটি কার্যকর হবে না। হয় এটিকে ফেলে দিন বা 'মিথ্যা'-তে লক করা পতাকাটি আপডেট করুন
আদিত্য টি

55

জুন 2020 সম্পাদনা করুন

এই পরামর্শ অনুসরণ করবেন না। এটি বছরের পর বছর ধরে বহু লোককে ঝামেলা করেছে। এটি আমার জন্য দীর্ঘদিন আগে কাজ করেছিল এবং আমি এটি ভাল বিশ্বাসে পোস্ট করেছি তবে এটি স্পষ্টভাবে এটি করার উপায় নয়। DATABASECHANGELOCK টেবিলটিতে এটি থাকা দরকার, তাই এটি থেকে সমস্ত কিছু মুছে ফেলা খারাপ ধারণা।

উদাহরণস্বরূপ, লিওস লিটারাক এই নির্দেশাবলী অনুসরণ করে এবং সার্ভারটি আরম্ভ করতে ব্যর্থ হয়েছিল।

আসল উত্তর

এটি সম্ভবত একটি মারা যাওয়া তরল প্রক্রিয়াজাতকরণ প্রক্রিয়াটির কারণে লতাটি DATABASECHANGELOGLOCK টেবিলে প্রকাশ না করায়। তারপর,

DELETE FROM DATABASECHANGELOGLOCK;

আপনাকে সাহায্য করতে পারে।

সম্পাদনা করুন: @ অ্যাড্রিয়ান বারের উত্তর এর চেয়ে ভাল সমাধান সরবরাহ করে। তার সমাধান করতে যদি আপনার কোনও সমস্যা হয় তবে এটি করুন।


1
এটি প্রশ্নের উত্তর দেয় না। কোনও লেখকের কাছ থেকে সমালোচনা বা স্পষ্টতার জন্য অনুরোধ জানাতে, তাদের পোস্টের নীচে একটি মন্তব্য দিন।
রচ্চা

@ রচ্চা আমি এটি আরও ভাল করে ব্যাখ্যা করেছি। আশা করি আপনাদের আরও ভালো লেগেছে।
e18r

12
উপরের পরামর্শ অনুসরণ করবেন না। DATABASECHANGELOGLOCK কোনো সারি ছাড়া সারি থাকা আবশ্যক আপনি একটি ব্যতিক্রম পাবেন
odedsh

এটি কোনও উপকারে আসে না, আমি টেবিলটি বাদ দেওয়ার পরিবর্তে বা তালাবদ্ধ অবস্থাকে 'মিথ্যা' হিসাবে আপডেট করার চেয়ে চেষ্টা করেছি। এটা কাজ করেনি।
আদিত্য টি

যদি আপনি এই উত্তরটি অনুসরণ করেন তবে ভবিষ্যতে স্ক্রিপ্টগুলি কার্যকর হওয়ার ভাল সুযোগ রয়েছে কারণ তারা লকটির অস্তিত্ব প্রত্যাশা করে। আপনি যদি ইতিমধ্যে এটি করে থাকেন তবে ইস্যুটি সমাধান করতে আপনি একটি খালি লক যুক্ত করতে পারেন INSERT INTO yourdb.DATABASECHANGELOGLOCK VALUES (1, 0, null, null);
রুডি

24

সমস্যাটি ছিল লিকুইবেসে সিকোয়েন্সএক্সবাদীদের বগি বাস্তবায়ন। যেহেতু এই বিবৃতিগুলির পরিবর্তনগুলি খুব দীর্ঘ সময় নিয়েছে এবং দুর্ঘটনাক্রমে বাতিল হয়েছিল। তারপরে পরবর্তীতে লিকুইডবেস-স্ক্রিপ্টগুলি কার্যকর করার চেষ্টা করুন।

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

এর পরিবর্তে এটি পরীক্ষা করার জন্য চারপাশের কাজগুলি সরল এসকিউএল ব্যবহার করছে:

  <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>

লকডেটা টেবিলে সংরক্ষণ করা হবে DATABASECHANGELOCK। লকটি থেকে মুক্তি পেতে আপনি কেবল 1 থেকে 0 পরিবর্তন করতে পারেন বা সেই টেবিলটি ফেলে দিন এবং পুনরায় তৈরি করুন।


1
তরলবেস 3.0.০.২ (আমি যে সংস্করণটি ব্যবহার করছি) তে, লক টেবিল থেকে এক লাইনটি সরিয়ে ফেলবেন না, বা পরের বার তরলিবাস চলাকালীন আপনার একটি ভিন্ন ত্রুটি ঘটবে, কারণ তড়িৎক্ষেত্রটি প্রত্যাশা করে যে একটি সারি সেখানে রয়েছে (বা পুরো টেবিল অনুপস্থিত)। ঠিক যেমনটি পিটার বলেছিলেন, ঠিক সেই তথ্যটি যুক্ত করতে চেয়েছিলেন, কারণ পুরানো সংস্করণগুলিতে মনে হয় সারিটি সরিয়েও কাজ করেছেন।
ক্যারিম

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 এবং তরল পদার্থ ব্যবহার করি এবং প্রতিটি সময় নিজেই ডিবিতে লক-স্টেট মুছতে চাই না। তবে আপনি বুঝতে পারলেন না কীভাবে আপনি ফোর্সলিজে লক সার্ভিসটি ইনজেক্ট করেন। আমাকে এই ক্লাসের উপরে কোনও পরিষেবা / উপাদান টিকা লিখতে হবে না, যে বসন্ত এটি প্রাথমিক শিম হিসাবে চয়ন করে?
আন্দ্রেজ তিহোনোভ

1
এটি সর্বশেষ বাক্যে উল্লেখ করা হয়েছে: "ক্লাসটি অবশ্যই তরলবেস.সেক্সট প্যাকেজে রাখতে হবে এবং স্প্রিং বুট 2 অটো কনফিগারেশন দ্বারা এটি গ্রহণ করা হবে।"
k_o_

আপনি কীভাবে ক্লাস স্থাপন করবেন liquibase.ext, আমার প্রকল্পে আমার কী সেই প্যাকেজটি সংজ্ঞায়িত করতে হবে?
akuma8

আমি আমার প্রকল্পে সেই প্যাকেজটি সংজ্ঞায়িত করেছি, এটি কাজ করে বলে মনে হচ্ছে তবে আমি এটি যাচাই করতে পারি না। আমি @PostConstructলগ বার্তা সহ একটি পদ্ধতি সংজ্ঞায়িত করেছি তবে এটি মুদ্রিত দেখতে পাচ্ছি না।
akuma8

@ আকুমা 8: হ্যাঁ, কেবলমাত্র সেই নামে আপনার প্রকল্পে একটি প্যাকেজ তৈরি করুন। আপনি @PostConstructপদ্ধতিটি কোথায় সংজ্ঞায়িত করেছেন ? ফোর্সরিলেজলক সার্ভিসে? এটি একটি স্প্রিং পরিষেবা নয়, সুতরাং এটি চাওয়া হবে না।
কে_ও_

3

কখনও কখনও টেবিলটি কাটা বা ফেলে দেওয়া DATABASECHANGELOGLOCK কাজ করে না। আমি PostgreSQL ডাটাবেস ব্যবহার করি এবং অনেকবার এই সমস্যাটি জুড়ে এসেছি। সমাধানের জন্য আমি যা করি তা হ'ল সেই ডাটাবেসের পটভূমিতে প্রস্তুত বিবৃতিগুলি রোলব্যাক করা। সমস্ত প্রস্তুত বিবৃতি রোলব্যাক করার চেষ্টা করুন এবং আবার তরলবাস পরিবর্তন করার চেষ্টা করুন।

এসকিউএল:

SELECT gid FROM pg_prepared_xacts WHERE database='database_name';

যদি উপরের বিবৃতিটি কোনও রেকর্ড দেয়, তবে নিম্নলিখিত এসকিউএল বিবৃতি সহ প্রস্তুত বিবৃতিটি রোলব্যাক করুন।

ROLLBACK PREPARED 'gid_obtained_from_above_SQL';

1

আপনি টেবিলটি ম্যানুয়ালি বা কোয়েরি ব্যবহার করে নিরাপদে মুছতে পারেন। এটি স্বয়ংক্রিয়ভাবে পুনরায় তৈরি করা হবে।

DROP TABLE DATABASECHANGELOGLOCK;

0

আমি প্রশংসা করি এটি অপির সমস্যা ছিল না, তবে আমি সম্প্রতি একটি ভিন্ন কারণ নিয়ে এই সমস্যাটিতে এসেছি। রেফারেন্সের জন্য, আমি এসকিউএল সার্ভারের সাথে লিকুইবেস মাভেন প্লাগইন (লিকুইবেস-মাভেন-প্লাগইন: 3.1.1) ব্যবহার করছিলাম।

যাইহোক, আমি ভুল করে আমার একটি স্ক্রিপ্টে একটি এসকিউএল সার্ভারের "ব্যবহার" বিবৃতিটি অনুলিপি করে পেস্ট করেছি যা ডেটাবেসগুলি স্যুইচ করে, তাই লিকুইবেস চলছিল এবং আপডেট করে যাচ্ছিল DATABASECHANGELOGLOCK, সঠিক ডাটাবেসে লকটি অর্জন করছিল , কিন্তু তারপরে পরিবর্তনগুলি প্রয়োগ করার জন্য ডাটাবেসগুলি স্যুইচিং করছিল । আমি কেবল সঠিক ডেটাবেসে আমার পরিবর্তনগুলি বা তরল পদার্থ নিরীক্ষণ দেখতে পাইনি, তবে অবশ্যই যখন আমি আবার তরলবাইজ চালালাম, তখন এটি লকটি অর্জন করতে পারেনি, কারণ লকটি "ভুল" ডাটাবেসে প্রকাশ হয়েছিল এবং তাই ছিল এখনও "সঠিক" ডাটাবেসের মধ্যে লক করা আছে। লকটি ছেড়ে দেওয়ার আগে তাত্ক্ষণিকভাবে লিকুইবেসটি প্রয়োগ করার আগেও এটি প্রয়োগ করা হয়েছিল বলে আমি আশা করেছি এবং এটি তরল পদার্থের একটি বাগ (আমি এখনও পরীক্ষা করে দেখিনি) তবে এটি পরবর্তী সংস্করণগুলিতে ভালভাবে সম্বোধন করা যেতে পারে! এটি বলেছিল, আমি মনে করি এটি কোনও বৈশিষ্ট্য হিসাবে বিবেচনা করা যেতে পারে!

বেশিরভাগ স্কুলছাত্রীর ত্রুটি, আমি জানি, তবে কেউ যদি একই সমস্যায় চলে যায় তবে আমি এখানে এটি উত্থাপন করেছি!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.