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)等,推薦使用小寫表名,可以提前規避一些問題。