我在 InnoDB (MySQL 5.5.7.-FreeBSD) 上有几个 DDBB。 5 年来我没有任何问题。我实现了周期性的查表,优化,...
奇怪的是,其中一个数据库的表从 70 行中丢失了 20 行(删除!)。这些行是几年前插入的。它们之间没有关系(随机 ID)。这是一张非常小的 table 。
经过几个小时的研究(和谷歌),我没有找到原因。我已经通过上次备份恢复了信息。
我检查过:
网络应用:
1)应用程序没有DELETE语句,只有SELECT或UPDATE。
2) 没有 DELETE ON CASCADE,没有外键。
2) protected SQL 注入(inject)。
3)没有应用程序管理表(如phpMysqlAdmin)。
4) 我的应用程序记录没有显示在那段时间内的攻击或访问尝试。
MySQL:
1) 所有行的验证都是直接在mysql控制台中完成的,无需使用APP。
2) mysqlcheck: 受影响的表没有错误。
3) Mysqldump:不转储消失的行,只转储剩余的行。
4) 错误日志:没有注册错误。
5) table.idb 文件不包含丢失的记录,只有剩余的行。
6) mysql 用户只能在本地访问(通过 IP)。
服务器:
1) 任何人都访问过服务器。
2) HDD 或 Controller 上没有发生错误。
3) 我没有在系统日志中看到事件。
显然一切都是正确的。我不知道发生了什么。
我想到了两个选择:
1) MySQL 5.5.7 中的错误???
2) 在记录丢失的那几个小时内,我正在(在不同的数据库上)导入数百万条 INSERT 和 DELETE。我认为这个紧张的过程没有损坏(不留痕迹)另一个数据库中的另一个表。
我担心它会不会再次发生!
谢谢!
更新 1 @pala_ 建议我查阅 bin-log(我没看过!)。
在 bin-log 中有 20 个带有著名 DELETE 的查询!
我粘贴bin-log:
(...)
BEGIN
/*!*/;
# at 83069675
# at 83069772
# at 83070746
# at 83071672
# at 83072677
#150505 12:29:18 server id 168291 end_log_pos 83069772 Table_map: `affected_database`.`affected_table` mapped to number 583255
#150505 12:29:18 server id 168291 end_log_pos 83070746 Delete_rows: table id 583255
#150505 12:29:18 server id 168291 end_log_pos 83071672 Delete_rows: table id 583255
#150505 12:29:18 server id 168291 end_log_pos 83072677 Delete_rows: table id 583255
#150505 12:29:18 server id 168291 end_log_pos 83073123 Delete_rows: table id 583255 flags: STMT_END_F
### DELETE FROM affected_database.affected_table
### WHERE
### @1=xxxxxxx
### @2=xxxxxxxx
### @3=xxxxxxxxxx
### @4=xxxxxxxxx
### @5=xxxxxxxxx
### @6=xxxxxxxxx
### @7=xxxxxxxxxx
### @8=xxxxxxxxx
### @9=xxxxxxxxxx
### @10=xxxxxxxxxxxx
### @11=xxxxxxxxxxx
### @12=xxxxxxxxxxx
### @13=xxxxxxxxxxx
### @14=xxxxxxxxxxx
### @15=xxxxxxxxxxx
### @16=xxxxxxxxxxx
### @17=xxxxxxxxxxx
### @18=xxxxxxxxxxx
### @19=xxxxxxxxxxx
### @20=xxxxxxxxxxx
### @21=xxxxxxxxxxx
### @22=xxxxxxxxxxx
### @23=xxxxxxxxxxx
### @24=xxxxxxxxxxx
### DELETE FROM affected_database.affected_table
### WHERE
(...) x20
它是如何运行的?
谢谢
最佳答案
根据你的bin-log,DELETE好像真的运行了。因此,更巧合的选项(MySQL 中的错误、不相关导入期间的问题(如果它确实不相关))似乎不太可能。
我们有两个选择: 1.“授权”但未知,例如在您的代码库中有一个删除方法,但您只是没有找到它,或者具有有效登录名的人运行了一个命令(您本身不需要为此应用程序,但您确实需要访问允许登录的服务器到你的数据库) 2. 未经授权:有人获得了对您系统的访问权限(并进行了清理),或者有人发现了 sql 注入(inject)
真的很难说哪个最有可能。从你所做的检查中很难说你有多彻底,但无论是对系统的访问(无事件)还是代码问题(防止注入(inject))都很难完全找出来。 另一方面,如果有很多人可能访问系统,则很难排除这种可能性。
如果你真的觉得这可能再次发生,你应该启用 general query log .那会给你一个来源的提示。您可以每天查看并旋转它,以免它变得太大。
如果您的服务器存在偏执狂级别的问题,您可以尝试将您的日志保存在外部,在一个只有您可以访问的地方:这将消除任何篡改证据。我自己还不会走那么远。
关于mysql - 5 年后,mySQL innoDB 表中有几行消失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30098412/
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
假设我在Ruby中有这个each循环。@list.each{|i|putsiifi>10breakend}我想循环遍历列表直到满足条件。这让我感到“不像Ruby”,因为我是Ruby的新手,是否有Ruby方法可以做到这一点? 最佳答案 您可以使用Enumerable#detect或Enumerable#take_while,取决于您想要的结果。@list.detect{|i|putsii>10}#Returnsthefirstelementgreaterthan10,ornil.正如其他人所指出的,更好的风格是先进行子选择,然后再对其
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl
我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有
这段代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?[*"a".."z"] 最佳答案 它叫做splatoperator.SplattinganLvalueAmaximumofonelvaluemaybesplattedinwhichcaseitisassignedanArrayconsistingoftheremainingrvaluesthatlackcorrespondinglvalues.Iftherightmostlvalueissplattedthenitconsumesallrvaluesw