Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 지난 1시간 동안 수정된 테이블 조회하기

MySQL에서 최근 1시간 이내에 수정된 테이블을 찾고 싶다면 INFORMATION_SCHEMA.TABLES를 활용하면 됩니다. 여기에 DATE_SUB() 함수와 INTERVAL을 함께 사용하면 원하는 시간 범위의 변경 이력을 손쉽게 확인할 수 있습니다.

기본 문법

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE DATE_SUB(NOW(), INTERVAL 1 HOUR) < UPDATE_TIME;

지난 1시간 동안 수정된 테이블 이름만 조회하기

먼저 테이블 이름만 간단히 확인하고 싶은 경우 아래 쿼리를 실행하면 됩니다.

mysql> SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES`
    -> WHERE
    -> DATE_SUB(NOW(), INTERVAL 1 HOUR) < `UPDATE_TIME`;

실행 결과

+---------------------+
| TABLE_NAME          |
+---------------------+
| innodb_table_stats  |
| innodb_index_stats  |
| employeeinformation |
+---------------------+
3 rows in set (0.37 sec)

위 결과를 보면 지난 1시간 동안 innodb_table_stats, innodb_index_stats, employeeinformation 세 개의 테이블이 수정된 것을 확인할 수 있습니다.

테이블의 상세 정보까지 함께 조회하기

테이블 이름뿐만 아니라 스키마(TABLE_SCHEMA), 테이블 유형(TABLE_TYPE), 엔진(ENGINE), 생성 시간(CREATE_TIME) 등 상세 정보가 필요하다면 다음과 같이 모든 컬럼을 조회하는 쿼리를 사용하면 됩니다.

mysql> SELECT *
    -> FROM `INFORMATION_SCHEMA`.`TABLES`
    -> WHERE
    -> DATE_SUB(NOW(), INTERVAL 1 HOUR) < `UPDATE_TIME`;

실행 결과

+---------------+--------------+---------------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+---------------------------------------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME          | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME         | UPDATE_TIME         | CHECK_TIME | TABLE_COLLATION    | CHECKSUM | CREATE_OPTIONS                          | TABLE_COMMENT |
+---------------+--------------+---------------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+---------------------------------------+---------------+
| def           | mysql        | innodb_table_stats  | BASE TABLE | InnoDB | 10      | Dynamic    | 449        | 145            | 65536       | 0               | 0            | 4194304   | NULL           | 2018-09-22 20:37:26 | 2018-12-24 15:13:41 | NULL       | utf8_bin           | NULL     | row_format=DYNAMIC stats_persistent=0   |               |
| def           | mysql        | innodb_index_stats  | BASE TABLE | InnoDB | 10      | Dynamic    | 1413       | 243            | 344064      | 0               | 0            | 4194304   | NULL           | 2018-09-22 20:37:26 | 2018-12-24 15:13:41 | NULL       | utf8_bin           | NULL     | row_format=DYNAMIC stats_persistent=0   |               |
| def           | test         | employeeinformation | BASE TABLE | InnoDB | 10      | Dynamic    | 6          | 2730           | 16384       | 0               | 0            | 0         | NULL           | 2018-12-24 15:12:04 | 2018-12-24 15:14:00 | NULL       | utf8mb4_0900_ai_ci | NULL     |                                         |               |
+---------------+--------------+---------------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+---------------------------------------+---------------+
3 rows in set (43.72 sec)

정리

핵심은 UPDATE_TIME 컬럼과 DATE_SUB(NOW(), INTERVAL 1 HOUR) 값을 비교하는 것입니다. 이 방식을 응용하면 INTERVAL 값을 조정하여 지난 하루, 일주일 등 원하는 기간 동안 수정된 테이블도 같은 방법으로 조회할 수 있습니다. 단, InnoDB 테이블의 경우 UPDATE_TIME이 항상 갱신되지 않을 수 있으므로(MySQL 버전 및 설정에 따라 다름), 정확한 변경 추적이 필요하다면 별도의 감사(audit) 로그나 트리거를 활용하는 것도 고려해 보세요.