全部产品
Search
文档中心

ApsaraDB RDS:Gunakan perintah OPTIMIZE TABLE untuk melepaskan ruang tabel di instans MySQL

更新时间:Jul 22, 2025

Ketika sebuah tabel MySQL berisi sejumlah besar data, menggunakan pernyataan DELETE untuk membersihkan data tidak langsung melepaskan ruang disk. Data hanya ditandai sebagai dapat digunakan kembali. Untuk benar-benar mereklaim ruang tabel dan mengurangi penggunaan disk, gunakan OPTIMIZE TABLE.

Prasyarat

  • Hanya mesin InnoDB dan MyISAM yang mendukung pernyataan OPTIMIZE TABLE.

  • Ruang disk tersisa pada instans harus lebih besar dari atau sama dengan ruang tabel yang akan dilepaskan.

    Catatan

    Jika ruang disk tersisa tidak mencukupi, Anda harus terlebih dahulu meningkatkan ruang disk. Setelah operasi selesai, Anda dapat menurunkan ruang disk sesuai kebutuhan, dan sistem akan mengembalikan selisih harga.

Pertimbangan

  • Hapus sejumlah besar data terlebih dahulu: Jika Anda tidak menghapus sejumlah besar data menggunakan DELETE, menjalankan OPTIMIZE TABLE secara langsung tidak akan efektif dalam mengurangi penggunaan ruang tabel.

  • Peningkatan Sementara Penggunaan Disk: Saat menjalankan OPTIMIZE TABLE, MySQL membuat tabel sementara untuk menyimpan data yang telah diorganisir ulang, sehingga meningkatkan penggunaan disk sementara. Setelah operasi selesai, tabel sementara dihapus, dan penggunaan disk kembali normal.

  • Dampak Kinerja dan Risiko Periode Puncak: Di RDS MySQL 5.7 dan 8.0, OPTIMIZE TABLE dijalankan menggunakan DDL Online, yang mendukung operasi DML bersamaan. Namun, menjalankan operasi ini pada tabel besar dapat menyebabkan konsumsi tiba-tiba IO dan Buffer, dengan risiko penguncian tabel atau konflik sumber daya. Selama periode puncak bisnis, hal ini bahkan dapat menyebabkan instans menjadi tidak tersedia atau pemantauan terganggu. Oleh karena itu, disarankan untuk menjalankan operasi ini selama jam-jam non-puncak bisnis untuk menghindari mempengaruhi operasi bisnis normal.

Gunakan CLI untuk melepaskan tablespace

  1. Hubungkan ke instans RDS MySQL melalui Klien.

  2. Gunakan pernyataan DELETE untuk membersihkan data yang tidak diinginkan sesuai kebutuhan.

  3. Jalankan perintah OPTIMIZE TABLE untuk melepaskan ruang tabel.

    OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;
    Catatan
    • <$Database1> dan <$Database2> adalah nama database, <Table1> dan <Table2> adalah nama tabel.

    • Saat menjalankan pernyataan OPTIMIZE TABLE pada mesin InnoDB, Anda akan melihat pesan berikut. Ini adalah hasil eksekusi normal yang dapat Anda abaikan. Pastikan bahwa hasilnya mengembalikan "ok". Untuk informasi lebih lanjut, lihat Pernyataan OPTIMIZE TABLE.

      Tabel tidak mendukung optimasi, melakukan recreate + analyze sebagai gantinya

Gunakan DMS untuk melepaskan tablespace

  1. Masuk ke instans RDS MySQL melalui DMS.

  2. Di panel sisi kiri, pilih ID instans dari instans target, lalu klik dua kali database target, klik kanan nama tabel apa pun, dan pilih Batch Operations.

  3. Pilih tabel tempat Anda ingin melepaskan ruang, lalu pilih Table Maintenance > Optimize Table.优化表

  4. Di kotak dialog yang muncul, konfirmasikan bahwa informasi perubahan sudah benar, lalu klik Confirm.

Referensi

Reklaim Ruang Fragmentasi Tabel

FAQ

Bagaimana cara menangani ketikaDELETEtidak melepaskan ruang diRDS MySQL?

Di RDS MySQL, ketika Anda menggunakan pernyataan DELETE untuk menghapus data, perintah ini hanya menandai lokasi catatan atau halaman data sebagai dapat digunakan kembali, tetapi ukuran file disk tidak berubah, artinya ruang tabel tidak langsung direklaim. Perilaku ini mencegah ruang tabel direklaim secara langsung, menciptakan fragmentasi ruang penyimpanan instans yang menghabiskan ruang penyimpanan instans.

Berikut ini memberikan dua solusi: DDL asli atau evolusi skema bebas kunci DMS. Perhatikan bahwa sebelum menjalankan salah satu solusi, Anda perlu memastikan bahwa instans memiliki ruang tersisa yang cukup untuk menghindari penguncian instans karena ruang instans penuh.

  • Organisasikan Fragmentasi Ruang Melalui Perintah: Jalankan OPTIMIZE TABLE atau ALTER TABLE <table_name> ENGINE=InnoDB; dan operasi DDL lainnya untuk mengatur ulang struktur data dan indeks tabel, sehingga melepaskan ruang yang terfragmentasi.

    Penting

    Saat menggunakan perintah DDL asli, Anda perlu menjalankannya selama jam-jam non-puncak bisnis untuk menghindari metadata lock blocking. Untuk informasi lebih lanjut, lihat Pertimbangan.

  • Gunakan Evolusi Skema Bebas Kunci DMS: Jika Anda ingin menghindari metadata lock, Anda dapat mempertimbangkan menggunakan Evolusi Skema Bebas Kunci DMS untuk mereklaim ruang fragmentasi tabel.

TRUNCATEatauDROPtidak melepaskan ruang di RDS MySQL, bagaimana cara menanganinya?

Di RDS MySQL, jika Anda menemukan bahwa ruang disk tidak dilepaskan setelah menjalankan operasi TRUNCATE atau DROP, Anda dapat menanganinya sesuai langkah-langkah berikut:

  1. Konfirmasi Logika Pelepasan Ruang

    Setelah menjalankan TRUNCATE atau DROP, konfirmasikan apakah ruang telah dilepaskan dengan memantau penggunaan disk dari instans. Biasanya, proporsi ukuran tabel yang dihapus terhadap total ruang instans akan tercermin sebagai penurunan penggunaan disk.

  2. Hindari Bergantung pada Informasi Usang

    Jika Anda memeriksa ukuran tabel melalui information_schema.tables atau Konsol RDS (Autonomy Service > Quick Diagnostics > Space Analysis), ruang tabel mungkin tampak tidak berubah karena penundaan pembaruan data. Oleh karena itu, disarankan untuk menggunakan penggunaan disk sebagai dasar penilaian.

  3. Pengaruh Penghapusan Asinkron

    Jika instans telah mengaktifkan penghapusan asinkron (seperti Alibaba Cloud's Purge Large File Asynchronously), ruang yang ditempati oleh file tabel tidak akan dilepaskan segera, tetapi dibersihkan secara bertahap oleh proses latar belakang. Dalam kasus ini, Anda perlu menunggu proses asinkron selesai agar ruang disk akhirnya dilepaskan.