Fitur native flashback memungkinkan Anda menggunakan pernyataan SQL untuk mengkueri atau memulihkan data ke titik waktu tertentu, sehingga Anda dapat dengan cepat mengambil data historis setelah terjadi operasi yang tidak disengaja.
Ikhtisar
Operasi yang tidak disengaja selama pemeliharaan database dapat berdampak serius terhadap bisnis Anda. Metode pemulihan data tradisional, seperti Binlog Flashback, umumnya kompleks, rentan kesalahan, dan memakan waktu. Pemulihan data dari set cadangan memerlukan sumber daya sistem tambahan, dan waktu pemulihannya bisa tidak dapat diprediksi saat menangani volume data yang besar.
AliSQL memperkenalkan fitur native flashback untuk engine InnoDB, yang menghilangkan kebutuhan akan operasi pemulihan yang kompleks. Dengan fitur ini, Anda dapat menggunakan pernyataan SQL sederhana untuk mengkueri atau memulihkan data historis dari sebelum terjadinya operasi yang tidak disengaja, sehingga menghemat waktu berharga dan menjamin kelangsungan bisnis.
Prasyarat
Untuk menggunakan fitur ini, versi database instans Anda harus memenuhi persyaratan berikut. Jika versi mesin minor tidak memenuhi persyaratan, Anda dapat memperbaruinya.
MySQL 8.4
MySQL 8.0 dengan versi mesin minor 20210930 atau lebih baru.
Batasan
Hanya tabel dengan engine InnoDB yang didukung.
Fitur ini mengonsumsi tablespace undo tambahan. Anda dapat mengonfigurasi ukuran maksimumnya melalui parameter innodb_undo_space_supremum_size.
Kueri native flashback mengembalikan data dari titik waktu yang paling dekat dengan timestamp yang ditentukan. Kecocokan eksak tidak dijamin.
Mengkueri dan memulihkan data historis yang melibatkan operasi DDL tidak didukung. Sebagai contoh, Anda tidak dapat menggunakan native flashback untuk mengkueri konten tabel yang telah di-drop.
Sintaksis
Fitur native flashback memperkenalkan klausa AS OF untuk menentukan titik waktu tujuan. Sintaksisnya adalah sebagai berikut:
SELECT ... FROM <table_name>
AS OF TIMESTAMP <expression>;Ekspresi tersebut menentukan titik waktu target 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
Parameter berikut mengonfigurasi fitur native flashback:
Parameter | Deskripsi |
innodb_rds_flashback_task_enabled |
Catatan Saat Anda menonaktifkan fitur native flashback, Anda juga harus mengatur parameter innodb_undo_retention ke 0. |
innodb_undo_retention |
Catatan
|
innodb_undo_space_supremum_size |
|
innodb_undo_space_reserved_size |
Catatan Nilai yang besar untuk parameter ini dapat menyebabkan akumulasi catatan undo yang berlebihan, yang berdampak pada performa instans. Kecuali diperlukan, pertahankan parameter ini pada nilai 0. |
Contoh
# Dapatkan timestamp saat ini.
MySQL [mytest]> select now();
+---------------------+
| now() |
+---------------------+
| 2020-10-14 15:44:09 |
+---------------------+
1 row in set (0.00 sec)
# Lihat data.
MySQL [mytest]> select * from mt1;
+----+------+
| id | c1 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+------+
5 rows in set (0.00 sec)
# Jalankan operasi update tanpa 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)
# Kueri data historis pada titik waktu yang ditentukan. Kueri mengembalikan hasil yang diharapkan.
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)
# Jika waktu yang ditentukan berada di luar jendela retensi data historis, kueri akan gagal.
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
# Mulai pemulihan data.
MySQL [mytest]> create table mt1_tmp like mt1; # Buat tabel temporary dengan struktur yang sama seperti 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'; # Masukkan data historis dari tabel asli ke tabel temporary.
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
MySQL [mytest]> select * from mt1_tmp; # Verifikasi bahwa data di tabel temporary sudah benar.
+----+------+
| 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 menjalankan operasi ini, hentikan semua operasi baca dan tulis pada tabel.) Ubah nama tabel asli menjadi mt1_bak dan tabel temporary menjadi mt1 untuk menyelesaikan pemulihan data.
Query OK, 0 rows affected (0.02 sec)
MySQL [mytest]> select * from mt1; # Verifikasi data yang telah dipulihkan.
+----+------+
| id | c1 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+----+------+
5 rows in set (0.01 sec)