最近烦心的事情很多,做事情精神不集中,在给客户做项目的时候,竟然糊里糊涂的删掉数据库里所有的表,因为本地数据库和在线数据库在浏览器不同选项卡里开着,一走神就删错了。

之后,我领教了祸不单行这句至理名言!我手里有客户数据库的备份,心想只要重新导入就没事了。但我手里的备份无法导入本地数据库,这个网站是wordpress+shopp插件做成的电子商务网站,wp shopp这个插件在存储图片方面提供了两种方式:文件存储或数据库存数。客户选择了默认的数据库存储,问题出来了,网站运行过程中似乎出了错误,本应存储二进制数据的Blob类型里竟然有一堆网页代码。导致导出的备份在出错的那一条记录处结束,后面的数据和排在这个表后面的十几个表全部丢失!我做梦也没想到手里的备份竟然不全,事情闹大了。

没有办法, 又向客服要了备份,虽然一开始担心客服的备份也是不全的(因为那个记录错误会导致语法错误,所以用phpmyadmin的导出功能无法正确备份)。客服的备份到手,导入后发现表结构是全的,长舒了一口气。赶快去看看那个惹火的表,一看傻眼了,出错那条记录后面的数据全部丢失。客服的备份也有错误!不仅如此,恢复过来的wordpress像吃错了药,post界面可以看到post数量,却一条post也不显示。点插件页面,竟然只接提示wordpress数据库需要升级。看来数据库的问题不小,于是到phpmyadmin用repair功能修复了数据表n次,感觉只有一个字 – 乱!奇迹的是,存储图片的那个表丢失的数据在repair后竟然被找回来了,怎么找回来的我没想明白,只是猜测可能是服务器开启了mysql日志功能,在data目录下有数据库的备份。之后问题一一克服,网站也恢复到先前的状态。

这件事把我好好的教育了一下。备份一定要校验,非常认真的校验。首先看大小,备份文件的大小应该大于数据库里显示的大小。其次,导入本地进行测试,如果可以正确导入则说明备份正确。最后,也是最关键的,如果出现无法导入本地的情况,并且数据在某个表被截断,一定要自己分析看是不是那个数据出现了非法字符,如果有非法字符导致语法错误,导出会被迫中止,有时候连错误提示都没有,会让我们麻痹大意。我一开始误以为表无法导入是因为Bolb数据大于1M,超过了mysql的限制。后来改了my.ini的配置仍然无法导入,没有往数据错误的方向怀疑,一直认为是本地环境有问题。

多动脑、少动手、勤分析、多思考。用柯南的方式进行缜密的推理,不要轻易破坏犯罪现场!

用phpmyadmin导出数据库时,要注意insert语句,有些低版本的mysql导出的备份是这样的

insert (field1,field2,…) values (value1,value2,…)

insert (field1,field2,…) values (value1,value2,…)

表里的每一条记录都占用一条insert语句, 也就是一个查询,本来回复一个表只需要创建表+插入全部数据两次查询,这种写法就会变成很多次查询,有多少条记录就会查询多少次,非常慢,特别是用Navicat的时候,会慢的让人发狂。正确的导出结构应该是这样

insert (field1, field2) values

(value1, value2…)

(value1, value2…)

3条留言

  1. 多动脑、少动手、勤分析、多思考。用柯南的方式进行缜密的推理,不要轻易破坏犯罪现场!

    赞一个。

  2. 哈哈~~~

    感觉到好欢乐,曾经也这样干过!

  3. 多动脑、少动手、勤分析、多思考。用柯南的方式进行缜密的推理,不要轻易破坏犯罪现场!
    太经典了。囧。

评论功能已关闭