欢迎光临
Corasql

Mysqldump版本问题导致虚拟列导入出问题

一、测试环境

操作系统:redhat 6.9

MySQL服务端版本:5.7.21

Mysqldump版本:

mysqldump  Ver 10.13 Distrib 5.1.73, for redhat-linux-gnu (x86_64)

mysqldump  Ver 10.13 Distrib 5.7.21, for linux-glibc2.12 (x86_64)

二、环境准备

CREATE TABLE `test` (

`id` char(12) COLLATE gbk_bin NOT NULL,

`name` char(2) COLLATE gbk_bin NOT NULL,

`col3` varchar(17) COLLATE gbk_bin NOT NULL,

`CALCOL` varchar(38) COLLATE gbk_bin GENERATED ALWAYS AS (concat(`id`,`name`)) VIRTUAL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin;

 

INSERT INTO `test` (`id`, `name`, `col3`) VALUES (‘010000000104′,’05’,’62805010000000104′);

 

三、mysqldump问题重现

以下分别使用mysql5.7版本mysqldump与mysql5.1版本的mysqldump对表进行备份。

[root@aboss ~]# /usr/local/mysql/bin/mysqldump –version

mysqldump  Ver 10.13 Distrib 5.7.21, for linux-glibc2.12 (x86_64)

[root@aboss ~]# /usr/local/mysql/bin/mysqldump -h192.168.8.198 -uroot -pxxxxxx –set-gtid-purged=OFF testdb test>test_5_7.sql

mysqldump: [Warning] Using a password on the command line interface can be insecure.

 

[root@aboss ~]#  mysqldump –version

mysqldump  Ver 10.13 Distrib 5.1.73, for redhat-linux-gnu (x86_64)

[root@aboss ~]#  mysqldump -h192.168.8.198 -uroot -pxxxxxx testdb test>test_5_1.sql

导出都是正常。

以下将对两个备份文件进行恢复

5.7版本的mysqldump导入是正常的

mysql -uroot -pxxxxxx testdb  <test_5_7.sql

而使用5.1版本的mysqldump导入时候,就报错了

[root@aboss ~]# mysql -uroot -pxxxxxx testdb  <test_5_1.sql

ERROR 3105 (HY000) at line 40: The value specified for generated column ‘CALCOL’ in table ‘test’ is not allowed.

报错信息是虚拟列是不允许被指定值的。

四、出现问题的原因

分别查看一下mysqldump导出来的内容

mysqldump5.7.21

INSERT INTO `test` (`id`, `name`, `col3`) VALUES (‘010000000104′,’05’,’62805010000000104′);

mysqldump 5.1.73

INSERT INTO `test` VALUES (‘010000000104′,’05’,’62805010000000104′,’01000000010405′);

从上面可以看出,5.7版本的mysqldump导出的sql文件,指定了列名,而不包含虚拟列,而5.1版本的mysqldump导出的sql文件,没有指定列名,也包含了虚拟列,所以会报错。

 

装了mysql5.7.21版本的数据库,为什么会使用5.1版本的mysqldump呢?

由于redhat6系统,默认安装的是mysql5.1版本的rpm,mysqldump将被安装在/usr/bin/目录下面。当你输入命令的时候,系统会优先在/usr/bin下面查找命令。

五、如何避免

1、使用mysqldump时要查看一下版本

2、使用mysqldump时,指定完整的路径

3、把操作系统默认装的5.1版本的mysqldump卸载掉

rpm -e mysql-5.1.73-8.el6_8.x86_64

分享到:更多 ()

评论 抢沙发

评论前必须登录!

DBA是一种生活方式,优化是一种生活态度

OracleMySQL