답변:
이후 버전의 MySQL에서는 information_schema
데이터베이스를 사용하여 다른 테이블이 언제 업데이트되었는지 알 수 있습니다.
SELECT UPDATE_TIME
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'dbname'
AND TABLE_NAME = 'tabname'
이것은 물론 데이터베이스에 대한 연결을 여는 것을 의미합니다.
다른 옵션은 MySQL 테이블이 업데이트 될 때마다 특정 파일을 "터치"하는 것입니다.
데이터베이스 업데이트시 :
O_RDRW
모드 에서 엽니 다close
다시또는 대안 적으로
touch()
의의 PHP와 동등한 utimes()
기능은 파일의 타임 스탬프를 변경합니다.페이지 표시 :
stat()
파일 수정 시간을 다시 읽는 데 사용 합니다.show table status
uses information_schema.tables
)
UPDATE_TIME
방법과 show table status
방법은 모두 InnoDB가 아닌 MyISAM 엔진에서만 사용할 수 있습니다. 이것은 버그 로 나열되어 있지만 , MySQL 5.5 Reference에 언급되어 있으며 ,이 file_per_table
모드는 모드가 신뢰할 수없는 수정 시간의 지표 라고 말합니다 .
mysql 버전 4.1.16을 사용하는 information_schema 데이터베이스가 없으므로이 경우 다음을 쿼리 할 수 있습니다.
SHOW TABLE STATUS FROM your_database LIKE 'your_table';
다음과 같은 열을 반환합니다.
| 이름 | 엔진 | 버전 | Row_format | 행 | Avg_row_length
| 데이터 길이 | Max_data_length | Index_length | Data_free | 자동 증분
| Create_time | 업데이트 _ 시간 | Check_time | 콜 레이션
| 체크섬 | Create_options | 코멘트 |
"당신은라는 열이 볼 수 있듯이 UPDATE_TIME "에 대한 마지막 업데이트 시간을 보여줍니다 당신에게 your_table가 .
아무도 행당 마지막 업데이트 시간을 추적하도록 제안하지 않은 것에 놀랐습니다.
mysql> CREATE TABLE foo (
id INT PRIMARY KEY
x INT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
KEY (updated_at)
);
mysql> INSERT INTO foo VALUES (1, NOW() - INTERVAL 3 DAY), (2, NOW());
mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x | updated_at |
+----+------+---------------------+
| 1 | NULL | 2013-08-18 03:26:28 |
| 2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+
mysql> UPDATE foo SET x = 1234 WHERE id = 1;
업데이트에서 언급하지 않았지만 타임 스탬프가 업데이트됩니다.
mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x | updated_at |
+----+------+---------------------+
| 1 | 1235 | 2013-08-21 03:30:20 | <-- this row has been updated
| 2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+
이제 MAX ()를 쿼리 할 수 있습니다.
mysql> SELECT MAX(updated_at) FROM foo;
+---------------------+
| MAX(updated_at) |
+---------------------+
| 2013-08-21 03:30:20 |
+---------------------+
물론, 더 많은 스토리지가 필요합니다 (TIMESTAMP의 경우 행당 4 바이트).
그러나 이것은 5.7.15 버전의 MySQL 이전의 InnoDB 테이블에서는 작동 하지만 INFORMATION_SCHEMA.TABLES.UPDATE_TIME
그렇지 않습니다.
가장 간단한 방법은 디스크에서 테이블 파일의 타임 스탬프를 확인하는 것입니다. 예를 들어, 데이터 디렉토리에서 확인할 수 있습니다
cd /var/lib/mysql/<mydatabase>
ls -lhtr *.ibd
먼저 가장 오래된 시간에 테이블을 수정했을 때 테이블이있는 모든 테이블의 목록을 제공해야합니다.
최근 테이블 변경 목록을 보려면 다음을 사용하십시오.
SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME
UPDATE_TIME
가 null입니까? 어떤 생각?
인정되는 대답이 있지만 그것이 옳다고 생각하지 않습니다. 필요한 것을 달성하는 가장 간단한 방법이지만, InnoDB에서 이미 활성화되어 있어도 (실제로 문서는 여전히 NULL을 가져야한다고 알려줍니다 ...), UPDATE_TIME을 사용하여 현재 버전 (8.0)에서도 MySQL docs 를 읽는 경우 올바른 옵션이 아닙니다.
서버가 다시 시작되거나 InnoDB 데이터 사전 캐시에서 테이블이 제거 될 때 타임 스탬프가 유지되지 않습니다.
올바르게 이해하면 (지금 서버에서 확인할 수 없음) 서버가 다시 시작된 후 타임 스탬프가 재설정됩니다.
실제 (그리고 비용이 많이 드는) 솔루션에 대해서는 CURRENT_TIMESTAMP를 사용하는 Bill Karwin의 솔루션 이 있으며 트리거를 기반으로 다른 솔루션 을 제안하고 싶습니다 (저는 그 중 하나를 사용하고 있습니다).
전역 변수 (여기서 타임 스탬프)의 저장소처럼 작동하는 별도의 테이블을 만들거나 (이 목적에 사용할 수있는 다른 테이블이있을 수도 있습니다) 시작합니다. 테이블 이름 (또는 여기에 테이블 ID로 유지하려는 값)과 타임 스탬프의 두 필드를 저장해야합니다. 그것을 가지고 나면이 테이블 id + 시작 날짜 (NOW ()는 좋은 선택 :))로 초기화해야합니다.
이제 다음과 같은 절차를 사용하여 관찰하려는 테이블로 이동하고 트리거 삽입 / 업데이트 / 삭제 후 트리거를 추가합니다.
CREATE PROCEDURE `timestamp_update` ()
BEGIN
UPDATE `SCHEMA_NAME`.`TIMESTAMPS_TABLE_NAME`
SET `timestamp_column`=DATE_FORMAT(NOW(), '%Y-%m-%d %T')
WHERE `table_name_column`='TABLE_NAME';
END
파일 시스템에서 수정 된 파일 날짜 만 가져 오십시오. 내 언어로는 :
tbl_updated = file.update_time(
"C:\ProgramData\MySQL\MySQL Server 5.5\data\mydb\person.frm")
산출:
1/25/2013 06:04:10 AM
이것이 관심이 있는지 확실하지 않습니다. mysql과 클라이언트간에 mysqlproxy를 사용하고 흥미로운 테이블 변경 사항에 따라 meacached의 키 값을 업데이트하기 위해 lua 스크립트를 사용하면 UPDATE, DELETE, INSERT가 내가 최근에 해낸 솔루션이었습니다. 래퍼가 PHP에서 후크 또는 트리거를 지원하는 경우 이는 더 쉬울 수 있습니다. 현재 래퍼 중 아무것도이 작업을 수행하지 않습니다.
phpMyAdmin에서 update-at이라는 이름으로 열을 만들고 내 코드 (nodejs)의 Date () 메서드에서 현재 시간을 얻었습니다. 테이블을 변경할 때마다이 열에는 변경 시간이 포함됩니다.
a) 모든 테이블과 마지막 업데이트 날짜가 표시됩니다
SHOW TABLE STATUS FROM db_name;
그런 다음 특정 테이블을 추가로 요청할 수 있습니다.
SHOW TABLE STATUS FROM db_name like 'table_name';
b) 위의 예와 같이 'Update_time'에서 정렬을 사용할 수 없지만 SELECT를 사용하면 다음을 수행 할 수 있습니다.
SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' ORDER BY UPDATE_TIME DESC;
특정 테이블에 대해 더 묻기 위해 :
SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' AND table_name='table_name' ORDER BY UPDATE_TIME DESC';
이것이 내가 한 일입니다. 도움이되기를 바랍니다.
<?php
mysql_connect("localhost", "USER", "PASSWORD") or die(mysql_error());
mysql_select_db("information_schema") or die(mysql_error());
$query1 = "SELECT `UPDATE_TIME` FROM `TABLES` WHERE
`TABLE_SCHEMA` LIKE 'DataBaseName' AND `TABLE_NAME` LIKE 'TableName'";
$result1 = mysql_query($query1) or die(mysql_error());
while($row = mysql_fetch_array($result1)) {
echo "<strong>1r tr.: </strong>".$row['UPDATE_TIME'];
}
?>