mysql 做数据迁移可能会遇到的问题

Posted 诺浅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 做数据迁移可能会遇到的问题相关的知识,希望对你有一定的参考价值。

问题一、This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de

这是我们开启了bin-log, 我们就必须指定我们的函数是否是

  1. DETERMINISTIC 确定性的
  2. NO SQL 没有SQl语句,当然也不会修改数据
  3. READS SQL DATA 只是读取数据,当然也不会修改数据
  4. MODIFIES SQL DATA 要修改数据
  5. CONTAINS SQL 包含了SQL语句

其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

mysql中创建函数时出现这种错误的解决方法:

set global log_bin_trust_function_creators=TRUE;

问题二、Data truncation: Incorrect datetime value: ‘0000-00-00 00:00:00’ for column xxx

这个是因为:mysql 5.7之后版本datatime 不允许设置 0000-00-00 00:00,这样如果我们新建的数据库没有关于这个限制的话,在导入数据时,如果数据中time的值为0000-00-00,就有可能导致出错,导致数据插入不进去。

解决方法:
1、查看sql_mode

# 查看全局sql_mode
select @@global.sql_mode;

2、将上述查询到的sql_mode中的NO_ZERO_DATE和NO_ZERO_IN_DATE删除重新设置进去即可
注意:修改好要重新登录才会生效

# 修改全局
set @@global.sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

问题三、Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘×××’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

这个问题的原因是mysql在5.7以上版本默认要求group by后面的列数需要与select 查询列一致,解决办法是关闭这个限制
1、查看sql_mode

# 查看全局sql_mode
select @@global.sql_mode;

2、将上述查询到的sql_mode中的ONLY_FULL_GROUP_BY删除重新设置进去即可
注意:修改好要重新登录才会生效

# 修改全局
set @@global.sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

临时设置和永久设置sql_mode

执行 SET GLOBAL sql_mode都是临时设置,在mysql重启后会失效
永久设置方法
编辑/etc/mysql/my.cnf,在[mysqld]下添加:

sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

设置表名忽略大小写

修改my.cnf文件,在[mysqld]下添加

lower_case_table_names = 1

但是我这里因为使用的是docker运行,这样设置后会报错

Different lower_case_table_names settings for server (‘1’) and data
dictionary (‘0’). 2019-01-28T13:24:25.339709+08:00 0 [ERROR]

简单来说是因为

Lower_case_table_names只能在初始化服务器时配置。服务器初始化后,不允许修改lower_case_table_names设置。

目前没有找到docker容器化方式运行的MySQL,如果MySQL已经在运行了应该怎么修改,只能删除掉容器重新运行,删掉容器意味着如果数据没有挂载出来数据会丢失,所以做好备份。

然后重新启动容器,启动命令加上--lower-case-table-names=1

docker run --name mysql --restart=always \\
-v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf \\
-v /home/mysql/data:/var/lib/mysql \\
-p 3306:3306 \\
-e TZ=Asia/Shanghai \\
-d mysql:8.0.18 --lower-case-table-names=1

程序中连接的时区设置

serverTimezone=GMT%2B8

升级mysql-connector 5到8遇到的问题

以上是关于mysql 做数据迁移可能会遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql 做数据迁移可能会遇到的问题

数据从sqlite3迁移到mysql中遇到的问题

如何将MySQL数据库迁移到Oracle数据库

MYSQL 到MYSQL 分表数据迁移

MYSQL 到MYSQL 分表数据迁移

数据库迁移 - MySQL 迁移到 HBase