MYSQL8.0安装
MYSQL8.0安装
一、卸载mariadb
如果Linux中安装了mariadb数据库,先卸载掉,因为CentOS 7 内部集成了mariadb,mariadb数据库是mysql的分支,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb
- 检查Linux是否安装了mariadb数据库
yum list installed | grep mariadb
无结果,说明未安装,否则需要全部卸载
2.全部卸载
yum -y remove mariadb*
- 检查mariadb是否全部卸载
yum list installed | grep mariadb
无结果,说明已经全部卸载
二、 删除之前安装的mysql
1、查找以前是否装有mysql
rpm -qa|grep -i mysql
无结果,说明未安装mysql或已经卸载彻底,接下来直接安装mysql即可,否则需要删除之前安装的mysql
2、查找之前安装的mysql的目录、并且删除mysql的文件和库 查找mysql的目录
find / -name mysql
删除对应的mysql目录
rm -rf 查找到的mysql的目录
3、卸载后/etc/my.cnf不会删除,需要进行手工删除
rm -rf /etc/my.cnf
三、安装并配置MySQL
1.创建mysql文件夹并切换路劲 local目录一般是linux上安装文件的地方,所以选这个路径
cd /usr/local
mkdir mysql
cd mysql
2.下载mysql
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
3.解压mysql
tar xvJf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
4.重命名文件夹并删除压缩包
mv mysql-8.0.30-linux-glibc2.12-x86_64 mysql-8.0
rm -rf mysql-8.0.30-linux-glibc2.12-x86_64
5.创建用户组以及用户和密码
groupadd mysql
useradd -g mysql mysql
为什么要创建mysql分组: 我们在编译安装的时候创建一个mysql组和一个mysql用户,并把datadir和安装目录属主改为mysql,在MySQL启动的时候,单进程mysqld,该进程的属主就是mysql,这样就保证了mysql服务的独立性,即便mysql服务被黑掉,得到了mysql用户权限,也不会影响整个系统的安全
6.授权用户
chown -R mysql.mysql /usr/local/mysql/mysql-8.0
7.切换到bin目录下,初始化基础信息得到临时密码
cd bin
./mysqld --user=mysql --basedir=/usr/local/mysql/mysql-8.0 --datadir=/usr/local/mysql/mysql-8.0/data/ --initialize
遇到 ./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
问题

原因:缺少libaio 解决方案
yum install libaio
解决完重新执行
./mysqld --user=mysql --basedir=/usr/local/mysql/mysql-8.0 --datadir=/usr/local/mysql/mysql-8.0/data/ --initialize
2024-04-30T08:22:05.438550Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2024-04-30T08:22:05.438657Z 0 [System] [MY-013169] [Server] /usr/local/mysql/mysql-8.0/bin/mysqld (mysqld 8.0.30) initializing of server in progress as process 9504
2024-04-30T08:22:05.566383Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-04-30T08:22:08.187953Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-04-30T08:22:10.238781Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Fq;4PAU-Udht
8.编辑配置文件my.cnf 如果没有 my.cnf 文件就通过命令 touch /etc/my.cnf 创建一个
vi /etc/my.cnf
内容如下:
[mysql]
#MySQL 提示符配置
#用户名@主机名+数据库名
#prompt="\\u@\\h [\\d]>"
#用户名@主机名+mysql版本号+数据库名
prompt=\\u@\\h \\v [\\d]>\\_
#用户名@主机名+当前时间+mysql版本号+数据库名
#prompt="(\\u@\\h) \\R:\\m:\\s \\v [\\d] \n>"
[mysqld]
#mysql安装根目录
basedir = /usr/local/mysql/mysql-8.0/
#mysql数据文件所在位置
datadir = /usr/local/mysql/mysql-8.0/data/
#设置socke文件所在目录
socket = /tmp/mysql.sock
#数据库默认字符集, 主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4
#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci
#设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'
9.切换到mysql-8.0目录下,添加mysqld服务到系统
cd /usr/local/mysql/mysql-8.0
cp -a ./support-files/mysql.server /etc/init.d/mysql
10.授权以及添加服务
chmod +x /etc/init.d/mysql
chkconfig --add mysql
11.启动mysql
service mysql start
12.查看启动状态
service mysql status

