การเพิ่มพื้นที่ว่างในดิสก์หลังจากฐานข้อมูลตก


12

ฉันกำลังทำงานกับระบบ dev และฉันได้รับการกู้คืนไปยังฐานข้อมูลพูดว่า "foo" ซึ่งฉันใช้เพื่อจุดประสงค์ด้านการพัฒนา ขณะที่ฉันกำลังทำงานผ่าน kinks ฉันเพิ่งเรียกใช้ DROP DATABASE foo อย่างไรก็ตามฉันรู้ได้อย่างรวดเร็วว่าฉันกินพื้นที่ทั้งหมดในดิสก์ของฉัน อึ.

VACUUM FULL จากฐานข้อมูลแบบลอจิคัลอื่นหรือไม่เพิ่มพื้นที่ว่างจากฐานข้อมูลที่ฉันทิ้งไว้ก่อนหน้านี้ (foo) ฉันลองสิ่งนี้จากฐานข้อมูลเชิงตรรกะที่แตกต่างกันและมีการเรียกคืนพื้นที่ว่าง แต่ฉันไม่คิดว่ามันเพียงพอที่จะอธิบายการเรียกฐานข้อมูล CREATE DATABASE / DROP DATABASE ทั้งหมดที่ฉันทำ มันอาจมีเพียง VACUUM'ed ฐานข้อมูลเชิงตรรกะที่ฉันวิ่งมา

จะต้องมีวิธีในการเรียกคืนพื้นที่นั้นโดยไม่ต้องดำเนินการฐานข้อมูลทั้งหมดหรือไม่

แก้ไข

ดังนั้นผมจึง reinitialized ฐานข้อมูลจากการสำรองข้อมูลประมาณต่อไปนี้ขั้นตอนเหล่านี้ หลังจากการคืนค่าฉันได้เรียกคืนพื้นที่ว่างบนดิสก์เป็นตัน! วิธีนี้ใช้ได้ผลในตอนนี้ แต่ความช่วยเหลือใด ๆ เกี่ยวกับวิธีล้างฐานข้อมูลที่ถูกทิ้งจะยังคงมีประโยชน์

แก้ไข 2

ดังนั้นฉันจึงพยายามรวบรวมข้อมูลเพิ่มเติมเกี่ยวกับปัญหานี้ ... นี่คือสิ่งที่ฉันคิดขึ้นมาเป็นตัวอย่าง:

Initial partition size:
                       Size   Used  Avail Use% Mounted on
                        25G   8.1G    16G  35% /apps1

After creating my new database and populating it:
                        25G    18G   6.4G  73% /apps1

After Dropping the database using "DROP database mydb" from a separate logical DB:
                        25G    13G    11G  56% /apps1

สำหรับฉันแล้วปรากฏว่าฐานข้อมูลใหม่ใช้เนื้อที่ดิสก์ประมาณ 9.6 GB อย่างไรก็ตามหลังจากวางลงพื้นที่ดิสก์ที่ถูกเรียกคืนจะเพิ่มขึ้นเพียง 4.6GG ดังนั้นมีพื้นที่ประมาณ 5 GB ที่ทำให้ฉันสงสัยว่าเกิดอะไรขึ้น!

และมันจะดำเนินต่อไปในรอบนี้เมื่อฉันสร้างเติมและปล่อยอีกครั้ง

ใครบ้างมีความคิดว่าสิ่งใดที่เอ้อระเหยหลังจากออกคำสั่ง "DROP DATABASE"


บางทีมันก็น่าสังเกตว่าฉันได้เปิดการเก็บถาวรไว้ ดูเหมือนว่าตำแหน่งที่ไฟล์เก็บถาวร WAL ถูกเขียนนั้นค่อนข้างใหญ่ ฉันไม่ได้ติดตามอย่างใกล้ชิด บางทีฉันอาจลองขั้นตอนเดียวกันตามที่ระบุข้างต้นและเรียกใช้ "du" ในไดเรกทอรีนั้นเพื่อดูว่ามีการเรียกคืนพื้นที่ทั้งหมดหรือไม่ ฉันจะรายงานกลับ
Jmoney38

ฉันถือว่าสุญญากาศไม่ช่วยอะไรเหรอ?
rogerdpack

คำตอบ:


6

ลองsudo lsof| grep deletedและตรวจสอบว่ากระบวนการ PostgreSQL ใด ๆ ปรากฏขึ้นหรือไม่ คำสั่งนี้ค้นหาไฟล์ที่ถูกลบ แต่ตัวให้คำอธิบายไฟล์ยังคงเปิดอยู่โดยกระบวนการใด ๆ ผลข้างเคียงก็คือdf -hและdu -sh /แตกต่าง นี่เป็นเพราะduดูที่ระบบไฟล์และสรุปขนาดของไฟล์ทั้งหมดและdfดูที่อุปกรณ์ฟิสิคัล

