Giải phóng không gian đĩa sau khi bỏ cơ sở dữ liệu


12

Tôi đang làm việc trên một hệ thống dev và tôi đã khôi phục lại cơ sở dữ liệu, nói "foo", rằng tôi đang sử dụng cho mục đích dev. Khi tôi đang làm việc thông qua các nút thắt, tôi vừa mới chạy DROP DATABASE foo. Tuy nhiên, tôi nhanh chóng nhận ra mình đã ăn hết dung lượng trên đĩa. Tào lao

VACUUM FULL, từ một cơ sở dữ liệu logic khác, có giải phóng không gian khỏi cơ sở dữ liệu mà trước đây tôi đã bỏ (foo) không? Tôi đã thử điều này từ một cơ sở dữ liệu logic khác và không gian trống đã được thu hồi, nhưng tôi không nghĩ rằng nó đủ để tính tất cả các cuộc gọi CREATE DATABASE / DROP DATABASE mà tôi đã thực hiện. Nó có thể vừa VACUUM là cơ sở dữ liệu logic mà tôi đã chạy từ đó.

Có phải là một cách để lấy lại không gian đó mà không thực hiện một cơ sở dữ liệu init?

BIÊN TẬP

Vì vậy, tôi đã khởi tạo lại cơ sở dữ liệu từ một bản sao lưu, theo các bước sau . Sau khi khôi phục, tôi đã lấy lại TON dung lượng trên đĩa! Điều này hiện đang hoạt động, nhưng bất kỳ trợ giúp nào về cách dọn dẹp cơ sở dữ liệu bị bỏ rơi vẫn sẽ hữu ích.

CHỈNH SỬA 2

Vì vậy, tôi đã quản lý để thu thập thêm một số thông tin về vấn đề này ... Đây là những gì tôi đã đưa ra làm ví dụ:

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

Vì vậy, có vẻ như DB mới chiếm ~ 9,6 GB trên đĩa. Tuy nhiên, sau khi bỏ nó, dung lượng đĩa được thu hồi chỉ tăng ~ 4,6G. Vì vậy, có khoảng 5 GB dung lượng khiến tôi tự hỏi chuyện gì đang xảy ra!?

Và nó tiếp tục chu trình này khi tôi tái tạo, điền và thả lại.

Có ai có ý tưởng gì về việc nán lại sau khi lệnh "DROP DATABASE" được ban hành không?


Có lẽ cũng đáng lưu ý rằng tôi đã lưu trữ BẬT. Dường như vị trí mà các tệp lưu trữ WAL đang được ghi là khá lớn. Tôi đã không theo dõi nó chặt chẽ. Có lẽ tôi sẽ thử quy trình tương tự được liệt kê ở trên và chạy "du" trên thư mục đó để xem liệu tất cả không gian có được thu hồi không. Tôi sẽ báo cáo lại.
Jmoney38

Tôi cho rằng chân không không giúp đỡ sau đó?
rogerdpack 17/07 '

Câu trả lời:


6

Hãy thử sudo lsof| grep deletedvà kiểm tra xem có bất kỳ quá trình PostgreSQL nào xuất hiện không. Lệnh này tìm kiếm các tệp đã bị xóa nhưng các mô tả tệp của nó vẫn được mở bởi bất kỳ quy trình nào. Một tác dụng phụ khác là df -hdu -sh /khác nhau. Điều này là do dunhìn vào hệ thống tệp và tổng hợp kích thước của tất cả các tệp và dfxem thiết bị vật lý.

Tôi vừa gặp sự cố với cơ sở dữ liệu không có bất kỳ khoảng trống nào sau DROP tableđó và đó là nguyên nhân.

Giải pháp duy nhất tôi biết là khởi động lại cơ sở dữ liệu. Có lẽ bạn có thể thử gửi tải lại (SIGHUP).


2
Các lsof | grep deletedmũi là một trong những tốt; thêm vào đó, thêm rằng bạn chỉ cần xác định phiên postgresql nào vẫn hoạt động và tiêu diệt chúng, để phát hành các tệp. Trong trường hợp của tôi, trong số hơn 500 kết nối hoạt động, gần như tất cả trong IDLE hoặc CAMIT, giết một kết nối duy nhất, được tìm thấy SELECT * FROM pg_stat_activityvà bị mắc kẹt trong ANALYZE, là đủ để giải phóng các tệp đã bị xóa. ! 00 GB được giải phóng.
Alex North-Keys

5

Tôi hiểu rằng khi bạn bỏ một cơ sở dữ liệu thì nó và các tệp đó sẽ biến mất.

Trừ khi bạn đang sử dụng không gian bảng thì mỗi cơ sở dữ liệu sẽ có dữ liệu trong thư mục con riêng của nó dưới $ PGDATA / cơ sở. Sử dụng một trong các máy chủ của tôi làm ví dụ (với tư cách là người dùng 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

Bây giờ, nếu chúng ta tạo một cơ sở dữ liệu mới thì sẽ có thêm một thư mục con dưới $ PGDATA / cơ sở:

-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

Đó là những gì chúng ta thấy ($ PGDATA / cơ sở / 83637 là thư mục con cho cơ sở dữ liệu mới).

Bỏ cơ sở dữ liệu đó cũng sẽ xóa các tệp dữ liệu:

-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

Đó là những gì chúng ta mong đợi-- thư mục $ PGDATA / base / 83637 không còn nữa, sẽ không có gì để hút bụi.

Bạn có chắc chắn không có thứ gì khác ăn hết dung lượng đĩa của bạn không? Một trong những cơ sở dữ liệu khác của bạn? đăng nhập tập tin?

Một cái gì đó mà bạn có thể thử sẽ là:

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

làm các công cụ cơ sở dữ liệu khác nhau của bạn, tạo, thả, v.v.

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

để có được một số ý tưởng nơi không gian đĩa đang đi.


Tôi thấy kết quả tương tự như bạn - tức là khi tôi thêm bảng, DB mới xuất hiện trong thư mục cơ sở và khi tôi xóa nó, nó sẽ biến mất. Tuy nhiên, thư mục đó dường như không bao gồm toàn bộ sự khác biệt về kích thước (ví dụ: ~ 9,6GB)
Jmoney38

@ Jmoney38 - Đó là lý do tại sao tôi khuyên bạn nên thực hiện "du -sh ls" trên thư mục $ PGDATA cả trước và sau khi thực hiện thêm / thả cơ sở dữ liệu vì điều đó sẽ đánh dấu các thư mục khác đang tăng vọt.
gsiems

@ Jmoney38 - Nếu tôi phải đoán tôi sẽ nói rằng sự khác biệt sẽ được tìm thấy trong các thư mục $ PGDATA / pg_log và / hoặc $ PGDATA / pg_xlog. Các tệp nhật ký dành cho cụm và không bị cắt ngắn khi bạn thả cơ sở dữ liệu.
gsiem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.