MySQL 8 安装与配置(二次修订版,2023-11-29)

零:五分钟速成版

若您熟悉MySQL,也知道每条命令都在做什么,可只参考本小结快速安装。

Linux平台:

# 下载 curl -O https://cdn.mysql.com//Downloads/MySQL-8.2/mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz # 解压 sudo tar -xvf mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local/ # 确保依赖库存在(若安装的为ARM架构的MySQL,还需要自行安装libnuma1和libncurses5) sudo yum install -y libaio # 创建用户组 sudo groupadd mysql # 创建用户 sudo useradd -r -g mysql -s /bin/false mysql # 创建符号链接 sudo ln -s /usr/local/mysql-8.2.0-linux-glibc2.28-x86_64/ /usr/local/mysql # 进入mysql目录 cd /usr/local/mysql/ # 创建目录 sudo mkdir mysql-files # 更改目录拥有者 sudo chown mysql:mysql mysql-files # 更改目录权限 sudo chmod 750 mysql-files # 执行初始化 sudo bin/mysqld --initialize --user=mysql # 启动MySQL sudo nohup bin/mysqld_safe --user=mysql & # 登录MySQL(输入初始化时生成并打印到控制台的随机密码) sudo /usr/local/mysql/bin/mysql -uroot -p # 更新密码 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.01 sec) # 创建用户 mysql> CREATE USER 'root'@'%' IDENTIFIED BY '000000'; Query OK, 0 rows affected (0.01 sec) # 分配所有库所有权限 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; Query OK, 0 rows affected (0.01 sec) # 退出登录 mysql> exit Bye

Windows 10或更高版本:

# 下载 curl -O https://cdn.mysql.com//Downloads/MySQL-8.2/mysql-8.2.0-winx64.zip # 解压 tar -xvf .\mysql-8.2.0-winx64.zip -C D:\ # 进入目录 cd /D D:\mysql-8.2.0-winx64\bin # 执行初始化 .\mysqld.exe --initialize --console # 启动MySQL start .\mysqld.exe # 登录MySQL(输入初始化时生成并打印到控制台的随机密码) .\mysql -uroot -p # 更新密码 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.01 sec) # 创建用户 mysql> CREATE USER 'root'@'%' IDENTIFIED BY '000000'; Query OK, 0 rows affected (0.01 sec) # 分配所有库所有权限 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; Query OK, 0 rows affected (0.01 sec) # 退出登录 mysql> exit Bye

--------- 至此安装完成,下面为详细版安装和配置步骤 ---------

一、准备下载地址

提示:如果您已经有了MySQL的下载地址,可跳过该步骤,直接前往 “二、下载安装包

1. 访问MySQL官方网站
2. 找到正确版本的MySQL服务器社区版下载地址
  1. 图片:进入下载页面

  2. 图片:选择MySQL服务器社区版

  3. 图片:选择匹配的版本

  4. 图片:复制下载地址

3. 将下载地址记下来,后面要用到
问:如何判断是否复制了正确的下载地址?
答:看URL结尾。结尾一般是*.tar.gz、*.zip之类的文件名

问:为啥我获得的下载地址和下面的地址不一样?
答:正常。地址末尾属文件名,会依据您选择的系统平台、CPU架构、版本号、压缩格式等选项而不同。文件前面的地址通常是不变的,但不排除MySQL官方更改了网站资源地址的情况,无论地址如何,只要能下载下来文件,就是正确的地址。

如(64位X86架构Linux平台的通用版):https://cdn.mysql.com//Downloads/MySQL-8.2/mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz

二、下载安装包

提示:如果您已经下载好了MySQL,可跳过该步骤,直接前往 “三、安装数据库

1. 准备需要安装MySQL的服务器

我需要给一台Linux机器安装数据库,所以我这里使用ssh登录Linux服务器,然后使用wget命令或curl命令下载安装包。Windows、MacOS等其它平台请采取适当的方式把安装包下载到本地,如使用命令行下载、使用浏览器下载等,这里不另做其它平台的示范。

2. 下载安装包

三、安装数据库

注意:如果您之前使用Linux平台如Yum、APT之类的包管理系统安装过MySQL,则使用通用二进制包安装时可能会遇到问题。确保您之前安装的MySQL已通过包管理系统完全删除,并且如数据文件等任何其他文件也都已经删除。您还应该检查并删除MySQL的配置文件,如/etc/my.cnf文件或/etc/mysql目录。

1. 将安装包解压到想要安装的位置

我这里将MySQL安装在/usr/local/目录下,该目录也是MySQL官方推荐的安装位置,如果您需要安装至不同的位置,请替换命令中的路径。Linux平台可使用如下的tar命令将安装包解压到指定目录,其它平台请用适合的方式将包解压到安装位置。

MySQL通用二进制包各目录解释说明

目录 目录或内容
bin mysqld服务器、客户端和实用程序
docs Info格式的MySQL手册
man 仅类Unix平台有该目录,该目录为Unix手册
include 被包含的头文件
lib
share 安装数据库的错误信息、字典和SQL
support-files 杂项支持文件
2. 检查MySQL所需的环境(Windows平台跳过该步骤)

MySQL依赖libaio库,请确保该库已被安装。Oracle Linux 8和Red Hat 8 (EL8)这些平台默认没有安装/lib64/libtinfo.so.5,请根据以下说明执行安装。MySQL官方文档未提到需安装libnuma1libncurses5库,但我实际安装ARM架构的MySQL时发现由于缺少这两个库报错了,如需安装请按照以下说明执行安装。

