回答:
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 statusinformation_schema.tables
UPDATE_TIMEメソッドとshow table status以下のメソッドはどちらもMyISAMエンジンでのみ使用でき、InnoDBでは使用できません。これはバグとしてリストされていますが、MySQL 5.5リファレンスで言及されています。これは、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 | Auto_increment
| 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;
これは、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 |
+---------------------+
確かに、これにはより多くのストレージが必要です(TIMESTAMPの行ごとに4バイト)。
しかし、これはMySQLのバージョン5.7.15より前の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を取得する必要があることがわかります...)、現在のバージョン(8.0)でも、MySQL ドキュメントを読んだ場合、UPDATE_TIMEを使用すると次の理由により、適切なオプションではありません。
サーバーが再起動されたとき、またはテーブルがInnoDBデータディクショナリキャッシュから削除されたとき、タイムスタンプは保持されません。
私が正しく理解している場合(現在サーバーで確認できない場合)、サーバーの再起動後にタイムスタンプがリセットされます。
実際の(そしてまあ、コストのかかる)ソリューションについては、CURRENT_TIMESTAMPを使用したBill Karwinのソリューションがあり、トリガーに基づいた別のソリューションを提案したいと思います(私はそのソリューションを使用しています)。
まず、グローバル変数(ここではタイムスタンプ)のストレージのように機能する別のテーブル(または、この目的で使用できる他のテーブルがある)を作成します。2つのフィールドを保存する必要があります-テーブル名(または、ここにテーブルIDとして保持したい任意の値)とタイムスタンプ。取得したら、このテーブルID +開始日で初期化する必要があります(NOW()が適切な選択です:))。
次に、監視するテーブルに移動し、次の手順または同様の手順でINSERT / UPDATE / DELETEの後にトリガーを追加します。
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を使用し、luaスクリプトを使用して、興味深いテーブル変更UPDATE、DELETE、INSERTに従ってmemcachedのキー値を更新することは、私が最近行った解決策でした。ラッパーが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'];
}
?>