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

设置表名忽略大小写

这条很重要,因为mysql运行以后就不能修改这项参数了,要重新安装mysql,经常出现迁移了一晚上的数据终于迁移完了,连接时发现要设置这个,只能全部重来。如果有其他好办法的兄弟,也欢迎评论区留言。
修改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

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';

永久设置
编辑/etc/mysql/my.cnf,在[mysqld]下添加:

sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

这个问题的详细连接

程序中连接的时区设置

serverTimezone=GMT%2B8

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

猜你喜欢

转载自blog.csdn.net/qq32933432/article/details/122268563