Heim  >  Artikel  >  Backend-Entwicklung  >  Mysql里面某一table的部分数据莫名的被删了,请问如何找到原因?

Mysql里面某一table的部分数据莫名的被删了,请问如何找到原因?

WBOY
WBOYOriginal
2016-07-22 12:01:241258Durchsuche

数据库是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进行时间点还原:

<code class="language-text">mysql -uroot -prootpwd db_name </code>
先查查代码逻辑吧,莫名其妙丢掉几条记录不大可能是数据库本身或者硬盘的问题。你就算把数据找回来,代码逻辑上不对,以后还是会丢数据。 硬盘数据丢失! 以percona 5.6为例:
有两种方法:
1 使用general_log
2 使用审计插件

一 使用general_log
打开general_log
<code class="language-text">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)
</code>
可以使用Datahekr 数据库中间件,有SAAS版本的,能提供比数据库自带LOG功能更详细的审计信息。 数据库里面有慢查询日志和执行的SQL日志,错误日志等等
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn