Operasi DDL yang tidak disengaja seperti DROP TABLE dapat menyebabkan kehilangan data karena tidak dapat dikembalikan (rollback). Untuk mengurangi risiko tersebut, Alibaba Cloud menyediakan fitur recycle bin. Fitur ini sementara memindahkan tabel yang dihapus ke recycle bin, memungkinkan Anda mengonfigurasi periode retensi untuk pemulihan data yang mudah, serta menyertakan paket DBMS_RECYCLE untuk pengelolaan.
Prasyarat
Instans Anda menjalankan salah satu versi berikut:
-
RDS for MySQL 8.4
-
RDS for MySQL 8.0 dengan versi mesin minor 20191225 atau lebih baru
-
RDS for MySQL 5.7 dengan versi mesin minor 20210430 atau lebih baru
Parameter recycle bin
Fitur recycle bin mencakup lima parameter:
|
Parameter |
Description |
|
loose_recycle_bin |
Menentukan apakah fitur recycle bin diaktifkan pada tingkat session dan tingkat global. Anda dapat mengubah parameter ini di Konsol. Nilai default: OFF. |
|
loose_recycle_bin_retention |
Menentukan periode retensi, dalam detik, untuk tabel di recycle bin. Nilai default adalah 604.800 (satu minggu). Anda dapat mengubah parameter ini di Konsol. |
|
loose_recycle_scheduler |
Menentukan apakah thread purge asinkron untuk recycle bin diaktifkan. Anda dapat mengubah parameter ini di Konsol. Nilai default: OFF. |
|
loose_recycle_scheduler_interval |
Interval polling untuk thread purge asinkron, dalam detik. Nilai default adalah 30. Parameter ini tidak dapat diubah. |
|
loose_recycle_scheduler_purge_table_print |
Menentukan apakah log detail untuk operasi purge asinkron dicetak. Nilai default: OFF. Parameter ini tidak dapat diubah. |
Untuk mencegah kehabisan ruang disk, atur periode retensi yang wajar dan aktifkan thread purge latar belakang.
Cara kerja
-
Mekanisme recycling dan purging
-
Mekanisme recycling
Pernyataan
TRUNCATE TABLEmemindahkan tabel asli ke direktori recycle bin khusus dan membuat tabel baru dengan struktur yang sama di tempatnya.CatatanFitur ini hanya didukung pada versi berikut:
RDS for MySQL 8.4
RDS for MySQL 8.0 dengan versi mesin minor 20200331 atau lebih baru
Pernyataan
DROP TABLEatauDROP DATABASEhanya memindahkan objek tabel terkait ke direktori recycle bin khusus. Objek lain ditangani sebagai berikut:-
Operasi tersebut tidak mendaur ulang objek yang tidak terkait dengan tabel. Objek tersebut dipertahankan atau dihapus sesuai dengan pernyataan operasi spesifik.
-
Operasi tersebut menghapus objek dependen yang dapat memodifikasi data tabel, seperti trigger dan foreign keys. Namun, statistik kolom tidak di-purge, melainkan dipindahkan ke recycle bin bersama tabelnya.
-
Mekanisme purging
Recycle bin menjalankan thread latar belakang untuk secara asinkron mem-purge objek tabel yang telah melebihi periode retensi yang ditetapkan oleh parameter loose_recycle_bin_retention. Jika purge menemui tabel besar, thread latar belakang lain akan dijalankan untuk menghapus tabel tersebut secara asinkron.
-
-
Izin
Saat instans RDS for MySQL dimulai, sistem menginisialisasi database bernama
__recycle_bin__, yang digunakan secara eksklusif oleh recycle bin.__recycle_bin__adalah database sistem yang tidak dapat Anda modifikasi atau hapus secara langsung.Meskipun Anda tidak dapat menjalankan pernyataan
drop tablesecara langsung pada tabel di recycle bin, Anda dapat menggunakan perintahcall dbms_recycle.purge_table('<TABLE>');untuk mem-purge-nya.CatatanAkun memerlukan izin
DROPbaik pada tabel asli maupun pada tabel di recycle bin. -
Konvensi penamaan tabel di recycle bin
Recycle bin menggabungkan tabel dari berbagai database ke dalam satu database
__recycle_bin__. Untuk memastikan nama tabel unik, recycle bin menggunakan format berikut:"__" + <Storage Engine> + <SE private id>Tabel berikut menjelaskan komponen format penamaan tersebut.
Parameter
Description
Storage engine
Nama storage engine.
SE private id
ID unik yang dihasilkan oleh storage engine untuk setiap tabel. Misalnya, pada engine InnoDB, ini adalah ID tabel.
-
Recycling independen
Pengaturan recycle bin hanya berlaku pada instans lokal. Pengaturan tersebut tidak diteruskan ke node yang memiliki replikasi log aktif, seperti instans secondary, instans hanya baca, dan instans pemulihan bencana. Sebagai contoh, Anda dapat mengonfigurasi periode retensi 7 hari pada instans primary dan periode retensi 14 hari pada instans secondary.
CatatanPeriode retensi yang berbeda dapat menyebabkan perbedaan signifikan dalam penggunaan ruang disk antar instans.
Catatan penggunaan
-
Jika database recycle bin dan tabel yang akan didaur ulang berada pada sistem file yang berbeda, menjalankan pernyataan
drop tableakan memicu migrasi file data yang memakan waktu. -
Ketika sebuah tabel berbagi ruang tabel umum dengan tabel lain, proses recycling tabel tersebut tidak memindahkan file data terkait.
Mengelola recycle bin
AliSQL menyediakan tiga fungsi dalam paket DBMS_RECYCLE untuk mengelola recycle bin:
-
Menampilkan tabel di recycle bin
Untuk melihat semua tabel di recycle bin, gunakan perintah berikut dari paket
DBMS_RECYCLE:call dbms_recycle.show_tables();Contoh:
mysql> call dbms_recycle.show_tables(); +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | SCHEMA | TABLE | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME | PURGE_TIME | +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | __recycle_bin__ | __innodb_1063 | product_db | t1 | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | | __recycle_bin__ | __innodb_1064 | product_db | t2 | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | | __recycle_bin__ | __innodb_1065 | product_db | parent | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | | __recycle_bin__ | __innodb_1066 | product_db | child | 2019-08-08 11:01:46 | 2019-08-15 11:01:46 | +-----------------+---------------+---------------+--------------+---------------------+---------------------+ 4 rows in set (0.00 sec)Parameter
Description
SCHEMA
Nama database untuk recycle bin.
TABLE
Nama tabel di recycle bin.
ORIGIN_SCHEMA
Nama database asli.
ORIGIN_TABLE
Nama tabel asli.
RECYCLED_TIME
Waktu saat tabel dipindahkan ke recycle bin.
PURGE_TIME
Waktu saat tabel dijadwalkan untuk di-purge dari recycle bin.
-
Mem-purge tabel secara manual dari recycle bin
Untuk mem-purge tabel secara manual dari recycle bin, gunakan perintah berikut dari paket
DBMS_RECYCLE:call dbms_recycle.purge_table('<TABLE>');Catatan-
<TABLE>adalah nama tabel di recycle bin. -
Akun memerlukan izin
DROPbaik pada tabel asli maupun pada tabel di recycle bin.
Contoh:
call dbms_recycle.purge_table('__innodb_1063'); -
-
Memulihkan tabel dari recycle bin
-
Untuk memulihkan tabel dari recycle bin, gunakan antarmuka yang disediakan oleh paket
DBMS_RECYCLE.Perintahnya adalah sebagai berikut:
call dbms_recycle.restore_table('<RECYCLE_TABLE>','<DEST_DB>','<DEST_TABLE>');Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter
Description
RECYCLE_TABLE
Nama tabel di recycle bin yang akan dipulihkan.
CatatanJika Anda hanya menentukan parameter ini, tabel akan dipulihkan ke lokasi aslinya dengan nama aslinya.
DEST_DB
Nama database tujuan.
DEST_TABLE
Nama tabel tujuan.
CatatanPerintah
restore_tablememerlukan izinSUPER. Karena akun pengguna tidak diberikan izin ini, Anda tidak dapat menjalankan perintah ini secara manual.Contoh:
mysql> call dbms_recycle.restore_table('__innodb_1063','testDB','testTable'); -
Memulihkan data dari tabel di recycle bin menggunakan
INSERT ... SELECT.Pertama, tanyakan semua tabel di recycle bin untuk menemukan nama tabel yang ingin Anda pulihkan di database
__recycle_bin__. Kemudian, buat tabel tujuan dengan struktur yang sama dan gunakan pernyataanINSERT ... SELECTuntuk mengimpor data ke tabel tujuan. Contohnya:mysql> call dbms_recycle.show_tables(); +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | SCHEMA | TABLE | ORIGIN_SCHEMA | ORIGIN_TABLE | RECYCLED_TIME | PURGE_TIME | +-----------------+---------------+---------------+--------------+---------------------+---------------------+ | __recycle_bin__ | __innodb_1132 | sbtest | sbtest1 | 2024-07-31 15:08:56 | 2024-08-07 15:08:56 | +-----------------+---------------+---------------+--------------+---------------------+---------------------+ 1 row in set (0.00 sec) mysql> CREATE TABLE `db1`.`t1` ( -> `id` int NOT NULL AUTO_INCREMENT, -> `k` int NOT NULL DEFAULT '0', -> `c` char(120) NOT NULL DEFAULT '', -> `pad` char(60) NOT NULL DEFAULT '', -> PRIMARY KEY (`id`), -> KEY `k_1` (`k`) -> ) ENGINE=InnoDB AUTO_INCREMENT=400001 DEFAULT CHARSET=utf8mb3; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> insert into `db1`.`t1` select * from `__recycle_bin__`.`__innodb_1132`; Query OK, 400000 rows affected (2.76 sec) Records: 400000 Duplicates: 0 Warnings: 0
-