在 centos7 上安装 mysql8 并实现远程连接(2023)

575 阅读5分钟

一、完全卸载并重新安装 MySQL 8

  1. 卸载 MySQL:
sudo systemctl stop mysqld

sudo yum remove mysql-server

sudo rm -rf /var/lib/mysql
  1. 清理残留的文件和文件夹:
sudo rm -rf /etc/my.cnf
 
sudo rm -rf /etc/mysql
 
sudo rm -rf /var/log/mysql*
  1. 更新系统并安装依赖:
sudo yum update
 
sudo yum install wget
 
sudo yum install libaio
 
sudo yum install numactl
  1. 下载并安装 MySQL 8:
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
 
sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
 
sudo yum install mysql-server
  • 如果遇到这个问题
mysql-community-server-8.0.34-1.el7.x86_64.rpm 的公钥尚未安装
 失败的软件包是:mysql-community-server-8.0.34-1.el7.x86_64
 GPG  密钥配置为:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
  • 解决方法

运行以下命令:

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
  1. 查看安装的版本
mysqladmin --version

二、初始化mysql

  1. 使用mysql系统用户以安全模式为mysql的root用户生成临时密码,第一次登录后要立马修改。
mysqld --initialize --user=mysql

注意

• 在MySQL8.0中,如果第一次启动服务器分别执行了数据初始化命令mysqld --initialize --user=mysql和服务启动命令systemctl start mysqld,那么服务器默认没有密码校验策略,此时可以修改为任意密码。

• 如果第一次启动服务器直接执行了systemctl start mysqld命令,那么数据会被自动初始化,那么服务器默认具有密码校验策略,此时密码长度必须最少8位,至少有一个数字,一个大写字母,一个小写字母,一个特殊字符。

  1. 查看临时密码 参照下面的截图
cat /var/log/mysqld.log

mysql初始化及临时密码查看,效果如下:

image.png

  1. 启动mysql
# 启动:
systemctl start mysqld.service
# 关闭:
systemctl stop mysqld.service
# 重启:
systemctl restart mysqld.service
# 查看状态:
systemctl status mysqld.service
  1. 使用临时密码登录并修改密码
# 要修改MySQL,首先必须启动MySQL服务,使用初始化密码登录后,才能修改密码:

mysql -hlocalhost -P3306 -uroot -p

# 回车,然后录入初始化密码

image.png

# 修改root用户密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

image.png

三、字符集问题(略)

# 查看mysql的默认编码,执行:

show variables like '%char%'

image.png

发现默认编码是utf8,则无需修改。

注意:mysql8以前的版本默认编码时latin,需要手动修改。

内容扩展

  • 如何修改字符集编码?

修改编码,需要修改mysql配置文件:vi /etc/my.cnf

在mysqld下添加一行编码配置:character_set_server=utf8

image.png

保存并退出,重启mysql服务:service mysql restart

  • 已生成的库表字符集如何变更?

修改数据库的字符集:alter database mydb character set 'utf8';

修改数据表的字符集:alter table mytbl convert to character set 'utf8';

四、解决远程访问问题

# 执行:
select user,host,plugin,authentication_string,select_priv,insert_priv from mysql.user

image.png

user:表示用户名,同一用户通过不同方式链接的权限是不一样的。

host:表示链接方式

• %:所有远程通过 TCP方式的连接

• IP地址: 如 (192.168.1.2,127.0.0.1) 通过指定ip地址进行的TCP方式的连接

• 机器名:通过制定i网络中的机器名进行的TCP方式的连接

• ::1:IPv6的本地ip地址 等同于IPv4的 127.0.0.1

• localhost:本地方式通过命令行方式的连接 ,比如mysql -u用户名 -p密码 方式的连接。

authentication_string:密码串,通过 MYSQLSHA1 (不可逆加密)生成的密文字符串。

select_privinsert_priv等为该用户所拥有的查询或者新增权限。

# root用户的当前主机配置信息为localhost,只允许本地使用,无法远程访问。
# 解决方案:修改Host为通配符%
update mysql.user set host = '%' where user ='root';
# 刷新权限
flush privileges;

或者创建新用户也可以解决远程访问问题。(企业环境一般是新建用户并设置新用户权限)

五、创建新用户(包括更新删除)

# 创建新用户并指定密码:
create user liuyan identified by 'liuyan';
# 或者
create user liuyan@'%' identified by 'liuyan';

# 修改用户密码
ALTER USER '用户名'@'host' IDENTIFIED BY '新密码';
# 或者
set password for '用户名'@'host'='新密码';

# 修改用户名
update mysql.user set user='新用户名' where user='现用户名';

# 删除用户 不推荐通过 DELETE FROM USER WHERE USER='li4' 进行删除,系统会有残留信息保留。
drop user 用户名; -- 默认删除host为%的用户
drop user '用户名'@'host';

# 所有user表的修改,必须刷新后才能生效
flush privileges;

# 注意:上述语句中可以使用 '用户名' 替换 '用户名'@'host'

六、用户授权(以root用户为例)

授权命令:

grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址

5.7及以前:该权限如果发现没有该用户,则会直接新建一个用户。

mysql8:必须现有对应用户

比如:

# 给root用户用本地命令行方式下,授予atguigudb这个库下的所有表的插删改查的权限。
grant select,insert,delete,drop on databaseName.* to root@'localhost'; 

# 授予通过网络方式登录的的root用户,对所有库所有表的全部权限,密码设为root.
grant all privileges on *.* to root@'%';

# 刷新权限
flush privileges;

image.png

七、测试远程连接

连接测试:连接时出现如下问题:错误号码 2058

image.png

mysql5.7之前密码加密使用的插件是mysql_native_password,mysql8修改为caching_sha2_password

解决方法:一种是升级SQLyog和Navicat(新版SQLyog和Navicat不会出现此问题),另一种是把MySQL用户登录密码加密规则还原成mysql_native_password

# Linux下 mysql -u root -p 登录你的 mysql 数据库,然后 执行这条SQLALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
flush privileges;

# 还原:
ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'root';
flush privileges;

# 更改后要重新设置密码:
ALTER USER root IDENTIFIED BY 'new_password';