Memulihkan ruang logis dari tablespace

11

Saya memiliki tablespace yang disebut DATA, dan pengaturan dengan perpanjangan otomatis sebagai false. Tablespace ini memiliki dua file data dan diatur sehingga membutuhkan ruang fisik 350 GB.

Seminggu yang lalu saya menanyakan user_tablespaces dan dba_data_files dan memperhatikan itu memiliki 20% ruang logis yang tersedia. Saya kemudian diproses dengan pembersihan dan menghapus banyak catatan dari tabel di tablespace ini. Kami berharap untuk melihat peningkatan besar dalam ruang yang tersedia. Sayangnya ketika saya mempertanyakan pandangan saya perhatikan ruang yang tersedia sekarang 20,5%.

Mungkinkah ini disebabkan oleh fragmentasi data? Bisakah kita "defrag" tablespace entah bagaimana dan memulihkan ruang yang hilang? Atau apakah kita perlu membuat ulang tablespace dari awal?

Nuno Furtado
sumber

Jawaban:

14

Saat Anda menghapus catatan, tidak ada yang secara otomatis memadatkan segmen, oleh karena itu Anda perlu melakukan penyusutan segmen untuk mendapatkan kembali ruang tersebut. Berikut adalah kutipan dari Panduan Administrator 11.2 tentang Mengembalikan Ruang yang Terbuang :

Seiring waktu, pembaruan dan penghapusan objek dalam tablespace dapat membuat kantong ruang kosong yang secara individual tidak cukup besar untuk digunakan kembali untuk data baru. Jenis ruang kosong ini disebut sebagai ruang bebas terfragmentasi.

Objek dengan ruang bebas terfragmentasi dapat menghasilkan banyak ruang terbuang, dan dapat berdampak pada kinerja database. Cara yang disukai untuk mendefrag dan mendapatkan kembali ruang ini adalah dengan melakukan penyusutan segmen online. Proses ini menggabungkan ruang bebas terfragmentasi di bawah tanda air tinggi dan memadatkan segmen. Setelah pemadatan, tanda air tinggi dipindahkan, menghasilkan ruang kosong baru di atas tanda air tinggi. Ruang di atas tanda air tinggi itu kemudian dialokasikan. Segmen tetap tersedia untuk kueri dan DML selama sebagian besar operasi, dan tidak ada ruang disk tambahan yang perlu dialokasikan.

Lebih jauh ke bawah pada halaman yang sama Anda dapat membaca ini:

Susut segmen adalah operasi online di tempat. Operasi dan kueri DML dapat dikeluarkan selama fase pergerakan data segmen menyusut. Operasi DML bersamaan diblokir untuk waktu yang singkat di akhir operasi menyusut, ketika ruang tersebut dialokasikan. Indeks dipertahankan selama operasi menyusut dan tetap dapat digunakan setelah operasi selesai. Susut segmen tidak memerlukan ruang disk tambahan untuk dialokasikan.

Susut segmen merebut kembali ruang yang tidak digunakan baik di atas maupun di bawah tanda air tinggi. Sebaliknya, alokasi ruang mengambil kembali ruang yang tidak digunakan hanya di atas tanda air tinggi. Dalam operasi susut, secara default, basis data memadatkan segmen, menyesuaikan tanda air tinggi, dan melepaskan ruang reklamasi.

Halaman ini mencakup lebih banyak informasi tentang masalah termasuk contoh.

Bagian "Ruang Segmen dan Tanda Air Tinggi" dari Panduan Konsep mungkin juga berguna.

Leigh Riffel
sumber
9

Ya, itu karena fragmentasi.

Untuk merebut kembali ruang, pertama-tama dapatkan daftar tabel di tablespace dengan kueri berikut (abaikan partisi - edit pertanyaan Anda jika Anda menggunakannya):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

Kemudian untuk setiap tabel, aktifkan gerakan baris:

alter table TABLEINDATAPARTITION enable row movement;

Anda kemudian dapat mengecilkan tabel:

alter table TABLEINDATAPARTITION shrink space;

Kemudian susutkan file data dengan:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

Nama datafile dapat diperoleh dari DBA_DATA_FILEStampilan, yang sudah Anda ketahui.

Philᵀᴹ
sumber
Luar biasa, jawaban praktis. +1
Leigh Riffel