中的命令行mysqldump做为常用的数据工具,虽说性能稍差,但优在易于调用,从长期应用的情况来看其表现也相当稳定,并且老实讲MySQL数据库下逻辑备份确实没有太多选择,因此mysqldump应用极为广泛,三思本人也是经常使用这个命令倒腾数据,整体感觉是个挺美好的东西,不过上周遭遇一次案例,认识到我对mysqldump的认识还有不足,记录下来,供有心的朋友参考。
事情是介个样子的,mysqldump命令常规方式创建备份拉到某机器上,恢复执行很成功,一条错误信息都没看着,但等恢复完登录到中一瞅,你猜怎么地,数据不全~~
第一反应当然是查看备份文件,经过检查,果然,恢复操作确实没有问题,因为备份集中的内容就不全,那么,为什么备份集内容不全呢~~
幸好原有执行场景均有记录,分析发现,原来是在导出某个视图对象时报错,mysqldump自动中止,因此所有该对象之后的就都没备份了~
这种情况模拟重现很简单,操作如下:
mysql> create j1 (id int,vl varchar(100));
mysql> create view j1_view as select * from j1;
mysql> rename table j1 to j2;
# mysqldump --tables j1 j1_view > bak.sql
mysqldump: Got error: 1356: View 'test.j1_v' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them when doing LOCK TABLES
创建备份时,view对象引用的表对象不存在,执行LOCK TABLES失败,于是mysqldump就中止了,这其实真不怪mysqldump,因为mysqldump执行过程中遇到任何问题,默认情况下都是直接退出。
那么怎么处理这种情况呢,两种思路:
1、修正无效的视图,这点可以通过information_schema.views.IS_UPDATABLE列来判断,当IS_UPDATABLE列值为NO时,说明该视图状态异常,需要处理了;
2、执行mysqldump时附加--force参数,该参数功能是当遇到错误时忽略,继续执行后面的操作;
这个参数提供类似ORACLE数据库中exp命令的ignore=y参数的功能,事实上在ORACLE数据库中执行exp时通常都会指定ignore,对应到MySQL数据库,我想在执行mysqldump命令行过程中,--force参数也应做为必备参数调用。
阅读(2280) | 评论(0) | 转发(0) |