ฉันเพิ่งมีปัญหากับฐานข้อมูลซึ่งไม่ได้เพิ่มพื้นที่ว่างใด ๆ หลังจากDROP tableนั้นเป็นสาเหตุ

ทางออกเดียวที่ฉันรู้คือการรีสตาร์ทฐานข้อมูล บางทีคุณอาจลองส่งการโหลดซ้ำ (SIGHUP)


2
lsof | grep deletedปลายเป็นหนึ่งที่ดี; ในนั้นให้เพิ่มว่าคุณจะต้องกำหนดเซสชัน postgresql ที่ยังคงใช้งานอยู่และฆ่าพวกเขาเพื่อปล่อยไฟล์ ในกรณีของฉันมีมากกว่า 500 การเชื่อมต่อที่ใช้งานอยู่ทั้งหมดใน IDLE หรือ COMMIT ซึ่งฆ่าคนเดียวที่พบSELECT * FROM pg_stat_activityและติดอยู่ใน ANALYZE เพียงพอที่จะเพิ่มไฟล์ที่ถูกลบ ! 00 GB เป็นอิสระ
Alex North-Keys

5

ความเข้าใจของฉันคือว่าเมื่อคุณวางฐานข้อมูลแล้วมันและมันเป็นไฟล์จะหายไป

นอกจากว่าคุณใช้พื้นที่ตารางแล้วฐานข้อมูลแต่ละแห่งควรมีข้อมูลอยู่ในไดเรกทอรีย่อยของตนเองภายใต้ $ PGDATA / base ใช้หนึ่งในเซิร์ฟเวอร์ของฉันเป็นตัวอย่าง (ในฐานะผู้ใช้ postgres):

-bash-3.2$ cd $PGDATA/base

-bash-3.2$ ls | wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

ตอนนี้ถ้าเราสร้างฐานข้อมูลใหม่ควรมีไดเรกทอรีย่อยอีกหนึ่งรายการภายใต้ $ PGDATA / base:

-bash-3.2$ createdb foo

-bash-3.2$ ls | wc -l
10

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
6.9M    83637
8.0K    pgsql_tmp

สิ่งใดที่เราเห็น ($ PGDATA / base / 83637 เป็นไดเรกทอรีย่อยสำหรับฐานข้อมูลใหม่)

การทิ้งฐานข้อมูลนั้นควรลบไฟล์ข้อมูลด้วย:

-bash-3.2$ dropdb foo

-bash-3.2$ ls wc -l
9

-bash-3.2$ du -sh `ls`
6.9M    1
6.7M    12690
6.9M    12698
11M     16391
341M    17339
3.8G    17341
11M     17343
6.8M    19047
8.0K    pgsql_tmp

ซึ่งเป็นสิ่งที่เราคาดหวัง - ไดเรกทอรี $ PGDATA / base / 83637 หายไปไม่ควรมีอะไรดูด

คุณแน่ใจหรือว่าไม่มีอะไรกินพื้นที่ว่างในดิสก์ของคุณ หนึ่งในฐานข้อมูลอื่น ๆ ของคุณ? ล็อกไฟล์หรือไม่

สิ่งที่คุณสามารถลองได้คือ:

-bash-3.2$ cd $PGDATA
-bash-3.2$ du -sh `ls` > ../pre_sizes

ทำสิ่งต่าง ๆ ฐานข้อมูลของคุณสร้างวาง ฯลฯ แล้ว:

-bash-3.2$ du -sh `ls` > ../post_sizes

เพื่อให้ได้ความคิดที่ว่าพื้นที่ว่างในดิสก์กำลังเกิดขึ้น


ฉันเห็นผลลัพธ์เดียวกันกับที่คุณทำ - เช่นเมื่อฉันเพิ่มตารางฐานข้อมูลใหม่จะปรากฏในไดเรกทอรีฐานและเมื่อฉันลบออกมันจะหายไป อย่างไรก็ตามไดเรกทอรีนั้นไม่ปรากฏว่ามีขนาดแตกต่างกันทั้งหมด (เช่น. ~ 9.6GB)
Jmoney38

@ Jmoney38 - นั่นเป็นเหตุผลที่ฉันแนะนำให้ทำ "du -sh ls" ในไดเรกทอรี $ PGDATA ทั้งก่อนและหลังการเพิ่ม / ลดฐานข้อมูลตามที่ควรตั้งค่าสถานะว่าไดเรกทอรีอื่นกำลังเติบโต leaps และขอบเขต
gsiems

@ Jmoney38 - ถ้าฉันต้องเดาฉันจะบอกว่าความแตกต่างนั้นจะพบได้ในไดเรกทอรี $ PGDATA / pg_log และ / หรือ $ PGDATA / pg_xlog ไดเรกทอรี ไฟล์บันทึกใช้สำหรับคลัสเตอร์และไม่ถูกตัดทอนเมื่อคุณวางฐานข้อมูล
gsiems
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.