mysql 的 init_connect 變量是每一個客戶端連上數據庫服務器時執行的一組數據,這組數據能夠是一個或者多個sql語句。mysql
A string to be executed by the server for each client that connects. The string consists of one or more SQL statements, separated by semicolon characters.sql
mysql 的 binlog 日誌用於記錄全部更新了數據庫內容的sql語句,以事件的形式保存。數據庫
The server's binary log consists of files containing 「events」 that describe modifications to database contents.vim
CREATE DATABASE accesslog; CREATE TABLE accesslog.accesslog ( `id` INT (11) PRIMARY KEY auto_increment, `time` TIMESTAMP, `localname` VARCHAR (30), `matchname` VARCHAR (30) )
GRANT SELECT ON accesslog.* to root@localhost IDENTIFIED BY 'password'
在 mysql 配置文件裏(my.cnf或者my.ini)裏[mysqld]裏添加以下設置服務器
init_connect='INSERT INTO accesslog.accesslog VALUES(connection_id(),now(),user(),current_user());'
而後重啓數據庫。工具
mysql> show variables like 'log_bin';
若是沒有開啓則開啓binlog 打開mysql配置文件日誌
vim /etc/my.cnf
在[mysqld] 區塊添加以下設置code
logb-bin=mysql-bin
mysql-bin是日誌文件的前綴名 而後重啓服務器生效server
binlog 日誌默認存儲在數據目錄,即 mysql 配置文件裏的 datadir 目錄。若是log-bin寫了完整的目錄,則日誌文件在相應目錄。 在目錄下能看到以下文件就是啦 事件
mysql 自帶的工具 mysqlbinlog 用於導出binlog日誌,格式以下:
/mysql/bin/mysqlbinlog --database=test --start-date="2016-03-25 00:00:00" --stop-date="2016-03-28 15:00:00" /mysql/data/mysql-bin.000071 > test
--database
: 指定數據庫名
--start-date
: 開始時間
--stop-date
: 結束時間
若是star-date 到 stop-date 跨越了好幾個binlog文件能夠經過mysql-bin.000*的方式模糊指定。 這樣就導出了 2016-03-25 00:00:00 到 2016-03-28 15:00:00 之間執行的全部修改過數據的sql語句了。 格式以下 160328 18:33:29是執行時間 thread id 是客戶端鏈接數據的id,即上面存儲到accelog的id 同時還能夠這樣提取出某張表的sql語句
cat test.sql | grep ‘TABLE_NAME’ > xx.sql
如上,經過查找binlog能找到客戶端鏈接數據庫的id,去查前面創建的accesslog表就能夠找到是哪一個用戶操做的。 另外,當發生了誤操做以後能夠利用該方法恢復數據。 假如2016-3-25 13:10:00 發生了誤操做。首先找到最近的一次數據庫備份,假如是2016-03-01 00:00:00 那麼則導出從2016-03-01 00:00:00到2016-3-25 13:10:00之間的binlog記錄,而後刪除其中的誤操做語句(必定要刪除)。接下來執行數據庫備份,而後執行binlog導出的sql記錄便可將數據庫恢復至最新版本。