programing

최근 한 시간 동안 수정된 테이블 찾기 쿼리

codeshow 2023. 10. 29. 20:04
반응형

최근 한 시간 동안 수정된 테이블 찾기 쿼리

MySQL 데이터베이스에서 지난 한 시간 동안 어떤 테이블이 수정되었는지 알고 싶습니다.이거 어떻게 해요?

MySQL 5.x는 INFORMATION_SCHEMA 데이터베이스를 통해 이 작업을 수행할 수 있습니다.이 데이터베이스에는 테이블, 보기, 열 등에 대한 정보가 들어 있습니다.

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

최근 한 시간 동안 업데이트된 모든 테이블(UPDATE_TIME)을 반환합니다.데이터베이스 이름(TAB)으로 필터링할 수도 있습니다.LE_SCHEMA 열).

쿼리 예제:

SELECT 
    CONCAT(`TABLE_SCHEMA`, '.', `TABLE_NAME`) AS `Table`, 
    UPDATE_TIME AS `Updated`
FROM `INFORMATION_SCHEMA`.`TABLES`
WHERE
    DATE_SUB(NOW(), INTERVAL 3 DAY) < `UPDATE_TIME`
    AND `TABLE_SCHEMA` != 'INFORMATION_SCHEMA'
    AND `TABLE_TYPE` = 'BASE TABLE';

변경사항을 탐지하려는 각 테이블에 대해 마지막 변경사항의 타임스탬프가 저장된 열이 있어야 합니다.

테이블의 모든 삽입 또는 업데이트에 대해 해당 열을 현재 날짜 및 시간으로 업데이트해야 합니다.

또는 삽입하거나 수정할 때마다 열을 자동으로 업데이트하는 트리거를 설정할 수도 있습니다.이렇게 하면 모든 쿼리를 수정할 필요가 없습니다.

이 작업이 완료되면 지난 한 시간 동안 테이블의 행이 수정되었는지 확인하려면 쿼리를 수행합니다.

select count(*) from mytable where datemod>subtime(now(),'1:0:0')

확인할 모든 테이블에 대해 반복합니다.

InnoDB는 현재 이 정보를 검색하기 위한 네이티브 메커니즘이 여전히 부족합니다.MySQL의 관련 기능 요청에서 누군가는 다음을 설정하라고 조언합니다.AFTER [all events]모니터링할 각 테이블에서 트리거합니다.트리거는 다음과 같은 문장을 발행할 것입니다.

INSERT INTO last_update VALUE ('current_table_name', NOW())
ON DUPLICATE KEY UPDATE update_time = NOW();

다음과 같은 테이블에서:

CREATE TABLE last_update (
    table_name VARCHAR(64) PRIMARY KEY,
    update_time DATETIME
) ENGINE = MyISAM; -- no need for transactions here

또는 이 데이터의 약간의 부정확성(1초 범위)이 허용되고 MySQL 데이터 파일에 대한 읽기 액세스 권한이 있는 경우(어떤 경우에도 권장됨) 설정으로 전환하여 기본 데이터 파일의 마지막 수정 시간을 확인할 수 있습니다.

이 파일들은 아래에서 찾을 수 있습니다./var/lib/mysql/[database_name]/*.ibd대부분의 기본 설치에서.

이 경로를 선택한 경우 새 설정을 적용하려면 기존 테이블을 다시 만들어야 합니다.

약 1.5년 전에 DBA Stack Exchange에서 다음과 같은 질문에 답한 적이 있습니다.InnoDB 테이블이 변경되었는지 확인하는 가장 빠른 방법.

그 오래된 대답에 근거해서, 나는 다음을 추천합니다.

디스크에 쓰기 플러시

이것은 일회성 설정입니다.innodb_max_dirty_pages_를 0으로 설정해야 합니다.

먼저 /etc/my.cnf에 추가합니다.

[mysqld]
innodb_max_dirty_pages_pct=0

그런 다음 이를 실행하여 mysql을 다시 시작할 필요가 없도록 합니다.

mysql> SET GLOBAL innodb_max_dirty_pages_pct = 0;

InnoDB 테이블의 타임스탬프 가져오기.ibd file

ls는 UNIX 타임스탬프를 초 단위로 검색할 수 있는 옵션을 가지고 있습니다. InnoDB의 rmydb.mytable

$ cd /var/lib/mysql/mydb
$ ls -l --time-style="+%s" mytable.ibd | awk '{print $6}'

그런 다음 UNIX_TIMESTamp(NOW()) - (timestamp of the .ibd file3600 이하인지 확인합니다.

한번 해보세요!!!

SELECT *
FROM  information_schema.tables
WHERE UPDATE_TIME >= SYSDATE() - INTERVAL 1 DAY  && TABLE_TYPE != 'SYSTEM VIEW'

SELECT * 
FROM information_schema.tables
WHERE UPDATE_TIME >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) && TABLE_TYPE != 'SYSTEM VIEW'

언급URL : https://stackoverflow.com/questions/2492040/query-to-find-tables-modified-in-the-last-hour

반응형