一、docker安装

1、查看可用的 MySQL 版本

访问 MySQL 镜像库地址:https://hub.docker.com/_/mysql?tab=tags

2、拉取 MySQL 镜像

这里我们拉取官方的最新版本的镜像:

$ docker pull mysql:8.0.26

3、查看本地镜像

使用以下命令来查看是否已安装了 mysql:

$ docker images

4、创建挂载目录

mkdir -p /usr/local/mysql/conf
mkdir -p /usr/local/mysql/data
mkdir -p /usr/local/mysql/logs

5、创建my.cnf

vim /usr/local/mysql/conf/my.cnf

把下面配置复制到文件中:

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[client]
default-character-set = utf8mb4

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

# Custom config should go here
# 字符集
character_set_server=utf8
collation-server=utf8_general_ci

# 是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

# 最大连接数
max_connections = 1000

# Innodb缓存池大小
innodb_buffer_pool_size = 4G

# 表文件描述符的缓存大小
table_open_cache_instances=1
table_open_cache=2000
table_definition_cache=2000

!includedir /etc/mysql/conf.d/

6、创建启动容器

docker run --restart=always --name mysql8.0 --privileged=true \
-d -p 3306:3306 \
-v /usr/local/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/mysql/logs:/logs \
-v /usr/local/mysql/data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.26

参数解释:

--restart=always    -> 开机启动容器,容器异常自动重启
--name              -> 指定容器名称
-d                  -> 以守护进程的方式启动容器
-p                  -> 映射宿主机端口
-v                  -> 映射配置文件、日志、数据
-e                  -> 写入配置root密码

7、查看是否启动正常

$ docker ps

使用Navicat连接:

二、yum 安装

1、(如果服务器接通外网)直接用wget下载mysql源rpm安装包

cd ~
wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm

如果没有安装wget,则安装: yum -y install wget

2、(如果服务器没有接通外网)下载mysql源rpm安装包

MySQL官网
image

上传到服务器
image

3、安装rmp包

yum install mysql80-community-release-el7-3.noarch.rpm

4、查看是否安装成功

[root@localhost ~]# yum repolist enabled | grep "mysql.*"
!mysql-connectors-community/x86_64       MySQL Connectors Community          212
!mysql-tools-community/x86_64            MySQL Tools Community               132
!mysql80-community/x86_64                MySQL 8.0 Community Server          283

5、安装mysql

yum -y install mysql-community-server

6、(可选)修改配置:

vim /etc/my.cnf

把下面配置复制到文件中:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# Custom config should go here
# 字符集
character_set_server=utf8
collation-server=utf8_general_ci

# 是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

#最大连接数
max_connections = 1000

# Innodb缓存池大小
innodb_buffer_pool_size = 4G

# 表文件描述符的缓存大小
table_open_cache_instances=1
table_open_cache=2000
table_definition_cache=2000

7、启动mysql

service mysqld.service restart

8、查看启动状态

[root@localhost etc]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since 四 2021-08-26 16:04:16 CST; 1 day 1h ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
 Main PID: 8704 (mysqld)
   Status: "Server is operational"
   CGroup: /system.slice/mysqld.service
           └─8704 /usr/sbin/mysqld

8月 26 16:04:05 localhost.localdomain systemd[1]: Starting MySQL Server...
8月 26 16:04:16 localhost.localdomain systemd[1]: Started MySQL Server.

9、配置开机启动

systemctl enable mysqld
systemctl daemon-reload

10、查看初始化密码

[root@localhost etc]#  cat /var/log/mysqld.log | grep password
2021-08-26T08:04:10.256089Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Gg2P(&gB<>Z)

11、输入命令进入mysql

mysql -uroot -p 回车 
输入初始密码密码(粘贴即可)

12、修改密码

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '设置密码';

13、创建远程连接root用户、授权

mysql> use mysql;
mysql> create user 'root'@'%' identified by '123456';
mysql> grant all privileges on *.* to 'root'@'%' with grant option;
mysql> flush privileges;
mysql> select user,host from user;
mysql> show grants for root@'%';

14、使用Navicat连接

image

三、用户管理

1、新增用户

格式:create user '用户名'@localhost identified by '密码'; ——localhost表示只允许本地连接,'%' 代表允许所有远程连接,ip表示只允许指定ip连接;
例子:create user 'root'@'%' identified by '123456';
# 使用password关键字密码需要符合加密方式
create user 'root'@'%' identified by password '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';

