Programing

MySQL 테이블이 마지막으로 업데이트 된 시점을 어떻게 알 수 있습니까?

lottogame 2020. 5. 26. 07:43
반응형

MySQL 테이블이 마지막으로 업데이트 된 시점을 어떻게 알 수 있습니까?


내 페이지의 바닥 글에 "my / 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 다시

또는 대안 적으로

  • 사용 touch()의의 PHP와 동등한 utimes()기능은 파일의 타임 스탬프를 변경합니다.

페이지 표시 :

  • stat()파일 수정 시간을 다시 읽는 데 사용 합니다.

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 | Update_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

모든 업데이트 / 삽입 / 삭제를 포착하고 사용자 정의 테이블에 타임 스탬프를 쓰는 트리거를 작성합니다. tablename | 타임 스탬프

Just because I don't like the idea to read internal system tables of db server directly


Although there is an accepted answer I don't feel that it is the right one. It is the simplest way to achieve what is needed, but even if already enabled in InnoDB (actually docs tell you that you still should get NULL ...), if you read MySQL docs, even in current version (8.0) using UPDATE_TIME is not the right option, because:

Timestamps are not persisted when the server is restarted or when the table is evicted from the InnoDB data dictionary cache.

If I understand correctly (can't verify it on a server right now), timestamp gets reset after server restart.

As for real (and, well, costly) solutions, you have Bill Karwin's solution with CURRENT_TIMESTAMP and I'd like to propose a different one, that is based on triggers (I'm using that one).

You start by creating a separate table (or maybe you have some other table that can be used for this purpose) which will work like a storage for global variables (here timestamps). You need to store two fields - table name (or whatever value you'd like to keep here as table id) and timestamp. After you have it, you should initialize it with this table id + starting date (NOW() is a good choice :) ).

Now, you move to tables you want to observe and add triggers AFTER INSERT/UPDATE/DELETE with this or similar procedure:

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

Just grab the file date modified from file system. In my language that is:

 tbl_updated = file.update_time(
        "C:\ProgramData\MySQL\MySQL Server 5.5\data\mydb\person.frm")

Output:

1/25/2013 06:04:10 AM

If you are running Linux you can use inotify to look at the table or the database directory. inotify is available from PHP, node.js, perl and I suspect most other languages. Of course you must have installed inotify or had your ISP install it. A lot of ISP will not.


Not sure if this would be of any interest. Using mysqlproxy in between mysql and clients, and making use of a lua script to update a key value in memcached according to interesting table changes UPDATE,DELETE,INSERT was the solution which I did quite recently. If the wrapper supported hooks or triggers in php, this could have been eaiser. None of the wrappers as of now does this.


OS level analysis:

Find where the DB is stored on disk:

grep datadir /etc/my.cnf
datadir=/var/lib/mysql

Check for most recent modifications

cd /var/lib/mysql/{db_name}
ls -lrt

Should work on all database types.


This is what I did, I hope it helps.

<?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'];
    }
?>

Cache the query in a global variable when it is not available.

Create a webpage to force the cache to be reloaded when you update it.

Add a call to the reloading page into your deployment scripts.

참고URL : https://stackoverflow.com/questions/307438/how-can-i-tell-when-a-mysql-table-was-last-updated

반응형