Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1113933
  • 博文数量: 350
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-23 17:53
文章分类

全部博文(350)

文章存档

2013年(350)

分类: Mysql/postgreSQL

2013-04-11 16:05:49

中的命令行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参数也应做为必备参数调用。
阅读(2056) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~