সহজতম ক্ষেত্রে, যখন আমরা একটি সারণীতে একটি নতুন সারি সন্নিবেশ করি (এবং লেনদেনটি অঙ্গীকার করে) তখন এটি পরবর্তী সমস্ত লেনদেনের জন্য দৃশ্যমান হবে। xmax
এই উদাহরণে 0 হওয়া দেখুন :
CREATE TABLE vis (
id serial,
is_active boolean
);
INSERT INTO vis (is_active) VALUES (FALSE);
SELECT ctid, xmin, xmax, * FROM vis;
ctid │xmin │ xmax │ id │ is_active
───────┼─────┼──────┼────┼───────────
(0,1) │2699 │ 0 │ 1 │ f
যখন আমরা এটি আপডেট করি (কারণ পতাকাটি FALSE
দুর্ঘটনার দ্বারা সেট করা হয়েছিল), এটি কিছুটা পরিবর্তন করে:
UPDATE vis SET is_active = TRUE;
SELECT ctid, xmin, xmax, * FROM vis;
ctid │ xmin │ xmax │ id │ is_active
──────┼──────┼──────┼────┼───────────
(0,2) │ 2700 │ 0 │ 1 │ t
মতে MVCC মডেল পোস্টগ্রি ব্যবহারসমূহ, একটি নতুন শারীরিক সারি লেখা হয়েছিল এবং পুরানো এক invalidated (এই থেকে দেখা যায় ctid
)। নতুনটি পরবর্তী সমস্ত লেনদেনের জন্য এখনও দৃশ্যমান।
এখন যখন আমরা পিছনে ফিরে যাচ্ছি তখন একটি আকর্ষণীয় বিষয় ঘটেছে UPDATE
:
BEGIN;
UPDATE vis SET is_active = TRUE;
ROLLBACK;
SELECT ctid, xmin, xmax, * FROM vis;
ctid │ xmin │ xmax │ id │ is_active
───────┼──────┼──────┼────┼───────────
(0,2) │ 2700 │ 2702 │ 1 │ t
সারি সংস্করণটি একই থাকে তবে এখন xmax
কিছুতে সেট করা আছে। এটি সত্ত্বেও, পরবর্তী লেনদেনগুলি এটি (অন্যথায় অপরিবর্তিত) সারিটি দেখতে পাবে।
এ সম্পর্কে কিছুটা পড়ার পরে, আপনি সারি দৃশ্যমানতার সম্পর্কে কয়েকটি জিনিস বের করতে পারেন। এখানে দৃশ্যমানতার মানচিত্র রয়েছে , তবে এটি কেবলমাত্র পুরো পৃষ্ঠাটি দৃশ্যমান কিনা তা জানায় - এটি অবশ্যই সারি (টিপল) স্তরে কাজ করে না। তারপরে কমিট লগ (ওরফে clog
) আছে - তবে পোস্টগ্রিজ যদি এটি দেখতে হয় তবে কীভাবে তা নির্ধারণ করবে?
আমি দৃশ্যমানতা কীভাবে কাজ করে তা নির্ধারণের জন্য তথ্যমাস্ক বিটগুলিতে একবার তাকানোর সিদ্ধান্ত নিয়েছি । তাদের দেখতে, সবচেয়ে সহজ উপায় হচ্ছে পেইনস্পেক্ট এক্সটেনশনটি ব্যবহার করা । কোন বিট সেট করা আছে তা জানতে, আমি সেগুলি সংরক্ষণের জন্য একটি টেবিল তৈরি করেছি:
CREATE TABLE infomask (
i_flag text,
i_bits bit(16)
);
INSERT INTO infomask
VALUES
('HEAP_HASNULL', x'0001'::bit(16)),
('HEAP_HASVARWIDTH', x'0002'::bit(16)),
('HEAP_HASEXTERNAL', x'0004'::bit(16)),
('HEAP_HASOID', x'0008'::bit(16)),
('HEAP_XMAX_KEYSHR_LOCK', x'0010'::bit(16)),
('HEAP_COMBOCID', x'0020'::bit(16)),
('HEAP_XMAX_EXCL_LOCK', x'0040'::bit(16)),
('HEAP_XMAX_LOCK_ONLY', x'0080'::bit(16)),
('HEAP_XMIN_COMMITTED', x'0100'::bit(16)),
('HEAP_XMIN_INVALID', x'0200'::bit(16)),
('HEAP_XMAX_COMMITTED', x'0400'::bit(16)),
('HEAP_XMAX_INVALID', x'0800'::bit(16)),
('HEAP_XMAX_IS_MULTI', x'1000'::bit(16)),
('HEAP_UPDATED', x'2000'::bit(16)),
('HEAP_MOVED_OFF', x'4000'::bit(16)),
('HEAP_MOVED_IN', x'8000'::bit(16)),
('HEAP_XACT_MASK', x'FFF0'::bit(16));
তারপরে আমার vis
টেবিলের অভ্যন্তরে কি আছে তা পরীক্ষা করে দেখুন - নোটটি যে pageinspect
স্তূপের শারীরিক সামগ্রীগুলি দেখায়, তাই কেবল দৃশ্যমান সারিগুলিও ফিরে আসে না:
SELECT t_xmin, t_xmax, string_agg(i_flag, ', ') FILTER (WHERE (t_infomask::bit(16) & i_bits)::integer::boolean)
FROM heap_page_items(get_raw_page('vis', 0)),
infomask
GROUP BY t_xmin, t_xmax;
t_xmin │ t_xmax │ string_agg
────────┼────────┼──────────────────────────────────────────────────────
2699 │ 2700 │ HEAP_XMIN_COMMITTED, HEAP_XMAX_COMMITTED
2700 │ 2702 │ HEAP_XMIN_COMMITTED, HEAP_XMAX_INVALID, HEAP_UPDATED
2702 │ 0 │ HEAP_XMIN_INVALID, HEAP_XMAX_INVALID, HEAP_UPDATED
আমি কি উপরে থেকে বুঝতে হয় যে প্রথম সংস্করণ লেনদেন 2699 সঙ্গে জীবন এসেছিলেন, তারপর সফলভাবে নতুন সংস্করণ দ্বারা 2700. প্রতিস্থাপিত
পরেরটাতে, যা 2700 সাল থেকে জীবিত ছিল, একটি ফিরে ঘূর্ণিত ছিল প্রচেষ্টা UPDATE
2702 সালে থেকে দেখা HEAP_XMAX_INVALID
।
শেষটি কখনও সত্যই জন্মগ্রহণ করেনি, যেমনটি দেখানো হয়েছে HEAP_XMIN_INVALID
।
সুতরাং, উপরের দিক থেকে অনুমান করে, প্রথম এবং শেষ কেসটি সুস্পষ্ট - তারা 2703 বা তার বেশি লেনদেনের ক্ষেত্রে আর দৃশ্যমান হবে না।
দ্বিতীয়টি কোথাও সন্ধান করতে হবে - আমি মনে করি এটি কমিট লগ, ওরফে clog
।
সমস্যাগুলি আরও জটিল করার UPDATE
জন্য নিম্নলিখিত ফলাফলগুলির পরবর্তী ফলাফল:
t_xmin │ t_xmax │ string_agg
────────┼────────┼────────────────────────────────────────────────────
2699 │ 2700 │ HEAP_XMIN_COMMITTED, HEAP_XMAX_COMMITTED
2702 │ 0 │ HEAP_XMIN_INVALID, HEAP_XMAX_INVALID, HEAP_UPDATED
2703 │ 0 │ HEAP_XMAX_INVALID, HEAP_UPDATED
2700 │ 2703 │ HEAP_XMIN_COMMITTED, HEAP_UPDATED
এখানে আমি ইতিমধ্যে দুজন প্রার্থীকে দেখতে পাচ্ছি যা দৃশ্যমান হতে পারে। সুতরাং, অবশেষে, এখানে আমার প্রশ্নগুলি:
- আমার অনুমান যে
clog
এই ক্ষেত্রে দৃশ্যমানতা নির্ধারণ করার জন্য স্থান দেখার জন্য এটিই জায়গা? - কোন পতাকা (বা পতাকা সংমিশ্রণ) সিস্টেমকে দেখার জন্য বলে
clog
? - এর ভিতরে কী আছে তা যাচাই করার কোনও উপায় আছে
clog
?clog
পোস্টগ্রিসের পূর্ববর্তী সংস্করণগুলিতে দুর্নীতি সম্পর্কে উল্লেখ রয়েছে এবং একটি ইঙ্গিত রয়েছে যে কেউ ম্যানুয়ালি একটি নকল ফাইল তৈরি করতে পারে। এই টুকরো টুকরো তথ্য এতে অনেক সাহায্য করবে।