2、删除用户

格式:drop user '用户名'@'localhost';
例子:drop user 'root'@'%';

3、查看用户

# 切换到mysql:
use mysql;
# 执行查看语句:
select User,Host,Password from user;

4、更改用户密码:

格式:mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY '设置新密码';
例子:mysql>ALTER USER 'root'@'%' IDENTIFIED BY '123456';
# 使用password关键字密码需要符合加密方式
mysql>ALTER USER 'root'@'%' password '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';

格式:mysql>set password for 用户名@localhost =password('新密码');
例子: mysql>set password for root@'%'=password('123456');

四、权限管理

通常情况下,数据库会根据不同的环境进行隔离,有针对性地进行权限控制:

'root'@'%' : dev环境开放所有权限,sit,uat回收所有权限
'root'@'192.168.252.%' : 该网段开放所有权限
'root'@'IP' : 测试人员的IP开放所有权限

1、查看用户权限:

格式:show grants for '用户名'@'localhost';
例子:show grants for 'root'@'%';

2、用户授予权限:

格式:grant 权限列表 on 数据库名.数据表名 to '用户表名'@'主机' with grant option;
例子:grant all privileges on . to 'root'@'%' with grant option;
# 指定密码
grant all privileges on . to 'root'@'%' identified by '123456' with grant option;
# 使用password关键字密码需要符合加密方式
grant all privileges on . to 'root'@'%' identified by password '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' with grant option;

3、刷新权限:

授权以后一定要刷新权限:
flush privileges;

4、权限回收

格式:revoke 权限列表 on 数据库名.数据库表名 from 用户名@主机;
例子:revoke all privileges on pcloud_ust2. from 'root'@'%';

5、授权、回收具体权限:select,create,delete,grant

赋予:grant select,create,delete on . to 'root'@'localhost' with grant option;
回收:revoke select,create,delete,grant option on . from 'root'@'localhost';

五、Mysql8.0配置my.cnf详解

1、关键配置

1. 配置文件的位置

MySQL配置文件
/etc/my.cnf 或者 /etc/my.cnf.d/server.cnf

2. 几个关键的文件:

.pid文件,记录了进程id
.sock文件,是内部通信使用的socket接口,比3306快
.log文件,日志文件
.cnf或.conf文件,配置文件
安装目录:basedir
数据目录:datadir

2、/etc/my.cnf

