记一次docker安装mysql
# docker 中下载 mysql
docker pull mysql
#启动
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端口映射到主机的3306端口
- -v /home/mysql/conf/:/etc/mysql/conf.d:将主机/home/mysql/conf/目录挂载到容器的/etc/mysql/conf.d
- -v /home/mysql/data:/var/lib/mysql :将主机/home/mysql/data目录挂载到容器的/var/lib/mysql
- -v /home/mysql/mysql-files:/var/lib/mysql-files/:将主机/home/mysql/mysql-files目录挂载到容器的/var/lib/mysql-files/
- -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
- --privileged=true 接触Linux文件安全限制
- --restart=always 跟随docker启动mysql
- -d: 后台运行容器,并返回容器ID
注意点
- MySQL(5.7.19)的默认配置文件是 /etc/mysql/my.cnf 文件。如果想要自定义配置,建议向 /etc/mysql/conf.d 目录中创建 .cnf 文件。新建的文件可以任意起名,只要保证后缀名是 cnf 即可。新建的文件中的配置项可以覆盖 /etc/mysql/my.cnf 中的配置项。
- 如果挂载了主配置文件后/etc/mysql/my.cnf需要同时挂载mysql-files -v /home/mysql/mysql-files:/var/lib/mysql-files/ ,不然启动mysql报错.并且要提前在主机上放置好配置文件.可以先运行一下镜像,把配置文件提前放置在挂载位置,再删除镜像重新挂载启动.
- 建议先运行一遍镜像,将镜像中/etc/mysql/my.cnf下的配置文件,拷贝一份出来,放在挂载目录下,不然会出现一些问题,比如丢skip-host-cache
skip-name-resolve这两个配置,导致远程连接特别慢的问题。 - 在挂载了配置文件后使用mysql -u root -p登录mysql可能出现限制登录的问题, mysql -h 127.0.0.1 -u root -p 能够登录得上mysql数据库。
#进入容器
docker exec -it mysql bash
#登录mysql
mysql -u root -p
#修改root密码,建议root不用远程登录,如何需要远程登录可以将localhost修改为%
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#创建一个新的可以远程登录的用户
CREATE USER 'dev'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
#赋予全部库的全部权限给新建用户
GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%';
权限分配
原文连接
user表中host列的值的意义
% 匹配所有主机
localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问;
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
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 命令来替代:
grant select, insert, update, delete on testdb.* to common_user@’%’
9>.grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。
grant 创建、修改、删除 MySQL 数据表结构权限。
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 外键权限。
grant references on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 临时表权限。
grant create temporary tables on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 索引权限。
grant index on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 视图、查看视图源代码 权限。
grant create view on testdb.* to developer@’192.168.0.%’;
grant show view on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 存储过程、函数 权限。
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 管理某个 MySQL 数据库的权限。
grant all privileges on testdb to dba@’localhost’
其中,关键字 “privileges” 可以省略。
11>.grant 高级 DBA 管理 MySQL 中所有数据库的权限。
grant all on . to dba@’localhost’
12>.MySQL grant 权限,分别可以作用在多个层次上。
- grant 作用在整个 MySQL 服务器上:
grant select on . to dba@localhost; -- dba 可以查询 MySQL 中所有数据库中的表。
grant all on . to dba@localhost; -- dba 可以管理 MySQL 中的所有数据库
- grant 作用在单个数据库上:
grant select on testdb.* to dba@localhost; -- dba 可以查询 testdb 中的表。
- grant 作用在单个数据表上:
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 作用在存储过程、函数上:
grant execute on procedure testdb.pr_add to ’dba’@’localhost’
grant execute on function testdb.fn_add to ’dba’@’localhost’
注意:修改完权限以后 一定要刷新服务,或者重启服务,刷新服务用:FLUSH PRIVILEGES。
遇到的问题
- 安装完成后远程连接贴别慢
问题解决:
解决方式原文链接
[mysqld]
skip-name-resolve
innodb_flush_log_at_trx_commit=0
sync_binlog=0
方法解析:
skip-name-resolve:跳过域名解析,对有些场景很管用,但对我遇到的不怎么管用。
设置这个以后,速度只有一点点提升(2秒 -> 1秒9)。
innodb_flush_log_at_trx_commit=0: 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。
设置这个以后,速度有很大提升(1秒9 -> 1秒)。
sync_binlog=0:每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。设为1是最安全的做法,但效率最低。docker中默认设置是1,意思是由操作系统来负责二进制日志文件的同步工作。
设置这个以后,速度有显著提升(1秒 -> 30毫秒)。
- mysql遇见Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的问题
解决方式原文链接
问题出现的原因:
MySQL 5.7.5及以上功能依赖检测功能。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们。(5.7.5之前,MySQL没有检测到功能依赖关系,默认情况下不启用ONLY_FULL_GROUP_BY。有关5.7.5之前的行为的说明,请参见“MySQL 5.6参考手册”。)
解决方法一:
打开navcat,
用sql查询:
select @@global.sql_mode
查询出来的值为:
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,重新设置值。
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打开
sudo vim /etc/mysql/conf.d/mysql.cnf
滚动到文件底部复制并粘贴
[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。
完成!