• MySQL5.6数据导入MySQL5.7报错:ERROR 1031 (HY000)


    一、故障现象

    今天将一个在MySQL5.7上的数据导入到MySQL5.6里面去,默认存储引擎都是InnoDB,导入报错如下:

    [root@oratest52 data]# mysql -uroot -p123456 < /data/127.sql
    ERROR 1031 (HY000) at line 598885: Table storage engine for 't_config_dbconnects' doesn't have this option
    

    报错提示598885行有问题,t_config_dbconnects表的存储引擎不支持这个选项。由于备份文件较大(50G),不可能用vi打开去看,用sed文件查看该表的建表sql如下:

    [root@oratest52 data]# sed -n '598870,598899p' 127.sql
    --
    -- Current Database: `db_config`
    --
    
    CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db_config` /*!40100 DEFAULT CHARACTER SET utf8 */;
    
    USE `db_config`;
    
    --
    -- Table structure for table `t_config_dbconnects`
    --
    
    DROP TABLE IF EXISTS `t_config_dbconnects`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `t_config_dbconnects` (
      `ID` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
      `NAME` char(50) DEFAULT NULL,
      `HOST` char(50) NOT NULL DEFAULT '',
      `PORT` char(10) NOT NULL DEFAULT '',
      `USER` char(50) NOT NULL DEFAULT '',
      `PASSWORD` char(50) NOT NULL DEFAULT '',
      `CHARSET` char(30) DEFAULT NULL,
      `DBNAME` char(50) NOT NULL DEFAULT '',
      `ABOUT` char(200) DEFAULT NULL,
      `POSTTIME` datetime DEFAULT NULL,
      `LASTUSER` char(50) DEFAULT NULL,
      PRIMARY KEY (`ID`),  
      UNIQUE KEY `IDX_NAME` (`NAME`)
    ) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;
    

    可以看到最后一行中有ROW_FORMAT=FIXED

    二、初步分析

    发现报错的表的ROW_FORMAT格式是FIXED,并不是我们熟悉的Dynamic。查看资料和官方文档发现不同版本或者不同源的MySQL对于行记录格式的处理方式不一样,解决上述问题就先要了解row_format的改进历程,这里简单介绍下MyISAM和InnoDB两种存储引擎对于row_format格式的处理。

    2.1MyISAM存储引擎

    MyISAM有3种行存储格式:fixed/dynamic/compressed

    1. fixed:为默认格式,只有当表不包含变长字段(varchar/varbinary/blob/text)时使用,该每行都是固定的,所以很容易获取行在页上的具体位置,存取效率比较高,但是占用磁盘空间较多
    2. dynamic:每行都有一个行头部,包含bitmap,用以记录那些列为空(NULL列不算为空)
    3. compressed只能通过myisampack创建且为只读

    2.2InnoDB存储引擎

    Innodb plugin新引入Barracuda,其包含compressed/dynamic两种行格式,而之前的compact/redundant统属于antelope;目前可选值为Antelope和Barracuda,低版本默认为Antelope,高版本默认为Barracuda。
    了解这两种存储引擎如上两种row_format格式后,就能明白对一张MyISAM表且row_format为fixed格式的表更改存储殷勤为InnoDB肯定是不行的,因为InnoDB的row_format不支持fixed格式。所以可以先备份要更改引擎的表数据,然后将表的row_format更改为存储引擎都能识别的row_format,再进行引擎的变更。

    mysql> alter table t_config_dbconnects ROW_FORMAT = default;
    Query OK, 0 rows affected (0.15 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> alter table t_config_dbconnects engine = innodb;
    Query OK, 0 rows affected (2.67 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    WilliamZheng©版权所有 转载请注明出处! 运维架构师群:833329925
  • 相关阅读:
    如何在Unity中播放影片
    C# typeof()实例详解
    unity3d用鼠标拖动物体的一段代码
    unity3d中Find的用法
    geometry_msgs/PoseStamped 类型的变量的构造
    c++ ros 计算两点距离
    C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值
    C++ 结构体指针的定义
    Cannot initialize a variable of type 'Stu *' with an rvalue of type 'void *'
    C++中的平方、开方、绝对值怎么计算
  • 原文地址:https://www.cnblogs.com/williamzheng/p/11453101.html
Copyright © 2020-2023  润新知