13.将mysql命令添加到系统指令
ln -s /usr/local/mysql/mysql-8.0/bin/mysql /usr/bin
实现在任何目录下执行 mysql -uroot -p 就可以进行登录
14.登录mysql,密码使用之前随机生成的密码
mysql -uroot -p
如果出现报错 error while loading shared libraries: libtinfo.so.5
解决办法
ls /usr/lib64

为此命令创建一个同步链接并命名为libtinfo.so.5即可
ln -s /usr/lib64/libtinfo.so.6.2 /usr/lib64/libtinfo.so.5
注:不同Linux版本下的 libtinfo.so 版本号可能不同,根据自己的修改
15.修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
修改root用户密码为 123456 ,也可以换成别的
16.执行 flush privileges 使密码生效
flush privileges;
17.选择mysql数据库
use mysql;
18.修改远程连接并生效,%表示开启远程权限
update user set host='%' where user='root';
flush privileges;
19.退出MySQL:
\q
20.查看mysql是否开机启动
chkconfig --list
如果 mysql服务的 第3、4、5项都是开着的,则已经开启了开机启动,反之则没有。
如果没有,可以用命令设置开机自启动:
systemctl enable mysqld.service
再次查看mysql是否开机启动:
chkconfig --list
四、Linux虚拟机防火墙开放端口号3306,实现MySQL远程连接
1.查看3306端口状态
firewall-cmd --zone=public --query-port=3306/tcp
2、如果是no,表示关闭,打开3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
3、防火墙重载
firewall-cmd --reload
4、再次查看3306端口状态
firewall-cmd --zone=public --query-port=3306/tcp
应该是yes,说明端口已经打开,去navicat测试连接,输入ip和root账户密码,即可成功!
如果是在阿里云或者别的平台还需要再平台开放端口
四、登录MySQL 执行下面命令,输入密码“123456”并确认:
mysql -uroot -p
或者执行下面命令一键登录:
mysql -uroot -hlocalhost -p123456
注:-p后跟密码
五、用户管理
创建用户
create user '#userName'@'#host' identified by '#passWord';
#userName 代表你要创建的此数据库的新用户账号
#host 代表访问权限,如下
- %代表通配所有host地址权限(可远程访问)
- localhost为本地权限(不可远程访问)
- 指定特殊Ip访问权限 如10.138.106.102
#passWord 代表你要创建的此数据库的新用密码 密码强度需要大小写及数字字母,否则会报密码强度不符合
用户名如果重复,会报错ERROR 1396 (HY000): Operation CREATE USER failed for 'testUser'@'%'
查看用户
use mysql;
select host, user, authentication_string, plugin from user;
用户授权
grant #auth on #databaseName.#table to '#userName'@'#host';
#auth 代表权限,如下
all privileges
全部权限select
查询权限select,insert,update,delete
增删改查权限select,[…]
增…等权限
#databaseName 代表数据库名
#table 代表具体表,如下
*
代表全部表- A,B 代表具体A,B表
#userName 代表用户名
#host 代表访问权限,如下
%
代表通配所有host地址权限(可远程访问)- localhost为本地权限(不可远程访问)
- 指定特殊Ip访问权限 如10.138.106.102
# 示例
grant all privileges on waline.* to 'waline_user'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, INDEX,ALTER ON waline.* TO waline_user'%' with grant option;
使用旧的加密方式
有时候在使用node时会遇到MySQL 8.0 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
报错
解决一(不推荐):
Using the old mysql_native_password
works:
-- 如果您使用多个 MySQL 用户,请确保更新所有从远程(即不是本地主机)连接的用户。就我而言,我还必须使用 '%' 而不是 'localhost'
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourRootPassword';
-- or
CREATE USER 'foo'@'%' IDENTIFIED WITH mysql_native_password BY 'bar';
-- then
FLUSH PRIVILEGES;
This is because caching_sha2_password
is introduced in MySQL 8.0, but the Node.js version is not implemented yet. You can see this pull request and this issue for more information. Probably a fix will come soon!
翻译:这是因为在MySQL 8.0中引入了caching_sha2_password,但是Node.js版本还没有实现。您可以查看此拉取请求和此问题以获取更多信息。可能很快就会有修复!
解决二升级node.js的包(参考如下)