MySQL 테이블이 마지막으로 업데이트된 날짜를 확인하려면 어떻게 해야 합니까?
페이지 바닥글에 "last updated the xx/xx/200x"와 같은 내용을 추가하고 싶습니다.이 날짜는 특정 mySQL 테이블이 마지막으로 업데이트된 날짜입니다.
그것을 하는 가장 좋은 방법은?마지막으로 갱신된 날짜를 불러오는 기능이 있나요?이 값이 필요할 때마다 데이터베이스에 액세스해야 합니까?
에서는 MySQL을 할 수 .information_schema
데이터베이스를 사용하여 다른 테이블이 갱신된 시기를 알 수 있습니다.
SELECT UPDATE_TIME
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'dbname'
AND TABLE_NAME = 'tabname'
이것은 물론 데이터베이스에 대한 연결을 여는 것을 의미합니다.
대체 옵션은 MySQL 테이블이 업데이트될 때마다 특정 파일을 "터치"하는 것입니다.
데이터베이스 업데이트 시:
- .
O_RDRW
전환 close
한 번지다
또는 다른 방법으로
- use, 에 상당하는 PHP,
utimes()
파일 타임스탬프를 변경합니다.
페이지 표시:
stat()
파일 수정 시간을 다시 읽습니다.
한 줄당 마지막 업데이트 시간을 추적하는 방법을 제안하지 않은 것이 놀랍습니다.
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바이트).
그러나 이는 MySQL 5.7.15 이전 버전의 InnoDB 테이블에서 작동합니다.INFORMATION_SCHEMA.TABLES.UPDATE_TIME
그렇지 않다.
mysql 버전 4.1.16을 사용하는 information_schema 데이터베이스가 없기 때문에 이 경우 다음과 같이 문의할 수 있습니다.
SHOW TABLE STATUS FROM your_database LIKE 'your_table';
다음 열이 반환됩니다.
| | || | Avg_row_length | | | | Row_format | Rows | Avg_row_length
| | | | | | Data_length | Index_length | Data_free | Auto_increment
| Create_time | Update_time | Check_time | 조회
| | Create_options | 멘 | | | |
보시는 바와 같이 "Update_time"이라는 컬럼이 있으며, 이 컬럼에는 your_table의 마지막 업데이트 시간이 표시됩니다.
가장 간단한 것은 디스크에 있는 테이블 파일의 타임스탬프를 확인하는 것입니다.예를 들어 데이터 디렉토리에서 확인할 수 있습니다.
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
tablename | timestamp와 같은 모든 업데이트/삽입/삭제 및 타임스탬프를 커스텀테이블에 기록하는 트리거를 만듭니다.
db 서버의 내부 시스템 테이블을 직접 읽는 것이 마음에 들지 않는다는 이유만으로
받아들여지는 답변이 있긴 하지만 그게 맞는 답변이라고는 생각하지 않습니다.필요한 것을 달성하는 가장 간단한 방법이지만 InnoDB에서 이미 활성화되어 있더라도(실제로는 NULL을 취득해야 한다고 하는 문서) MySQL 문서를 읽는 경우 UPDATE_TIME을 사용하는 현재 버전(8.0)에서도 올바른 옵션은 아닙니다.
서버가 재시작되거나 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
OS 레벨 분석:
디스크에서 DB가 저장된 위치를 찾습니다.
grep datadir /etc/my.cnf
datadir=/var/lib/mysql
최신 수정 사항 확인
cd /var/lib/mysql/{db_name}
ls -lrt
모든 데이터베이스 유형에서 작동해야 합니다.
이것은 로컬에서 동작하도록 했습니다만, 공개 Web 사이트의 공유 호스트에서는 동작하지 않습니다(권리 문제라고 생각합니다.
SELECT last_update FROM mysql.innodb_table_stats WHERE table_name = 'yourTblName';
'2020-10-09 08:25:10'
Windows 8.1에서의 MySQL 5.7.20 로그
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';
파일 시스템에서 수정된 파일 날짜를 가져오기만 하면 됩니다.내 언어로는 다음과 같습니다.
tbl_updated = file.update_time(
"C:\ProgramData\MySQL\MySQL Server 5.5\data\mydb\person.frm")
출력:
1/25/2013 06:04:10 AM
Linux 를 실행하고 있는 경우는, inotify 를 사용해 테이블 또는 데이타베이스 디렉토리를 참조할 수 있습니다.inotify는 PHP, node.js, perl 및 대부분의 다른 언어에서 사용할 수 있습니다.물론 inotify 를 인스톨 하거나 ISP 에 인스톨 해 둘 필요가 있습니다.많은 ISP는 그렇지 않다.
이게 무슨 관심사인지 잘 모르겠네요.mysql과 클라이언트 사이에서 mysqlproxy를 사용하고 memcached의 키 값을 대상 테이블에 따라 업데이트하기 위해 lua 스크립트를 사용하면 UPDATE, DELETE,INSERT가 제가 최근에 한 해결책이었습니다.래퍼가 훅 또는 트리거를 php로 지원한다면 이는 eaiser일 수 있습니다.현시점에서는 어떤 포장지도 이 기능을 하지 않습니다.
phpMyAdmin에서 update-at라는 이름의 컬럼을 만들고 코드(nodejs)의 Date() 메서드에서 현재 시간을 가져옵니다.테이블이 변경될 때마다 이 컬럼은 변경 시간을 유지합니다.
다른 것과 같지만 시간을 절약하기 위해 사용한 몇 가지 조건이 있습니다.
SELECT
UPDATE_TIME,
TABLE_SCHEMA,
TABLE_NAME
FROM
information_schema.tables
WHERE
1 = 1
AND UPDATE_TIME > '2021-11-09 00:00:00'
AND TABLE_SCHEMA = 'db_name_here'
AND TABLE_NAME not in ('table_name_here',)
ORDER BY
UPDATE_TIME DESC,
TABLE_SCHEMA,
TABLE_NAME;
이게 내가 한 일이니까 도움이 됐으면 좋겠어요.
<?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'];
}
?>
쿼리를 사용할 수 없는 경우 글로벌 변수에 캐시합니다.
웹 페이지를 생성하여 업데이트 시 캐시를 강제로 새로고침합니다.
전개 스크립트에 새로고침 페이지에 콜을 추가합니다.
언급URL : https://stackoverflow.com/questions/307438/how-can-i-tell-when-a-mysql-table-was-last-updated
'programing' 카테고리의 다른 글
기존 콜백 API를 약속으로 변환하려면 어떻게 해야 합니까? (0) | 2022.12.11 |
---|---|
상위 행을 삭제하거나 업데이트할 수 없음: 외부 키 제약 조건이 실패합니다. (0) | 2022.12.11 |
PHP cURL을 사용하여 JSON 데이터를 게시하는 방법 (0) | 2022.12.11 |
문자열을 n자 세그먼트로 분할하려면 어떻게 해야 합니까? (0) | 2022.12.11 |
크기 자동 조정을 사용하여 텍스트 영역 작성 (0) | 2022.12.11 |