記一次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)
- 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)。
- 如果掛載了主配置文件后/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).
- 建議先運(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)題。 - 在掛載了配置文件后使用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è)層次上。
- 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ù)
- grant 作用在單個(gè)數(shù)據(jù)庫(kù)上:
grant select on testdb.* to dba@localhost; -- dba 可以查詢 testdb 中的表。
- grant 作用在單個(gè)數(shù)據(jù)表上:
grant select, insert, update, delete on testdb.orders to dba@localhost;
- grant 作用在表中的列上:
grant select(id, se, rank) on testdb.apache_log to dba@localhost;
- 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)題
- 安裝完成后遠(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毫秒)。
- 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。
完成!