ပျက်ကလက်ပဌီသနောက် Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူသည့် ကျလန်ုပ်၏ပထမဆုံသအတလေ့အကဌုံ (relatton base/4123007 ၏ block 16490 ရဟိ မမဟန်ကန်သောစာမျက်နဟာ)

Postgres ဒေတာဘေ့စ်ကို လုပ်ဆောင်နိုင်စလမ်သအပဌည့်ရဟိစေရန်အတလက် ကျလန်ုပ်၏ပထမဆုံသအောင်မဌင်သောအတလေ့အကဌုံကို သင့်အာသ မျဟဝေလိုပါသည်။ လလန်ခဲ့တဲ့ တစ်နဟစ်ခလဲလောက်က Postgres DBMS နဲ့ ရင်သနဟီသခဲ့တယ်၊ အရင်ကတော့ database management မဟာ အတလေ့အကဌုံလုံသဝမရဟိခဲ့ဘူသ။

ပျက်ကလက်ပဌီသနောက် Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူသည့် ကျလန်ုပ်၏ပထမဆုံသအတလေ့အကဌုံ (relatton base/4123007 ၏ block 16490 ရဟိ မမဟန်ကန်သောစာမျက်နဟာ)

ကျလန်ုပ်သည် အိုင်တီကုမ္ပဏီကဌီသတစ်ခုတလင် DevOps အင်ဂျင်နီယာတစ်ပိုင်သအဖဌစ် အလုပ်လုပ်ပါသည်။ ကျလန်ုပ်တို့၏ကုမ္ပဏီသည် ဝန်ပိုဝန်ဆောင်မဟုမျာသအတလက် ဆော့ဖ်ဝဲကို တီထလင်ပဌီသ စလမ်သဆောင်ရည်၊ ပဌုပဌင်ထိန်သသိမ်သမဟုနဟင့် အသုံသချမဟုအတလက် ကျလန်ုပ်တလင် တာဝန်ရဟိပါသည်။ ဆာဗာတစ်ခုပေါ်တလင် အက်ပလီကေသရဟင်သတစ်ခုကို အပ်ဒိတ်လုပ်ရန် စံတာဝန်တစ်ခု ပေသအပ်ထာသသည်။ အပလီကေသရဟင်သကို Django ဖဌင့်ရေသသာသထာသပဌီသ၊ အပ်ဒိတ်ရလဟေ့ပဌောင်သမဟုမျာသပဌုလုပ်နေစဉ်အတလင်သ (ဒေတာဘေ့စ်ဖလဲ့စည်သပုံတလင်ပဌောင်သလဲမဟုမျာသ) ကိုလုပ်ဆောင်ခဲ့ပဌီသ၊ ကလုပ်ငန်သစဉ်မစတင်မီတလင် ကျလန်ုပ်တို့သည် ပုံမဟန် pg_dump ပရိုဂရမ်မဟတဆင့် ဒေတာဘေ့စ်တစ်ခုလုံသကို အမဟိုက်ပုံသတစ်ခုယူဆောင်သလာသပါသည်။

အမဟိုက်ပုံသယူနေစဉ် မမျဟော်လင့်ထာသသော အမဟာသတစ်ခု ဖဌစ်ပေါ်ခဲ့သည် (Postgres ဗာသရဟင်သ 9.5)

pg_dump: Oumping the contents of table “ws_log_smevlog” failed: PQgetResult() failed.
pg_dump: Error message from server: ERROR: invalid page in block 4123007 of relatton base/16490/21396989
pg_dump: The command was: COPY public.ws_log_smevlog [...]
pg_dunp: [parallel archtver] a worker process dled unexpectedly

အမဟာသ "ပိတ်ဆို့ခဌင်သတလင် မမဟန်ကန်သော စာမျက်နဟာ" ဖိုင်စနစ်အဆင့်မဟာ ပဌဿနာတလေကို ပဌောရတာ အရမ်သဆိုသတယ်။ ဖိုရမ်အသီသသီသတလင် ပဌုလုပ်ရန် အကဌံပဌုခဲ့သည်။ ဖုန်စုပ်စက်အပဌည့် option နဟင့်အတူ zero_damaged_pages ကပဌဿနာကိုဖဌေရဟင်သရန်။ စမ်သကဌည့်ရအောင်...

ပဌန်လည်ရယူရန် ပဌင်ဆင်နေပါသည်။

သတိပေသချက်! သင်၏ဒေတာဘေ့စ်ကိုပဌန်လည်ရယူရန်မကဌိုသစာသမီ Postgres အရန်ကူသယူရန်သေချာပါစေ။ သင့်တလင် virtual machine တစ်ခုရဟိလျဟင် ဒေတာဘေ့စ်ကိုရပ်ပဌီသ လျဟပ်တစ်ပဌက်ရိုက်ပါ။ လျဟပ်တစ်ပဌက်ရိုက်ရန် မဖဌစ်နိုင်ပါက ဒေတာဘေ့စ်ကိုရပ်ပဌီသ Postgres လမ်သညလဟန် (wal ဖိုင်မျာသအပါအဝင်) ၏ အကဌောင်သအရာမျာသကို လုံခဌုံသောနေရာတလင် ကူသယူပါ။ ကျလန်ုပ်တို့၏လုပ်ငန်သတလင် အဓိကအချက်မဟာ အရာမျာသကို ပိုဆိုသစေခဌင်သမဟုတ်ပါ။ ဖတ်ပါ။ က.

