Todos los productos
Search
Centro de documentos

ApsaraDB RDS:Flashback nativo

Última actualización: Oct 10, 2026

El flashback nativo le permite consultar o restaurar datos a un momento específico mediante comandos SQL, lo que facilita una recuperación rápida ante operaciones accidentales.

Descripción general

Las operaciones accidentales durante el mantenimiento de la base de datos pueden afectar gravemente su negocio. Los métodos de recuperación tradicionales, como Binlog Flashback, son complejos, propensos a errores y consumen mucho tiempo. Restaurar desde un conjunto de copia de seguridad requiere recursos adicionales del sistema, y el tiempo de recuperación se vuelve impredecible cuando se manejan grandes volúmenes de datos.

AliSQL introduce el flashback nativo para el motor InnoDB, lo que elimina las operaciones de recuperación complejas. Con comandos SQL sencillos, usted puede consultar o restaurar los datos históricos previos a una operación accidental. Esto reduce el tiempo de recuperación y minimiza el impacto en el negocio.

Requisitos previos

Su instancia debe ejecutar una de las siguientes versiones de base de datos. Si la versión secundaria del motor no cumple con los requisitos, puede update it.

  • MySQL 8.4

  • MySQL 8.0 con una versión secundaria del motor 20210930 o posterior.

Limitaciones

  • Solo es compatible con tablas del motor InnoDB.

  • Esta función consume espacio adicional en el tablespace de undo. Puede limitar el tamaño máximo con el innodb_undo_space_supremum_size parameter.

  • Una consulta de flashback nativo devuelve los datos del momento más cercano a la marca de tiempo especificada. No se garantiza una coincidencia exacta.

  • No es posible consultar ni restaurar datos históricos a través de operaciones DDL. Por ejemplo, no puede usar el flashback nativo para consultar el contenido de una tabla que ya se eliminó.

Sintaxis

El flashback nativo introduce la cláusula AS OF para especificar el momento que desea consultar o restaurar. La sintaxis es a continuación:

SELECT ... FROM <table_name>
  AS OF TIMESTAMP <expression>;

La expresión indica el momento objetivo y admite varios formatos. A continuación se muestran algunos ejemplos:

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);

Parámetros

Los siguientes parámetros controlan el comportamiento del flashback nativo:

Parámetro

Descripción

innodb_rds_flashback_task_enabled

  • Descripción: habilita o deshabilita la función de flashback nativo.

  • Formato de línea de comandos: --innodb-rds-flashback-task-enabled=#.

  • Alcance: parámetro global.

  • Tipo de dato: booleano.

  • Valor predeterminado: OFF.

  • Valores válidos: [ON|OFF].

Nota

Cuando deshabilite la función de flashback nativo, también debe establecer el parámetro innodb_undo_retention en 0.

innodb_undo_retention

  • Descripción: periodo de retención de los registros de undo, en segundos. No es posible consultar los registros de undo anteriores a este periodo.

  • Formato de línea de comandos: --innodb-undo-retention=#.

  • Alcance: parámetro global.

  • Tipo de dato: entero.

  • Valor predeterminado: 0.

  • Valores válidos: de 0 a 4294967295.

Nota
  • Un valor mayor permite que el flashback nativo consulte datos más antiguos, pero también incrementa el espacio de almacenamiento que consume el tablespace de undo.

  • Si el parámetro innodb_rds_flashback_task_enabled está configurado en OFF, también debe establecer este parámetro en 0.

innodb_undo_space_supremum_size

  • Descripción: tamaño máximo del tablespace de undo, en MB. Si el uso de espacio supera este valor, los registros de undo se purgan de forma forzosa, sin importar la configuración del parámetro innodb_undo_retention.

  • Formato de línea de comandos: --innodb-undo-space-supremum-size=#.

  • Alcance: parámetro global.

  • Tipo de dato: entero.

  • Valor predeterminado: 10240.

  • Valores válidos: de 0 a 4294967295.

innodb_undo_space_reserved_size

  • Descripción: tamaño reservado para el tablespace de undo, en MB. Cuando el parámetro innodb_undo_retention es distinto de cero, este espacio se utiliza para conservar la mayor cantidad posible de registros de undo.

  • Formato de línea de comandos: --innodb-undo-space-reserved-size=#.

  • Alcance: parámetro global.

  • Tipo de dato: entero.

  • Valor predeterminado: 0.

  • Valores válidos: de 0 a 4294967295.

Nota

Un valor alto puede provocar una acumulación excesiva de registros de undo, lo cual afecta el rendimiento de la instancia. Mantenga este parámetro en 0 a menos que sea obligatorio.

Ejemplos

# Get the current timestamp.
MySQL [mytest]> select now();
+---------------------+
| now()               |
+---------------------+
| 2020-10-14 15:44:09 |
+---------------------+
1 row in set (0.00 sec)

# View the 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)

# Run an update operation without a WHERE clause.
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)

# Query the historical data at the specified point in time. The query returns the expected result.
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)

# If the specified time is outside the retention window for historical data, the query fails.
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

# Start the data recovery.
MySQL [mytest]> create table mt1_tmp like mt1; # Create a temporary table with the same structure as the original table.
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'; # Insert the historical data from the original table into the temporary table. 
Query OK, 5 rows affected (0.01 sec) 
Records: 5  Duplicates: 0  Warnings: 0 
MySQL [mytest]> select * from mt1_tmp; # Verify that the data in the temporary table is correct. 
+----+------+
| 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; # (Before you perform this operation, stop all read and write operations on the table.) Rename the original table to mt1_bak and the temporary table to mt1 to complete the data recovery.
Query OK, 0 rows affected (0.02 sec)
MySQL [mytest]> select * from mt1; # Verify the restored data. 
+----+------+
| id | c1   |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  5 |    5 |
+----+------+ 
5 rows in set (0.01 sec)