কোনও সারণির শেষ পরিবর্তিত সময়ের কোনও নির্ভরযোগ্য, রচয়িতা রেকর্ড নেই। বিভিন্ন কারণে রিফ্লাইনেড ব্যবহার করা ভুল:
লেখাগুলি প্রথমে রাইটিং-হেড লগ (ওয়াল) এ রেকর্ড করা হয়, তারপরে অলসভাবে গাদা (টেবিল ফাইল) এ রেকর্ড করা হয় । রেকর্ডটি একবার ওএল-তে থাকলে, পিজি এটি গাদা লিখতে ছুটে যায় না এবং পরবর্তী সিস্টেমের চেকপয়েন্ট পর্যন্ত এটি লেখাও হতে পারে না;
বড় টেবিলগুলিতে একাধিক কাঁটাচামচ রয়েছে, আপনাকে সমস্ত কাঁটাচামচ পরীক্ষা করতে হবে এবং নতুন টাইমস্ট্যাম্প বাছাই করতে হবে;
কোনও সাধারণ SELECT
ইঙ্গিত-বিট সেটিংয়ের কারণে অন্তর্নিহিত টেবিলটিতে লেখার ক্রিয়াকলাপ উত্পন্ন করতে পারে;
অটোভ্যাকম এবং অন্যান্য রক্ষণাবেক্ষণ যা ব্যবহারকারীর দৃশ্যমান ডেটা পরিবর্তন করে না এখনও সম্পর্ক ফাইলগুলিকে সংশোধন করে;
কিছু ক্রিয়াকলাপ, যেমন vaccum full
, রিফ্লেইনডকে প্রতিস্থাপন করবে। আপনি যদি উপযুক্ত লক না নিয়ে একযোগে এটি দেখার চেষ্টা করছেন তবে আপনি যেখানে আশা করছেন তা তা নাও হতে পারে।
কয়েকটি বিকল্প
আপনার যদি নির্ভরযোগ্যতার প্রয়োজন না হয় তবে আপনি সম্ভাব্যভাবে তথ্যটি ইন pg_stat_database
এবং ব্যবহার করতে পারেন pg_stat_all_tables
। এগুলি আপনাকে সর্বশেষ পরিসংখ্যান পুনরায় সেট করার সময় দিতে পারে এবং শেষ পরিসংখ্যান পুনরায় সেট করার পরে ক্রিয়াকলাপের পরিসংখ্যান । এটি আপনাকে জানায় না যে সর্বাধিক সাম্প্রতিক ক্রিয়াকলাপটি কখন হয়েছিল, কেবলমাত্র এটি ছিল শেষ পরিসংখ্যানগুলি পুনরায় সেট করার পরে, এবং সেই পরিসংখ্যান পুনরায় সেট হওয়ার আগে কী হয়েছিল সে সম্পর্কে কোনও তথ্য নেই। সুতরাং এটি সীমাবদ্ধ তবে এটি ইতিমধ্যে রয়েছে।
এটি নির্ভরযোগ্যভাবে করার জন্য একটি বিকল্প হ'ল প্রতিটি টেবিলের জন্য শেষ-সংশোধিত সময় সমেত একটি টেবিল আপডেট করতে একটি ট্রিগার ব্যবহার করা। সচেতন থাকুন যে এটি করার ফলে টেবিলে সমস্ত লেখাগুলিকে সিরিয়ালাইজ করা হবে , সম্মতিটি নষ্ট হবে। এটি প্রতিটি লেনদেনে মোটামুটি ওভারহেড যুক্ত করবে। আমি এটি সুপারিশ না।
কিছুটা কম ভয়ঙ্কর বিকল্প হ'ল ব্যবহার করা LISTEN
এবং NOTIFY
। একটি বহিরাগত ডেমন প্রক্রিয়া পোস্টগ্রেএসকিউএল এবং LISTEN
ইভেন্টগুলির জন্য সংযুক্ত করুন । টেবিল পরিবর্তিত হলে, ON INSERT OR UPDATE OR DELETE
পাঠানোর জন্য NOTIFY
লোড হিসাবে টেবিলের ওড সহ কোনও টেবিল পরিবর্তিত হলে ট্রিগারগুলি প্রেরণে ব্যবহার করুন । লেনদেনের সময় এইগুলি পাঠানো হয়। আপনার ডিমন পরিবর্তন নোটিফিকেশন সংগ্রহ করতে এবং অলসভাবে এগুলি আবার ডাটাবেসের কোনও টেবিলে লিখতে পারে। যদি সিস্টেমটি ক্র্যাশ হয়ে যায় তবে আপনি আপনার সর্বাধিক সাম্প্রতিক পরিবর্তনের রেকর্ডটি হারাবেন, তবে এটি ঠিক আছে, আপনি যদি ক্র্যাশের পরে শুরু করেন তবে সমস্ত টেবিলকে কেবলমাত্র সংশোধিত হিসাবে বিবেচনা করবেন।
সম্মতিযুক্ত সমস্যাগুলির সবচেয়ে খারাপ সমস্যা এড়াতে আপনি পরিবর্তনের before insert or update or delete or truncate on tablename for each statement execute
জন্য প্যারামিটার হিসাবে সম্পর্কটিকে সাধারণ হিসাবে গ্রহণ করে ট্রিগার ব্যবহার করে পরিবর্তনের টাইমস্ট্যাম্পগুলি লগ করতে পারেন। এটি (relation_oid, timestamp)
পরিবর্তন-লগিং টেবিলের মধ্যে একটি জুড়ি .োকাবে। তারপরে আপনার একটি পৃথক সংযোগে সহায়তার প্রক্রিয়া রয়েছে, বা আপনার অ্যাপ্লিকেশন দ্বারা পর্যায়ক্রমে ডাকা হয়, সর্বশেষতম তথ্যের জন্য সেই টেবিলটি একত্রিত করুন, এটিকে সাম্প্রতিক পরিবর্তনের সংক্ষিপ্ত তালিকায় একীভূত করুন এবং লগ টেবিলটি কেটে ফেলুন। শ্রবণ / বিজ্ঞাপিত পদ্ধতির মাধ্যমে এটির একমাত্র সুবিধা হ'ল এটি ক্র্যাশ সম্পর্কিত তথ্য হারাবে না - তবে এটি খুব কম দক্ষও।
আরেকটি পদ্ধতির একটি সি এক্সটেনশন ফাংশন লিখতে হতে পারে ব্যবহারসমূহ (যেমন) ProcessUtility_hook
, ExecutorRun_hook
ইত্যাদি ফাঁদ টেবিল পরিবর্তন এবং প্রখর রৌদ্রে আপডেট পরিসংখ্যান করতে। এটি কতটা বাস্তব হবে তা দেখার জন্য আমি তাকাতে পারি নি; উত্সে বিভিন্ন _ হুক বিকল্পগুলি একবার দেখুন।
সর্বোত্তম উপায় হ'ল এই তথ্য রেকর্ড করার জন্য পরিসংখ্যান কোডটি প্যাচ করা এবং মূল অন্তর্ভুক্তির জন্য পোস্টগ্র্রেএসকিউএলে একটি প্যাচ জমা দেওয়া। শুধু কোড লিখে শুরু করবেন না; হ্যাকারদের উপর আপনার ধারণাটি উত্থাপন করুন একবার আপনি এটির জন্য একটি ভাল সংজ্ঞায়িত উপায় থাকার জন্য যথেষ্ট ভেবে দেখেছেন (উদাহরণস্বরূপ কোডটি পড়া শুরু করুন, "আমি কীভাবে করব ..." জিজ্ঞাসা করে পোস্ট করবেন না)। pg_stat_...
এটিতে সর্বশেষ আপডেট হওয়া সময়গুলি যোগ করা ভাল হতে পারে , তবে আপনাকে সম্প্রদায়টি বোঝাতে হবে যে এটি ওভারহেডের পক্ষে মূল্যবান ছিল বা এটি বিকল্পভাবে ট্র্যাক করার একটি উপায় সরবরাহ করতে পারে - এবং আপনাকে পরিসংখ্যানগুলি রাখতে কোড লিখতে হবে এবং একটি প্যাচ জমা দিন , কারণ এই বৈশিষ্ট্যটি কেবল যারাই চায় এটি নিয়ে বিরক্ত হয়।
আমি এটা কিভাবে করব
যদি আমার এটি করতে হয়, এবং এটি সঠিকভাবে করার জন্য কোনও প্যাচ লেখার সময় না পেয়ে আমি সম্ভবত উপরে বর্ণিত শ্রবণ / বিজ্ঞপ্তিটি ব্যবহার করব।
PostgreSQL 9.5 কমিট টাইমস্ট্যাম্পগুলির জন্য আপডেট
আপডেট : পোস্টগ্রিসকিউএল 9.5 এর টাইমস্ট্যাম্প রয়েছে । আপনি যদি তাদের মধ্যে সক্রিয় postgresql.conf
(এবং অতীতে খুবই করেছিলেন), আপনি পরীক্ষা করতে পারবেন সর্বশ্রেষ্ঠ সঙ্গে সারিতে টাইমস্ট্যাম্প কমিট xmin
করতে আনুমানিক সর্বশেষ সংশোধিত সময়। এটি কেবলমাত্র একটি আনুমানিক কারণ কারণ সর্বাধিক সাম্প্রতিক সারিগুলি মুছে ফেলা হলে সেগুলি গণনা করা হবে না।
এছাড়াও, প্রতিশ্রুতিবদ্ধ টাইমস্ট্যাম্প রেকর্ডগুলি কেবলমাত্র একটি সীমিত সময়ের জন্য রাখা হয়। সুতরাং যদি আপনি যদি বলতে চান যে কোনও টেবিল যা খুব বেশি সংশোধিত হয় না তখন উত্তরটি কার্যকরভাবে "ডুনো, কিছুক্ষণ আগে" হয়ে যাবে।