복붙노트

[SQL] MySQL의 테이블이 마지막으로 업데이트 할 때 어떻게 알 수 있습니까?

SQL

MySQL의 테이블이 마지막으로 업데이트 할 때 어떻게 알 수 있습니까?

내 페이지의 바닥 글에서 내가 좋아하는 뭔가를 추가하고 싶습니다 "마지막 업데이트 XX / XX / 200X"이 날짜가 특정 MySQL의 테이블이 갱신 된 마지막 시간 인과 함께.

그렇게하는 가장 좋은 방법은 무엇입니까? 마지막으로 업데이트 된 날짜를 검색 할 수있는 기능이 있습니까? 나는 데이터베이스에 나는이 값을 필요로 할 때마다 액세스해야 하는가?

해결법

  1. ==============================

    1.MySQL의 이후 버전에서는 다른 테이블이 업데이트되었을 때 당신에게하는 INFORMATION_SCHEMA 데이터베이스를 사용할 수 있습니다 :

    MySQL의 이후 버전에서는 다른 테이블이 업데이트되었을 때 당신에게하는 INFORMATION_SCHEMA 데이터베이스를 사용할 수 있습니다 :

    SELECT UPDATE_TIME
    FROM   information_schema.tables
    WHERE  TABLE_SCHEMA = 'dbname'
       AND TABLE_NAME = 'tabname'
    

    물론 이것은 평균 개방의 데이터베이스에 대한 연결을한다.

    또 다른 옵션은 MySQL의 테이블이 업데이트 될 때마다 특정 파일 "터치"하는 것입니다 :

    데이터베이스 업데이트에서 :

    또는 대안

    페이지 표시의 경우 :

  2. ==============================

    2.그래서이 경우에는이를 조회 할 수 있습니다, MySQL 버전 4.1.16을 사용하여, INFORMATION_SCHEMA 데이터베이스가 없습니다 :

    그래서이 경우에는이를 조회 할 수 있습니다, MySQL 버전 4.1.16을 사용하여, INFORMATION_SCHEMA 데이터베이스가 없습니다 :

    SHOW TABLE STATUS FROM your_database LIKE 'your_table';
    

    그것은 이러한 열을 반환합니다 :

    | Name      | Engine | Version | Row_format | Rows | Avg_row_length 
    | Data_length | Max_data_length | Index_length | Data_free | Auto_increment
    | Create_time | Update_time | Check_time | Collation
    | Checksum | Create_options | Comment |

    "UPDATE_TIME"your_table의 마지막 업데이트 시간이 쇼 당신 : 당신은라는 열이 볼 수 있듯이.

  3. ==============================

    3.나는 행당 마지막 업데이트 시간을 추적 제안했다 아무도 놀라게하지 해요 :

    나는 행당 마지막 업데이트 시간을 추적 제안했다 아무도 놀라게하지 해요 :

    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;
    

    이것은 우리가 UPDATE에서 언급하지 않은 경우에도 타임 스탬프를 업데이트합니다.

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

    틀림없이, 이것은 더 많은 저장 (타임 스탬프 행 당 4 바이트)가 필요합니다. 그러나 이것은 INFORMATION_SCHEMA.TABLES.UPDATE_TIME하지 않는의 MySQL 5.7.15 버전 전에 InnoDB 테이블에 적용됩니다.

  4. ==============================

    4.가장 간단한 것은 디스크에있는 테이블 파일의 타임 스탬프를 확인하는 것입니다. 예를 들어, 당신은 당신의 데이터 디렉토리 아래에서 확인하실 수 있습니다

    가장 간단한 것은 디스크에있는 테이블 파일의 타임 스탬프를 확인하는 것입니다. 예를 들어, 당신은 당신의 데이터 디렉토리 아래에서 확인하실 수 있습니다

    cd /var/lib/mysql/<mydatabase>
    ls -lhtr *.ibd
    

    그것은 마지막으로 첫째, 가장 오래된 시간을 수정 된 이렇게하면 테이블의 모든 테이블의 목록을 제공해야한다.

  5. ==============================

    5.최근 테이블 변경의 목록이 사용

    최근 테이블 변경의 목록이 사용

    SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
    FROM information_schema.tables
    ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME
    
  6. ==============================

    6.나는 뭔가를 사용자 정의 테이블의 모든 업데이트 / 삽입 / 삭제 및 쓰기 타임 스탬프를 잡는다 트리거를 만들 것 TABLENAME | 타임 스탬프

    나는 뭔가를 사용자 정의 테이블의 모든 업데이트 / 삽입 / 삭제 및 쓰기 타임 스탬프를 잡는다 트리거를 만들 것 TABLENAME | 타임 스탬프

    내가 직접 DB 서버의 내부 시스템 테이블을 읽을 생각처럼 안해서

  7. ==============================

    7.수락 된 응답이 있지만 나는 그것이 올바른 일이라고 생각하지 않습니다. UPDATE_TIME은 사용이 필요한 것을 얻을 수있는 가장 간단한 방법이지만, 이미 이노에서 사용할 경우에도 당신도 최신 버전 (8.0)에서 MySQL의 문서를 읽을 경우, (실제로 문서는 여전히 NULL을 ... 얻을 것을 당신에게) 하지 않을 권리 옵션 때문에 :

    수락 된 응답이 있지만 나는 그것이 올바른 일이라고 생각하지 않습니다. UPDATE_TIME은 사용이 필요한 것을 얻을 수있는 가장 간단한 방법이지만, 이미 이노에서 사용할 경우에도 당신도 최신 버전 (8.0)에서 MySQL의 문서를 읽을 경우, (실제로 문서는 여전히 NULL을 ... 얻을 것을 당신에게) 하지 않을 권리 옵션 때문에 :

    만약 내가 제대로 이해하고, 타임 스탬프 서버를 다시 시작한 후 다시 얻을 수 (지금 서버를 확인할 수 없습니다).

    실제 (그리고, 물론, 비용이 많이 드는) 솔루션으로, 당신은 CURRENT_TIMESTAMP와 빌 Karwin의 솔루션을 가지고 있고 나는 (내가 하나를 사용하고 있습니다) 트리거를 기반으로 다른 하나를 제안하고 싶습니다.

    별도의 테이블을 생성 (또는 어쩌면 당신은이 목적을 위해 사용할 수있는 다른 테이블이) 전역 변수 (여기에 타임 스탬프)의 저장과 같은 작동에 의해 시작합니다. 당신은 두 개의 필드를 저장해야 - 테이블 이름과 타임 스탬프 (또는 어떤 값이 테이블 ID 여기에 유지하고 싶습니다). 당신이 그것을 가지고 후에는 (() 좋은 선택입니다 : NOW) 개시일이 테이블 ID +로 초기화한다.

    지금, 당신은 당신이이 식물 또는 유사한 절차를 삭제 / 관찰하고 INSERT / UPDATE 후에 트리거를 추가 할 테이블로 이동 :

    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
    
  8. ==============================

    8.LEVEL 분석 :

    LEVEL 분석 :

    DB를 디스크에 저장되는 위치 찾기 :

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

    가장 최근의 변경 확인

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

    모든 데이터베이스 유형에 작동합니다.

  9. ==============================

    9.그냥 파일 시스템에서 수정 된 파일의 날짜를 잡아. 내 언어입니다 :

    그냥 파일 시스템에서 수정 된 파일의 날짜를 잡아. 내 언어입니다 :

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

    산출:

    1/25/2013 06:04:10 AM
    
  10. ==============================

    10.리눅스를 실행하는 경우 테이블 또는 데이터베이스 디렉토리를보고 inotify를 사용할 수 있습니다. inotify를은 PHP, Node.js를, 펄에서 사용할 수 있고 나는 대부분의 다른 언어를 생각한다. 물론 당신은 inotify를 설치하거나 ISP가 설치 있었해야합니다. ISP의 많은하지 않습니다.

    리눅스를 실행하는 경우 테이블 또는 데이터베이스 디렉토리를보고 inotify를 사용할 수 있습니다. inotify를은 PHP, Node.js를, 펄에서 사용할 수 있고 나는 대부분의 다른 언어를 생각한다. 물론 당신은 inotify를 설치하거나 ISP가 설치 있었해야합니다. ISP의 많은하지 않습니다.

  11. ==============================

    11.확실하지이 관심이 될 것입니다 경우. 루아 스크립트의 사용을 MySQL과 클라이언트 사이에 mysqlproxy를 사용하고 만드는 것은 흥미로운 표에 따라 변경 memcached를 UPDATE에서 키 값을 업데이트 삭제하려면 INSERT 내가 아주 최근 한 솔루션이었다. 래퍼는 PHP에 후크 또는 트리거를 지원하는 경우,이 eaiser 수 있었다. 지금과 같은 래퍼 중에이 작업을 수행하지 않습니다.

    확실하지이 관심이 될 것입니다 경우. 루아 스크립트의 사용을 MySQL과 클라이언트 사이에 mysqlproxy를 사용하고 만드는 것은 흥미로운 표에 따라 변경 memcached를 UPDATE에서 키 값을 업데이트 삭제하려면 INSERT 내가 아주 최근 한 솔루션이었다. 래퍼는 PHP에 후크 또는 트리거를 지원하는 경우,이 eaiser 수 있었다. 지금과 같은 래퍼 중에이 작업을 수행하지 않습니다.

  12. ==============================

    12.내가 이름으로 열을 만들어 : phpMyAdmin에의 갱신에와 내 코드 (nodejs)에서 날짜 () 메소드에서 현재 시간을 얻었다. 테이블의 모든 변화와 함께이 열은 변화의 시간을 누릅니다.

    내가 이름으로 열을 만들어 : phpMyAdmin에의 갱신에와 내 코드 (nodejs)에서 날짜 () 메소드에서 현재 시간을 얻었다. 테이블의 모든 변화와 함께이 열은 변화의 시간을 누릅니다.

  13. ==============================

    13.A) 그것은 당신에게 모든 테이블이 마지막 업데이트 날짜를 표시합니다

    A) 그것은 당신에게 모든 테이블이 마지막 업데이트 날짜를 표시합니다

    SHOW TABLE STATUS FROM db_name;
    

    다음, 당신은 더 특정 테이블을 요청할 수 있습니다 :

    SHOW TABLE STATUS FROM db_name like 'table_name';
    

    b)는 위의 예에서와 같이 당신은 'UPDATE_TIME'에 정렬 할 수 있지만, 당신을 선택하여 사용할 수 없습니다 :

    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';
    
  14. ==============================

    14.이것은 내가 무슨 짓을했는지, 나는 그것이 도움이되기를 바랍니다있다.

    이것은 내가 무슨 짓을했는지, 나는 그것이 도움이되기를 바랍니다있다.

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

    15.사용할 수없는 경우 전역 변수에 쿼리를 캐시합니다.

    사용할 수없는 경우 전역 변수에 쿼리를 캐시합니다.

    당신이 그것을 업데이트 할 때 캐시가 다시로드 강제로 웹 페이지를 작성합니다.

    배포 스크립트에 다시로드 페이지에 대한 호출을 추가합니다.

  16. from https://stackoverflow.com/questions/307438/how-can-i-tell-when-a-mysql-table-was-last-updated by cc-by-sa and MIT license