docker搭建mysql目錄掛載,完成數(shù)據(jù)遷移

搭建mysql

docker run -d --name mysql -p 3306:3306 --restart=always -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --lower_case_table_names=1

  • 參數(shù)

    • -d 后臺(tái)運(yùn)行

    • --name 容器命名

    • -p 端口映射 宿主機(jī)端口:容器端口

    • -e 環(huán)境變量 用來設(shè)置默認(rèn)用戶名密碼

    • --restart 控制docker重啟時(shí), 容器是否(no)自動(dòng)啟動(dòng)

    • --lower_case_table_names

      0 表名存儲(chǔ)為給定的大小和比較是區(qū)分大小寫的 1 表名存儲(chǔ)在磁盤是小寫的,但是比較的時(shí)候是不區(qū)分大小寫

      2 表名存儲(chǔ)為給定的大小寫但是比較的時(shí)候是小寫的

拷貝mysql默認(rèn)配置文件, 映射默認(rèn)配置, 數(shù)據(jù)保存目錄

  • copy mysql 默認(rèn)配置 docker cp mysql:/etc/mysql /usr/local/share/env/mysql-conf

  • 刪除未映射數(shù)據(jù)存儲(chǔ)目錄和配置的mysql容器 docker rm mysql -f

  • 重新運(yùn)行一個(gè)容器, 并加入數(shù)據(jù)存儲(chǔ)目錄映射, 目錄映射

docker run -d --name mysql -p 3306:3306 --restart=always -v /usr/local/share/env/mysql57-data:/var/lib/mysql -v /usr/local/share/env/mysql-conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7 --lower_case_table_names=1


image.png

通過navicat數(shù)據(jù)傳輸遷移數(shù)據(jù),報(bào)Invalid default value for 'created_time',如下

[圖片上傳中...(image.png-4b66fc-1594446819574-0)]

  • [ERR] 1067 - Invalid default value for 'created_time'


    image.png

    查詢資料說是sql_mode的原因, 可通過 select @@sql_mode 默認(rèn)值為 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

可通過SET GLOBAL sql_mode='ONLY_FULL_GROUP',臨時(shí)有效
修改my.cnf配置

查看my.cnf, 引用兩個(gè)配置文件, 所以直接修改mysql.conf.d/mysqld.cnf配置,在配置中加入,

  • 去掉ONLY_FULL_GROUP_BY, 修改默認(rèn)group by策略,
  • 去掉NO_ZERO_IN_DATE,NO_ZERO_DATE 修改datetime和timestamp默認(rèn)值可為null
    sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

改了sql_mode模式為嚴(yán)格或者寬松模式情況下,都會(huì)報(bào)錯(cuò)。本地和線上服務(wù)器相同的模式也不行
網(wǎng)上搜索資料,
mysql5.6.6之前,timestamp時(shí)間類型有一個(gè)默認(rèn)行為:
TIMESTAMP列如果沒有明確聲明NULL屬性,默認(rèn)為NOT NULL。(而其他數(shù)據(jù)類型,如果沒有顯示聲明為NOT NULL,則允許NULL值。)
insert插入一條數(shù)據(jù),TIMESTAMP的列值為NULL,會(huì)自動(dòng)存儲(chǔ)時(shí)候,會(huì)將當(dāng)前timestamp存儲(chǔ)到這個(gè)timestamp列中。
也就是說會(huì)自動(dòng)分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性。每次更新記錄都會(huì)將timestamp列更新為當(dāng)前的時(shí)間戳對應(yīng)的時(shí)間值現(xiàn)在mysql5.6版本以后,timestamp字段的默認(rèn)行為發(fā)生的變化,多了一些限制。如果timestamp列設(shè)置默認(rèn)值為NULL,Default NULL 這會(huì)發(fā)生報(bào)錯(cuò) 1067 - Invalid default value for如果需要讓timestamp列在創(chuàng)建表時(shí)可以為NULL值,需要將explicit_defaults_for_timestamp設(shè)為ONexplicit_defaults_for_timestamp默認(rèn)為OFF關(guān)閉狀態(tài),打開后可以阻止timestamp的默認(rèn)行為。

繼續(xù)在mysqld.cnf配置加入explicit_defaults_for_timestamp = ON

  • 運(yùn)行 docker restart mysql 重啟mysql后就可以正常執(zhí)行上面的數(shù)據(jù)傳輸


    image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容