MySQL中對於DML(數據寫入,數據修改和數據刪除操作是可以有效跟蹤的,對於select目前沒有找到好的方法,只能通過構建生命週期體系來完善了。

我來說一下數據寫入的跟進過程,可以在資料庫test中創建一張表test_data

create table test_data(id int primary key,name varchar(30)) engine=innodb;

我們寫入一條數據:

mysql&> insert into test_data values(1,aa);

Query OK, 1 row affected (0.00 sec)

查看數據字典informationschema.tables的欄位update_time可以看到發生了變化

mysql&> select * from information_schema.tables where table_schema=test and table_name=test_dataG

*************************** 1. row ***************************

TABLE_CATALOG: def

TABLE_SCHEMA: test

TABLE_NAME: test_data

TABLE_TYPE: BASE TABLE

ENGINE: InnoDB

VERSION: 10

ROW_FORMAT: Dynamic

TABLE_ROWS: 1

AVG_ROW_LENGTH: 16384

DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

INDEX_LENGTH: 0

DATA_FREE: 0

AUTO_INCREMENT: NULL

CREATE_TIME: 2019-10-08 12:29:05

UPDATE_TIME: 2019-10-08 12:29:40

CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

CHECKSUM: NULL

CREATE_OPTIONS:

TABLE_COMMENT:

1 row in set (0.00 sec)

如果繼續寫入一條數據:

mysql&> insert into test_data values(2,bb);

Query OK, 1 row affected (0.00 sec)

查看字典裏的數據,就會發現時間戳開始變化(遞增),當然你可以在寫入前記錄下時間戳。

mysql&> select * from information_schema.tables where table_schema=test and table_name=test_dataG

*************************** 1. row ***************************

TABLE_CATALOG: def

TABLE_SCHEMA: test

TABLE_NAME: test_data

TABLE_TYPE: BASE TABLE

ENGINE: InnoDB

VERSION: 10

ROW_FORMAT: Dynamic

TABLE_ROWS: 2

AVG_ROW_LENGTH: 8192

DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

INDEX_LENGTH: 0

DATA_FREE: 0

AUTO_INCREMENT: NULL

CREATE_TIME: 2019-10-08 12:29:05

UPDATE_TIME: 2019-10-08 12:29:58

CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

CHECKSUM: NULL

CREATE_OPTIONS:

TABLE_COMMENT:

1 row in set (0.00 sec)

所以你的問題可以轉換一個思路來實現,即一段時間內沒有變化的表,可以通過information_schema.tables的欄位來進行查詢,這樣就可以得到資料庫裏的熱表和冷表了。

比如查看2019-10-08之前沒有DML數據變化的表,可以使用如下的SQL:

select table_name,update_time from information_schema.tables where update_time &<=2019-10-08 ;

| xxxx1 | 2019-09-02 23:49:42 |

| xxxx2 | 2019-09-03 23:45:21 |

| xxxx3 | 2019-09-04 23:59:31 |

| xxxx4 | 2019-09-05 23:41:25 |

| xxxx5 | 2019-09-06 21:44:40 |

| xxxx6 | 2019-09-07 23:46:17 |

+-------------------------+---------------------+

1019 rows in set (1.66 sec)

補充下,資料庫版本建議是在MySQL 5.7+


use dbname

show tables;


開啟binlog,增刪改操作會計入binlog文件,如果binlog保留時間夠長,可以用 mysqlbinlog 命令查詢到。

開啟general_log,查詢操作會寫入general_log文件,系統可以直接查看文件。


這一個觸發器,當資料庫表發生變化,觸發器就向日誌表寫數據。然後你的項目定時查詢這張表,即可在前臺知道哪些表被修改了。


Log 裏看


Binlog日誌可以查詢出指定時間內的數據增刪改操作,但查詢操作無法記錄,也沒有必要吧?


推薦閱讀:
相關文章