CATATAN: Saya telah menguji ini pada 9.1. Saya tidak memiliki server 9.0 di sini. Saya sedikit yakin meskipun itu akan bekerja pada 9.0 sekalipun.
HATI-HATI (Sebagaimana dicatat dalam komentar oleh @erny):
Note that high CPU load due to I/O operations may be expected.
Anda dapat melakukan ini dengan tidak ada down-time dengan menggunakan tablespace sementara. Waktu henti akan berupa kunci eksklusif. Tetapi hanya di atas meja Anda menyedot debu. Jadi semua yang akan terjadi adalah bahwa permintaan klien hanya akan menunggu kunci diperoleh jika mereka mengakses tabel tersebut. Anda tidak perlu menutup koneksi yang ada.
Satu hal yang perlu diperhatikan, adalah menggerakkan meja dan ruang hampa sendiri perlu menunggu kunci eksklusif terlebih dahulu!
Pertama, Anda jelas membutuhkan penyimpanan tambahan. Seperti Stéphane
disebutkan dalam komentar, ini harus setidaknya dua kali lebih besar dari tabel yang dimaksud seperti VACUUM FULL
halnya salinan lengkap. Jika Anda beruntung dan secara dinamis dapat menambahkan disk ke mesin, lakukan itu. Dalam kasus terburuk Anda hanya dapat memasang disk USB (berisiko dan lambat)!
Selanjutnya, pasang perangkat baru dan buat tersedia sebagai tablespace:
CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
Anda dapat membuat daftar tablespace dengan mudah menggunakan:
\db
Periksa kembali tablespace tablespace Anda saat ini (Anda perlu tahu ke mana harus memindahkannya kembali):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
Jika itu NULL
, itu akan berada di tablespace default:
SHOW default_tablespace;
Jika itu adalah NULL
juga, kemungkinan akan pg_default
(memeriksa dokumen resmi dalam kasus itu berubah).
Sekarang pindahkan meja:
ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT; -- if autocommit is off
Vakum itu:
VACUUM FULL mytable;
Pindahkan kembali:
-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT; -- if autocommit is off
Hapus ruang sementara:
DROP TABLESPACE tempspace;