mysql迁移记录
背景
公司自建了PAAS平台,可以支持CI/CD流程。我们发布流程是mit->test->uat->prod。分别对应开发、测试、验收、生产环境,环境之间是互相隔离的。
有个历史的数据库只有TEST环境才有,为了便于调试,需要拷贝一份到MIT环境,以下是遇到的问题记录。
安全可靠的数据迁移方式
工具
推荐文章:https://www.cnblogs.com/swtjavaspace/p/9698167.html
navicat使用 工具->数据传输 可以很方便的把一台机器的数据库同步到另一台机器(包括结构和数据)
遇到问题
Got a packet bigger than ‘max_allowed_packet’ bytes With statement
如果某个数据库表的内容太大,会导致失败。此时修改数据库配置即可。
vim /etc/my.conf # windows下是my.ini
# [mysqld]下加入一行 注意是mysqld
max_allowed_packet=16M
systemctl restart mariadb # 然后重启mysql
重启mysql
systemctl restart mariadb
执行一下语句查看是否生效:
MariaDB [(none)]> show VARIABLES like '%max_allowed_packet%';
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| max_allowed_packet | 16777216 |
| slave_max_allowed_packet | 1073741824 |
+--------------------------+------------+
2 rows in set (0.00 sec)
16777216 代表16M,默认是1024。
Invalid default value for 'CREATE_TIME’报错的解决方法
源表里面某个字段时datetime类型,默认值使用了CURRENT_TIMESTAMP来生成默认时间,导入的时候报错了。根据网上资料,这个功能需要 mysql5.7 版本以上才支持:
查看mysql版本
[root@10-0-59-117 ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 253
Server version: 5.5.60-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
方案一:升级mysql 5.7以上。
方案二:修改默认值CURRENT_TIMESTAMP为NULL。
方案三:跳过。
因为有些表其实用不到,所以我选择了方案三,在进行数据传输的时候把报错的表先跳过了。后面如果有需要再手动导出导入来修正。
参考:
https://www.jianshu.com/p/2f30786a5a6a
https://www.cnblogs.com/han-1034683568/p/11418264.html
忽略表名大小写
dos't not exist bi_sqa.sys_log
迁移完成后,启动服务,提示表名不存在。经过检查发现代码里面使用的 大写表名,而Linux里面的mysql是默认不启用忽略表名大小写功能的。
在 mysql.conf 的 mysqld 下加入下面的配置,然后重启mysql即可。
[mysqld]
lower_case_table_names=1
查看是否生效
MariaDB [(none)]> show variables like "%case%";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 1 |
+------------------------+-------+
2 rows in set (0.00 sec)
显示 1,则代表已经Ok了。
推荐使用小写表名
如果启用了 lower_case_table_names 后,系统全部使用小写表名,如果此时出现 大写 的表名,则会提示不存在的问题。
所以,如果系统模块比较多,涉及多种开发语言(C++/JAVA)等,推荐使用小写表名,可以提前规避一些问题。