3. 为MySQL准备所需的用户、用户组和目录(Windows平台跳过该步骤)

为MySQL创建一个用于运行mysqld进程的专用“用户”和“用户组”,并创建mysql-files目录。

# 创建一个名为“mysql”的用户组 groupadd mysql # 创建一个名为“mysql”的不可用于shell登录的用户 # mysql只使用该用户执行进程,因此该用户不需要shell登录。 useradd -r -g mysql -s /bin/false mysql # 创建mysql符号链接:可简单理解成为原目录创建了别名,访问/usr/local/mysql/就等同于访问原目录 ln -s /usr/local/mysql-8.2.0-linux-glibc2.28-x86_64/ /usr/local/mysql # 切换到mysql目录 cd /usr/local/mysql/ # 在mysql目录下创建一个名为“mysql-files”的目录 # 该目录用于数据导入和导出操作,具体配置见secure_file_priv变量说明。MySQL官方不建议该变量为空,并表示这将会是一个不安全的设置。如果设置为目录名称,则服务器将导入和导出操作限制为仅使用该目录中的文件。该目录必须存在;服务器不会创建它。 mkdir mysql-files # 将mysql-files目录拥有者改为“mysql”用户组下的“mysql”用户 chown mysql:mysql mysql-files # 为mysql-files目录设置适当的目录权限 chmod 750 mysql-files
4. 初始化数据目录

a) Linux平台

# 进入MySQL目录 cd /usr/local/mysql-8.2.0-linux-glibc2.28-x86_64 # 执行初始化:过程中会为root用户生成一个随机密码并打印至控制台 bin/mysqld --initialize --user=mysql # 方式一:启动MySQL服务器(前台启动占用当前终端且ssh登录断开会中断运行) bin/mysqld_safe --user=mysql & # 方式二:启动MySQL服务器(后台启动不会占用当前终端,建议首次启动选方式一,可以控制台直观的看到启动有没有报错) nohup bin/mysqld_safe --user=mysql &

b) Windows平台

# 进入MySQL目录 cd /D "D:\Program Files\mysql-8.2.0-winx64\bin" # 执行初始化:过程中会为root用户生成一个随机密码并打印至控制台 .\mysqld.exe --initialize --console # 启动MySQL服务器(或鼠标双击mysqld.exe) .\mysqld.exe

四、MySQL服务器配置——更新密码(必须)

1. 登录MySQL数据库
2. 更新root用户密码

注意:登录成功后MySQL强制我们做的第一件事是更新root用户的密码,因为这时除更新密码外无论我们敲什么命令都会收到必须更新密码的报错信息:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

# 这里我将密码更新为123456,请根据实际情况为您的root用户设置一个足够安全的密码 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.01 sec) # 更新完密码后退出数据库登录 mysql> exit Bye

五、MySQL服务器配置——用户和权限(可选)

默认情况下MySQL 8为我们创建了一个'root'@'localhost'用户,它表示来自localhost的root用户。上面我们之所以可以用root用户成功登录到数据库是因为客户端和服务端为同一台机器,即我们登录时的身份为'root'@'localhost'。如果我们用另一台IP为192.168.0.102的同内网机器登录数据库就会发现无法成功登录,因为那时我们的登录身份为'root'@'192.168.0.102',它和'root'@'localhost'是两个不同的用户,所以要想成功登录我们需要创建'root'@'192.168.0.102'用户。如果我们想让所有IP都可登录该数据库(包括公网),则可以用“%”表示任意IP,即我们只需要创建一个'root'@'%'用户即可。

注意:以下所有以“mysql>”开头的命令均在已登录的mysqld客户端交互界面中执行

a. 允许任意机器登录MySQL数据库,并拥有所有库的所有权限
# 创建用户('root'@'%'表示匹配任意IP地址的root用户) mysql> CREATE USER 'root'@'%' IDENTIFIED BY '000000'; Query OK, 0 rows affected (0.01 sec) # 至此已经允许其它机器登录MySQL数据库,但由于没有权限,登录后无法进行任何操作,也看不到任何数据库 # 分配所有库的所有权限(请根据实际情况分配适当的权限) mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; Query OK, 0 rows affected (0.01 sec)

提示:若其它机器仍无法登录MySQL,请检查防火墙(若有)、云平台安全组(若有)等配置,比如检查是否放行了3306端口,由于不属于MySQL安装部分,故本篇不做介绍。

b. 创建一个只允许我的电脑登录的MySQL用户,并拥有my_project库的一些权限
  1. 查询当前我电脑的公网IP(作者的IP是60.31.98.23)

  2. 登录数据库进行配置

    # 创建用户(60.31.98.23部分也可使用“%”通配符,如'zhangsan'@'60.31.98.%''zhangsan'@'60.31.%' mysql> CREATE USER 'zhangsan'@'60.31.98.23' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.01 sec) # 分配权限(请根据实际情况分配适当的权限) # 下面命令表示分配所有库的创建(CREATE)、修改(ALTER)、删除(DROP)、插入(INSERT)、更新(UPDATE)、删除(DELETE)、查询(SELECT)、表间引用(REFERENCES)权限给'root'@'%'用户 # RELOAD表示刷新配置 mysql> GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD ON my_project.* TO 'zhangsan'@'60.31.98.23' WITH GRANT OPTION; Query OK, 0 rows affected (0.01 sec)

--------- The End ---------

Source: https://blog.ximinghui.org/install_mysql8_v2.html