Mysql

查找數據庫中任何表的最後更新/插入/刪除的實用方法?

  • April 16, 2022

作業系統:W10。

這個問題專門關於 MariaDB 中的可能性,特別是版本~~“Ver 10.16 Distrib 10.2.11-MariaDB”~~。

編輯

根據 Rick James 的回答,我現在已經升級到**“Ver 15.1 Distrib 10.7.3-MariaDB”**。

我想實現一種為數據庫設置“最後修改”時間戳的方法,即顯示最後一次 INSERT 或 DELETE 或 UPDATE 發生的時間,而不管它發生在哪個表

案例(由於下面的評論):我正在執行一個經常性的系統管理任務。每 10 分鐘檢查一次數據庫是否需要使用mysqldump,出於備份目的,到一個經常被快照/備份的目錄(使用restic)。目前,此循環腳本檢查以下 MariaDB 文件是否已更新:ibdata1、ib_logfile0、ib_logfile1。如果這 3 個中最近的最後修改日期比最後一個 .sql 轉儲文件的日期時間(合併到名稱中)更新,它會執行新的轉儲。否則不行。我保留最後 5 個這樣的 .sql 轉儲文件。除非某些數據已更改,否則我不希望發生轉儲。這種安排的問題是它沒有顯示哪些數據庫需要轉儲,所以我轉儲了所有非系統數據庫。我正在尋找更細粒度的安排。

我發現了這個,看起來很有希望……但後來那裡有一些關於 InnoDB 的評論並information_schema.tables.update_time引導我做一個實驗。

與某些地方斷言的update_time始終NULL位於 InnoDB 表中的情況相反,我所擁有的似乎並非如此。NULL不幸的是,那里關於伺服器啟動時設置為該值的評論似乎是正確的。

在其他地方,我讀到較新版本的 MariaDB,脫離了普通 MySQL,實際上確實實現了某種變化歷史。

我目前正在假設我必須為每個表實現和触發器AFTER UPDATE,然後獲取每個表的值並找到最新的值,以確定整個數據庫的“最後修改”時間。AFTER INSERT``AFTER DELETE

這個版本的 MariaDB 還有其他可能性嗎?

在 MySQL 或 MariaDB 中,InnoDB 沒有數據庫範圍(或系統範圍)的“最後修改時間戳”。

另一方面,MariaDB 中有臨時表。這使您可以保留所有更改的歷史記錄。

複製將允許您“持續”擁有​​一個“副本”,其中整個數據庫集都是最新的。

如果您願意,您可以做任何事情來備份副本。

這種技術根本不涉及停止主伺服器。

此外,binlog(在 Primary 上)和 relay-log(在 Replica 上)實際上通過查看複製流在這些文件中的任何一個中的“位置”來指示是否進行了任何更改。

備份的目的是什麼?如果是普通備份;請使用現有技術,例如我在此處概述的,而不是在本論壇中即時發明的新技術。

LVM 作為一種在單個伺服器上拍攝“快照”的技術。它是如此之快,以至於您的一些設計想法可能是不必要的。(它使用“寫時複製”並從作業系統獲得一些低級幫助。)

引用自:https://dba.stackexchange.com/questions/310972