从零到一:Linux MySQL部署与配置

本教程是"从零到一:SpringBoot SSH远程部署进阶篇"的进阶篇章。基于前一阶段开发的SSH远程部署功能,本指南详细介绍如何在Linux服务器上配置MySQL数据库环境,并与SpringBoot应用集成。本文假设您已完成了SSH远程部署功能的开发工作,现在需要掌握如何正确地配置和操作数据库相关功能,以支持完整的应用部署流程。

从零到一:SpringBoot SSH远程部署基础篇
从零到一:SpringBoot SSH远程部署进阶篇

目录

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

在交互过程中,您需要:

  1. 设置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)级别,提供足够的安全性但不会过于复杂。

  2. 设置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,请重新设置更强的密码。

  3. 移除匿名用户

    Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
    
  4. 禁止root远程登录

    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
    
  5. 移除测试数据库

    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
    
  6. 重新加载权限表

    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服务器部署在云平台(如云服务提供商平台),还需要在云平台控制台配置安全组规则:

  1. 登录云平台控制台
  2. 找到您的服务器实例
  3. 进入安全组设置
  4. 添加入方向规则:
    • 协议类型: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官方文档或联系数据库管理员获取进一步支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值