নিষ্ক্রিয় পোস্টগ্র্যাস এসকিউএল সংযোগগুলির জন্য কি কোনও সময়সীমা শেষ হয়েছে?


98
1 S postgres  5038   876  0  80   0 - 11962 sk_wai 09:57 ?        00:00:00 postgres: postgres my_app ::1(45035) idle                                                                                 
1 S postgres  9796   876  0  80   0 - 11964 sk_wai 11:01 ?        00:00:00 postgres: postgres my_app ::1(43084) idle             

আমি তাদের অনেক দেখতে। আমরা আমাদের সংযোগ ফাঁস ঠিক করার চেষ্টা করছি। তবে ইতিমধ্যে আমরা এই নিষ্ক্রিয় সংযোগগুলির জন্য একটি সময়সীমা নির্ধারণ করতে চাই, সম্ভবত সর্বোচ্চ 5 মিনিট।


আপনি কিভাবে ডিবি সংযোগ করছেন? সকেটটাইমআউট আপনি যা খুঁজছেন তা হতে পারে।
দুনে

আমাদের কাছে এই লিগ্যাসি পাইলন্স ওয়েব অ্যাপ্লিকেশন রয়েছে এবং আমরা এসকিউএএলএলকেমি ব্যবহার করেছি তবে দৃশ্যত আমরা এটি সঠিকভাবে ব্যবহার করি নি। মনে নেই। আমরা ফাঁসটি ঠিক করার চেষ্টা করছি। socketTimeoutদস্তাবেজ থেকে দেখে মনে হচ্ছে এটি সম্পূর্ণরূপে ডিবি-র সংযোগটি বন্ধ করে দেয়। আমি প্রতিটি নিষ্ক্রিয়তা বন্ধ করার চেষ্টা করছি এবং সংযোগটি প্রতিষ্ঠিত হওয়ার সাথে সাথে কাউন্টারটি শুরু হবে।
ব্যবহারকারী 1012451


@ ব্যবহারকারী 1012451 আপনি যখন "প্রতিটি অলস বন্ধ করুন" বলছেন - <IDLE> in transactionসেশনটি চালু থাকলেও অবস্থায় থাকলে কী আপনি সেশন সমাপ্ত করতে চান <IDLE>? অন্য কথায়, লেনদেন শেষ করুন তবে সেশন নয়? (নিম্নচোটিত: অস্পষ্ট প্রশ্ন)
ক্রেগ রিঞ্জার

@ ক্র্যাগরিঞ্জার কিছুক্ষণ পরে, আমরা সর্বোচ্চ ক্লায়েন্ট সংযোগে পৌঁছেছি। এটি সমাধান করার জন্য, আমাদের অবশ্যই ওয়েব অ্যাপ পুনরায় চালু করতে হবে, যা পোস্টগ্র্যাস্কেলও পুনরায় আরম্ভ করতে বাধ্য করে। যা প্রতিটি সংযোগ মুছে দেয়। যখন আমরা এগুলি idleচিরকাল দেখতে পাই , আমরা জিজ্ঞাসা করছি যে আমরা প্রতিটি সংযোগ / সেশনের সময়সীমা নির্ধারণ করতে পারি কিনা (দুঃখিত, আমি সঠিকভাবে সঠিক পরিভাষা জানি না, দুঃখিত)। কোনও লেনদেনের জন্য যদি কোনও সাধারণ ওয়েব অ্যাপ্লিকেশনটির জন্য 5 মিনিট সময় লাগে তবে অবশ্যই কিছু ভুল হতে পারে ....
ব্যবহারকারী 1012451

উত্তর:


120

মনে হচ্ছে আপনার অ্যাপ্লিকেশনটিতে আপনার একটি সংযোগ ফাঁস হয়েছে কারণ এটি পুলযুক্ত সংযোগগুলি বন্ধ করতে ব্যর্থ । আপনার কাছে কেবল <idle> in transactionসেশনে সমস্যা হচ্ছে না , তবে সামগ্রিকভাবে অনেক সংযোগ রয়েছে।

