পোস্টগ্রিএসকিউএল ডিলিট থেকে ফেলা যায় `ত্রুটি: অদৃশ্য টিপলি মুছতে চেষ্টা করেছে


25

ভূল

অবৈধ টাইমস্ট্যাম্পগুলি সহ টিপলগুলি মুছার চেষ্টা করছে

DELETE FROM comments WHERE date > '1 Jan 9999' OR date < '1 Jan 2000' OR date_found > '1 Jan 9999' OR date_found < '1 Jan 2000';

শেষ হয়

ERROR:  attempted to delete invisible tuple

নেই 2009 থেকে একটি মেইলিং তালিকা সঠিক একই ত্রুটি বার্তা, যেখানে ওপি এটি সংশোধন করা ছিল আলোচনা, কিন্তু আমি এর তিনি তা কীভাবে বা কি এই ত্রুটি নেতৃত্বে থাকতে পারে কোন ব্যাখ্যা খুঁজে।

গুগলে হিট না থাকায় এবং পোস্টগ্রিজ এসকিউএল সম্পর্কে আমার সীমিত জ্ঞানের কারণে আমি অসহায়।

দুর্নীতির কারণ কি

আমার পোস্টগ্র্রেএসকিউএল 9.5.5 সার্ভার রয়েছে ( ~ 4TB ডেটা, সমস্ত ডিফল্ট সেটিংস, আপড মেমরি সীমা বাদে ) ডিবিয়ান 8 এ চলমান রয়েছে, যখন ওএস কার্নেল আতঙ্কিত হয়েছিল - সম্ভবত / dev / md1 পুনরায় নির্মাণের সময় যেখানে অদলবদুটি ছিল। তার আগে, পোস্টগ্রেএসকিউএল 400 গিগাবাইট লগ ফাইলের সাথে প্রায় সমস্ত ডিস্ক স্পেস খেয়ে ফেলেছিল। ওএস আর কখনও বুট হয়নি, ডিস্ক চেকগুলি ঠিক আছে, তাই আমি একটি লাইভসিডি থেকে বুট করেছি এবং প্রতিটি ব্লক ডিভাইসটিকে চিত্রের ক্ষেত্রে ব্যাক আপ করেছি case আমি / dev / md2 থেকে সফলভাবে / ডিরেক্টরি পুনর্নির্মাণ করেছি, fsck একটি পরিষ্কার ফাইল সিস্টেম দেখিয়েছে এবং আমি PGDATA ফোল্ডারটি একটি বাহ্যিক এইচডিডি তে ব্যাক আপ করেছি।

পুনরুদ্ধারের চেষ্টা করার জন্য আমি যা করেছি

আমি এমডি ডিভাইসগুলি ফর্ম্যাট করেছি এবং একটি নতুন পোস্টগ্র্যাস্কেল -9.5 সহ ওএস পুনরায় ইনস্টল করার পরে, আমি পোস্টগ্রাইএসকিউএল সার্ভারটি বন্ধ করে দিয়েছি, পোস্টগ্রিজ ব্যবহারকারীর কাছে পিজিডিটিএ ফোল্ডারটি সরিয়ে নিয়েছি এবং সার্ভারটি শুরু করেছি - সবকিছু ঠিক আছে বলে মনে হয়েছিল, কোনও ত্রুটি নেই।

আমি শুরু করার pg_dumpallসাথে সাথে এটি মারা গেল

Error message from server: ERROR:  timestamp out of range

আমি আপত্তিজনক টিপলগুলি মুছে ফেলার চেষ্টা করেছি, বার বার একই invisible tupleত্রুটিটি শেষ করার জন্য ।

আমি চেষ্টা করেছিলাম

প্রথমে, ক্ষতিগ্রস্ত পৃষ্ঠাগুলির কারণে মুছে ফেলুন অনুসন্ধানগুলি ব্যর্থ হয়েছে, সুতরাং আমি নিম্নলিখিত সেটিংস সেট করেছি:

zero_damaged_pages = on
ignore_system_indexes = on
enable_indexscan = off
enable_bitmapscan = off
enable_indexonlyscan = off

এখন আমি লক্ষ্য করেছি যে আমি যখন আবার একই প্রশ্নগুলি চালাচ্ছি তখন সার্ভার একই পৃষ্ঠাগুলি বারবার জিরোস করে, এর অর্থ কী তা নিশ্চিত নয়:

invalid page in block 92800 of relation base/16385/16443; zeroing out page

আমি অনির্ধারিত ক্রমে অনুসরণ করার চেষ্টা করেছি:

  • pg_resetxlog -D $PGDATA কোনও ত্রুটি বা বার্তা ছাড়াই এটির কাজটি করেছে
  • পিকে সীমাবদ্ধতা সহ সমস্ত সূচক মুছে ফেলা হয়েছে
  • CREATE TABLE aaa AS (SELECT * FROM comments);বিশালাকার করার Segmentation faultউপর

    heap_deform_tuple (tuple=tuple@entry=0x7f0d1be29b08, tupleDesc=tupleDesc@entry=0x7f0d1a35abe0, values=values@entry=0x7ffd57a5beb0, isnull=isnull@entry=0x7ffd57a65af0 "\001\001") এটি পুনরুত্পাদনযোগ্য এবং একটি 9 গিগাবাইট কোর ডাম্প ছেড়ে দেয়।

  • SELECT COUNT(*) from comments;VACUUM comments;সম্পূর্ণ করার অনুমতি দেওয়া হয়েছে, একই কৌশলটি অন্য টেবিলে কাজ করে না।
  • SELECT COUNT(*) from photos;এবং VACUUM photos;এখন মারা যায় ERROR: MultiXactId 302740528 has not been created yet -- apparent wraparound- এটি প্রতিটি টেবিলকে হান্ট করে, যেখানে অন্য ত্রুটিগুলি আর পপ আপ হয় না।

থটস

  • ডিবি প্রচুর ( সম্ভবত ডুপ্লিকেট ) ON CONFLICTক্লোজ দিয়ে লিখেছিল যেVACUUM কার্নেল আতঙ্ক দেখা দিলে ডিবি একটি কাজ করছিল , আমি বিশ্বাস করি এটির কি বাকি আছে যা সমস্যা সৃষ্টি করছে nonexistent MultiXactIdsএবংinvisible tuple
  • 2+ বছরের ব্যবধানে ক্রোলারের সাথে ডেটা সংগ্রহ করা হয়েছিল এবং এর কিছু হারিয়ে আমি পুরোপুরি ঠিক আছি
  • এখন আমি ব্যাকআপ করি
  • টেবিল বা কোনও ট্রিগারগুলির মধ্যে কোনও সম্পর্কযুক্ত বাধা ছিল না

এখানে এখন পর্যন্ত পিজি_কন্ট্রোলডাটা আউটপুট রয়েছে:

pg_control version number:            942
Catalog version number:               201510051
Database system identifier:           6330224129664261958
Database cluster state:               in production
pg_control last modified:             Thu 08 Dec 2016 01:06:22 AM EET
Latest checkpoint location:           1562/8F9F8A8
Prior checkpoint location:            1562/8F7F460
Latest checkpoint's REDO location:    1562/8F9F8A8
Latest checkpoint's REDO WAL file:    000000010000156200000008
Latest checkpoint's TimeLineID:       1
Latest checkpoint's PrevTimeLineID:   1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0/40781255
Latest checkpoint's NextOID:          67798231
Latest checkpoint's NextMultiXactId:  1
Latest checkpoint's NextMultiOffset:  0
Latest checkpoint's oldestXID:        615
Latest checkpoint's oldestXID's DB:   1
Latest checkpoint's oldestActiveXID:  0
Latest checkpoint's oldestMultiXid:   1
Latest checkpoint's oldestMulti's DB: 1
Latest checkpoint's oldestCommitTsXid:0
Latest checkpoint's newestCommitTsXid:0
Time of latest checkpoint:            Thu 08 Dec 2016 01:06:22 AM EET
Fake LSN counter for unlogged rels:   0/1
Minimum recovery ending location:     0/0
Min recovery ending loc's timeline:   0
Backup start location:                0/0
Backup end location:                  0/0
End-of-backup record required:        no
wal_level setting:                    minimal
wal_log_hints setting:                off
max_connections setting:              100
max_worker_processes setting:         8
max_prepared_xacts setting:           0
max_locks_per_xact setting:           64
track_commit_timestamp setting:       off
Maximum data alignment:               8
Database block size:                  8192
Blocks per segment of large relation: 131072
WAL block size:                       8192
Bytes per WAL segment:                16777216
Maximum length of identifiers:        64
Maximum columns in an index:          32
Maximum size of a TOAST chunk:        1996
Size of a large-object chunk:         2048
Date/time type storage:               64-bit integers
Float4 argument passing:              by value
Float8 argument passing:              by value
Data page checksum version:           0

আপডেট

  • ( 9 ডিসেম্বর 2016 ) অস্তিত্বহীন মাল্টিএক্স্যাক্টআইডস সম্পর্কে পড়ার সময় , আমি মনে রেখেছি যে আমার ডাটাবেস ক্র্যাশ হওয়ার মুহুর্তে অপারেটিং লোডের অধীনে ছিল না, তবে এটি একটি ম্যানুয়াল VACUUMঅনুরোধটি প্রক্রিয়া করছিল । আমি বুঝতে পারি যে ডিস্কগুলিতে কেবল 3% স্থান বাকি আছে after আমার /var/logবড় ফাইলগুলির জন্য পরীক্ষা করা উচিত ছিল , তবে আমি ভুলভাবে পোস্টগ্র্যাস এসকিউএলএকে দোষ দিয়েছি এবং চেষ্টা করেছি VACUUM FULL, কেবলমাত্র ডিভাইসে অল্প জায়গার কারণে এটিকে বাতিল করা সন্ধান করতে। সুতরাং আমি সাধারণ ভ্যাকুয়াম শুরু করেছি এবং এটি এ রেখেছি।
  • ( ১৪ ডিসেম্বর ২০১ 2016 ) গিথুব থেকে পোস্টগ্রেএসকিউএল উত্সগুলির একটি 9.5 শাখা ডাউনলোড করে, হিপাম.সি এবং মাল্টিএক্স্যাক্ট.-এর ব্লকগুলি মন্তব্য করেছে এবং আশা করে এটি সংকলন করেছে যে এটি ত্রুটিগুলি ফেলে দেবে না। তবে সার্ভারটি আরম্ভ হবে না, কারণ এটিপিটি থেকে আমার ব্যবহার করা একই পতাকাগুলির সাথে এটি কনফিগার করতে হয়েছিল। এখানে প্রায় 47 টি পতাকা ছিল, যার প্রত্যেকটির অপরিবর্তনীয় নামের সাথে নির্ভরতা প্রয়োজন, তাই আমি এই ধারণাটি ছেড়ে দিলাম।
  • ( 16 ডিসেম্বর 2016 ) প্রাসঙ্গিক পৃষ্ঠাগুলি শূন্য করে অবৈধ টাইমস্ট্যাম্পগুলির সাথে টিপলগুলি থেকে মুক্তি পাওয়ার একটি উপায় আমি পেয়েছি। আমি প্রথমে নিম্নলিখিত বিকল্পগুলি সেট করেছিলাম psql:

    \set FETCH_COUNT 1
    \pset pager off

    আমি তখন করি SELECT ctid, * FROM comments;। এইভাবে ctidকোয়েরিটি মারা যাওয়ার আগে একটি খারাপ টিপলটিকে ছাড়িয়ে যায়। তারপরে আমি সেই পৃষ্ঠাটি শূন্যগুলি পূরণ করতে এগিয়ে dd if=/dev/zero of=/var/lib/postgresql/9.5/main/base/16385/16443 bs=8K seek=92803 count=1 conv=notruncচলেছি : তবে প্রতিটি পৃষ্ঠা, এইভাবে শূন্য হয়, পূর্ববর্তী পৃষ্ঠাটি ভেঙে দেয়, ফলস্বরূপ পৃষ্ঠাটি 16442এখন অবৈধ টাইমস্ট্যাম্পের সাথে একটি টিপল রাখে। এখানে আমি কী ভুল করছি তা নিশ্চিত নয়।

  • ( pg_dump -Fc --table photos vw > photos.bak dece ডিসেম্বর ২০১ 1. ) ১.৩ জিবি ( সম্ভবত ৮০০ গিগাবাইটের বাইরে ) লিখিত হওয়ার পরে বিভাগের ফল্টে ফলাফল চেষ্টা করা হচ্ছে । এখানে সার্ভার লগ আছে:

    2016-12-16 18:48:05 EET [19337-2] LOG:  server process (PID 29088) was terminated by signal 11: Segmentation fault
    2016-12-16 18:48:05 EET [19337-3] DETAIL:  Failed process was running: COPY public.photos (id, owner_id, width, height, text, date, link, thumb, album_id, time_found, user_id, lat, long) TO stdout;
    2016-12-16 18:48:05 EET [19337-4] LOG:  terminating any other active server processes
    2016-12-16 18:48:05 EET [19342-2] WARNING:  terminating connection because of crash of another server process
    2016-12-16 18:48:05 EET [19342-3] DETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
    2016-12-16 18:48:05 EET [19342-4] HINT:  In a moment you should be able to reconnect to the database and repeat your command.
    2016-12-16 18:48:05 EET [19337-5] LOG:  all server processes terminated; reinitializing
    2016-12-16 18:48:06 EET [29135-1] LOG:  database system was interrupted; last known up at 2016-12-14 22:58:59 EET
    2016-12-16 18:48:07 EET [29135-2] LOG:  database system was not properly shut down; automatic recovery in progress
    2016-12-16 18:48:07 EET [29135-3] LOG:  invalid record length at 1562/A302F878
    2016-12-16 18:48:07 EET [29135-4] LOG:  redo is not required
    2016-12-16 18:48:07 EET [29135-5] LOG:  MultiXact member wraparound protections are now enabled
    2016-12-16 18:48:07 EET [19337-6] LOG:  database system is ready to accept connections
    2016-12-16 18:48:07 EET [29139-1] LOG:  autovacuum launcher started

    এখানে একটি ছোট স্ট্যাকট্রেস:

    #0  pglz_decompress (source=source@entry=0x7fbfb6b99b13 "32;00/0ag4d/Jnz\027QI\003Jh3A.jpg", slen=<optimized out>,
        dest=dest@entry=0x7fbf74a0b044 "", rawsize=926905132)
    #1  0x00007fc1bf120c12 in toast_decompress_datum (attr=0x7fbfb6b99b0b)
    #2  0x00007fc1bf423c83 in text_to_cstring (t=0x7fbfb6b99b0b)

    কীভাবে এটিকে ঘিরে কাজ করা যায় তা আমার কোনও ধারণা নেই।

  • ( ২৯ ডিসেম্বর ২০১ 2016 ) আমি একটি ইউটিলিটি লিখেছি যা SELECT * FROM tablename LIMIT 10000 OFFSET 0অফসেটকে বাড়িয়ে দেয় এবং মৃত টিপলসকে সংকুচিত করে দেয় এবং এটি আমার স্থানীয় মেশিনে টিপলস ব্যতীত সফলভাবে ডুপ্লিকেট করা হয়েছে ( আমি আশা করি কেবলমাত্র আমি নিজেই দূষিত হয়েছি)। সার্ভারটি পুনরায় চালু হয়ে যায় কিনা এটিও অপেক্ষা করার কথা। তবে আমার রেডে আমার পর্যাপ্ত জায়গা নেই, এবং আমি slowdiskএকটি 8 টিবি এইচডিডি তে একটি টেবিল স্পেস তৈরি করেছি । আমি যখন চেষ্টা করার চেষ্টা করি তখন CREATE DATABASE vwslow WITH TABLESPACE slowdiskএটি ত্রুটিগুলি সহ করে না:

    2016-12-29 02:34:13 EET [29983-1] LOG:  request to flush past end of generated WAL; request 950412DE/114D59, currpos 1562/A3030C70
    2016-12-29 02:34:13 EET [29983-2] CONTEXT:  writing block 58368001 of relation base/16385/16473
    2016-12-29 02:34:13 EET [29983-3] ERROR:  xlog flush request 950412DE/114D59 is not satisfied --- flushed only to 1562/A3030C70
    2016-12-29 02:34:13 EET [29983-4] CONTEXT:  writing block 58368001 of relation base/16385/16473
    2016-12-29 02:34:13 EET [30005-44212] postgres@vw ERROR:  checkpoint request failed
    2016-12-29 02:34:13 EET [30005-44213] postgres@vw HINT:  Consult recent messages in the server log for details.
    2016-12-29 02:34:13 EET [30005-44214] postgres@vw STATEMENT:  CREATE DATABASE vwslow WITH TABLESPACE slowdisk;

    ম্যানুয়াল CHECKPOINTএকই ত্রুটিগুলির ফলস্বরূপ।

    একটি সার্ভার পুনঃসূচনা চেকপয়েন্টের ত্রুটিটিকে দূরে সরিয়ে দিয়েছে এবং আমাকে আমার সরঞ্জাম চালাতে দেয়। আমার প্রশ্নের উত্তর দেবে এবং কোডটি যদি কাজ করে তবে তা প্রকাশ করবে।


এটি পড়ুন এবং অন্য কিছু করার চেষ্টা করার আগে এটিতে কাজ করুন: wiki.postgresql.org/wiki/ দুর্নীতি । যদিও দেখে মনে হচ্ছে কিছুটা দেরি হয়ে গেছে। আমি এখানে দৃ cause়রূপে ডিস্ক ইস্যু / RAID পুনর্নির্মাণের মূল কারণ হিসাবে সন্দেহ করি।
ক্রেগ রিঞ্জার

আপনি রিসেটলগ ইত্যাদির আগে ডেটা ডিরেক্টরিটির একটি অনুলিপি রেখেছিলেন?
ক্রেগ রিঞ্জার

ডাটাডির নিজেই নয়, আমি কাঁচা ডিস্ক চিত্রগুলি যেখানে নিরাপদ সেগুলি অফসাইটে সরিয়ে নিয়েছি। তারা ভাল, কারণ আমি তাদের থেকে আমার রেডটি পুনর্নির্মাণ করেছি।
কাই

1
@ ক্রেইগ্রারঞ্জার আপনি কি এই বিষয়ে একটি উত্তর লিখবেন? আপনি সম্ভবত পোস্টগ্র্রেস ট্যাগে উত্তর দেওয়া কয়েকজন ব্যবহারকারীর মধ্যে একজন এবং ইস্যুতে দরকারী কিছু বলতে পারেন। মনে হচ্ছে খুব কম কাজ করা যেতে পারে।
ypercubeᵀᴹ

4
আপনি এইটির উত্তর খুঁজে পাচ্ছেন না। এরউইন আপনাকে সাহায্য করতে সক্ষম হতে পারে। এর থেকে লজ্জাজনক, ডেভিড ফেটার, বা irc.freenode.net/#postgresql এ অ্যান্ড্রুএসডাব্লু / রোডিয়ামডোডের সন্ধান করুন। তারা (ডিবিএএস) তারা কী আবিষ্কার করে তা আমাদের জানান। আমার অনুভূতি আছে যে এটি অর্থ প্রদানের পরামর্শমূলক কাজ হতে চলেছে যা আপনার ডেটাবেজে সম্পূর্ণ অ্যাক্সেস প্রয়োজন। বিকাশকারী.পোস্টগ্রেসক্ল.আর.এল / অ্যাডুনস্তান যুক্তডিন.ইন /ডাভিডফেটর those লোকদের সাথে বা তাদের সংস্থাগুলির সাথে আমার কোনও সম্পর্ক নেই। তবে, কেবলমাত্র সেই ব্যক্তিদেরই আমি ব্যক্তিগতভাবে সেই ছিনতাই থেকে বেরিয়ে আসার জন্য বিশ্বাস করব।
ইভান ক্যারল

উত্তর:


2

ঠিক আছে, আমি পুনরুদ্ধার প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে পরিচালনা করতে পেরেছি SELECTএবং INSERT INTOরেঞ্জগুলি এড়িয়ে চলেছি এবং সার্ভারের ক্র্যাশ হয়েছে কিনা তা অপেক্ষা করছি। আমি প্রথমে এটিকে নোডে কোড করেছি - এটি থেকে অবিস্মৃত ডেটা ছিঁড়ে গেছে comments, এবং এখনও চলছে।

গতকাল আমি গোলং চেষ্টা করার সিদ্ধান্ত নিয়েছি, এবং এখানে গো কোড সহ একটি রেপো রয়েছে: https://github.com/kaivi/pg_ripper আমি খুব শীঘ্রই এটি আপডেট করব যাতে এটি খারাপ খারাপ টিপলগুলি ঘিরে কাজ করে, এবং পুরোটা ছেড়ে দেয় না একটি ধারণ করে।

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