December 31, 2006

mysqldump出来的数据导入到另外一个数据库的时候出现

Error 1153 Got a packet bigger than max_allowed_packet’…

原因是数据表中有一些行的数据大小大于了目标机的max_allowed_packet值,这个值默认是1M,原则上都够用了,但是如果把一些大的二进制数据放到数据库中,比如图片等,就很容易超过了。

解决方法:可以在mysqld启动的时候加入启动参数,其中2M可以变成任何值,最大1G

mysqld –max_allowed_packet=2M

如果觉得麻烦,就修改mysql的config文件,加入以下字段

[mysqld]
max_allowed_packet=2M

dump出来的数据导入到新服务器的时候,会出现一些存储过程与视图访问的异常,有一个原因是这些routines(view + proc + func)都指定了创建者,也就是definer,definer对该routine权限有特殊含义,所以,解决方法就是记得将mysql.user表也同步过来。当然,最好是重新grant而不是操作该表。

关于存储过程的权限管理,一种是SQL SECURITY INVOKER,一种是SQL SECURITY DEFINER,也就是一种是调用者权限,一种是定义者权限,如果使用第一种,那么执行的时候是以执行者本身的权限来操作存储过程中包含的表。如果是第二种,那么执行的时候,是以该存储过程的定义者权限来操作。