Fitur kueri flashback memungkinkan Anda mengambil data dari kluster, database, dan tabel sebagaimana keadaannya pada titik waktu tertentu di masa lalu secara efisien.
Prasyarat
Kluster PolarDB Anda harus menggunakan salah satu versi berikut:
PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.21 atau yang lebih baru.
PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.32 atau yang lebih baru.
PolarDB for MySQL 5.7 dengan versi revisi 5.7.1.0.25 atau yang lebih baru.
PolarDB for MySQL 5.6 dengan versi revisi 5.6.1.0.36 atau yang lebih baru.
Untuk informasi selengkapnya, lihat Kueri nomor versi.
Fitur kueri flashback bergantung pada parameter innodb_backquery_enable, yang secara default dinonaktifkan. Untuk menggunakan fitur ini, Anda harus mengaktifkan parameter innodb_backquery_enable di bagian Parameters kluster PolarDB Anda.
CatatanJika Anda menjalankan kueri flashback sebelum mengaktifkan parameter innodb_backquery_enable, sistem akan mengembalikan kesalahan berikut:
ERROR 1815 (HY000): Internal error: the backquery_time set is out of range, too old.
Peringatan
Gunakan kueri flashback hanya untuk skenario tabel tunggal. Jangan menggunakannya untuk kueri kompleks seperti yang melibatkan JOIN atau subkueri.
Gunakan kunci primer dalam kueri flashback. Indeks sekunder tidak didukung untuk kueri flashback. Jika Anda menggunakan indeks sekunder, kueri tersebut akan dikonversi menjadi pemindaian tabel penuh, sehingga menurunkan kinerja.
Saat fitur kueri flashback diaktifkan, tablespace undo meningkat karena log undo menyimpan data historis dalam rentang waktu yang ditentukan oleh parameter
innodb_backquery_window. Tablespace juga dapat meningkat dalam skenario BLOB. Kinerja penulisan mungkin sedikit menurun selama proses peningkatan tablespace.Saat fitur kueri flashback diaktifkan, jumlah log undo meningkat. Catatan yang ditandai untuk penghapusan mungkin tidak dihapus segera, yang dapat menurunkan kinerja kueri dalam beberapa kasus.
Satu catatan dapat memiliki maksimal 100.000 versi historis. Jika Anda melakukan kueri flashback pada catatan yang melebihi batas ini, sistem akan mengembalikan kesalahan berikut:
record undo history version exceed limit.Setelah operasi DDL dilakukan, Anda tidak dapat menggunakan kueri flashback untuk mengambil data dari titik waktu sebelum operasi tersebut. Jika Anda mencoba melakukannya, sistem mungkin mengembalikan kesalahan berikut:
Backquery primary key invisible.Anda dapat menggunakan kueri flashback untuk melihat tabel yang telah dihapus hanya jika fitur tersebut diaktifkan sebelum penghapusan tabel tersebut.
Kueri flashback hanya berlaku dalam skenario Snapshot Read. Jika Anda menggunakan pembacaan terkunci (Lock Read), kesalahan berikut akan dikembalikan: This query in backquery is not a consistent read, please check. Berikut adalah contoh pernyataan Lock Read:
SELECT * FROM your_table WHERE condition LOCK IN SHARE MODE; SELECT * FROM your_table WHERE condition FOR UPDATE; /* REPEATABLE-READ dan tingkat isolasi yang lebih tinggi menggunakan Lock Read. */ /* Tingkat isolasi READ-COMMITTED menggunakan Snapshot Read. */ INSERT INTO ... SELECT ...;
Sintaks
Sintaks kueri flashback untuk tabel tunggal
SELECT column_name_list FROM table_name AS OF TIMESTAMP time_expr alias WHERE...;Sintaks kueri flashback untuk multi-tabel
SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1,table2_name AS OF TIMESTAMP time_expr alias2 WHERE... ;Sintaks kueri flashback untuk multi-tabel dengan JOIN
SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1 JOIN table2_name AS OF TIMESTAMP time_expr alias2 ON join_cond1 JOIN table3_name AS OF TIMESTAMP time_expr alias3 ON join_cond2 WHERE...;
Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter | Diperlukan | Deskripsi |
column_name_list | Ya | Nama kolom yang akan dikueri. |
table_name table1_name table2_name table3_name | Ya | Nama tabel. |
time_expr | Ya | Timestamp untuk flashback. Ini dapat berupa string waktu atau fungsi waktu. Hanya ekspresi konstan yang didukung. Ekspresi tidak boleh mengandung nama kolom. Contoh:
|
alias alias1 alias2 alias3 | Tidak | Alias tabel. |
join_cond1 join_cond2 | Ya | Kondisi JOIN. |
Parameter
PolarDB menyediakan parameter berikut untuk mengontrol fitur flashback:
Parameter | Tipe Data | Deskripsi |
loose_innodb_backquery_enable | BOOL | Menentukan apakah akan mengaktifkan fitur kueri flashback. Nilai valid:
|
loose_innodb_backquery_window | ULONG | Rentang waktu selama kueri flashback didukung.
|
loose_innodb_backquery_capacity_limit | ULONG | Kapasitas log undo yang didukung oleh kueri flashback. Jika kapasitas log undo lebih besar dari atau sama dengan nilai ini, rentang waktu yang didukung untuk kueri flashback akan dipersingkat.
|
Contoh
Contoh berikut menunjukkan cara melakukan kueri flashback pada tabel tunggal.
Persiapkan data uji.
Buat tabel
productsdan masukkan data ke dalamnya pada2021-08-31 13:51.create table products ( prod_id bigint(10) primary key NOT NULL, prod_name varchar(20) NOT NULL, cust_id bigint(10) NULL, createtime datetime NOT NULL DEFAULT NOW() ); INSERT INTO products(prod_id,prod_name,cust_id,createtime) values (101,'Book',1,NOW()),(102,'Apple',1,NOW()),(103,'Beef',2,NOW()),(104,'Bread',3,NOW()),(105,'Cheese',4,NOW());Kueri data dalam tabel
products.SELECT * FROM products; +---------+-----------+---------+---------------------+ | prod_id | prod_name | cust_id | createtime | +---------+-----------+---------+---------------------+ | 101 | Book | 1 | 2021-08-31 13:51:22 | | 102 | Apple | 1 | 2021-08-31 13:51:24 | | 103 | Beef | 2 | 2021-08-31 13:51:26 | | 104 | Bread | 3 | 2021-08-31 13:51:27 | | 105 | Cheese | 4 | 2021-08-31 13:51:29 | +---------+-----------+---------+---------------------+ 5 rows in set (0.00 sec)Perbarui data uji.
Perbarui data dalam tabel
productspada2021-08-31 14:18.UPDATE products SET prod_id = 110, createtime = NOW() WHERE prod_name = "Book"; UPDATE products SET prod_id = 119, createtime = NOW() WHERE prod_name = "Apple"; SELECT * FROM products; +---------+-----------+---------+---------------------+ | prod_id | prod_name | cust_id | createtime | +---------+-----------+---------+---------------------+ | 103 | Beef | 2 | 2021-08-31 13:51:26 | | 104 | Bread | 3 | 2021-08-31 13:51:27 | | 105 | Cheese | 4 | 2021-08-31 13:51:29 | | 110 | Book | 1 | 2021-08-31 14:18:21 | | 119 | Apple | 1 | 2021-08-31 14:18:22 | +---------+-----------+---------+---------------------+ 5 rows in set (0.00 sec)Jalankan kueri flashback.
Kueri data dalam tabel
productssebagaimana keadaannya pada2021-08-31 14:00:00.SELECT * FROM products AS of TIMESTAMP '2021-08-31 14:00:00'; +---------+-----------+---------+---------------------+ | prod_id | prod_name | cust_id | createtime | +---------+-----------+---------+---------------------+ | 101 | Book | 1 | 2021-08-31 13:51:22 | | 102 | Apple | 1 | 2021-08-31 13:51:24 | | 103 | Beef | 2 | 2021-08-31 13:51:26 | | 104 | Bread | 3 | 2021-08-31 13:51:27 | | 105 | Cheese | 4 | 2021-08-31 13:51:29 | +---------+-----------+---------+---------------------+ 5 rows in set (0.00 sec)