mysql 做数据迁移可能会遇到的问题
Posted 诺浅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 做数据迁移可能会遇到的问题相关的知识,希望对你有一定的参考价值。
问题一、This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de
这是我们开启了bin-log, 我们就必须指定我们的函数是否是
- DETERMINISTIC 确定性的
- NO SQL 没有SQl语句,当然也不会修改数据
- READS SQL DATA 只是读取数据,当然也不会修改数据
- MODIFIES SQL DATA 要修改数据
- 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
以上是关于mysql 做数据迁移可能会遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章