資料庫是Mysql的,有個user table.裡面目前有144059個使用者資訊。最近有反饋就是有一些使用者以前註冊過,然後過一段時間發現不能登入,需要重新註冊一下。網站是PHP的。得到反饋後就檢查了一下cron job和日誌等,都沒找到原因。(不能登入的原因就是該使用者的資訊被刪了)
所以,想請教一下,該從哪方面入手比較好。
+++++++++++++++++++++++++++++++++++++++++++
修改了一些許可權之後,使用者丟失的情況就沒有發生過了(已經過了2個月了)。不過,以前丟失使用者的原因一直沒找到。
反正,結案咯。
回複內容:
資料庫都有log的(指的不是給人看的那些文本log),你找到那條delete語句的transaction id,然後復原到那裡就好了。把能接觸到資料的程式員全部抓起來,然後老虎凳,辣椒水,不出一個小時,就會有人承認是自己偷偷刪的。找原因呢,就分析log
log資訊如果不全那該補全就補全
另外沒有人懷疑 sql inject 嗎? MySQL開啟binlog後,寫入操作都會記錄到二進位日誌裡,可以使用mysqlbinlog查看/匯出/恢複資料.
假設你之前進行了 mysqldump全量備份,和binlog增量備份(在mysqldump全量備份時使用參數--flush-logs清除全量備份前的binlog).
先恢複之前用mysqldump進行的全量備份,然後用 mysqlbinlog進行還原時間點:
mysql -uroot -prootpwd db_name < db_name.sql mysqlbinlog --stop-datetime="2013-10-12 12:30:00" /var/log/mysql/mysql-bin.000001 | mysql -uroot -prootpwd
先查查代碼邏輯吧,莫名其妙丟掉幾條記錄不大可能是資料庫本身或者硬碟的問題。你就算把資料找回來,代碼邏輯上不對,以後還是會丟資料。硬碟資料丟失!以percona 5.6為例:
有兩種方法:
1 使用general_log
2 使用審計外掛程式
一 使用general_log
開啟general_log
set global general_log=on; mysql> show variables where value like '%table%' -> ;+------------------------------+-----------------------+| Variable_name | Value |+------------------------------+-----------------------+| log_output | TABLE || slave_rows_search_algorithms | TABLE_SCAN,INDEX_SCAN || tx_isolation | REPEATABLE-READ |+------------------------------+-----------------------+3 rows in set (0.00 sec)
可以使用Datahekr 資料庫中介軟體,有SAAS版本的,能提供比資料庫內建LOG功能更詳細的審計資訊。資料庫裡面有慢查詢日誌和執行的SQL日誌,錯誤記錄檔等等