为了提高mysql主从复制的效率,将mysql 从5.1.63升级到5.6.20,升级过程非常顺利,但是在数据的迁移过程中出现了问题,
第一次数据迁移直接使用的是数据文件迁移的方法:停掉原5.1.63的数据库服务,将数据库的物理文件直接拷贝到5.6.20的数据库的data目录下,启动5.6.20的数据库服务,启动非常正常,但在打开前端应用时,好多数据都不能正常呈现,进入数据库查看有不少数据缺失,应该是高版本中对低版本的数据文件的识别存在问题,所以从低版本向高版本进行数据迁移不能使用直接拷贝数据文件的方法。直接拷贝文件时候同一个大版本的情况下。
第二次迁移,由于第一次迁移失败,所以第二次只好直接把数据DUMP出来,使用工具mysqldump -uroot -proot database >./data.isql 将整个要迁移的库的数据备份出来,生成data.isql,这个过程要看数据库的大小,时间不一,等数据DUMP出来之后,使用命令mysql -uroot -proot database < ./data.isql,将备份文件导入到5.6.20数据库中。一切正常,大家前端应用,数据显示也非常正常,就在准备收工的时候,问题出现,在前端应用中不能添加数据,提示添加失败。
将前端应用中添加数据过程中的DEBUG信息打印出来,发现是由于某个列的值(查看该字段的属性是允许null空值存在)没有给导致出错,为啥之前在5.1.63中没有这个问题,查看5.6.20数据库的配置文件发现了问题,该版本数据库的配置文件默认加了 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 这个配置,其中参数STRICT_TRANS_TABLE,表示是要对SQL的语句进行严格校验,是不允许有空值存在,必须要给字段赋值,而低版本的5.1.63数据库中默认是没有参数,也就是不严格校验你的SQL语法。
解决问题的方法很简单,就是将STRICT_TRANS_TABLES 这个参数去掉,或者将这个sql_mode整个参数的赋值注释掉,重启数据库就可以。
本次数据库的版本升级和数据迁移也是一波三折,好歹算迁移成功。
本文出自 “与狼共舞” 博客,请务必保留此出处http://renwd.blog.51cto.com/858281/1552485