Pada Oracle versi 11g:
Setelah Googling, saya tidak dapat menemukan cara sederhana untuk mendapatkan kembali ruang kosong setelah menghapus tabel.
Saya telah menemukan banyak penjelasan, menceritakan bagaimana datafile menjadi terfragmentasi, tumpukan besar pertanyaan membosankan yang harus Anda jalankan untuk memindahkan "ruang kosong" di akhir datafile (tabel demi tabel ... bahkan ketika Anda punya 200 tabel!?).
Maka Anda harus mengurangi ukuran datafile dengan "menebak" dengan seberapa banyak Anda dapat menguranginya, atau Anda harus tahu persis apa "ukuran blok" Anda ... Dan akhirnya Anda tidak boleh lupa untuk "membangun kembali indeks".
Lihat misalnya: http://asktom.oracle.com/pls/asktom/f?p=100:11~::::P11_QUESTION_ID:54178027703899
dan http://www.oracle-base.com/articles/misc/ReclaimingUnusedSpace.php
Apakah ada prosedur PL / SQL sederhana yang, diberikan nama tablespace atau nama datafile, akan melakukan pekerjaan itu? Atau alat Oracle serupa?
sumber
Jawaban:
Jawaban singkatnya adalah Tidak . Sayangnya cara untuk melakukan ini di Oracle memang membutuhkan "tumpukan besar pertanyaan yang membosankan". Artikel yang Anda tautkan adalah beberapa informasi terbaik yang tersedia pada subjek. Filefile memang menjadi terfragmentasi, sehingga bahkan jika ruang kosong ada di bawah segmen tertinggi, Oracle tidak akan secara otomatis mengkonsolidasikannya ketika a
RESIZE
dilakukan.Untuk "defragment" tablespace Anda perlu memindahkan segmen ini ke awal datafile daripada di akhir. Untuk tabel, ini adalah proses offline yang artinya tabel tidak akan tersedia saat perpindahan sedang berlangsung. Indeks dapat dipindahkan baik offline atau dengan Edisi Perusahaan mereka dapat dipindahkan online. Karena Anda memiliki jendela pemadaman, saya sarankan Anda mengikuti langkah-langkah ini.
A. Kecilkan datafile dengan ruang kosong di luar tanda air tinggi. Ini dapat dilakukan sebagai berikut (kueri mirip dengan prosedur Frosty Z):
B. Setelah mengecilkan hal-hal di atas tanda air tinggi, cari tahu tablespace apa yang masih akan mendapat manfaat dari memiliki segmen bergerak.
C. Untuk masing-masing tablespace ini tentukan segmen mana yang perlu dipindahkan. (Ganti PENGGUNA dengan nama tablespace Anda atau gabung dengan kueri sebelumnya)
D. Pindahkan setiap tabel dan bangun kembali indeks dan statistik.
E. Ulangi langkah A.
Saya baru saja membangun sebagian besar pertanyaan ini, jadi Anda harus mengujinya secara menyeluruh sebelum digunakan. Saya kira Anda bisa membuat prosedur yang akan digunakan
EXECUTE IMMEDIATE
untuk membuat pernyataan aktual untuk berjalan secara dinamis, tetapi karena permintaan akan menerima ORA-08103: Objek tidak lagi ada saat perpindahan sedang berlangsung, saya pikir yang terbaik adalah mengontrol proses itu secara manual bahkan jika itu berarti sedikit lebih banyak waktu / usaha.sumber
Solusi sebagian yang terinspirasi dari halaman ini :
Itu tidak mengatur ulang ruang kosong tetapi secara otomatis mendeteksi ruang kosong yang tersedia di akhir datafile dan mencetak perintah 'RESIZE' yang tepat.
sumber
Sebelum Anda mencoba mengecilkanfile data sama sekali, tanyakan pada diri Anda: Apakah Anda akan membuat segmen baru lagi di dalam tablespace terkait entah kapan dalam waktu yang tidak begitu lama? Jika ya, tidak ada gunanya menyusut. Ruang hanya akan digunakan kembali untuk segmen baru Anda dan Anda menyelamatkan diri dan sistem dengan banyak upaya dengan membiarkannya apa adanya.
sumber
Setelah berselancar di Google selama berhari-hari, saya telah menemukan contoh paling sederhana dan jelas untuk mendapatkan kembali ruang kosong di tablespace setelah dihapus. saya harap ini membantu
Tautan: http://www.dbforums.com/oracle/976248-how-reduce-tablespaces-used-space-after-delete-records-2.html
larutan:
Mari kita buat tabel dengan 9999 baris di dalamnya, masing-masing berukuran sekitar 1k:
Tabel memiliki 29 luasan yang dialokasikan, dengan total 14,6 juta:
Mari kita hapus SEMUA baris:
Sekarang- "kejutan" - tabel masih menggunakan luasan yang sama:
Mengapa Karena bahkan jika Anda menghapus semua baris tabel, Tanda Air Tinggi tidak berkurang - tidak pernah menurun, untuk memungkinkan konkurensi maksimum (Oracle sangat serius dalam memaksimalkan konkurensi yaitu kinerja dan skalabilitas; itu adalah alasan utama di balik keberhasilannya dalam aplikasi Perusahaan).
Deallocating ruang yang tidak digunakan (= ruang di atas HWM) tidak banyak membantu (karena tidak ada banyak ruang yang tidak digunakan di atas HWM):
Sekarang, mari kita PINDAHKAN tabel, yang pada dasarnya berarti mengkloning tabel (termasuk pemicu, kendala, dan sebagainya), mentransfer baris, menjatuhkan tabel "lama" dan mengganti nama yang baru - semua dibuat oleh kernel, sehingga sangat aman bahkan dalam kasus kegagalan mesin / server:
Sekarang, kita sekarang hanya memiliki alokasi awal:
Peringatan: biasanya terjadi bahwa banyak / semua indeks di atas tabel tidak dapat digunakan setelah pindah (tidak dalam kasus ini tetapi saya menjalankan 9.2.0.4, rilis terbaru, yang mungkin telah mengoptimalkan proses jika tabel benar-benar kosong ):
Jika STATUS bukan VALID, Anda cukup membangun kembali secara manual indeks:
Atau Anda dapat mengotomatiskan seluruh proses:
Sebagai contoh, mari kita atur secara manual indeks ke UNUSABLE:
HTH Alberto
sumber
Seperti yang dikatakan sebelumnya, Anda harus memindahkan semua 200+ tabel di tablespace tersebut untuk membebaskan sebagian ruang dalam datafile Anda dan kemudian mengubah ukuran untuk mendapatkan kembali ruang tersebut. Tetapi alih-alih menjalankan semua pertanyaan itu, manajer Perusahaan 12c melakukan tugas ini. Anda harus menavigasi ke Database Home> Storage> Tablespace. Pilih tablespace yang ingin Anda kerjakan dan klik Reorganisasi. Ini akan memberikan opsi untuk melihat pernyataan SQL yang akan dieksekusi. Anda dapat mengambil salinannya dan menjalankannya sendiri atau menjadwalkan pekerjaan di EM.
Ini benar-benar menciptakan tablespace lain, memindahkan semua objek ke tablespace baru, membangun kembali indeks dan menjatuhkan objek dari tablespace lama.
Ada beberapa kekurangan yang bisa saya pikirkan. Ini harus dilakukan pada jam-jam di luar jam sibuk jika tidak maka sumber daya akan sibuk. File data (bukan tablespace) akan memiliki "reorg" ditambahkan ke namanya, menjelang akhir.
sumber