关于安装运行MYSQL8.0简单使用及注意事项 On Docker Desktop & WSL2
阅读原文时间:2023年07月09日阅读:2

MYSQL是业界非常流行的一款关系型数据库系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。

MySQL is the world's most popular open source database. With its proven performance, reliability and ease-of-use, MySQL has become the leading database choice for web-based applications, covering the entire range from personal projects and websites, via e-commerce and information services, all the way to high profile web properties including Facebook, Twitter, YouTube, Yahoo! and many more.

从docker官方镜像库,我们就能找到MYSQL镜像,分社区版(免费)和企业版(收费),我们这里就用社区版就行了。

安装也很简单,比如以v8.0版本为例,切换到Ubuntu终端的Root用户执行如下命令即可

docker run --publish 3306:3306 --name mysql-ce-8.0 --restart always \
--volume /home/username/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=yourrootpassword \
-d mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci

其中含义如下:

  • --publish 3306:3306代表容器内端口号和暴漏的端口号,第一个数字是对外暴漏的端口号,如果你本地有其他同类数据库,你可以修改其他值,第二个值是容器内MYSQL的默认监听端口3306,这个不建议修改。
  • --name mysql-ce-8.0是我们给即将运行的Docker实例取的昵称。
  • --restart always代表希望这个实例随着Docker Desktop一起重启,这样就自动做到开机自启。
  • --volume /home/username/mysql/data:/var/lib/mysql代表我们持久化MYSQL的目录绑定,这里你需要把第一个地址修改成你自己的地址,如果没有对应的文件夹的,请实现新建好:mkdir dirname
  • -e MYSQL_ROOT_PASSWORD=yourrootpassword是设置Root账号的预设密码,请将yourrootpassword部分替换成自己的密码。
  • -d mysql:8.0是指定镜像名字和版本号(Tag),这里我们那Tag=8.0举例,还有其他Tag请参见Docker Hub详情页
  • --character-set-server=utf8mb4--collation-server=utf8mb4_unicode_ci,然数据库所有表都采用utf8mb4字符

  1. 进入MYSQL容器内部

    docker exec -it mysql-ce-8.0 bash

  1. 进入MYSQL的ROOT账号

    mysql -uroot -p

  1. 查看MYSQL所有数据库

    show databases;

  1. 进入名为mysql的数据库

    use mysql;

  1. 查询所有的用户

    select host,user,plugin from user;

我们会看到所用用户的密码登录方式都已经是caching_sha2_password模式,这是MYSQL 8.0系列新引入的一种密码机制。

传统的MYSQL密码机制插件叫mysql_native_password,其采用的是一种不加盐的SHA1哈希算法。

(SHA1(SHA1(password)))

将密码用如上方式存储在mysql.user表中验证用户,该插件的一个优点是,它允许使用质询-响应机制进行身份验证,从而可以在未加密的通道上验证客户端的身份,而无需发送实际密码,但是缺点也很明显,很容易被暴力破击。

而新的caching_sha2_password密码算法呢,使用的是SHA256哈希算法,并且每个密码采用20字节的加盐,而且支持两种操作方式:

  • COMPLETE:要求客户端安全地发送实际密码(通过TLS连接或使用RSA密钥对)。服务器生成5000轮哈希,并与mysql.user中存储的值进行比较。
  • FAST:允许使用SHA2哈希的基于质询-响应的身份验证。高性能和安全性在同一时间。

通过使用不同轮回数的哈希将密码存储和身份验证脱钩。即使有人可以访问这两个密码,也无法在实际可行的时间内使用此信息来推断密码或获取密码的sha2哈希。蛮力破解8字符长的密码以及5000轮咸化哈希值将花费很长时间。

对比两种密码机制特点如下:

特性

mysql_native_password

caching_sha2_password

哈希算法

SHA1

SHA256

加盐

20字节

哈希轮数

2

5000

支持质询-响应认证

是(快速模式)

重新确定密码知识

没有

是(完成模式)

  1. 暂时修改Root用户的登录密码机制

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';

  1. 刷新让权限设置生效,让表中设置同步到内存中

    FLUSH PRIVILEGES;

  1. 尝试连接并登录本地MYSQL

笔者使用的是Database .Net工具来连接这个MYSQL数据库。

由于MYSQL 8.0之后带来的相关安全限制,我们需要在连接时改两个地方。

  • 切换到连接对话框属性页面,把AllowPublicKeyRetrieval设置成true

  • 切换到连接对话框属性页面,把Ssl Mode设置成None

然后,再输入root的密码,进行连接,即可

By default, client libraries will not send the password unless a secure connection (using TLS or RSA public key encryption) can be established. To avoid a MITM attack, the RSA public key will not be sent in plain text. For Connector/NET, you can use TLS (SslMode=Required) to protect the RSA public key. With MySqlConnector, you also have the option of specifying the server’s public key directly, using the ServerRSAPublicKeyFile option, or allowing a potentially-insecure connection by using AllowPublicKeyRetrieval=true.