docker安裝mysql8.0

記一次docker安裝mysql

    # docker 中下載 mysql
    docker pull mysql
    #啟動(dòng)
    docker run -p 3306:3306 --name mysql
     -v /home/mysql/conf/:/etc/mysql/conf.d
     -v /home/mysql/data:/var/lib/mysql 
     -e MYSQL_ROOT_PASSWORD=123456 
     --privileged=true 
     --restart=always
     -d 
     mysql
  • -p 3306:3306:將容器的3306端口映射到主機(jī)的3306端口
  • -v /home/mysql/conf/:/etc/mysql/conf.d:將主機(jī)/home/mysql/conf/目錄掛載到容器的/etc/mysql/conf.d
  • -v /home/mysql/data:/var/lib/mysql :將主機(jī)/home/mysql/data目錄掛載到容器的/var/lib/mysql
  • -v /home/mysql/mysql-files:/var/lib/mysql-files/:將主機(jī)/home/mysql/mysql-files目錄掛載到容器的/var/lib/mysql-files/
  • -e MYSQL_ROOT_PASSWORD=123456:初始化root用戶的密碼
  • --privileged=true 接觸Linux文件安全限制
  • --restart=always 跟隨docker啟動(dòng)mysql
  • -d: 后臺(tái)運(yùn)行容器,并返回容器ID

注意點(diǎn)

  1. MySQL(5.7.19)的默認(rèn)配置文件是 /etc/mysql/my.cnf 文件。如果想要自定義配置,建議向 /etc/mysql/conf.d 目錄中創(chuàng)建 .cnf 文件。新建的文件可以任意起名,只要保證后綴名是 cnf 即可。新建的文件中的配置項(xiàng)可以覆蓋 /etc/mysql/my.cnf 中的配置項(xiàng)。
  2. 如果掛載了主配置文件后/etc/mysql/my.cnf需要同時(shí)掛載mysql-files -v /home/mysql/mysql-files:/var/lib/mysql-files/ ,不然啟動(dòng)mysql報(bào)錯(cuò).并且要提前在主機(jī)上放置好配置文件.可以先運(yùn)行一下鏡像,把配置文件提前放置在掛載位置,再刪除鏡像重新掛載啟動(dòng).
  3. 建議先運(yùn)行一遍鏡像,將鏡像中/etc/mysql/my.cnf下的配置文件,拷貝一份出來(lái),放在掛載目錄下,不然會(huì)出現(xiàn)一些問(wèn)題,比如丟skip-host-cache
    skip-name-resolve這兩個(gè)配置,導(dǎo)致遠(yuǎn)程連接特別慢的問(wèn)題。
  4. 在掛載了配置文件后使用mysql -u root -p登錄mysql可能出現(xiàn)限制登錄的問(wèn)題, mysql -h 127.0.0.1 -u root -p 能夠登錄得上mysql數(shù)據(jù)庫(kù)。
#進(jìn)入容器
docker exec -it mysql bash
#登錄mysql
mysql -u root -p
#修改root密碼,建議root不用遠(yuǎn)程登錄,如何需要遠(yuǎn)程登錄可以將localhost修改為%
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#創(chuàng)建一個(gè)新的可以遠(yuǎn)程登錄的用戶
CREATE USER 'dev'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
#賦予全部庫(kù)的全部權(quán)限給新建用戶
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%';

權(quán)限分配
原文連接
user表中host列的值的意義
% 匹配所有主機(jī)
localhost localhost不會(huì)被解析成IP地址,直接通過(guò)UNIXsocket連接
127.0.0.1 會(huì)通過(guò)TCP/IP協(xié)議連接,并且只能在本機(jī)訪問(wèn);
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1

grant 普通數(shù)據(jù)用戶,查詢、插入、更新、刪除 數(shù)據(jù)庫(kù)中所有表數(shù)據(jù)的權(quán)利。

grant select on testdb.* to common_user@’%’

grant insert on testdb.* to common_user@’%’

grant update on testdb.* to common_user@’%’

grant delete on testdb.* to common_user@’%’

或者,用一條 MySQL 命令來(lái)替代:

grant select, insert, update, delete on testdb.* to common_user@’%’

9>.grant 數(shù)據(jù)庫(kù)開(kāi)發(fā)人員,創(chuàng)建表、索引、視圖、存儲(chǔ)過(guò)程、函數(shù)。。。等權(quán)限。

grant 創(chuàng)建、修改、刪除 MySQL 數(shù)據(jù)表結(jié)構(gòu)權(quán)限。

grant create on testdb.* to developer@’192.168.0.%’;

grant alter on testdb.* to developer@’192.168.0.%’;

grant drop on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 外鍵權(quán)限。

grant references on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 臨時(shí)表權(quán)限。

grant create temporary tables on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 索引權(quán)限。

grant index on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 視圖、查看視圖源代碼 權(quán)限。

grant create view on testdb.* to developer@’192.168.0.%’;

grant show view on testdb.* to developer@’192.168.0.%’;

grant 操作 MySQL 存儲(chǔ)過(guò)程、函數(shù) 權(quán)限。

grant create routine on testdb.* to developer@’192.168.0.%’; -- now, can show procedure status

grant alter routine on testdb.* to developer@’192.168.0.%’; -- now, you can drop a procedure

