Mysql数据库备份时视图(view)不能正常导入的解决方法

2015-02-11 15:31:16    2016-06-17 17:19:45

症状

最近在使用前面提到的备份mysql数据库方法把一个数据库文件导入到新的mysql服务器上的时候,出现了权限出错的问题。数据库似乎导入正常,但导入后发现原先建立的视图(view)全部变成空的了。后来才发现,原来以前备份和恢复数据库的时候,大多是用同样的用户名,而且主要只是数据表(table)。而这次在转移时,用了新的用户名和密码,而且数据库中包括不少视图。

出错原因

数据库导出文件中,视图的定义中默认是包含当前用户名,在一行叫“DEFINER”里面。在新的数据库上导入文件时,数据库默认是用“DEFINER”后面的那个用户名,如果新的数据库中没有这个用户名或者这个用户名权限不够,则在导入视图中会出现权限出错的提示信息,无法正确地创建视图。类似的情况在建立触发器(trigger)时也会遇到。

解决方法

导出数据库后先去掉数据库备份文件中所有对“DEFINER”的定义,然后再导入,这样就会以新用户名的身份去建立视图和触发器,不用再遇到权限的错误了。

mysqldump -u OLD_USER -pOLD_PASSWORD@OLD_SERVER OLD_DB | sed -e 's/DEFINER[ ]*=[ ]*[^*]**/*/' | mysql -u NEW_USER -pNEW_PASSWORD --host=NEW_SERVER -C NEW_DB