[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
# Mysql服务的唯一编号 每个mysql服务Id需唯一
server-id = 1

# 服务端口号 默认3306
port = 3306

# mysql安装根目录
basedir = /usr/local/mysql

# mysql数据文件所在位置
datadir = /usr/local/mysql/data

# pid
pid-file = /usr/local/mysql/mysql.pid

# 设置socke文件所在目录
socket = /tmp/mysql.sock

# 设置临时目录
tmpdir = /tmp

# 用户
user = root

# 允许访问的IP网段
bind-address = 0.0.0.0

# 跳过密码登录
#skip-grant-tables

# 主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容
skip-external-locking

# 只能用IP地址检查客户端的登录,不用主机名
skip_name_resolve = 1

# 事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
transaction_isolation = READ-COMMITTED

# 数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4

# 数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci

# 设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'

# 是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

# TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp = true

# MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
#MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效
interactive_timeout = 1800
wait_timeout = 1800

#数据库错误日志文件
log_error = error.log

3、其他的配置详解

1. 禁用mysql的缓存查询结果集功能
# 写入频繁的数据库,不要开查询缓存
# 后期根据业务情况测试决定是否开启
# 大部分情况下关闭下面两项

# 首先要把Query_cache和该表相关的语句全部置为失效,然后在写入更新。
# 那么如果Query_cache非常大,该表的查询结构又比较多,查询语句失效也慢,一个更新或是Insert就会很慢,这样看到的就是Update或是Insert怎么这么慢了。
# 所以在数据库写入量或是更新量也比较大的系统,该参数不适合分配过大。而且在高并发,写入量大的系统,建议把该功能禁掉。
query_cache_size = 0
query_cache_type = 0

# 指定单个查询能够使用的缓冲区大小,缺省为1M
query_cache_limit = 1M

# 默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费
# 说明:禁掉查询缓存的方法就是直接注释掉查询缓存的配置,如#query_cache_size=1M, 这样就可以了
query_cache_min_res_unit = 4KB

2. 其他需要开的缓存:读缓存、线程缓存、排序缓存
# connection级参数。太大将导致在连接数增高时,内存不足。
sort_buffer_size = 2M

# 网络传输中一次消息传输量的最大值。系统默认值 为1MB,最大值是1GB,必须设置1024的倍数。
max_allowed_packet = 32M

# 和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享
join_buffer_size = 2M

# 默认大小是 32M。GROUP BY 多不多的问题
tmp_table_size = 256M

# 索引的缓冲区大小,对于内存在4GB左右的服务器来说,该参数可设置为256MB或384MB。
max_heap_table_size = 256M
key_buffer_size = 2048M

# 进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索
read_buffer_size = 1M
read_rnd_buffer_size = 16M

# 批量插入数据缓存大小,可以有效提高插入效率,默认为8M
bulk_insert_buffer_size = 64M

# Innodb缓存,只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。
innodb_buffer_pool_size = 2048M

# 网络传输中一次消息传输量的最大值。系统默认值为1MB,最大值是1GB,必须设置1024的倍数。
innodb_additional_mem_pool_size = 16M

# 循环方式将日志文件写到多个文件。推荐设置为3
innodb_log_files_in_group = 3

# InnoDB 有其内置的死锁检测机制,能导致未完成的事务回滚。innodb_file_per_table = 0 独享表空间,关闭
innodb_lock_wait_timeout = 120

3. 连接数
# 允许打开的文件数
open_files_limit = 10240

# 短时间内的多少个请求可以被存在堆栈中
back_log = 600

# MySQL默认的最大连接数为100,MySQL服务器允许的最大连接数16384
max_connections = 3000

# 设置每个主机的连接请求异常中断的最大次数,当超过该次数,MYSQL服务器将禁止host的连接请求
max_connect_errors = 6000

# 重新利用保存在缓存中线程的数量
thread_cache_size = 300

# 每个线程的堆栈大小,默认值足够大,可满足普通操作。可设置范围为128K至4GB,默认为192KB。
thread_concurrency = 8
thread_concurrency应设为总CPU核数的2倍
thread_stack = 192K

4. 线程池有关参数,线程池很少配
# 表示线程池模型。
thread_handling

# 表示线程池的group个数,一般设置为当前CPU核心数目。理想情况下,一个group一个活跃的工作线程,达到充分利用CPU的目的。
thread_pool_size

# 用于timer线程定期检查group是否“停滞”,参数表示检测的间隔。
thread_pool_stall_limit

# 当一个worker空闲一段时间后会自动退出,保证线程池中的工作线程在满足请求的情况下,保持比较低的水平。60秒
thread_pool_idle_timeout

# 该参数用于控制CPU核心上“超频”的线程数。这个参数设置值不含listen线程计数。
thread_pool_oversubscribe

# 表示优先队列的模式。
threadpool_high_prio_mode

# 限制线程池最大的线程数,超过将无法再创建更多的线程,默认为100000。
thread_pool_max_threads

# 最多语序多少次被放入高优先级队列中,默认为4294967295。只有在thread_pool_high_prio_mode为transactions的时候才有效果
thread_pool_high_prio_tickets

说明:
线程处理的最小单位是statement(语句)
线程池实现在server端,通过创建一定数量的线程服务DB请求,相对于one-conection-per-thread的一个线程服务一个连接的方式,线程池服务的最小单位是语句,即一个线程可以对应多个活跃的连接。

5. 慢查询日志
# 是否开启慢查询日志,1表示开启,0表示关闭。
slow_query_log = 1

# MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
slow_query_log_file = slow.log

# (5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
log-slow-queries

# 慢查询阈值,当查询时间多于设定的阈值时,记录日志。
long_query_time = 2

# 未使用索引的查询也被记录到慢查询日志中(可选项)。
log_queries_not_using_indexes = 1

#检索的行数必须达到此值才可被记为慢查询
min_examined_row_limit = 100

# mysql binlog日志文件保存的过期时间,过期后自动删除
expire_logs_days = 5

# 日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。
# log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。
# MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。
# 日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。
log_output='FILE,TABLE'

#针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数
log_throttle_queries_not_using_indexes = 5

#作为从库时生效,从库复制中如何有慢sql也将被记录
log_slow_slave_statements = 1

六、常见问题:

1、安装好了Mysql8,但是使用远程的Navicat连接时提示错误,不能正确连接

image
报错:navicat不支持caching_sha_password加密方式
原因:mysql8.0使用新的密码加密方式:caching_sha_password
解决方式:修改成旧的加密方式(mysql_native_password),并重置密码
修改mysql密码模式及可访问主机:

1、进入容器内部
$ docker exec -it mysql8.0 /bin/bash

2、连接mysql
$ mysql -uroot -p

3、使用mysql库
$ mysql> use mysql;

4、修改访问主机以及密码等,设置为所有主机可访问
$ mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';
注意:mysql_native_password,mysql8.x版本必须使用这种模式,否则navicate无法正确连接

5、刷新
$ mysql> flush privileges;

6、查看密码及主机
$ mysql> select host,user,plugin from user;
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| %         | root             | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session    | caching_sha2_password |
| localhost | mysql.sys        | caching_sha2_password |
| localhost | root             | caching_sha2_password |
+-----------+------------------+-----------------------+

经过以上步骤,再次远程使用Navicat连接数据库时就可以正常连接了。

2、Mysql8 设置忽略大小写后无法启动

-- 报错信息:
[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').

-- 背景知识:
MySQL 5.7之前允许数据库初始化和启动的值不一致且以启动值为准。
MySQL 8.0新增了data dictionary的概念,数据初始化的时候在linux下默认使用lower-case-table-names=0的参数,数据库启动的时候读取的my.cnf文件中的值。若二者值不一致则在mysql的错误日志中记录报错信息:
[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0').
[ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('0') and data dictionary ('1').

-- 解决办法:
在mysql数据库初始化的时候指定不区分大小写,在数据库实例启动的时候也要指定不区分大小写。即数据库初始化时lower_case_table_names的值和数据库启动时的值需要一样。
在实际开发生产的应用中多是不区分大小写的即lower-case-table-names=1。

如果是新安装的mysql,还没有任何数据,所以使用rm -rf删除mysql挂载的数据:

[root@localhost mysql]# cd /usr/local/mysql/
[root@localhost mysql]# rm -rf conf.d
[root@localhost mysql]# rm -rf data/*
[root@localhost mysql]# rm -rf logs/*

然后再重新修改vim /usr/local/mysql/conf/my.cnf,添加忽略大小写不敏感:

# 是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

重新创建容器即可。

3、MySQL8的密码策略及修改密码策略

由于Mysql8使用valiadte_password策略,对密码强度要求非常高:

validate_password.policy:密码策略,检查用户的密码。
0:(Low)密码长度最少8个字符
1:(Mediumpolicy)至少包含1个数字,1个小写字母,1个大写字母和1个特殊字符组成(默认值)
2:(Strongpolicy)长度为4或更长的密码子字符串不得与字典文件中的单词匹配

validate_password.length:需要密码最小字符数,默认为8

validate_password.number_count:需要密码的最小数字字符数,默认为1

validate_password.mixed_case_count:需要密码的小写和大写的最小字符数,默认为1

validate_password.special_char_count:需要密码的特殊字符的最小字符数,默认为1

validate_password.dictionary_file:用于检查密码的字典文件的路径名,默认没有

如果出现报错:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,则可以修改密码策略:

# 设置策略校验级别为low
mysql> Set Persist validate_password.policy = 0

这样,只要密码长度不低于8个字符就可以了;

# 设置密码最低长度
mysql> Set Persist validate_password.length = 6

这样,密码最小长度是6,但最小字符数不能低于number_count、mixed_case_count、special_char_count的值;

查看当前密码策略:

mysql> Show Variables Like 'validate_password.%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | ON    |
| validate_password.dictionary_file    |       |
| validate_password.length             | 6     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 1     |
| validate_password.policy             | LOW   |
| validate_password.special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.01 sec)

说明当前设置密码策略级别policy = 0,length = 6;

密码强度评估:1 ~ 100:

mysql> select validate_password_strength('Password!');
+-----------------------------------------+
| validate_password_strength('Password!') |
+-----------------------------------------+
|                                      50 |
+-----------------------------------------+
1 row in set (0.00 sec)

说明当前密码强度为50.

posted on 2021-08-25 15:39  java先生  阅读(811)  评论(0编辑  收藏  举报