grant execute on testdb.* to developer@’192.168.0.%’;

10>.grant 普通 DBA 管理某個(gè) MySQL 數(shù)據(jù)庫(kù)的權(quán)限。

grant all privileges on testdb to dba@’localhost’

其中,關(guān)鍵字 “privileges” 可以省略。

11>.grant 高級(jí) DBA 管理 MySQL 中所有數(shù)據(jù)庫(kù)的權(quán)限。

grant all on . to dba@’localhost’

12>.MySQL grant 權(quán)限,分別可以作用在多個(gè)層次上。

  1. grant 作用在整個(gè) MySQL 服務(wù)器上:

grant select on . to dba@localhost; -- dba 可以查詢 MySQL 中所有數(shù)據(jù)庫(kù)中的表。

grant all on . to dba@localhost; -- dba 可以管理 MySQL 中的所有數(shù)據(jù)庫(kù)

  1. grant 作用在單個(gè)數(shù)據(jù)庫(kù)上:

grant select on testdb.* to dba@localhost; -- dba 可以查詢 testdb 中的表。

  1. grant 作用在單個(gè)數(shù)據(jù)表上:

grant select, insert, update, delete on testdb.orders to dba@localhost;

  1. grant 作用在表中的列上:

grant select(id, se, rank) on testdb.apache_log to dba@localhost;

  1. grant 作用在存儲(chǔ)過(guò)程、函數(shù)上:

grant execute on procedure testdb.pr_add to ’dba’@’localhost’

grant execute on function testdb.fn_add to ’dba’@’localhost’

注意:修改完權(quán)限以后 一定要刷新服務(wù),或者重啟服務(wù),刷新服務(wù)用:FLUSH PRIVILEGES。

遇到的問(wèn)題

  1. 安裝完成后遠(yuǎn)程連接貼別慢

問(wèn)題解決:
解決方式原文鏈接
[mysqld]
skip-name-resolve
innodb_flush_log_at_trx_commit=0
sync_binlog=0
方法解析:

skip-name-resolve:跳過(guò)域名解析,對(duì)有些場(chǎng)景很管用,但對(duì)我遇到的不怎么管用。

設(shè)置這個(gè)以后,速度只有一點(diǎn)點(diǎn)提升(2秒  -> 1秒9)。

innodb_flush_log_at_trx_commit=0: 這個(gè)選項(xiàng)決定著什么時(shí)候把日志信息寫(xiě)入日志文件以及什么時(shí)候把這些文件物理地寫(xiě)(術(shù)語(yǔ)稱為”同步”)到硬盤(pán)上。設(shè)置值0的意思是每隔一秒寫(xiě)一次日志并進(jìn)行 同步,這可以減少硬盤(pán)寫(xiě)操作次數(shù),但可能造成數(shù)據(jù)丟失; 設(shè)置值1(設(shè)置設(shè)置)的意思是在每執(zhí)行完一條COMMIT命令就寫(xiě)一次日志并進(jìn)行同步,這可以防止數(shù)據(jù)丟失,但硬盤(pán)寫(xiě)操作可能會(huì)很頻繁; 設(shè)置值2是一般折衷的辦法,即每執(zhí)行完一條COMMIT命令寫(xiě)一次日志,每隔一秒進(jìn)行一次同步。

設(shè)置這個(gè)以后,速度有很大提升(1秒9  -> 1秒)。

sync_binlog=0:每經(jīng)過(guò)n次日志寫(xiě)操作就把日志文件寫(xiě)入硬盤(pán)一次(對(duì)日志信息進(jìn)行一次同步)。設(shè)為1是最安全的做法,但效率最低。docker中默認(rèn)設(shè)置是1,意思是由操作系統(tǒng)來(lái)負(fù)責(zé)二進(jìn)制日志文件的同步工作。

設(shè)置這個(gè)以后,速度有顯著提升(1秒  -> 30毫秒)。
  1. mysql遇見(jiàn)Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的問(wèn)題
    解決方式原文鏈接
    問(wèn)題出現(xiàn)的原因:
    MySQL 5.7.5及以上功能依賴檢測(cè)功能。如果啟用了ONLY_FULL_GROUP_BY SQL模式(默認(rèn)情況下),MySQL將拒絕選擇列表,HAVING條件或ORDER BY列表的查詢引用在GROUP BY子句中既未命名的非集合列,也不在功能上依賴于它們。(5.7.5之前,MySQL沒(méi)有檢測(cè)到功能依賴關(guān)系,默認(rèn)情況下不啟用ONLY_FULL_GROUP_BY。有關(guān)5.7.5之前的行為的說(shuō)明,請(qǐng)參見(jiàn)“MySQL 5.6參考手冊(cè)”。)

解決方法一:

打開(kāi)navcat,

用sql查詢:

select @@global.sql_mode

查詢出來(lái)的值為:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

去掉ONLY_FULL_GROUP_BY,重新設(shè)置值。

set @@global.sql_mode
=’STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’;

解決方法二:

成功的步驟:

iterm打開(kāi)

sudo vim /etc/mysql/conf.d/mysql.cnf

滾動(dòng)到文件底部復(fù)制并粘貼

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

到文件的底部

保存并退出輸入模式

sudo service mysql restart

重啟MySQL。
完成!

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

相關(guān)閱讀更多精彩內(nèi)容

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