tencent cloud

TencentDB for MySQL

플래시백 쿼리

PDF
포커스 모드
폰트 크기
마지막 업데이트 시간: 2026-03-11 10:14:59

기능 소개

데이터베이스 운영 과정에서 오작동이 발생할 수 있으며, 이러한 오작동은 비즈니스에 심각한 영향을 미칠 수 있습니다. 오작동으로 인해 비즈니스가 영향을 받을 경우 일반적인 복구 방법으로 롤백, 클로닝 등의 작업이 있지만, 소량의 데이터 변경 및 긴급 장애 복구의 경우 오류가 발생하기 쉽고 시간이 오래 걸리며, 데이터 양이 많을 경우 복구 시간이 통제 불가능합니다. TXSQL 팀은 Innodb 엔진에서 플래시백 쿼리 기능을 설계 및 구현하여 간단한 SQL 문으로 오작동 이전의 이력 데이터를 조회할 수 있도록 했습니다. 특정 SQL 구문을 통해 지정된 시점의 데이터를 조회함으로써 대량의 데이터 조회 및 복구 시간을 절약하고, 오작동 후 데이터를 신속히 복구하여 비즈니스의 빠른 운영 재개를 보장합니다.

지원 버전

커널 버전 MySQL 5.7 20230601 이상.
커널 버전 MySQL 8.0 20220331 이상.
커널 마이너 버전을 확인하거나 업그레이드하는 방법은 커널 마이너 버전 업그레이드를 참조하십시오.

적용 시나리오

플래시백 쿼리 기능은 데이터베이스 운영 과정에서 오작동 발생 후 이력 데이터를 빠르게 조회하기 위해 사용됩니다. 해당 기능 사용 시 다음 사항에 유의해야 합니다:
Innodb 물리 테이블만 지원하며 뷰 및 기타 엔진은 지원하지 않습니다. last_insert_id() 등 실제 열에 대응되지 않는 함수는 지원하지 않습니다.
초 단위 플래시백 쿼리만 지원하며 100% 정확성을 보장하지 않습니다. 1초 내에 여러 변경이 발생한 경우 그 중 아무 변경 사항이나 조회될 수 있습니다.
플래시백 쿼리는 기본 키(또는 GEN_CLUST_INDEX)만 지원합니다.
prepared statement 및 stored procedure에서 사용을 지원하지 않습니다.
DDL을 지원하지 않습니다. 테이블에 대해 DDL(예: truncate table, 이러한 경우 휴지통을 통한 복구 권장)을 진행한 경우 플래시백 쿼리 결과가 예상과 다를 수 있습니다.
동일한 문장에서 동일한 테이블에 여러 플래시백 쿼리 시간이 지정된 경우 현재 쿼리 시간과 가장 멀리 떨어진 시간을 선택합니다.
마스터-슬레이브 인스턴스 간 시간 차이로 인해 동일한 시간에 플래시백 쿼리를 수행해도 마스터와 슬레이브 인스턴스에서 얻은 결과가 다를 수 있습니다.
플래시백 쿼리 활성화 시 언두 로그 정리가 지연되고 메모리 점유율이 증가하므로, Innodb_backquery_window를 과도하게 설정(권장값 900~1800)하지 마십시오. 특히 비즈니스 접근이 빈번한 인스턴스에는 주의가 필요합니다.
데이터베이스 인스턴스가 재시작되거나 크래시(crash) 발생 시, 재시작 또는 크래시 이전의 이력 정보는 조회할 수 없습니다. 지정된 시간은 지원 범위 내에 있어야 합니다(지원 범위는 상태 변수 Innodb_backquery_up_time 및 Innodb_backquery_low_time을 통해 확인 가능하며, show status like '%backquery%'을 실행하여 조회).

사용 설명

플래시백 쿼리는 새로운 AS OF 문법을 제공합니다. 파라미터 설정에서 Innodb_backquery_enable 파라미터를 ON으로 설정하여 플래시백 쿼리 기능을 활성화한 후, 특정 문법을 통해 지정 시간의 데이터를 조회할 수 있습니다. 문법은 다음과 같습니다:
SELECT ... FROM <테이블명>
AS OF TIMESTAMP <시간>;
지정 시간 조회 참조 예제
MySQL [test]> create table t1(id int,c1 int) engine=innodb;
Query OK, 0 rows affected (0.06 sec)

MySQL [test]> insert into t1 values(1,1),(2,2),(3,3),(4,4);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0

MySQL [test]> select now();
+---------------------+
| now() |
+---------------------+
| 2024-10-18 16:01:01 |
+---------------------+
1 row in set (0.00 sec)

MySQL [test]> delete from t1 where id=4;
Query OK, 1 row affected (0.00 sec)

MySQL [test]> select * from t1;
+------+------+
| id | c1 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)

MySQL [test]> select * from t1 as of timestamp '2024-10-18 16:01:01';
+------+------+
| id | c1 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+------+------+
4 rows in set (0.00 sec)
역사 데이터를 통해 테이블 생성 예제
create table t3 select * from t1 as of timestamp '2024-10-18 16:01:01';
역사 데이터를 테이블에 삽입 예제
insert into t4 select * from t1 as of timestamp '2024-10-18 16:01:01';

매개변수 설명

다음 표에는 플래시백 쿼리 기능에서 구성 가능한 파라미터 설명이 나열되어 있습니다.
매개변수 이름
파라미터 범위
유형
기본값
값 범위
재시작 필요 여부
설명
Innodb_backquery_enable
전역 파라미터
Boolean
OFF
ON\\OFF
아니요
플래시백 쿼리 기능의 스위치입니다.
Innodb_backquery_window
전역 파라미터
Integer
900
1 - 86400
아니요
플래시백 쿼리가 지원하는 시간 범위로 단위는 초(second)입니다. 이 파라미터 값이 클수록 플래시백 쿼리가 지원하는 이력 데이터 조회 기간이 길어지지만, 동시에 undo 테이블스페이스가 차지하는 스토리지 공간도 증가합니다.
Innodb_backquery_history_limit
전역 파라미터
Integer
8000000
1 - 9223372036854476000
아니요
언두 이력 연결 리스트 길이 제한으로, 설정값을 초과하면 Innodb_backquery_window가 트리거하는 purge가 무시되며, 이력 연결 리스트 길이가 설정값 미만으로 낮아질 때까지 유지됩니다.

도움말 및 지원

문제 해결에 도움이 되었나요?

피드백