Topik ini menjelaskan fitur flashback asli, yang memungkinkan Anda mengeksekusi pernyataan SQL untuk menanyakan atau mengembalikan data pada titik waktu tertentu. Dengan cara ini, jika terjadi operasi yang tidak disengaja, Anda dapat memperoleh data historis dengan cepat.
Deskripsi Fitur
Operasi yang tidak disengaja selama pemeliharaan dan pengoperasian (O&M) database dapat berdampak serius pada bisnis Anda. Dalam situasi seperti itu, Anda dapat mengembalikan data dari file log biner. Namun, metode pemulihan ini rumit, memakan waktu, dan rentan terhadap kesalahan. Alternatifnya, Anda dapat mengembalikan data dari file cadangan data, tetapi metode ini membutuhkan sumber daya tambahan dan mungkin memerlukan waktu lama untuk sejumlah besar data.
Fitur flashback asli AliSQL didukung oleh InnoDB. Anda dapat menanyakan atau mengembalikan data historis dalam waktu singkat dengan mengeksekusi pernyataan SQL sederhana, sehingga memastikan stabilitas layanan database Anda.
Prasyarat
Instans RDS Anda harus menjalankan MySQL 8.0 pada Edisi Dasar RDS, Edisi Ketersediaan Tinggi RDS, atau Edisi Kluster RDS.
Versi mesin minor instans RDS Anda harus 20210930 atau lebih baru. Untuk informasi lebih lanjut tentang cara melihat atau memperbarui versi mesin minor, lihat Perbarui versi mesin minor.
Catatan Penggunaan
Fitur flashback asli hanya didukung untuk tabel InnoDB.
Fitur flashback asli mengonsumsi ruang tabel undo tambahan. Anda dapat mengonfigurasi parameter innodb_undo_space_supremum_size untuk menentukan ruang tabel undo. Untuk informasi lebih lanjut, lihat Parameter.
Fitur flashback asli mengembalikan data pada titik waktu yang paling dekat dengan titik waktu yang ditentukan, tetapi tidak menjamin hasil kueri persis sesuai dengan data pada titik waktu tersebut.
Anda tidak dapat menggunakan fitur flashback asli untuk menanyakan atau mengembalikan data dari tabel tempat operasi DDL telah dilakukan. Misalnya, Anda tidak dapat menggunakan fitur ini untuk menanyakan data dari tabel yang dihapus.
Sintaksis
Fitur flashback asli menyediakan sintaksis baru AS OF, yang digunakan untuk menentukan titik waktu ke mana Anda ingin mengembalikan tabel. Contoh berikut menunjukkan sintaksis AS OF:
SELECT ... FROM <Nama tabel>
AS OF TIMESTAMP <Ekspresi>;Parameter Ekspresi menentukan titik waktu ke mana Anda ingin mengembalikan tabel dan mendukung beberapa format. Contoh:
SELECT ... FROM tablename
AS OF TIMESTAMP '2020-11-11 00:00:00';
SELECT ... FROM tablename
AS OF TIMESTAMP now();
SELECT ... FROM tablename
AS OF TIMESTAMP (SELECT now());
SELECT ... FROM tablename
AS OF TIMESTAMP DATE_SUB(now(), INTERVAL 1 minute);Parameter
Tabel berikut menjelaskan parameter dari fitur flashback asli.
Parameter | Deskripsi |
innodb_rds_flashback_task_enabled |
Catatan Jika Anda ingin menonaktifkan fitur flashback asli, Anda harus menyetel parameter ini ke OFF dan menyetel parameter innodb_undo_retention ke 0. |
innodb_undo_retention |
Catatan
|
innodb_undo_space_supremum_size |
|
innodb_undo_space_reserved_size |
Catatan Jika Anda menyetel parameter ini ke nilai besar, sejumlah besar catatan undo dicadangkan. Akibatnya, performa instans RDS Anda menurun. Kami merekomendasikan agar Anda menyetel parameter ini ke 0. |
Contoh
# Memperoleh titik waktu.
MySQL [mytest]> select now();
+---------------------+
| now() |
+---------------------+
| 2020-10-14 15:44:09 |
+---------------------+
1 row in set (0.00 sec)
# Menanyakan data dari sebuah tabel.
MySQL [mytest]> select * from mt1;
+----+------+
| id | c1 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+------+
5 rows in set (0.00 sec)
# Melakukan operasi pembaruan yang tidak mengandung klausa WHERE.
MySQL [mytest]> update mt1 set c1 = 100;
Query OK, 5 rows affected (0.00 sec)
Rows matched: 5 Changed: 5 Warnings: 0
MySQL [mytest]> select * from mt1;
+----+------+
| id | c1 |
+----+------+
| 1 | 100 |
| 2 | 100 |
| 3 | 100 |
| 4 | 100 |
| 5 | 100 |
+----+------+
5 rows in set (0.00 sec)
# Menanyakan data historis pada titik waktu tertentu. Hasil berhasil dikembalikan.
MySQL [mytest]> select * from mt1 AS OF timestamp '2020-10-14 15:44:09';
+----+------+
| id | c1 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+------+
5 rows in set (0.00 sec)
# Menanyakan data historis pada titik waktu yang tidak dalam periode retensi data historis. Pesan kesalahan dikembalikan.
MySQL [mytest]> select * from mt1 AS OF timestamp '2020-10-13 14:44:09';
ERROR 7545 (HY000): The snapshot to find is out of range
# Mengembalikan data tabel.
MySQL [mytest]> create table mt1_tmp like mt1; # Membuat tabel sementara yang menggunakan skema yang sama dengan tabel asli.
Query OK, 0 rows affected (0.03 sec)
MySQL [mytest]> insert into mt1_tmp
-> select * from mt1 AS OF
-> TIMESTAMP '2020-10-14 15:44:09'; # Menulis data historis dari tabel asli ke tabel sementara.
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
MySQL [mytest]> select * from mt1_tmp; # Memverifikasi data di tabel sementara.
+----+------+
| id | c1 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+------+
5 rows in set (0.00 sec)
MySQL [mytest]> rename table mt1 to mt1_bak,
-> mt1_tmp to mt1; #(Sebelum melakukan operasi ini, Anda harus menghentikan operasi baca dan tulis pada tabel asli.) Mengubah nama tabel asli menjadi mt1_bak dan mengubah nama tabel sementara menjadi nama asli tabel asli untuk menyelesaikan pemulihan data.
Query OK, 0 rows affected (0.02 sec)
MySQL [mytest]> select * from mt1; # Memverifikasi bahwa data benar setelah proses pemulihan.
+----+------+
| id | c1 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+------+
5 rows in set (0.01 sec)