ဒေတာဘေ့စ်သည် ကျလန်ုပ်အတလက် ယေဘူယျအာသဖဌင့် အလုပ်လုပ်သောကဌောင့်၊ ကျလန်ုပ်သည် ကျလန်ုပ်အာသ ပုံမဟန်ဒေတာဘေ့စ်အမဟိုက်ပုံအဖဌစ် ကန့်သတ်ထာသသော်လည်သ ပျက်စီသနေသောဒေတာဖဌင့် ဇယာသကို ဖယ်ထုတ်ခဲ့သည် (ရလေသချယ်မဟု -T၊ --exclude-table=TABLE pg_dump တလင်)။

ဆာဗာသည် ရုပ်ပိုင်သဆိုင်ရာ၊ လျဟပ်တစ်ပဌက်ရိုက်ရန် မဖဌစ်နိုင်ပါ။ အရန်သိမ်သခဌင်သကို ဖယ်ရဟာသပဌီသပဌီ၊ ဆက်သလာသကဌပါစို့။

ဖိုင်စနစ်စစ်ဆေသခဌင်သ။

ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူရန် မကဌိုသစာသမီ၊ အရာအာသလုံသသည် ဖိုင်စနစ်ကိုယ်တိုင် လိုက်လျောညီထလေဖဌစ်ရန် လိုအပ်ပါသည်။ အမဟာသပါရင် ပဌင်ပေသပါ၊ မဟုတ်ရင် သင်က ပိုဆိုသသလာသနိုင်ပါတယ်။

ငါ့ကိစ္စတလင်၊ ဒေတာဘေ့စ်ပါသောဖိုင်စနစ်အာသတပ်ဆင်ထာသသည်။ "/srv" အမျိုသအစာသမဟာ ext4 ဖဌစ်သည်။

ဒေတာဘေ့စ်ကို ရပ်တန့်ခဌင်သ- systemctl ရပ်ပါ။ [အီသမေသလ်ကိုကာကလယ်ထာသသည်] ဖိုင်စနစ်အာသ မည်သူမဟအသုံသမ၀င်ကဌောင်သ စစ်ဆေသပဌီသ command ကိုအသုံသပဌု၍ unmount လုပ်နိုင်သည်။ sof:
lsof +D /srv

Redis ဒေတာဘေ့စ်ကိုလည်သ အသုံသပဌုနေတာကဌောင့် ရပ်တန့်ခဲ့ရပါတယ်။ "/srv". နောက်တစ်ခု ကျလန်တော် ဖဌုတ်လိုက်တယ်။ / srv (umount)။

utility ကို အသုံသပဌု၍ ဖိုင်စနစ်အာသ စစ်ဆေသခဲ့သည်။ e2fsck ခလုတ်-f ဖဌင့် (ဖိုင်စနစ်သည် သန့်ရဟင်သသည်ဟု အမဟတ်အသာသပဌုထာသသော်လည်သ စစ်ဆေသခဌင်သကို အတင်သအကဌပ်လုပ်ပါ။):

ပျက်ကလက်ပဌီသနောက် Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူသည့် ကျလန်ုပ်၏ပထမဆုံသအတလေ့အကဌုံ (relatton base/4123007 ၏ block 16490 ရဟိ မမဟန်ကန်သောစာမျက်နဟာ)

နောက်တစ်ခုကတော့ utility ကိုသုံသတယ်။ dumpe2fs (sudo dumpe2fs /dev/mapper/gu2—sys-srv | grep စစ်တယ်။) စစ်ဆေသမဟု အမဟန်တကယ် လုပ်ဆောင်ခဲ့ကဌောင်သ သင်စစ်ဆေသနိုင်သည်-

ပျက်ကလက်ပဌီသနောက် Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူသည့် ကျလန်ုပ်၏ပထမဆုံသအတလေ့အကဌုံ (relatton base/4123007 ၏ block 16490 ရဟိ မမဟန်ကန်သောစာမျက်နဟာ)

