Windows及CentOS 8安装MySQL8记录
概述
本文记录一下在Windows、Linux等系统安装MySQL 8遇到的问题,以及解决过程。算是一个备忘录。
Windows 10
切记:
在安装之前,需卸载之前安装的MySQL 5.x版本;否则安装失败(因为不管是MySQL 5.x还是MySQL 8.x版本,默认都使用3306端口,使用同一个后台进程名mysqld):
官网下载地址,忽略账号注册或登陆,直接下载得到zip包,解压缩。本文安装到D:\mysql-8.0.23-winx64
目录下。在此目录下新建my.ini
,内容为:
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=D:\\mysql-8.0.23-winx64
# 设置mysql数据库的数据的存放目录
datadir=D:\\mysql-8.0.23-winx64\\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
配置系统环境:新增MYSQL_HOME=D:\mysql-8.0.23-winx64
环境变量,并在path
中添加%MYSQL_HOME%\bin
环境变量。
以管理员的身份打开cmd窗口跳转路径到D:\mysql-8.0.23-winx64\bin
初始化命令:mysqld --initialize --user=mysql --console
添加服务:mysqld -install
启动服务:net start mysql
打开任务管理器,可发现已经有一个mysqld进程,如何使用DataGrip客户端连接到本地数据库呢?
注意上述操作的输出信息,即如下截图,在mysqld --initialize --user=mysql --console
命令输出的最后一行有类似这样的文本: A temporary password is generated for root@localhost: oYYgq-DS<3o5
即用户名root,密码是随机字符串。本地环境不考虑安全性,一般会修改密码。
输入mysql -u root -p
进行登录数据库,输入截图中的密码。
修改密码:ALTER USER root@localhost IDENTIFIED BY 'root';
修改密码为:root
CentOS 8
首先,查看是否已经安装MySQL:
yum list installed mysql
或者
rpm -qa | grep mysql
若已经安装,可考虑卸载,卸载前关闭mysql服务,然后使用命令:
rpm -ev --nodeps mysql-errmsg-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64 mysql-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64 mysql-server-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64 mysql80-community-release-el8-1.noarch mysql-common-8.0.21-1.module_el8.2.0+493+63b41e36.x86_64
验证卸载:rpm -qa | grep mysql
安装Yum Repository:
wget https://repo.mysql.com//mysql80-community-release-el8-1.noarch.rpm
使用rpm来安装MySQL:
rpm -ivh mysql80-community-release-el8-1.noarch.rpm
使用yum安装mysql服务:
yum install mysql-server
设置开机启动:
systemctl enable mysqld.service
# Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
systemctl enable mysqld@.service
# Created symlink /etc/systemd/system/multi-user.target.wants/mysqld@.service → /usr/lib/systemd/system/mysqld@.service.
启动服务:
systemctl start mysqld.service
查看是否启动MySQL服务
ps -ef | grep mysql
检查是否已经设置为开机启动MySQL服务:
systemctl list-unit-files | grep mysqld
题外话:上面提到设置服务开机启动,需要执行两条几乎一样的命令。那问题来了:mysqld.service和mysqld@.service有何区别?
如果没有执行:systemctl enable mysqld@.service
,输出将是:
[root@centos170 ~]# systemctl list-unit-files | grep mysqld
mysqld.service enabled
mysqld@.service disabled
除此之外,两者有何区别,有待调研。
输入mysql
,即可进入命令行,查询版本:
select version();
得到:8.0.21
查看所有默认的数据库:
show databases;
输出:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
注:大多数语句要输入结束符分号;
。
直接使用mysql
可以进入命令行客户端。输入mysql -uroot -p
直接回车都能进入mysql客户端,即root用户是没有密码的!!!
但是,本地使用可视化客户端工具DataGrip连接,方便后续的数据查询与展示,却连接失败,报错信息:SQLException: null, message from server: "Host 'XXX' is not allowed to connect
。
解决方案:参考。
这个报错异常是数据库默认情况下只允许localhost或127.0.0.1访问,不允许远程访问。一般而言,在Linux服务器安装MySQL服务后,我们会通过Windows或Mac开发机来连接Linux服务上面的MySQL服务。
切换DB:use mysql
,查看用户和对应的host信息:
select user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
可知root用户只允许host为localhost访问,故而需要更新:update user set host='%' where user='root';
使更改生效:FLUSH PRIVILEGES;
此时再次使用DataGrip客户端连接MySQL,输入User,即用户名root
,密码为空,点击测试连接:
连接成功!
如果是生产数据库,一定要设置密码:
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
这里可以考虑使用一款随机密码生成器小工具。