02_虚拟机中间件部署_安装 MySQL 服务
- [ubuntu 系统 安装 MySQL 服务](#ubuntu 系统 安装 MySQL 服务)
-
- [安装 MySQL](#安装 MySQL)
-
- 一:安装命令
-
- 1、查看密码设置要求
- 2、查看有哪些用户
- [3、设置本地 root 密码(安全管理)](#3、设置本地 root 密码(安全管理))
- [4、创建 ljh 普通管理用户(可远程登录)](#4、创建 ljh 普通管理用户(可远程登录))
- 5、数据挂载
-
- 5-1:设置数据挂载目录权限
- 5-2:设置错误日志文件挂载和权限
- [5-3:修改 MySQL 配置文件](#5-3:修改 MySQL 配置文件)
- [5-4: 更新 AppArmor](#5-4: 更新 AppArmor)
- [5-5: 启动 MySQL](#5-5: 启动 MySQL)
- [5-6: 测试mysql的挂载是否成功](#5-6: 测试mysql的挂载是否成功)
- [6、设置 MySQL服务 自动启动](#6、设置 MySQL服务 自动启动)
- 二:连接Navicat
-
- [Navicat 客户端连接 ljh 用户](#Navicat 客户端连接 ljh 用户)
-
- [检查MySQL 是否允许远程连接](#检查MySQL 是否允许远程连接)
- 三:出现的问题:
-
- 问题1:更新包索引列表失败
- [问题2:为什么是切换 ljh 用户安装的mysql,sudo mysql -u root -p 登录还是得用sudo](#问题2:为什么是切换 ljh 用户安装的mysql,sudo mysql -u root -p 登录还是得用sudo)
- [四:IDEA 执行sql脚本](#四:IDEA 执行sql脚本)
ubuntu 系统 安装 MySQL 服务
这里是直接在ubuntu系统安装mysql,没有在docker里面安装;

安装 MySQL
一:安装命令
java
1、更新包索引列表
sudo apt update
升级所有已安装的软件包到可用的最新版本,确保所有已安装的软件都是最新的:
sudo apt upgrade -y
2、安装MySQL服务器:该命令将安装MySQL服务器及其所有依赖项。
sudo apt install mysql-server -y
3、安装MySQL后,一个重要的步骤是执行安全配置脚本。这将帮助你提高MySQL服务器的安全性
运行安全配置脚本:
sudo mysql_secure_installation
mysql_secure_installation 这个脚本是 MySQL 官方安装包自带的安全配置工具,
通常安装 MySQL 服务端时一同被安装到系统中,用于:
-1、设置 root 密码
-2、删除匿名用户
-3、禁止远程 root 登录
-4、删除测试数据库
你将被提示设置密码策略等级。选择一个你认为合适的级别(0-2)(0的强度最低)
接下来,你将被问及是否移除匿名用户、禁用root用户的远程登录、删除test数据库,并重新加载权限表。
建议对所有这些问题回答"Yes"
4、确保MySQL服务正在运行:
sudo systemctl status mysql
如果服务未运行,使用以下命令启动它:
sudo systemctl start mysql
然后就可以尝试登录了:
sudo mysql -u root -p
显示输入密码时,直接回车即可,还没有设置密码
查看版本
mysql --version
----------------------------------------------------------------------------
查看 ubuntu系统版本,我的是24版本
lsb_release -a
Ubuntu 20.04 LTS的默认软件仓库已经包含MySQL 8.0,因此你可以直接安装而无需添加额外的仓库。

1、查看密码设置要求
查看密码设置要求
SHOW VARIABLES LIKE 'validate_password%';

设置 root 或普通用户密码时,必须满足这些要求,否则会报错:
最小长度:8
必须有大小写字母各至少 1 个
必须有数字至少 1 个
必须有特殊字符至少 1 个
密码不能包含用户名
没有字典限制(dictionary_file 为空)
与旧密码差异没有限制(changed_characters_percentage=0)
2、查看有哪些用户
SHOW DATABASES; 会列出 MySQL 服务器上所有的数据库。
use mysql; 用于切换到名为 mysql 的数据库
select host, user, authentication_string, plugin from user; 用来查看 MySQL 用户信息的
免密登录理解:

在 Ubuntu 安装 MySQL 后:
1、root@localhost 是默认账号
2、使用 auth_socket 插件
3、localhost 表示 只能在 MySQL 所在的 Linux 服务器本机登录。
本地登录指的是必须在 MySQL 所在的 Linux 服务器上直接访问 MySQL 服务,不能通过网络远程连接。
root@localhost → 仅允许本机连接
root@% → 允许任何 IP 连接
% 是通配符,但企业安全不推荐给 root 用 %,风险太高
3、设置本地 root 密码(安全管理)
mysql -u root -p
账户:root
密码:@Root123456@
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '@Root123456@';
FLUSH PRIVILEGES;
exit
仅限本地 root
不允许远程 root 登录
密码遵循 STRONG 策略(大小写、数字、特殊符号、长度 ≥ 8)
安全性高,不暴露在网络上
企业级原则:root 只用于本地管理 MySQL

现在就需要密码才能登录了,不过也只是本地登录而已。

4、创建 ljh 普通管理用户(可远程登录)
mysql -u ljh -p
账户:ljh
密码:@Ljh123456@
CREATE USER 'ljh'@'%' IDENTIFIED BY '@Ljh123456@';
GRANT ALL PRIVILEGES ON *.* TO 'ljh'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
----------------------------
ljh → 专门管理数据库的用户
ALL PRIVILEGES 表示授予 所有可能的权限,基本上 ljh 用户可以对 MySQL 做 几乎任何操作
'%' → 主机(客户端 IP),
% 是 通配符,表示 允许任意 IP 的客户端连接
也就是说:
本机(localhost) 能登录,
局域网其它电脑 能登录,
甚至公网 (如果 MySQL 暴露到公网)能登录,
所以 远程登录权限就是通过 '%' 体现的
因为是学习测试,且ip可能会随网络变动而变动,所以这里就先用 '%',表示 ljh 这个用户在哪个网络环境都可以登录。
⚠️ 注意:
避免使用 root@% 或 % 通配符
避免直接给普通用户 ALL PRIVILEGES,最好只给必要数据库权限

创建 ljh 时,没指定认证方式:所以MySQL 8 默认给新用户分配 caching_sha2_password 插件

如果要改的话,可以这样改:
ALTER USER 'ljh'@'%' IDENTIFIED WITH mysql_native_password BY '@Ljh123456@';
FLUSH PRIVILEGES;
5、数据挂载
5-1:设置数据挂载目录权限
MySQL 服务运行用户通常是 mysql,需要把新目录权限改为 mysql:mysql:
# 1、把这个目录及里面所有文件的所有者和所属组都改成 mysql 用户和 mysql 组
sudo chown -R mysql:mysql /home/ljh/nfturbo/middleware/mysql/mydata
# 2、只允许目录主人(mysql)读、写、进入,其他用户完全没有权限
sudo chmod 700 /home/ljh/nfturbo/middleware/mysql/mydata
chmod 700 → 只有 MySQL 用户能访问,安全
chmod 750 -- 允许 mysql 组访问
# 3、查看目录所有者和所属组
ls -ld /home/ljh/nfturbo/middleware/mysql/mydata
输出:
drwx------ 7 mysql mysql 4096 Feb 7 19:24 /home/ljh/nfturbo/middleware/mysql/mydata

如上图可以看出:
目录主人:mysql 用户
所属组:mysql 组
后面测试过程中,MySQL 服务是 mysql 用户运行的,要访问 /home/ljh/nfturbo/middleware/mysql/mydata,mysql 用户必须对mydata目录的所有父目录都有 "执行权限" (x)
java
修改父目录权限
让 mysql 用户可以访问新目录,但不破坏其他用户权限:
# 给上层目录增加"执行权限"给其他用户,允许进入但不读写
sudo chmod o+x /home/ljh
sudo chmod o+x /home/ljh/nfturbo
sudo chmod o+x /home/ljh/nfturbo/middleware
sudo chmod o+x /home/ljh/nfturbo/middleware/mysql

问题:这个运行用户是指什么,跟我的root用户和ljh普通用户有什么关联没?
回答:在 Linux 系统里,每个进程都有一个 所属用户(UID),MySQL 服务不是用我登录的用户运行的,MySQL 服务进程 默认是 mysql 用户 启动的,而不是我登录虚拟机的 root 或 ljh 用户。

5-2:设置错误日志文件挂载和权限
# 1、创建挂载日志的目录
sudo mkdir /home/ljh/nfturbo/middleware/mysql/mylogs
注意理解:这里创建文件夹,无论是sudo还是切换到ljh用户来创建这个文件夹,最终都是把文件夹的权限给到 mysql 用户,ljh就无法访问了。
# 2、给目录赋予权限
sudo chown mysql:mysql /home/ljh/nfturbo/middleware/mysql/mylogs
sudo chmod 750 /home/ljh/nfturbo/middleware/mysql/mylogs
然后在 mysqld.cnf 中 配置:
log_error = /home/ljh/nfturbo/middleware/mysql/mylogs/error.log
当 MySQL 启动时,如果 error.log 文件不存在,它会 用 mysql 用户创建这个文件,不用提前创建文件,也不用提前赋权限。
如果自己创建这个文件,就得手动赋权。
# 3、查看目录所有者和所属组
ls -ld /home/ljh/nfturbo/middleware/mysql/mylogs
输出:
drwxr-x--- 2 mysql mysql 4096 Feb 7 18:12 /home/ljh/nfturbo/middleware/mysql/mylogs



ljh 没有权限访问 mydata 这个文件夹的截图:因为这两个文件夹的权限都给了 mysql 了,要看就切换成root用户看。

二进制日志 (binlog) 后续有需要做主从配置再弄。
log_error 只是 MySQL 的 错误日志,它只记录启动错误、崩溃信息和严重警告。正常运行日志(查询、慢查询等)不在这里。
5-3:修改 MySQL 配置文件
编辑 MySQL 配置:路径
/etc/mysql/mysql.conf.d/mysqld.cnf
挂载目录修改:
datadir = /home/ljh/nfturbo/middleware/mysql/mydata
日志这里修改:
log_error = /home/ljh/nfturbo/middleware/mysql/mylogs/error.log

5-4: 更新 AppArmor
更新 AppArmor(Ubuntu 特有,保证 MySQL 可以访问新目录)

Ubuntu 默认有 AppArmor 安全限制,
AppArmor 默认只允许访问 /var/lib/mysql。我新加了两个目录:
/home/ljh/nfturbo/middleware/mysql/mydata
/home/ljh/nfturbo/middleware/mysql/mylogs
所以 MySQL 访问非默认目录可能被阻止:
因此 /etc/apparmor.d/usr.sbin.mysqld 需要更新:
到这个路径下 /etc/apparmor.d 找到 usr.sbin.mysqld 配置文件,
增加新目录权限:注意不是替换
# 这个是原始默认数据目录
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
在下面添加这个--------------------------------------
# 1、新数据目录
/home/ljh/nfturbo/middleware/mysql/mydata/ r,
/home/ljh/nfturbo/middleware/mysql/mydata/** rwk,
# 2、新日志目录
/home/ljh/nfturbo/middleware/mysql/mylogs/ r,
/home/ljh/nfturbo/middleware/mysql/mylogs/** rwk,
# 3、保存后重新加载 AppArmor:
sudo systemctl restart apparmor
# 4、新目录必须初始化 MySQL 数据
sudo mysqld --initialize --user=mysql --datadir=/home/ljh/nfturbo/middleware/mysql/mydata
这会在新目录生成 系统库文件,否则 MySQL 启动会报错。

注意:mylogs 日志目录和 mydata 数据目录不一样,不用初始化

=====================================================
初始化新目录问题及解决方式
没有初始化就会报这个错

这个错误的解决方法我直接汇总在这里就好:
java
MySQL 服务是 mysql 用户运行的,
要访问 /home/ljh/nfturbo/middleware/mysql/mydata,
mysql 用户必须对mydata目录的所有父目录都有 "执行权限" (x)
修改父目录权限,让 mysql 用户可以访问新目录,但不破坏其他用户权限:
# 给上层目录增加"执行权限"给其他用户,允许进入但不读写
sudo chmod o+x /home/ljh
sudo chmod o+x /home/ljh/nfturbo
sudo chmod o+x /home/ljh/nfturbo/middleware
sudo chmod o+x /home/ljh/nfturbo/middleware/mysql
正确初始化 mydata 流程(安全方法)
1、清空旧目录:
sudo rm -rf /home/ljh/nfturbo/middleware/mysql/mydata/*
2、设置权限:
sudo chown -R mysql:mysql /home/ljh/nfturbo/middleware/mysql/mydata
sudo chmod 700 /home/ljh/nfturbo/middleware/mysql/mydata
3、初始化数据库:----这一步吧原本创建的ljh用户和修改root用户的密码也删除了,需要重新创建。
sudo mysqld --initialize-insecure --user=mysql --datadir=/home/ljh/nfturbo/middleware/mysql/mydata
4、重载 AppArmor:
sudo systemctl restart apparmor
5、启动 MySQL:
sudo systemctl restart mysql
sudo systemctl status mysql
重新创建ljh用户和修改root密码

输入 SHOW VARIABLES LIKE 'datadir'; 可以看出数据挂载目录已经是我们设置的新目录了

======================================================
5-5: 启动 MySQL
启动 MySQL
sudo systemctl start mysql
检查状态:
sudo systemctl status mysql
5-6: 测试mysql的挂载是否成功
mysql -u ljh -p
密码:@Ljh123456@
SHOW DATABASES;
如果能看到数据库并操作,说明挂载成功
Navicat 也可以继续访问

问题理解:
那现在我用ljh用户登录这个mysql,创建数据库或者添加表,数据都会挂载到mydata这个文件夹了吗。
回答:
MySQL 服务进程是 mysql 用户 在运行,
所有数据库操作最终都是由 mysql 用户写入磁盘,跟我登录的 ljh 用户无关。
测试mysql是否能成功将数据挂载到自定义目录下:
java
创建测试数据库和表:
CREATE DATABASE db_test;
USE db_test;
CREATE TABLE t1(id INT);
INSERT INTO t1 VALUES(1);
用 sudo 临时在 Linux 终端查看数据目录,因为ljh用户是没有访问这个目录的权限的【因为不推荐给ljh用户访问这个数据目录的权限】
sudo ls -l /home/ljh/nfturbo/middleware/mysql/mydata

可以看到数据出现在我们自己创建的挂载文件夹中

6、设置 MySQL服务 自动启动
# 查看 MySQL 服务状态
sudo systemctl status mysql
让 MySQL 服务随 Linux 启动而自动启动
sudo systemctl enable mysql
二:连接Navicat
Navicat 客户端连接 ljh 用户
我这里都是对的,但是链接不上,可能是因为我的认证插件是:caching_sha2_password。
而Navicat 老版本可能 不支持 caching_sha2_password,会导致登录失败。

检查MySQL 是否允许远程连接
修改这个 mysqld.cnf 配置文件
cd /etc/mysql/mysql.conf.d
vim mysqld.cnf
重启mysql
sudo systemctl restart mysql

连接成功

三:出现的问题:
问题1:更新包索引列表失败
更新包索引列表出现问题

理解问题:
sudo apt update 这个命令操作对象是系统级(核心)的,apt 作用对象是系统级仓库缓存。
apt 更新的是:全系统软件索引、所有用户共享。
执行这个命令实际发生了三件事:
1、访问软件仓库服务器
2、下载软件包索引
3、写入系统缓存目录
Ubuntu 软件仓库地址配置成了国内不可用的 cn.archive 源(而且是 HTTP),导致 apt 无法访问仓库服务器而报错。
仓库服务器不属于我的这个虚拟机,它是互联网上 Ubuntu 官方的公共服务器。
cn.archive 是Ubuntu 官方在中国的下载服务器。
仓库服务器地址就写在 apt 配置文件里。

这说明 Ubuntu 24.04 以后已经不用老的 sources.list 文件了,真正的仓库配置都在 /etc/apt/sources.list.d/ubuntu.sources 里。
如图,就是说我的虚拟机都是从 【http://cn.archive.ubuntu.com/ubuntu/】这个地址下载软件的,这个地址就是下载源。
【http://security.ubuntu.com/ubuntu/ 】是 Ubuntu 官方的安全更新仓库,你的虚拟机会从这里下载安全补丁和安全更新包



这个配置文件和内容 【/etc/apt/sources.list.d/ubuntu.sources】 是 Ubuntu 24.04 系统自带的默认仓库配置文件,虚拟机在安装系统时就已经自带了。
解决方法
虚拟机现在 sudo apt update 报 403 / 无法更新,问题核心是:
默认的仓库 http://cn.archive.ubuntu.com/ubuntu/ 在国内不稳定甚至被拒绝
安全仓库 http://security.ubuntu.com/ubuntu/ 可以保留
解决办法就是 把主仓库换成国内稳定的镜像,同时保留安全仓库。
# 备份原配置
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak

软件下载路径改成阿里云的
URIs: https://mirrors.aliyun.com/ubuntu/
因为 ljh 用户对这个系统的配置文件只有【读】没有【写】功能,所以我这边是切换成 root 用户来修改这个配置文件的。
最后是成功更新了。

问题2:为什么是切换 ljh 用户安装的mysql,sudo mysql -u root -p 登录还是得用sudo

因为 MySQL 安装在系统级,默认 root 用户是用 auth_socket 插件认证的,只允许 Linux 系统用户 root 登录,所以即使 ljh 用户安装了 MySQL,登录 MySQL root 时仍然需要 sudo 提权。
MySQL 默认只允许系统 root 用户登录,安装用户是谁无关,普通 ljh 用户必须用 sudo 才能匹配认证。
也可以改成用密码登录。
四:IDEA 执行sql脚本
自己创建好数据库即可,剩下的执行脚本即可。
