এই ব্লগ পোস্টটি এসকিউএল কোয়ারেন্টাইনের ধারণার সাথে পরিচয় করিয়ে দেয়। Oracle® রিসোর্স ম্যানেজার ব্যবহার করে, আপনি অন্যদের মধ্যে CPU এবং I/O-এর মতো সংস্থানগুলির ব্যবহার নিয়ন্ত্রণ এবং সীমিত করতে পারেন। সবচেয়ে মজার তথ্য হল যে আপনি যেকোন দীর্ঘ-চলমান প্রশ্নগুলির সম্পাদন রোধ করতে পারেন যা একটি সংজ্ঞায়িত থ্রেশহোল্ড অতিক্রম করে৷
এসকিউএল কোয়ারেন্টাইন কি?
কোয়ারেন্টাইন মানে আইসোলেশন। SQL কোয়ারেন্টাইন একটি সংস্করণ 19c বৈশিষ্ট্য যা আপনি পলাতক প্রশ্নের ওভারহেড দূর করতে ব্যবহার করতে পারেন। পলাতক ক্যোয়ারীগুলি হল যেগুলি রিসোর্স ম্যানেজার দ্বারা শেষ হয়ে যায় কারণ সেগুলি একটি সংস্থান বা রানটাইম সীমা অতিক্রম করে এবং প্রচুর সংস্থান, CPU এবং IO ব্যবহার করে৷
এই বৈশিষ্ট্যটি শুধুমাত্র Exadata (Oracle Database Enterprise Edition on Engineered Systems) এবং DBCS/ExaCS (Oracle Database Exadata Cloud Service) এর জন্য উপলব্ধ। এটি পরীক্ষা করার জন্য, আমি আন্ডারস্কোর প্যারামিটার সেট করেছি এবং নিম্নলিখিত কমান্ড ব্যবহার করে ডাটাবেস বাউন্স করেছি:
Alter system set"_exadata_feature_on"=true scope=spfile;
দীর্ঘদিন ধরে চলমান প্রশ্নগুলি সম্পর্কে কী?
ডেটাবেস রিসোর্স ম্যানেজার (DBRM) হল একটি ব্যাকগ্রাউন্ড প্রসেস যা আপনাকে একটি এসকিউএল স্টেটমেন্ট বন্ধ করতে দেয় যা IO এবং CPU-এর মতো নির্দিষ্ট রিসোর্স ইউটিলাইজেশন থ্রেশহোল্ড অতিক্রম করে। এটিও যেকোন প্রশ্ন শেষ করতে পারে যা সর্বোচ্চ রান-টাইম থ্রেশহোল্ড অতিক্রম করে৷
যেকোন চিহ্নিত এসকিউএল এক্সিকিউশন প্ল্যান এবং এসকিউএল স্টেটমেন্ট যা সীমা অতিক্রম করে তাকে কোয়ারেন্টাইন করা হয়, যা বোঝায় যে একই এসকিউএল আবার চালানো হলে, একই এক্সিকিউশন প্ল্যান ব্যবহার করে, এসকিউএল স্টেটমেন্ট বন্ধ হয়ে যাবে এবং নিম্নলিখিত ত্রুটিটি ফ্ল্যাশ করবে:
error: ORA-56955: quarantined plan used.
যখন এই ত্রুটিগুলি ঘটে, তখন অবজেক্ট কোয়ারেন্টাইন সেই বস্তুটিকে বিচ্ছিন্ন করে যা ত্রুটি সৃষ্টি করে এবং তারপরে ডাটাবেসের বাকি অংশে এর প্রভাব দেখতে এটি পর্যবেক্ষণ করে।
আমি টেবিল এবং সূচী উল্লেখ করছি না কিন্তু সেশন, প্রসেস, SGA লেনদেন এবং একটি লাইব্রেরি ক্যাশে সহ ওরাকল কোয়ারেন্টাইন করতে পারে এমন বস্তুর কথা বলছি।
আপনি এখন কোনো SQL কোয়েরি বন্ধ বা বাতিল করতে পারেন যা নির্দিষ্ট সময়ের চেয়ে বেশি চলে, যেমন নিম্নলিখিত উদাহরণ:
চিত্র 1:রানওয়ে এসকিউএল স্টেটমেন্ট চিত্রের উৎস:https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf
বিচ্ছিন্ন বস্তু সম্পর্কে জানুন
https://dbaparadise.com/2020/01/everything-you-need-to-know-about-quarantined-objects/ অনুসারে, আপনি V$QUARANTINEকে জিজ্ঞাসা করতে পারেন> এবংV$QUARANTINE_SUMMARY ভিউ, যা আপনাকে বস্তুর ধরন, বস্তুর মেমরি ঠিকানা, প্রকৃত ORA- ত্রুটি এবং ত্রুটির তারিখ ও সময় বলে।
নিম্নলিখিত উদাহরণে দেখানো হয়েছে, আপনি অনুমান করতে পারেন যে সার্ভারে সিপিইউ ব্যবহার চালানোর সময় পলাতক প্রশ্নের প্রতিক্রিয়ার মতো দেখায়। আমরা দেখতে পাচ্ছি তিনটি প্রশ্ন একসাথে চলছে, CPU এর ক্ষমতার প্রায় 100% ব্যবহার করছে।
চিত্র 2:Runaway SQL দ্বারা ব্যবহৃত CPU চিত্রের উৎস:https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf
SQL কোয়ারেন্টাইন
পলাতক প্রশ্নের ওভারহেড দূর করতে আপনি SQL কোয়ারেন্টাইন ব্যবহার করতে পারেন। যখন রিসোর্স ম্যানেজার একটি এসকিউএল স্টেটমেন্টকে রিসোর্স বা রান-টাইম সীমা অতিক্রম করে শনাক্ত করে, তখন স্টেটমেন্টের দ্বারা ব্যবহৃত SQL এক্সিকিউশন প্ল্যান কোয়ারেন্টাইন হয়ে যায়।
যদি একই SQL স্টেটমেন্ট একই SQL প্ল্যান ব্যবহার করে সঞ্চালিত হয়, তাহলে তা অবিলম্বে বন্ধ হয়ে যায়। এটি উল্লেখযোগ্যভাবে সিস্টেম রিসোর্স ব্যবহার কমাতে সাহায্য করে। নিম্নোক্ত চিত্রে, আপনি যখন কয়েকটি প্রশ্ন সম্পাদন করে তখন উচ্চ ব্যবহার দেখতে পারেন। যাইহোক, মৃত্যুদন্ড কার্যকর করার আগে বন্ধ করে দিয়ে, কোয়ারেন্টাইনে থাকার পরে তারা আর সিস্টেম রিসোর্স ব্যবহার করে না।
চিত্র 3:SQL কোয়ারেন্টাইন দ্বারা সংরক্ষিত CPU চিত্রের উৎস:https://www.oracle.com/technetwork/database/bi-datawarehousing/twp-optimizer-with-oracledb-19c-5324206.pdf
ক্যারান্টাইন বৈশিষ্ট্য ব্যবহার করার পদক্ষেপগুলি
আসুন বৈশিষ্ট্যটি এবং এটি কীভাবে কাজ করে তা পরীক্ষা করে দেখি।
প্রথমত, আপনাকে ডাটাবেস সেট আপ করতে হবে যেহেতু আপনি Exadata এ কাজ করছেন।
alter system set "_exadata_feature_on"=true scope=spfile;
shutdown immediate;
startup;
তারপরে, রিসোর্স ম্যানেজার সেটআপ করার জন্য আপনাকে নিম্নলিখিত ধাপগুলি সম্পূর্ণ করতে হবে:
-
একটি মুলতুবি এলাকা তৈরি করা হচ্ছে:
begin dbms_resource_manager.create_pending_area(); end; /
-
এক বা একাধিক সংস্থান ভোক্তা গোষ্ঠী তৈরি করুন:
begin dbms_resource_manager.create_consumer_group(CONSUMER_GROUP=>'. SQL_LIMIT',COMMENT=>'consumer group'); end; /
-
সম্পদ পরিকল্পনা তৈরি করুন:
begin dbms_resource_manager.set_consumer_group_mapping(attribute => 'ORACLE_USER',value => 'DBA1',consumer_group =>'SQL_LIMIT' ); dbms_resource_manager.create_plan(PLAN=> 'NEW_PLAN',COMMENT=>'Kill statement after exceeding total execution time'); end; /
-
সম্পদ পরিকল্পনা নির্দেশাবলী তৈরি করুন. ডিফল্টরূপে CANCEL_SQL গ্রুপটি ইতিমধ্যেই বিদ্যমান:
begin dbms_resource_manager.create_plan_directive( plan => 'NEW_PLAN', group_or_subplan => 'SQL_LIMIT', comment => 'Kill statement after exceeding total execution time', switch_group=>'CANCEL_SQL', switch_time => 10, switch_estimate=>false); end; / begin dbms_resource_manager.create_plan_directive(PLAN=> 'NEW_PLAN', GROUP_OR_SUBPLAN=>'OTHER_GROUPS',COMMENT=>'leave others alone', CPU_P1=>100 ); end; /
-
প্ল্যান, ভোক্তা গোষ্ঠী এবং নির্দেশাবলীর জন্য মুলতুবি এলাকা যাচাই করুন এবং জমা দিন:
begin dbms_resource_manager.validate_pending_area(); end; / begin dbms_resource_manager.submit_pending_area(); end; /
এখানে আপনাকে অনুদান বরাদ্দ করতে হবে এবং ব্যবহারকারীদের ভোক্তা গোষ্ঠী বরাদ্দ করতে হবে।
-
বিশেষাধিকার, ভূমিকা এবং নির্ধারিত ব্যবহারকারীদের জন্য একটি মুলতুবি এলাকা তৈরি করুন:
begin dbms_resource_manager.create_pending_area(); end; /
-
রিসোর্স ভোক্তা গোষ্ঠীর জন্য ব্যবহারকারী বা ভূমিকার জন্য সুইচ সুবিধা মঞ্জুর করুন।
begin dbms_resource_manager_privs.grant_switch_consumer_group('DBA1','SQL_LIMIT',false); end; /
-
রিসোর্স কনজিউমার গ্রুপে ব্যবহারকারীদের বরাদ্দ করুন।
begin dbms_resource_manager.set_initial_consumer_group('DBA1','SQL_LIMIT'); end; /
-
মুলতুবি থাকা এলাকাগুলিকে যাচাই করুন এবং জমা দিন৷
৷begin dbms_resource_manager.validate_pending_area(); end; / begin dbms_resource_manager.submit_pending_area(); end; /
-
এখন, আপনাকে প্ল্যান আপডেট করতে হবে এবং আবার পেন্ডিং এরিয়া জমা দিতে হবে।
begin dbms_resource_manager.clear_pending_area; dbms_resource_manager_create_pending_area; end; / begin dbms_resource_manager.update_plan_directive(plan=>'NEW_PLAN',group_or_subplan=>'SQL_LIMIT',new_switch_elapsed_time=>10, new_switch_for_call=>TRUE,new_switch_group=>'CANCEL_SQL'); end; / begin dbms_resource_manager.validate_pending_area(); dbms_resource_manager.submit_pending_area; end; /
পরবর্তী ধাপগুলি
৷পূর্ববর্তী ধাপগুলি রিসোর্স ম্যানেজার সেটআপ সম্পূর্ণ করে। সেগুলি সম্পূর্ণ করার পরে, আপনাকে যা করতে হবে তা হল এই পরিকল্পনাটি একটি উদাহরণে বরাদ্দ করা:
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN=NEW_PLAN;
DBA1 ব্যবহারকারীর সাথে লগ ইন করুন এবং রিসোর্স প্ল্যানে সংজ্ঞায়িত 10 সেকেন্ডের অতিবাহিত সময়ের থ্রেশহোল্ড অতিক্রম করবে এমন একটি প্রশ্ন জারি করুন৷
আপনাকে অবশ্যই DBA1 ব্যবহারকারী হিসাবে বিবৃতিটি কার্যকর করতে হবে এবং DBA1-এর অবশ্যই DBA ভিউতে অ্যাক্সেস থাকতে হবে।
select a.owner_name,b.product_name,c.location,d.country_code
from import_pr_table a, item_table b, locate_dealer_table c,country_table d;
ERROR at line 1:
ORA-00040: active time limit exceeded - call aborted
লক্ষ্য করুন যে এই ক্ষেত্রে, রিসোর্স ম্যানেজার একটি ORA-00040
দিয়ে এক্সিকিউশন বন্ধ করে দিয়েছে ত্রুটি৷
আপনি বিবৃতিটির SQL_ID খুঁজে পেতে পারেন? এটি হল 3hdkutq4krg4c
.
এসকিউএল কোয়ারেন্টাইন তৈরি করুন
আপনি DBMS_SQLQ ব্যবহার করতে পারেন৷ একটি SQL স্টেটমেন্টের এক্সিকিউশন প্ল্যানের জন্য কোয়ারেন্টাইন কনফিগারেশন তৈরি করার জন্য প্যাকেজ যা কোয়ারেন্টাইন করা দরকার।
আপনি SQL পাঠ্য বা বিবৃতিটির SQL_ID ব্যবহার করতে পারেন কোয়ারেন্টাইন করার জন্য, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
CREATE_QUARANTINE_BY_SQL_ID
or
CREATE_QUARANTINE_BY_SQL_TEXT
DECLARE
quarantine_sql VARCHAR2(30);
BEGIN
quarantine_sql := DBMS_SQLQ.CREATE_QUARANTINE_BY_SQL_ID(SQL_ID => '3hdkutq4krg4c');
END;
/
আপনি এই কোয়ারেন্টাইন কনফিগারেশন তৈরি করার পরে, আপনি DBMS_SQLQ.ALTER_QUARANTINE ব্যবহার করে কোয়ারেন্টাইন থ্রেশহোল্ড নির্দিষ্ট করতে পারেন পদ্ধতি।
BEGIN
DBMS_SQLQ.ALTER_QUARANTINE(
QUARANTINE_NAME => 'SQL_QUARANTINE_3hdkutq4krg4c',
PARAMETER_NAME => 'ELAPSED_TIME',
PARAMETER_VALUE => '10');
END;
/
আপনি এখন DBA_SQL_QUARANTINE প্রশ্ন করতে পারেন৷ কোন SQL স্টেটমেন্ট কোয়ারেন্টাইন করা হয়েছে তা দেখতে দেখুন।
এসকিউএল কোয়ারেন্টাইনের জায়গায়, আপনি একই SQL স্টেটমেন্ট চালানোর চেষ্টা করলে এটি কার্যকর হয় না।
select a.owner_name,b.product_name,c.location,d.country_code from import_pr_table a, item_table b, locate_dealer_table c,country_table d;
ERROR at line 1:
ORA-56955: quarantined plan used
পূর্ববর্তী ত্রুটি বার্তাটি বলে যে এই বিবৃতিটির জন্য ব্যবহৃত পরিকল্পনাটি অ্যাকোয়ারেন্টাইন পরিকল্পনার অংশ। এটি কোয়েরিটি বাতিল করেছে কারণ এটি থ্রেশহোল্ড সীমা অতিক্রম করেছে৷
৷যদি আপনি V$SQL চেক করেন দেখুন, আপনি দুটি নতুন কলাম দেখতে পাচ্ছেন:sql_quarantine এবংএড়িয়ে যাওয়া_এক্সিকিউশন :
select sql_quarantine,avoided_executions from v$sql where sql_id='3hdkutq4krg4c';
SQL> select sql_quarantine,avoided_executions
2 from v$sql where sql_id='3hdkutq4krg4c';
SQL_QUARANTINE AVOIDED_EXECUTIONS
--------------- ---------------
SQL_QUARANTINE_3hdkutq4krg4c
1
উপসংহার
SQL কোয়ারেন্টাইন বৈশিষ্ট্যটি কর্মক্ষমতা উন্নত করতে সাহায্য করে কারণ এটি একটি ব্যয়বহুল, কোয়ারেন্টাইন করা SQL স্টেটমেন্টের ভবিষ্যৎ সম্পাদনকে বাধা দেয়।
কোনো মন্তব্য করতে বা প্রশ্ন জিজ্ঞাসা করতে প্রতিক্রিয়া ট্যাব ব্যবহার করুন। এছাড়াও আপনিসেলস চ্যাট এ ক্লিক করতে পারেন৷ এখন চ্যাট করতে এবং কথোপকথন শুরু করতে।