সংযোগ হত্যা হত্যা এর সঠিক উত্তর নয়, তবে এটি একটি ঠিক-ইশ অস্থায়ী কর্মক্ষেত্র।

পোস্টগ্র্রেএসকিউএল ডেটাবেস থেকে অন্য সমস্ত সংযোগ বুট করার জন্য পোস্টগ্রেএসকিউএল পুনরায় শুরু করার পরিবর্তে দেখুন: আমি কীভাবে পোস্টগ্রিজ ডাটাবেস থেকে সমস্ত অন্যান্য ব্যবহারকারীকে আলাদা করব? এবং যদি কোনও পোস্টগ্রিজ এসকিউএল ডাটাবেসটিতে সক্রিয় সংযোগ থাকে তবে কীভাবে তা ড্রপ করবেন? । পরেরটি আরও ভাল কোয়েরি দেখায়।

সময়সীমা নির্ধারণের জন্য, যেমন @ দুন পরামর্শ দিয়েছেন পোস্টগ্রিএসকিউএল-এ নিষ্ক্রিয় সংযোগগুলি কীভাবে স্বয়ংক্রিয়ভাবে বন্ধ করবেন? , যা আপনাকে পোস্টগ্রেনসকিউএল-এর জন্য প্রক্সিতে পিজবাউনসার ব্যবহার করতে এবং নিষ্ক্রিয় সংযোগগুলি পরিচালনা করতে পরামর্শ দেয়। আপনার যদি কোনও বগি অ্যাপ্লিকেশন থাকে যা যেভাবেই সংযোগ ফাঁস করে দেয় এটি খুব ভাল ধারণা; আমি খুব দৃ strongly়ভাবে পিজবউনসার কনফিগার করার পরামর্শ দিচ্ছি।

একটি টিসিপি রক্ষণশীল এখানে কাজ করবে না, কারণ অ্যাপটি এখনও সংযুক্ত এবং জীবিত, এটি ঠিক হওয়া উচিত নয়।

PostgreSQL 9.2 এবং এর উপরে, আপনি নিষ্ক্রিয় সংযোগের রিপার প্রয়োগ করতে নতুন state_changeটাইমস্ট্যাম্প কলাম এবং stateক্ষেত্রটি ব্যবহার করতে পারেন pg_stat_activity। ক্রোন জব এর মতো কিছু চালান:

SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE datname = 'regress'
      AND pid <> pg_backend_pid()
      AND state = 'idle'
      AND state_change < current_timestamp - INTERVAL '5' MINUTE;

পুরানো সংস্করণগুলিতে আপনাকে জটিল স্কিমগুলি প্রয়োগ করতে হবে যা কখন সংযোগটি নিষ্ক্রিয় হয়ে গেছে তার উপর নজর রাখে। বিরক্ত কর না; কেবল পিজবউনসার ব্যবহার করুন।


4
ভাল, তবে এটি অন্যান্য পিজএডমিন ব্যাককেডকে হত্যা করবে। অতিরিক্ত শর্ত অ্যাপলিকেশন_নাম = '' ব্যবহার করুন
অ্যান্ড্রু সেলিভানভ

4
আমি যদি পিজবাউনার ব্যবহার করি তবে আমি কী পিজি_মিটারমিট_ব্যাকেন্ড চালাতে পারি?
হেনলি চিউ

@ হেনলিচিহু আমি কেন তা দেখছি না, যদিও আমি বিশেষভাবে পরীক্ষা করে দেখিনি।
ক্রেগ রিঞ্জার

4
এটি চালানোর ফলে আমার ওয়াল প্রেরক প্রক্রিয়াটি মেরে ফেলা হয়েছে বলে মনে হচ্ছে
জোসেফ পার্সী

