02_虚拟机中间件部署_安装 MySQL 服务【创建用户、数据挂载】

02_虚拟机中间件部署_安装 MySQL 服务

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

我这里都是对的,但是链接不上,可能是因为我的认证插件是: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脚本

自己创建好数据库即可,剩下的执行脚本即可。

相关推荐
小高不会迪斯科10 小时前
CMU 15445学习心得(二) 内存管理及数据移动--数据库系统如何玩转内存
数据库·oracle
e***89010 小时前
MySQL 8.0版本JDBC驱动Jar包
数据库·mysql·jar
l1t10 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
失忆爆表症12 小时前
03_数据库配置指南:PostgreSQL 17 + pgvector 向量存储
数据库·postgresql
AI_567812 小时前
Excel数据透视表提速:Power Query预处理百万数据
数据库·excel
SQL必知必会13 小时前
SQL 窗口帧:ROWS vs RANGE 深度解析
数据库·sql·性能优化
Gauss松鼠会13 小时前
【GaussDB】GaussDB数据库开发设计之JDBC高可用性
数据库·数据库开发·gaussdb
+VX:Fegn089513 小时前
计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
识君啊14 小时前
SpringBoot 事务管理解析 - @Transactional 的正确用法与常见坑
java·数据库·spring boot·后端
一个天蝎座 白勺 程序猿14 小时前
破译JSON密码:KingbaseES全场景JSON数据处理实战指南
数据库·sql·json·kingbasees·金仓数据库