上云无忧 > 文档中心 > 百度智能云云数据库RDS使用mysqldump导入GeneratedColumn报错问题
云数据库 RDS
百度智能云云数据库RDS使用mysqldump导入GeneratedColumn报错问题

文档简介:
MySQL在5.7版本中提供了Generated Column的功能,它可以通过函数计算获得新的一列数据,我们可以通过在虚拟列加索引的方式提高查询效率、分区表可使用虚拟列进行分区等。 for MySQL 版
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

背景

MySQL在5.7版本中提供了Generated Column的功能,它可以通过函数计算获得新的一列数据,我们可以通过在虚拟列加索引的方式提高查询效率、分区表可使用虚拟列进行分区等。

问题现象

在使用低版本mysqldump命令做有虚拟列表的导入导出操作时,报错:

ERROR 3105 (HY000) at line 38: The value specified for generated column 'col1' in table 'tb_01' is not allowed.

原因分析

mysqldump版本低于5.7.9的话,会误导出虚拟列数据,但是虚拟列是不允许被插入的,因此产生以上报错。

Changes in MySQL 5.7.9:mysqldump used incorrect syntax for generated column definitions. (Bug #20769542)

解决方案

使用5.7.9以上版本的mysqldump工具导出含Generated Column的表的数据。

案例复现

1、测试表和数据

CREATE TABLE triangle (
  sidea double DEFAULT NULL,
  sideb double DEFAULT NULL,
  sidec double GENERATED ALWAYS AS (sqrt(((sidea * sidea) + (sideb * sideb)))) VIRTUAL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into triangle(sidea,sideb)values(1,1),(3,4),(6,8);

2、分别使用不同版本的mysqldump导出数据

  • 使用低版本mysqldump导出数据示例
LOCK TABLES `triangle` WRITE;
/*!40000 ALTER TABLE `triangle` DISABLE KEYS */;
INSERT INTO `triangle` VALUES (1,2,2.23606797749979),(3,4,5),(2,9,9.219544457292887);
/*!40000 ALTER TABLE `triangle` ENABLE KEYS */;
UNLOCK TABLES;
  • 使用高版本mysqldump导出数据示例
LOCK TABLES `triangle` WRITE;
/*!40000 ALTER TABLE `triangle` DISABLE KEYS */;
INSERT INTO `triangle` (`sidea`, `sideb`) VALUES (1,2),(3,4),(2,9);
/*!40000 ALTER TABLE `triangle` ENABLE KEYS */;
UNLOCK TABLES;

总结建议

建议mysqldump与MySQL Server版本对齐,避免使用较低版本导致类似Generated Column的新特性带来的兼容性问题。

相似文档
  • MySQL从5.7.1版本开始,临时表的存放由之前的临时文件可替换成采用独立的临时表空间形式,命名为ibtmp1;由innodb_temp_data_file_path参数可配置临时表空间相关参数。MySQL将临时表空间从系统表空间 (system tablespace) 文件中独立出来,该共享临时表空间用于存储非压缩 InnoDB 临时表 (non-compressed InnoDB temporary tables)、关系对象 (related objects)、回滚段 (rollback segment) 等数据。 for MySQL 版
  • MySQL的权限REFERENCES是控制是否允许给表建立外键关联关系的权限。 问题现象: 从MySQL5.6版本的数据库中导出的含外键的表,然后再导入到MySQL5.7版本的数据库中,导入过程中产生如下报错: ERROR 1142 (42000): REFERENCES command denied to user 'user'@'host' for table 'tb_01'; for MySQL 版
  • 从MySQL 5.7.5版本开始,可以在线动态调整innodb_buffer_pool_size的大小,这个新特性同时也引入了参数innodb_buffer_pool_chunk_size。因为buffer pool的大小受innodb_buffer_pool_chunk_size和innodb_buffer_pool_instances两个参数影响,所以,实际innodb_buffer_pool_size的大小可能与DBA设置的并不一样,有时区别甚至还挺大。 for MySQL 版
  • MySQL 在 5.7 版本中新增了生成列(Generated Column)的功能,它可以通过函数表达式计算获得新的一列数据,我们可以在函数表达式查询中通过构建生成列加索引的方式提高查询效率、分区表可使用生成列进行分区等,由于生成列默认是虚拟类型,因此通常称之为虚拟列。 for MySQL 版
  • MySQL 在 5.7 版本中新增了生成列(Generated Column)的功能,它可以通过函数表达式计算获得新的一列数据,我们可以在函数表达式查询中通过构建生成列加索引的方式提高查询效率、分区表可使用生成列进行分区等,由于生成列默认是虚拟类型,因此通常称之为虚拟列。 for MySQL 版
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部