@ ক্রেইগরিঞ্জার এমনকি একটি পিএসকিএল সংযোগকে নিষ্ক্রিয় সংযোগ হিসাবে বিবেচনা করা হয়। এবং কেন একজনকে প্রথমে নিষ্ক্রিয় সংযোগটি বন্ধ করতে হবে। আমার একটি দীর্ঘ চলমান কোড রয়েছে যা পিজির সাথে সংযোগ স্থাপন করে কিছু ডিএমএল ক্রিয়াকলাপ সম্পাদন করে এবং তারপরে সারিটির উপরের বার্তার জন্য অপেক্ষা করে এবং আরও কিছু ডিএমএল অপারেশন সম্পাদন করে। এখন এই সময়ের মধ্যে অর্থাৎ যখন এটি উপরে বর্ণিত কাতারে অপেক্ষা করছে (বার্তার জন্য) তবুও ডাকগুলির সাথে সংযোগটি idle। কেন আমি এটি বন্ধ করব?
বীরেন

73

পোস্টগ্র্যাসকিউএল 9.6 এ, একটি নতুন বিকল্প রয়েছে idle_in_transaction_session_timeoutযা আপনার বর্ণনাকে সম্পূর্ণ করবে। আপনি এটি SETকমান্ড ব্যবহার করে সেট করতে পারেন , যেমন:

SET SESSION idle_in_transaction_session_timeout = '5min';

4
এটি এত সাধারণ কিছু জিজ্ঞাসা করতে চুষতে ব্যর্থ হয় তবে আমি সাধারণভাবে ডেটাবেসগুলিতে একেবারে নতুন - আপনি কীভাবে এই ফাংশনটি ব্যবহার করবেন তার একটি খুব মৌলিক উদাহরণ দিতে পারেন?
এসএজি

পোস্টগ্র্যাস এসকিউএল এর আগের সংস্করণগুলিতে এর মতো কিছু ??
sdsc81

না, অন্যান্য উত্তরের অনুরূপ কিছু পূর্ববর্তী সংস্করণগুলির জন্য প্রয়োজনীয়।
shosti

আপনার কি ডাটাবেসের প্রতিটি পুনঃসূচনাতে এই প্যারামিটারটি সেট করা দরকার? বা একবার করার পরে কি আপনি ভুলে যেতে পারেন? ধন্যবাদ
ফ্রেসকো

4
SET SESSIONএটি কেবলমাত্র বর্তমান সেশনের জন্য (আপনি নতুন সংযোগ খোলার পরে এটি ডিফল্টে ফিরে যাবে)। আপনি উদাহরণস্বরূপ ALTER DATABASE SET idle_in_transaction_session_timeout = '5min'ব্যবহার করে বা কনফিগারেশন ফাইল ব্যবহার করে ( postgresql.org/docs/current/static/config-setting.html দেখুন ) একটি ডাটাবেস স্তরে কনফিগার প্যারামিটার সেট করতে পারেন ।
shosti

22

PostgreSQL 9.1 এ, নিম্নলিখিত প্রশ্নের সাথে নিষ্ক্রিয় সংযোগ রয়েছে। এটি আমাকে সেই পরিস্থিতি থেকে বাঁচতে সাহায্য করেছিল যা ডাটাবেস পুনরায় আরম্ভ করার ক্ষেত্রে প্রয়োজন ran এটি বেশিরভাগ ক্ষেত্রে জেডিবিসি সংযোগগুলি খোলা থাকে এবং সঠিকভাবে বন্ধ হয় না happens

SELECT
   pg_terminate_backend(procpid)
FROM
   pg_stat_activity
WHERE
   current_query = '<IDLE>'
AND
   now() - query_start > '00:10:00';

4
পিজি_টারমিট_ব্যাকেন্ডটি 8.4 থেকে রয়েছে
অ্যান্ড্রু ব্যাংক

8

আপনি যদি পোস্টগ্রিস্কল 9.6+ ব্যবহার করেন তবে আপনার পোস্টগ্রেস্কএল.কনফে আপনি সেট করতে পারেন

idle_in_transaction_session_timeout = 30000 (এমসিকে)


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