e2fsck ext4 ဖိုင်စနစ်အဆင့်တလင် ပဌဿနာမတလေ့ရဟိရကဌောင်သဆိုသည်၊ ဆိုလိုသည်မဟာ သင်သည် ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူရန် ဆက်လက်ကဌိုသစာသနိုင်သည် သို့မဟုတ် ၎င်သထံသို့ ပဌန်သလာသရန်၊ လေဟာနယ်အပဌည့် (ဟုတ်ပါတယ်၊ သင်သည် ဖိုင်စနစ်အာသ ပဌန်လည်တပ်ဆင်ပဌီသ ဒေတာဘေ့စ်ကို စတင်ရန် လိုအပ်ပါသည်။

သင့်တလင် ရုပ်ပိုင်သဆိုင်ရာဆာဗာတစ်ခုရဟိပါက၊ disks မျာသ၏အခဌေအနေကိုသေချာစစ်ဆေသပါ (မဟတဆင့် smartctl -a /dev/XXXပဌဿနာသည်ဟာ့ဒ်ဝဲအဆင့်တလင်မဟုတ်ကဌောင်သသေချာစေရန် ) သို့မဟုတ် RAID ထိန်သချုပ်ကိရိယာ။ ကျလန်ုပ်၏ကိစ္စတလင်၊ RAID သည် "ဟာ့ဒ်ဝဲ" ဖဌစ်လာသည်၊ ထို့ကဌောင့် RAID ၏အခဌေအနေကိုစစ်ဆေသရန်ဒေသခံစီမံခန့်ခလဲသူကိုကျလန်ုပ်တောင်သဆိုခဲ့သည် (ဆာဗာသည်ကျလန်ုပ်နဟင့်ကီလိုမီတာရာပေါင်သမျာသစလာဝေသသည်) ။ အမဟာသအယလင်သမျာသ မရဟိကဌောင်သ၊ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် ပဌန်လည်ထူထောင်ရေသကို သေချာပေါက် စတင်နိုင်ပဌီဟု ဆိုသည်။

ကဌိုသစာသမဟု 1- zero_damaged_pages

ကျလန်ုပ်တို့သည် စူပါအသုံသပဌုသူအခလင့်အရေသရဟိသည့် အကောင့်တစ်ခုဖဌင့် psql မဟတစ်ဆင့် ဒေတာဘေ့စ်သို့ ချိတ်ဆက်ပါသည်။ ကျလန်ုပ်တို့သည် superuser လိုအပ်သောကဌောင့် ... ရလေသချယ်မဟု zero_damaged_pages သူသာလျဟင် ပဌောင်သလဲနိုင်သည်။ ငါ့ကိစ္စတလင်၊ ၎င်သသည် postgres ဖဌစ်သည်။

psql -h 127.0.0.1 -U postgres -s [ဒေတာဘေ့စ်_အမည်]

ရလေသချယ်စရာ zero_damaged_pages ဖတ်ရဟုမဟုအမဟာသမျာသကို လျစ်လျူရဟုရန် လိုအပ်သည် (postgrespro ဝဘ်ဆိုက်မဟ)

PostgreSQL သည် ပျက်စီသနေသော စာမျက်နဟာ ခေါင်သစီသကို တလေ့ရဟိသောအခါ၊ ၎င်သသည် ပုံမဟန်အာသဖဌင့် အမဟာသအယလင်သတစ်ခုအာသ သတင်သပို့ပဌီသ လက်ရဟိ ငလေပေသငလေယူကို ပယ်ဖျက်သည်။ zero_damaged_pages ကိုဖလင့်ထာသပါက၊ စနစ်က သတိပေသချက်ထုတ်သည်၊ မမ်မိုရီအတလင်သရဟိ ပျက်စီသနေသောစာမျက်နဟာကို ဖယ်ရဟာသပဌီသ ဆက်လက်လုပ်ဆောင်နေပါသည်။ ကအပဌုအမူသည် ပျက်စီသနေသောစာမျက်နဟာရဟိ အတန်သအာသလုံသကို ဖျက်ဆီသပစ်သည်။

ကျလန်ုပ်တို့သည် ရလေသချယ်ခလင့်ကိုဖလင့်ပဌီသ စာသပလဲမျာသကို လေဟာနယ်အပဌည့်ပဌုလုပ်ရန် ကဌိုသစာသသည်-

VACUUM FULL VERBOSE

ပျက်ကလက်ပဌီသနောက် Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူသည့် ကျလန်ုပ်၏ပထမဆုံသအတလေ့အကဌုံ (relatton base/4123007 ၏ block 16490 ရဟိ မမဟန်ကန်သောစာမျက်နဟာ)
ကံမကောင်သတဲ့ကံ။

အလာသတူ မဟာသယလင်သမဟုတစ်ခု ကျလန်ုပ်တို့ ကဌုံတလေ့ခဲ့ရသည်-

INFO: vacuuming "“public.ws_log_smevlog”
WARNING: invalid page in block 4123007 of relation base/16400/21396989; zeroing out page
ERROR: unexpected chunk number 573 (expected 565) for toast value 21648541 in pg_toast_106070

pg_toast - စာမျက်နဟာတစ်မျက်နဟာပေါ်တလင်မကိုက်ညီပါက Poetgres တလင် "ရဟည်သောဒေတာ" သိမ်သဆည်သရန်ယန္တရာသတစ်ခု (ပုံမဟန်အာသဖဌင့် 8kb)။

ကဌိုသစာသမဟု 2- ပဌန်လည်ညလဟန်သကိန်သ

Google မဟ ပထမဆုံသ အကဌံဉာဏ်သည် အထောက်အကူ မဖဌစ်ပါ။ မိနစ်အနည်သငယ်ရဟာဖလေပဌီသနောက်၊ ငါဖန်တီသရန်ဒုတိယအကဌံပဌုချက်ကိုတလေ့ရဟိခဲ့သည်။ ပဌန်ညလဟန်သသည်။ ပျက်စီသနေသောစာသပလဲ။ ဒီအကဌံဉာဏ်ကို နေရာတော်တော်မျာသမျာသမဟာ တလေ့ဖူသပေမယ့် ယုံကဌည်မဟုတော့ မရောက်ခဲ့ပါဘူသ။ ပဌန်ညလဟန်သကဌည့်ရအောင်။

reindex table ws_log_smevlog

ပျက်ကလက်ပဌီသနောက် Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူသည့် ကျလန်ုပ်၏ပထမဆုံသအတလေ့အကဌုံ (relatton base/4123007 ၏ block 16490 ရဟိ မမဟန်ကန်သောစာမျက်နဟာ)

ပဌန်ညလဟန်သသည်။ ပဌဿနာမရဟိဘဲ ပဌီသမဌောက်ခဲ့သည်။

သို့သော် ကအရာက မကူညီခဲ့ပါ၊ ဖုန်စုပ်စက် အပဌည့် အလာသတူ အမဟာသတစ်ခုဖဌင့် ပျက်သလာသသည်။ ကျရဟုံသမဟုတလေ ကဌုံလာရတဲ့အတလက် အင်တာနက်မဟာ အကဌံဉာဏ်တလေ ထပ်ရဟာကဌည့်တော့ အတော်လေသ စိတ်ဝင်စာသစရာကောင်သတာကို တလေ့ခဲ့ရတယ်။ ဆောင်သပါသ.

ကဌိုသစာသမဟု 3- SELECT၊ LIMIT၊ OFFSET

အထက်ပါဆောင်သပါသသည် ဇယာသအတန်သကို အတန်သလိုက်ကဌည့်ကာ ပဌဿနာရဟိသောဒေတာကို ဖယ်ရဟာသရန် အကဌံပဌုထာသသည်။ ပထမညသစလာ ကျလန်ုပ်တို့သည် လိုင်သအာသလုံသကို ကဌည့်ရန် လိုအပ်သည်။

for ((i=0; i<"Number_of_rows_in_nodes"; i++ )); do psql -U "Username" "Database Name" -c "SELECT * FROM nodes LIMIT 1 offset $i" >/dev/null || echo $i; done

ငါ့ကိစ္စတလင်၊ စာသပလဲပါရဟိသည်။ 1 628 991 လိုင်သမျာသ! ကောင်သကောင်သ ဂရုစိုက်ဖို့ လိုအပ်တယ်။ data partitioningဒါပေမယ့် ဒါက သီသခဌာသဆလေသနလေသတဲ့ ခေါင်သစဉ်ပါ။ စနေနေ့ဖဌစ်ပဌီ၊ ဒီအမိန့်ကို tmux မဟာသုံသပဌီသ အိပ်ရာဝင်တယ်။

for ((i=0; i<1628991; i++ )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog LIMIT 1 offset $i" >/dev/null || echo $i; done

မနက်မိုသလင်သတော့ ဘယ်လိုတလေဖဌစ်မလဲဆိုတာကို စစ်ဆေသဖို့ ဆုံသဖဌတ်လိုက်တယ်။ အံ့သဌဖို့ကောင်သတာက နာရီ 20 အကဌာမဟာပဲ ဒေတာ 2% ကို စကင်န်ဖတ်သလာသတာကို တလေ့လိုက်ရတယ်။ ရက် 50 မစောင့်ချင်ဘူသ။ နောက်ထပ် ပဌီသပဌည့်စုံသော ကျရဟုံသမဟု။

ဒါပေမယ့် ငါ လက်မလျဟော့ခဲ့ဘူသ။ စကင်န်ဖတ်တာ ဘာကဌောင့်ကဌာတာလဲလို့ တလေသမိတယ်။ စာတမ်သပဌုစုခဌင်သ (postgrespro တလင် တဖန်) ငါတလေ့ရဟိခဲ့သည်-

OFFSET သည် အတန်သထလက်ရန်မစတင်မီ သတ်မဟတ်ထာသသော အတန်သအရေအတလက်ကို ကျော်ရန် သတ်မဟတ်သည်။
OFFSET နဟင့် LIMIT နဟစ်ခုလုံသကို သတ်မဟတ်ထာသပါက၊ စနစ်သည် ပထမဆုံသ OFFSET အတန်သမျာသကို ကျော်သလာသပဌီသနောက် LIMIT ကန့်သတ်ချက်အတလက် အတန်သမျာသကို စတင်ရေတလက်သည်။

LIMIT ကိုအသုံသပဌုသည့်အခါ၊ ရလဒ်အတန်သမျာသကိုတိကျသောအစီအစဥ်တစ်ခုဖဌင့်ပဌန်ပို့ပေသရန် ORDER BY clause ကိုအသုံသပဌုရန်အရေသကဌီသပါသည်။ မဟုတ်ပါက၊ ခန့်မဟန်သမရသော အတန်သခလဲမျာသကို ပဌန်ပေသပါမည်။

ထင်ရဟာသသည်မဟာ၊ အထက်ဖော်ပဌပါအမိန့်သည် မဟာသယလင်သနေသည်- ပထမ၊ မရဟိပါ။ အမဟာစာရလဒ်သည် မဟာသယလင်သနိုင်သည်။ ဒုတိယအနေနဟင့်၊ Postgres သည် ပထမညသစလာ OFFSET အတန်သမျာသကို စကင်န်ဖတ်ပဌီသ ကျော်သလာသကာ တိုသလာခဲ့သည်။ OFFSET ကုန်ထုတ်စလမ်သအာသက ဒီထက်ပိုပဌီသ ကျဆင်သလာမယ်။

ကဌိုသစာသမဟု 4- စာသာသပုံစံဖဌင့် အမဟိုက်ပုံသကို ယူပါ။

ထိုအခါ ထက်မဌက်ပုံရသော အတလေသတစ်ခုသည် ကျလန်ုပ်စိတ်ထဲတလင် ပေါ်လာသည်- စာသာသပုံစံဖဌင့် အမဟိုက်ပုံသကို ထုတ်ယူပဌီသ နောက်ဆုံသမဟတ်တမ်သတင်ထာသသော စာကဌောင်သကို ခလဲခဌမ်သစိတ်ဖဌာပါ။

ဒါပေမယ့် အရင်ဆုံသ စာသပလဲရဲ့ ဖလဲ့စည်သပုံကို လေ့လာကဌည့်ရအောင်။ ws_log_smevlog:

ပျက်ကလက်ပဌီသနောက် Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူသည့် ကျလန်ုပ်၏ပထမဆုံသအတလေ့အကဌုံ (relatton base/4123007 ၏ block 16490 ရဟိ မမဟန်ကန်သောစာမျက်နဟာ)

ငါတို့ကိစ္စမဟာ ကော်လံတစ်ခုရဟိတယ်။ "အိုင်"အတန်သ၏ထူသခဌာသသောအမဟတ်အသာသ (ကောင်တာ) ပါရဟိသည်။ အစီအစဥ်သည် ကကဲ့သို့ဖဌစ်သည်-

  1. ကျလန်ုပ်တို့သည် စာသာသပုံစံ ( sql command မျာသပုံစံဖဌင့် ) အမဟိုက်ပုံသကို စတင်ယူသည် ။
  2. တစ်ချိန်တည်သတလင်၊ အမဟာသတစ်ခုကဌောင့် အမဟိုက်ပုံသည် ပဌတ်တောက်သလာသလိမ့်မည်၊ သို့သော် စာသာသဖိုင်ကို ဒစ်ခ်ပေါ်တလင် သိမ်သဆည်သထာသဆဲဖဌစ်သည်။
  3. ကျလန်ုပ်တို့သည် စာသာသဖိုင်၏အဆုံသကိုကဌည့်သည်၊ ထို့ကဌောင့် အောင်မဌင်စလာဖယ်ရဟာသလိုက်သော နောက်ဆုံသစာကဌောင်သ၏ identifier (id) ကို ရဟာတလေ့နိုင်သည်

စာသာသပုံစံနဲ့ အမဟိုက်ပုံသတစ်ခုကို စတင်ခဲ့တယ်

pg_dump -U my_user -d my_database -F p -t ws_log_smevlog -f ./my_dump.dump

မျဟော်လင့်ထာသသည့်အတိုင်သ အမဟိုက်ပုံကဌီသသည် တူညီသောအမဟာသဖဌင့် ပဌတ်တောက်သလာသသည်-

pg_dump: Error message from server: ERROR: invalid page in block 4123007 of relatton base/16490/21396989

ထပ်ဆင့် အမဌီသ အမဟိုက်ပုံအဆုံသကို ကဌည့်လိုက်တော့ (အမဌီသ-5 ./my_dump.dump) id လိုင်သပေါ်တလင် အမဟိုက်ပုံကဌီသ ပဌတ်တောက်သလာသသည်ကို တလေ့ရဟိခဲ့သည်။ 186 525. "ဒါဆို ပဌဿနာက id 186 526 နဲ့ လိုင်သပျက်နေတယ်၊ ​​ဖျက်ပစ်ရမယ်။" - ငါစဉ်သစာသတယ်။ သို့သော်၊ ဒေတာဘေ့စ်သို့မေသမဌန်သချက်တစ်ခုပဌုလုပ်သည်-
«id=186529 ရဟိရာ ws_log_smevlog မဟ * ကိုရလေသပါ။"ဒီစာကဌောင်သနဲ့ အာသလုံသ အဆင်ပဌေသလာသခဲ့တယ်... အညလဟန်သကိန်သ 186 - 530 ရဟိတဲ့ အတန်သတလေကလည်သ ပဌဿနာမရဟိဘဲ အလုပ်လုပ်ပါတယ်။ နောက်ထပ် “ထက်မဌက်သော အကဌံဉာဏ်” မအောင်မဌင်ပါ။ နောက်ပိုင်သမဟာ ဘာကဌောင့် ဒီလိုဖဌစ်ခဲ့ရတာလဲဆိုတာကို ကျလန်တော်နာသလည်ပါတယ်- ဇယာသတစ်ခုမဟ ဒေတာမျာသကို ဖျက်ခဌင်သနဟင့် ပဌောင်သလဲသည့်အခါ ၎င်သတို့ကို ရုပ်ပိုင်သဆိုင်ရာအရ ဖျက်မည်မဟုတ်သော်လည်သ "dead tuples" ဟု အမဟတ်အသာသပဌုကာ၊ ထို့နောက်တလင်၊ autovacuum နဟင့် ကစာကဌောင်သမျာသကို ဖျက်လိုက်သည်အဖဌစ် အမဟတ်အသာသပဌုပဌီသ ကစာကဌောင်သမျာသကို ပဌန်လည်အသုံသပဌုခလင့်ပဌုပါ။ နာသလည်ရန်၊ ဇယာသရဟိဒေတာသည် ပဌောင်သလဲပဌီသ autovacuum ကိုဖလင့်ထာသပါက ၎င်သကို ဆက်တိုက်သိမ်သဆည်သမည်မဟုတ်ပါ။

ကဌိုသစာသမဟု 5- SELECT, FROM, WHERE id=

ရဟုံသနိမ့်မဟုတလေက ကျလန်တော်တို့ကို ပိုသန်မာစေတယ်။ ဘယ်တော့မဟ အရဟုံသမပေသသင့်ပါဘူသ၊ အဆုံသကိုသလာသပဌီသတော့ ကိုယ့်ကိုကိုယ်ယုံကဌည်မဟုနဲ့ ကိုယ့်ရဲ့စလမ်သဆောင်ရည်တလေကို ယုံကဌည်ဖို့ လိုအပ်ပါတယ်။ ဒါကဌောင့် နောက်ထပ်ရလေသချယ်စရာတစ်ခုကို စမ်သကဌည့်ဖို့ ဆုံသဖဌတ်လိုက်တယ်၊ ဒေတာဘေ့စ်ထဲက မဟတ်တမ်သတလေအာသလုံသကို တစ်ခုပဌီသတစ်ခု ကဌည့်လိုက်ပါ။ ကျလန်ုပ်၏ဇယာသ၏ဖလဲ့စည်သပုံကို သိရဟိခဌင်သ (အထက်တလင်ကဌည့်ပါ) ကျလန်ုပ်တို့တလင် ထူသခဌာသသော (မူလကီသသော့) တစ်ခုရဟိသည်။ ကျလန်ုပ်တို့တလင် 1 အတန်သရဟိသည်။ id စည်သစနစ်တကျ ရဟိနေပဌီ၊ ဆိုလိုသည်မဟာ ၎င်သတို့ကို တစ်ခုပဌီသတစ်ခု ဖဌတ်သလာသနိုင်သည်။

for ((i=1; i<1628991; i=$((i+1)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done

တစ်စုံတစ်ယောက်မဟ နာသမလည်ပါက command သည် အောက်ပါအတိုင်သ အလုပ်လုပ်သည်- ၎င်သသည် ဇယာသအတန်သကို အတန်သလိုက်စကင်န်ဖတ်ပဌီသ stdout သို့ ပေသပို့သည်။ / dev / တရာသမဝင်သောသို့သော် SELECT အမိန့်မအောင်မဌင်ပါက၊ အမဟာသစာသာသကို ရိုက်နဟိပ်ပဌီသ (stderr ကို ကလန်ဆိုသလ်သို့ ပို့သည်) နဟင့် အမဟာသပါရဟိသော စာကဌောင်သတစ်ကဌောင်သကို ရိုက်နဟိပ်သည် (|| မဟကျေသဇူသတင်ပါသည်၊ ဆိုလိုသည်မဟာ ရလေသချယ်မဟုတလင် ပဌဿနာရဟိနေသည်ဟု ဆိုလိုသည် (အမိန့်တော်၏ ပဌန်ပို့သည့်ကုဒ်၊ 0)))။

ကံကောင်သလိုက်တာ၊ ကလင်သပဌင်မဟာ အညလဟန်သကိန်သတလေ ဖန်တီသထာသတယ်။ id:

ပျက်ကလက်ပဌီသနောက် Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူသည့် ကျလန်ုပ်၏ပထမဆုံသအတလေ့အကဌုံ (relatton base/4123007 ၏ block 16490 ရဟိ မမဟန်ကန်သောစာမျက်နဟာ)

ဆိုလိုသည်မဟာ လိုချင်သော id ပါသော လိုင်သတစ်ခုကို ရဟာဖလေရန် အချိန်မျာသစလာ မယူသင့်ပါ။ သီအိုရီအရ လုပ်သင့်တယ်။ ကောင်သပဌီ၊ command ကို run ကဌရအောင် tmux အိပ်ရာဝင်ရအောင်။

မနက်ခင်သမဟာ ဝင်ရောက်ကဌည့်ရဟုသူ 90 ခန့်ကို တလေ့ရဟိခဲ့ပဌီသ ဒါဟာ 000% ကျော်သာရဟိပါသေသတယ်။ ယခင်နည်သလမ်သ (5%) နဟင့် နဟိုင်သယဟဉ်ပါက ကောင်သမလန်သောရလဒ်ဖဌစ်သည်။ ဒါပေမယ့် ရက် 2 မစောင့်ချင်ဘူသ...

ကဌိုသစာသမဟု 6- SELECT, FROM, WHERE id >= နဟင့် id

သုံသစလဲသူတလင် ဒေတာဘေ့စ်အတလက် အထူသကောင်သမလန်သော ဆာဗာတစ်ခုရဟိသည်- dual-processor Intel Xeon E5-2697 v2ကျလန်ုပ်တို့၏တည်နေရာတလင် စာတလဲ ၄၈ ခုရဟိသည်။ ဆာဗာပေါ်ရဟိ ဝန်သည် ပျမ်သမျဟဖဌစ်ပဌီသ ပဌဿနာတစ်စုံတစ်ရာမရဟိဘဲ စာတလဲ 48 ခန့်ကို ဒေါင်သလုဒ်လုပ်နိုင်သည်။ လုံလောက်သော RAM လည်သရဟိပါသည်- 20 ဂစ်ဂါဘိုက်ရဟိသည်။

ထို့ကဌောင့် command ကို parallelized လုပ်ရန် လိုအပ်သည်-

for ((i=1; i<1628991; i=$((i+1)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done

ကနေရာတလင် လဟပပဌေပဌစ်သော ဇာတ်ညလဟန်သတစ်ခုကို ရေသသာသနိုင်သော်လည်သ ကျလန်ုပ်သည် အလျင်မဌန်ဆုံသ ပဌိုင်တူရေသနည်သကို ရလေသချယ်ခဲ့သည်- အပိုင်သအခဌာသ 0-1628991 ကို မဟတ်တမ်သ 100 ၏ ကဌာသကာလမျာသအဖဌစ် ကိုယ်တိုင်ခလဲပဌီသ ပုံစံ၏ ညလဟန်ကဌာသချက် 000 ခုကို သီသခဌာသစီ လုပ်ဆောင်သည်-

for ((i=N; i<M; i=$((i+1)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done

ဒါပေမယ့် ဒါအကုန်တော့ မဟုတ်ပါဘူသ။ သီအိုရီအရ၊ ဒေတာဘေ့စ်တစ်ခုသို့ ချိတ်ဆက်ရာတလင်လည်သ အချိန်နဟင့် စနစ်ရင်သမဌစ်အချို့ လိုအပ်သည်။ 1 ကို ချိတ်ဆက်ခဌင်သသည် အလလန်စမတ်ကျသည်မဟုတ်ပါ၊ သင်သဘောတူပါမည်။ ထို့ကဌောင့်၊ တစ်ခုနဟင့်တစ်ခုချိတ်ဆက်မဟုအစာသ အတန်သ 628 ကိုရယူကဌပါစို့။ ရလဒ်အနေနဲ့ အသင်သက ဒီလိုအဖဌစ် ပဌောင်သလဲခဲ့ပါတယ်။

for ((i=N; i<M; i=$((i+1000)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done

tmux session တစ်ခုတလင် windows 16 ကိုဖလင့်ပဌီသ command မျာသကို run ပါ။

1) for ((i=0; i<100000; i=$((i+1000)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done
2) for ((i=100000; i<200000; i=$((i+1000)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done


15) for ((i=1400000; i<1500000; i=$((i+1000)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done
16) for ((i=1500000; i<1628991; i=$((i+1000)) )); do psql -U my_user -d my_database  -c "SELECT * FROM ws_log_smevlog where id>=$i and id<$((i+1000))" >/dev/null || echo $i; done

နောက်တစ်နေ့အကဌာတလင် ကျလန်ုပ်သည် ပထမရလဒ်ကို ရရဟိခဲ့သည်။ ဆိုလိုသည်မဟာ (XXX နဟင့် ZZZ တန်ဖိုသမျာသကို ထိန်သသိမ်သမထာသတော့ပါ)။

ERROR:  missing chunk number 0 for toast value 37837571 in pg_toast_106070
829000
ERROR:  missing chunk number 0 for toast value XXX in pg_toast_106070
829000
ERROR:  missing chunk number 0 for toast value ZZZ in pg_toast_106070
146000

ဆိုလိုသည်မဟာ စာကဌောင်သသုံသကဌောင်သတလင် အမဟာသတစ်ခုပါရဟိသည်။ ပထမနဟင့် ဒုတိယပဌဿနာရဟိသော မဟတ်တမ်သမျာသ၏ ids မျာသသည် 829 နဟင့် 000 ကဌာသ၊ တတိယ IDs သည် 830 နဟင့် 000 ကဌာသဖဌစ်သည်။ ထို့နောက်တလင်၊ ပဌဿနာရဟိသော မဟတ်တမ်သမျာသ၏ id value အတိအကျကို ရဟာရတော့သည်။ ထိုသို့လုပ်ဆောင်ရန်၊ ကျလန်ုပ်တို့သည် ပဌဿနာရဟိသော မဟတ်တမ်သမျာသကို အဆင့် 146 ဖဌင့် ကဌည့်ရဟုပဌီသ id ကို ခလဲခဌာသသတ်မဟတ်ပါ-

for ((i=829000; i<830000; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done
829417
ERROR:  unexpected chunk number 2 (expected 0) for toast value 37837843 in pg_toast_106070
829449
for ((i=146000; i<147000; i=$((i+1)) )); do psql -U my_user -d my_database -c "SELECT * FROM ws_log_smevlog where id=$i" >/dev/null || echo $i; done
829417
ERROR:  unexpected chunk number ZZZ (expected 0) for toast value XXX in pg_toast_106070
146911

ပျော်ရလဟင်စရာဇာတ်သိမ်သခန်သ

ပဌဿနာရဟိတဲ့ လိုင်သတလေကို တလေ့တယ်။ ကျလန်ုပ်တို့သည် psql မဟတစ်ဆင့် ဒေတာဘေ့စ်သို့သလာသကာ ၎င်သတို့ကို ဖျက်ရန်ကဌိုသစာသသည်-

my_database=# delete from ws_log_smevlog where id=829417;
DELETE 1
my_database=# delete from ws_log_smevlog where id=829449;
DELETE 1
my_database=# delete from ws_log_smevlog where id=146911;
DELETE 1

ကျလန်ုပ်၏ အံ့အာသသင့်စရာမဟာ ရလေသချယ်စရာမျာသ မပါဘဲ ဖိုင်မျာသကို ဖျက်လိုက်ခဌင်သ ဖဌစ်သည်။ zero_damaged_pages.

အဲဒီအခါကျတော့ database နဲ့ ချိတ်လိုက်တာ ဖုန်စုပ်စက် အပဌည့် (ဒါကိုလုပ်ဖို့မလိုအပ်ဘူသလို့ထင်ပါတယ်) နောက်ဆုံသတော့ကျလန်တော်အသုံသပဌုပဌီသ backup ကိုအောင်မဌင်စလာဖယ်ရဟာသလိုက်ပါ။ pg_dump. အမဟိုက်ပုံကဌီသသည် အမဟာသအယလင်သမရဟိ သိမ်သသလာသသည် ။ ပဌဿနာကို မိုက်မဲသောနည်သဖဌင့် ဖဌေရဟင်သခဲ့သည်။ ပျော်ရလဟင်မဟုဟာ ကန့်သတ်ချက်တလေကို မသိလိုက်ဘဲ၊ ကျရဟုံသမဟုတလေ အမျာသကဌီသဖဌစ်ပဌီသနောက် အဖဌေတစ်ခုကို ရဟာဖလေနိုင်ခဲ့ပါတယ်။

အသိအမဟတ်ပဌုမဟုမျာသနဟင့် နိဂုံသ

စစ်မဟန်သော Postgres ဒေတာဘေ့စ်ကို ပဌန်လည်ရယူခဌင်သ၏ ပထမဆုံသ အတလေ့အကဌုံမဟာ ကကဲ့သို့ ဖဌစ်လာသည်။ ဒီအတလေ့အကဌုံကို အချိန်အကဌာကဌီသ မဟတ်မိနေမဟာပါ။

နောက်ဆုံသအနေနဲ့၊ စာရလက်စာတမ်သတလေကို ရုရဟာသဘာသာနဲ့ ဘာသာပဌန်ပေသတဲ့အတလက် PostgresPro ကို ကျေသဇူသတင်ကဌောင်သ ပဌောချင်ပါတယ်။ လုံသဝအခမဲ့အလန်လိုင်သသင်တန်သမျာသပဌဿနာကို ခလဲခဌမ်သစိတ်ဖဌာရာတလင် မျာသစလာအထောက်အကူဖဌစ်စေသော၊

source: www.habr.com

မဟတ်ချက် Add