• mysql5.5版本数据迁移问题


    场景:大数据所用的MySQL数据库中,部分表是myisam引擎的,部分表是innodb引擎的。并且表空间是共享表空间。

               大数据部门想将所有的myisam引擎的表,转换为innodb引擎的表,并大共享表空间转换为独立表空间。

    迁移方案:1、新搭建一个实例。

                      2、把主库的表结构备份导入到新建的实例中。

                      3、然后把主库的数据使用mysqldump逻辑导出,最后source到新添加的从库中

    本以为这样可以解决上面的两个问题,change master to之后,观察一会,主从关系都是yes状态,由于数据量比较大,近一个T了。第二天再次show slave status发现从库出现1048错误。提示的信息

    观察旧从库和主库,并没有问题,初步判断原因是sql_mode原因。

    观察主库的binlog文件。发现每个binlog开头都是SET @@session.sql_mode=2097152,这个表示的是在会话级别将sql_mode设置为严格模式;查阅资料,strict_trans_tables只对事务表启用严格模式。而对于 myisam引擎的表,例如:类型是int(1),在插入数据的时候插入了values('aa'),那么 aa不能转换为int,执行结果是会报错的。如果大于第一行数据,MySQL将非法值转换为最接近该列的合法值并插入调整后的值,如果不能转换,MySQL在列中插入隐式默认值,在任何情况下,MySQL都不会报错(除非语法错误),并会继续执行语句。说使用的是java语言,在mysql5.5版本数据库中,默认的sql_mode是空的。java发现数据库的sql_mode是空值的话,将数据库sql_mode转换为严格模式。而原来的主库和从库都没有问题,只有新的 从库会报错。个人推断是。由于新建的从库把原来的myisam的表都已经转换为innodb表了,那么之前主库的binlog中还有非法数据插入,binlog设置的是针对事务表有效,而非事务,将其数据截断了,而新的从库,都是事务表,所以会报错!!

    画外音:

    基本找到问题所在的原因之后:

    还是想将数据全部备份之后,导入到从库中。修改引擎的方法,要么业务停,将表直接修改为innodb。要么程序端java修改,不要修改数据库的sql_mode。

    参考链接:

    https://blog.csdn.net/hjgzj/article/details/77885090

    https://yq.aliyun.com/articles/59265

  • 相关阅读:
    React PC端悬浮锚点吸顶导航
    LESS 移动端一像素1px线条CSS解决方案
    React Swiper轮播图
    Win10 虚拟机安装mac系统
    ReactNative Windows环境初始化项目
    Win10 安装AndroidStudio
    Win10 环境安装JDK
    【mysql基础学习篇】mysql服务器架构简介
    uniapp封装小程序雷达图组件实现
    这12道Spring面试题要是还不会的话?就白干了!
  • 原文地址:https://www.cnblogs.com/lucky8866/p/10677192.html
Copyright © 2020-2023  润新知