本教程是"从零到一:SpringBoot SSH远程部署进阶篇"的进阶篇章。基于前一阶段开发的SSH远程部署功能,本指南详细介绍如何在Linux服务器上配置MySQL数据库环境,并与SpringBoot应用集成。本文假设您已完成了SSH远程部署功能的开发工作,现在需要掌握如何正确地配置和操作数据库相关功能,以支持完整的应用部署流程。
从零到一:SpringBoot SSH远程部署基础篇
从零到一:SpringBoot SSH远程部署进阶篇
目录
- 1. 安装MySQL服务器
- 2. 安全配置
- 3. 创建数据库和用户
- 4. 配置远程连接
- 5. 防火墙配置
- 6. 云服务器安全组设置
- 7. 测试连接
- 8. 常见问题与解决方案
- 9. 性能优化建议
- 10. 与Java应用集成
1. 安装MySQL服务器
在Linux服务器上安装MySQL是部署数据库应用的第一步。以下指南适用于CentOS/RHEL系统。
1.1 卸载可能存在的旧版本
如果服务器上存在旧版本的MySQL,建议先卸载:
# 停止MySQL服务
systemctl stop mysqld
# 禁用开机自启
systemctl disable mysqld
# 移除MySQL所有包
yum remove -y mysql mysql-server mysql-common mysql-libs mysql-client mysql-devel
# 更全面地移除所有MySQL相关包
yum remove -y $(rpm -qa | grep -i mysql)
# 如果有MariaDB相关包也一并移除
yum remove -y $(rpm -qa | grep -i mariadb)
# 删除数据目录和配置文件
rm -rf /var/lib/mysql /var/lib/mysql.bak
rm -rf /etc/my.cnf /etc/my.cnf.d /etc/mysql
rm -rf /var/log/mysql /var/log/mysqld.log
rm -rf /usr/lib64/mysql
# 删除MySQL用户和组
userdel mysql
groupdel mysql
# 清理yum缓存
yum clean all
1.2 安装MySQL服务器
# 更新yum仓库
yum update -y
# 安装MySQL服务器
yum install -y mysql-server
# 如果找不到包,可以启用特定的模块
# CentOS 8/RHEL 8系统可能需要执行:
# yum module enable -y mysql:8.0
# yum install -y mysql-server
# 启动MySQL服务
systemctl start mysqld
# 设置开机自启
systemctl enable mysqld
# 检查服务状态
systemctl status mysqld
1.3 CentOS 8特殊说明
CentOS 8已经结束生命周期,默认源可能不可用。如果遇到以下错误:
Errors during downloading metadata for repository 'base':
- Status code: 404 for http://mirrors.example.com/centos/8/BaseOS/x86_64/os/repodata/repomd.xml
请修复镜像源:
# 进入yum源配置目录
cd /etc/yum.repos.d/
# 备份原有的repo文件
mkdir backup
mv *.repo backup/
# 下载镜像源(CentOS 8的存档版本)
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.example.com/repo/Centos-vault-8.5.2111.repo
# 清除并重建yum缓存
yum clean all
yum makecache
# 更新系统包
yum update -y
2. 安全配置
MySQL初始安装后需要进行安全配置。
2.1 初始化安全设置
# 运行MySQL安全配置脚本
mysql_secure_installation
在交互过程中,您需要:
-
设置root密码强度验证:
VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security... Press y|Y for Yes, any other key for No: Y There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
推荐选择MEDIUM(1)级别,提供足够的安全性但不会过于复杂。
-
设置root密码:
Please set the password for root here. New password: (输入强密码) Re-enter new password: (再次输入)
请确保密码符合以下要求:
- 长度至少8个字符
- 包含大小写字母
- 包含数字
- 包含特殊字符
如果密码强度不足,系统会提示
Failed! Error: Your password does not satisfy the current policy requirements
,请重新设置更强的密码。 -
移除匿名用户:
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
-
禁止root远程登录:
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
-
移除测试数据库:
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
-
重新加载权限表:
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
完成以上步骤后,MySQL基本安全配置就完成了。
3. 创建数据库和用户
安全配置完成后,需要创建应用所需的数据库和用户。
3.1 登录MySQL
# 使用root用户和密码登录
mysql -u root -p
3.2 创建数据库
-- 创建数据库,使用UTF-8字符集
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 查看创建的数据库
SHOW DATABASES;
3.3 创建本地应用用户
-- 创建应用将使用的本地数据库用户
CREATE USER 'db_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON db_name.* TO 'db_user'@'localhost';
-- 允许应用从本地IP连接
CREATE USER 'db_user'@'127.0.0.1' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON db_name.* TO 'db_user'@'127.0.0.1';
-- 刷新权限
FLUSH PRIVILEGES;
-- 验证用户创建
SELECT user, host FROM mysql.user WHERE user = 'db_user';
4. 配置远程连接
如果需要从远程主机(如开发机器或管理工具)连接到MySQL服务器,需要进行以下配置。
4.1 创建允许远程连接的用户
-- 在MySQL中执行
-- 创建允许从任何主机连接的用户
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'strong_remote_password';
GRANT ALL PRIVILEGES ON db_name.* TO 'remote_user'@'%';
-- 或者只允许特定IP连接(更安全)
CREATE USER 'remote_user'@'specific_ip_address' IDENTIFIED BY 'strong_remote_password';
GRANT ALL PRIVILEGES ON db_name.* TO 'remote_user'@'specific_ip_address';
-- 刷新权限
FLUSH PRIVILEGES;
-- 退出MySQL
EXIT;
4.2 修改MySQL配置允许远程连接
# 编辑MySQL配置文件
vi /etc/my.cnf
# 在[mysqld]部分添加或修改以下行
# 注释掉或修改bind-address,允许所有IP连接
# bind-address = 0.0.0.0
# 保存并退出
# 重启MySQL服务
systemctl restart mysqld
4.3 验证MySQL监听状态
# 检查MySQL是否监听在所有接口上
netstat -tlnp | grep mysql
# 预期输出应包含类似内容:
# tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 123456/mysqld
5. 防火墙配置
MySQL默认使用3306端口,需要在防火墙中开放此端口。
5.1 FirewallD (CentOS/RHEL 7及以上)
# 查看防火墙状态
firewall-cmd --state
# 开放MySQL端口
firewall-cmd --permanent --add-port=3306/tcp
# 重新加载防火墙配置
firewall-cmd --reload
# 验证端口是否开放
firewall-cmd --list-all
5.2 UFW (Ubuntu/Debian)
# 开放MySQL端口
ufw allow 3306/tcp
# 检查状态
ufw status
5.3 iptables (传统防火墙)
# 开放MySQL端口
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# 保存规则(因系统而异)
service iptables save
# 或
iptables-save > /etc/iptables/rules.v4
6. 云服务器安全组设置
如果您的MySQL服务器部署在云平台(如云服务提供商平台),还需要在云平台控制台配置安全组规则:
- 登录云平台控制台
- 找到您的服务器实例
- 进入安全组设置
- 添加入方向规则:
- 协议类型:TCP
- 端口范围:3306/3306
- 授权对象:
- 0.0.0.0/0(允许所有IP,不推荐生产环境)
- 或特定IP/IP段(更安全,推荐)
7. 测试连接
7.1 从服务器本地测试
# 使用MySQL客户端连接
mysql -u db_user -p -h localhost
# 或者使用IP地址
mysql -u db_user -p -h 127.0.0.1
7.2 从远程主机测试
# 使用命令行
mysql -h server_ip -u remote_user -p
# 测试特定数据库连接
mysql -h server_ip -u remote_user -p db_name
7.3 使用图形化工具连接
使用MySQL Workbench、Navicat、DBeaver等图形化工具配置连接:
- 主机:server_ip
- 端口:3306
- 用户名:remote_user
- 密码:strong_remote_password
- 数据库:db_name
8. 常见问题与解决方案
8.1 连接被拒绝
错误信息:ERROR 1130: Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server
解决方案:
- 确认已创建允许远程连接的用户
- 检查用户的host值是否正确('%'或特定IP)
SELECT user, host FROM mysql.user WHERE user = 'remote_user';
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON db_name.* TO 'remote_user'@'%';
FLUSH PRIVILEGES;
8.2 无法通过socket连接
错误信息:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'
解决方案:
- 确认MySQL服务正在运行:
systemctl status mysqld
- 检查socket文件路径是否正确
- 如果MySQL未启动,尝试启动:
systemctl start mysqld
- 如果启动失败,检查错误日志:
cat /var/log/mysqld.log
8.3 访问被防火墙阻止
症状:连接超时,无错误信息
解决方案:
- 检查服务器防火墙设置:
firewall-cmd --list-all
- 检查云平台安全组规则
- 确认MySQL配置允许远程连接
- 使用telnet测试端口:
telnet server_ip 3306
8.4 密码策略问题
错误信息:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
解决方案:
- 使用符合策略的强密码(包含大小写字母、数字和特殊字符)
- 或临时调整密码策略:
SET GLOBAL validate_password.policy = 0; -- 仅适用于测试环境
8.5 权限问题
错误信息:ERROR 1044 (42000): Access denied for user 'user'@'host' to database 'db_name'
解决方案:
- 确认用户拥有正确的数据库权限
GRANT ALL PRIVILEGES ON db_name.* TO 'user'@'host';
FLUSH PRIVILEGES;
9. 性能优化建议
9.1 基本配置优化
编辑MySQL配置文件(/etc/my.cnf)添加以下设置:
[mysqld]
# 缓冲池大小,根据服务器内存调整(通常为系统内存的50-80%)
innodb_buffer_pool_size = 1G
# 日志文件大小
innodb_log_file_size = 256M
# 最大连接数
max_connections = 200
# 查询缓存大小(注意:MySQL 8.0已移除查询缓存)
query_cache_size = 64M
query_cache_type = 1
# 临时表大小
tmp_table_size = 64M
max_heap_table_size = 64M
# 打开文件限制
open_files_limit = 4096
9.2 查询优化
- 为经常查询的列创建索引
- 避免使用SELECT *,只选择需要的列
- 使用EXPLAIN分析和优化查询
- 对大表进行分区
- 定期优化和分析表:
OPTIMIZE TABLE your_table; ANALYZE TABLE your_table;
9.3 定期维护
# 创建定期维护脚本
cat > /usr/local/bin/mysql_maintenance.sh << 'EOF'
#!/bin/bash
mysqlcheck -u root -p'password' --auto-repair --optimize --all-databases
EOF
chmod +x /usr/local/bin/mysql_maintenance.sh
# 添加到crontab
echo "0 2 * * 0 /usr/local/bin/mysql_maintenance.sh > /var/log/mysql_maintenance.log 2>&1" >> /etc/crontab
10. 与Java应用集成
10.1 配置Java应用连接MySQL
对于SpringBoot应用,修改application.yml或application.properties配置:
# application.yml示例
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
username: db_user
password: strong_password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
10.2 创建外部配置文件
# 在应用目录创建外部配置文件
cat > /app/config/application.yml << EOF
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
username: db_user
password: strong_password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
# 其他应用配置...
EOF
10.3 启动脚本与外部配置
# 创建启动脚本
cat > /app/start.sh << 'EOF'
#!/bin/bash
cd /app
pkill -f application.jar || true
nohup java -jar application.jar --spring.config.location=file:./config/application.yml > application.log 2>&1 &
echo "应用已启动。查看日志请使用: tail -f application.log"
EOF
# 设置执行权限
chmod +x /app/start.sh
通过本指南,您应该能够在Linux服务器上成功部署MySQL数据库,配置远程连接,并与Java应用程序集成。记住,在生产环境中安全性尤为重要,请确保使用强密码,限制远程访问,并定期更新和维护您的数据库系统。
如有任何问题,请参考MySQL官方文档或联系数据库管理员获取进一步支持。