当前位置: 首页 > news >正文

阿里云 RDS 过期应急方案:ECS 自建 MySQL 部署与数据迁移全流程

前言

本文记录一次真实的生产应急场景:项目使用的阿里云RDS MySQL到期关停,万幸提前导出了全量SQL备份文件,为了节省成本,复用现有部署业务的ECS服务器自建MySQL 8.0,完成数据迁移、业务恢复全流程,同时整理所有踩坑点和解决方案,作为个人技术笔记留存,也给遇到同类问题的同学提供参考。

环境说明

  • 服务器:阿里云ECS,系统为OpenCloudOS 8(CentOS 8 兼容系)

  • 数据库版本:MySQL 8.0.45(与原RDS版本一致,避免兼容性问题)

  • 前置准备:原RDS全量SQL备份文件、ECS root权限、阿里云控制台安全组配置权限


一、前置环境清理:卸载系统自带MariaDB

OpenCloudOS/CentOS系统默认会预装MariaDB,与MySQL会产生端口、依赖冲突,必须先完全卸载。

1. 切换root用户

所有操作必须使用root权限执行,普通用户执行会提示权限不足:

# 切换root用户,输入root密码后回车
su - root

2. 停止并卸载MariaDB

# 停止MariaDB服务
systemctl stop mariadb
systemctl disable mariadb# 强制卸载所有MariaDB相关安装包(--nodeps忽略依赖冲突)
rpm -e --nodeps --allmatches mariadb*# 清理残留文件,避免后续MySQL安装冲突
rm -rf /var/lib/mysql
rm -rf /etc/my.cnf
rm -rf /var/log/mariadb
rm -rf /var/log/mysql*

3. 验证卸载干净

# 无任何输出则说明卸载完成
rpm -qa | grep -E "mariadb|mysql"

二、MySQL 8.0 完整安装步骤

1. 添加MySQL官方YUM源

# 下载MySQL 8.0 官方YUM源(适配CentOS 8/OpenCloudOS 8)
wget https://repo.mysql.com/mysql80-community-release-el8-3.noarch.rpm# 安装YUM源
rpm -ivh mysql80-community-release-el8-3.noarch.rpm# 验证源添加成功
yum repolist enabled | grep mysql

2. 安装MySQL Server

# 安装MySQL 8.0,--nogpgcheck避免密钥校验失败
yum install -y mysql-community-server --nogpgcheck# 验证安装成功,输出版本号则正常
mysql --version

3. 启动服务并设置开机自启

# 启动MySQL服务
systemctl start mysqld# 设置开机自启,ECS重启后自动拉起MySQL
systemctl enable mysqld# 验证服务状态,看到active (running)则成功
systemctl status mysqld

4. 修改root初始密码

MySQL 8.0安装后会生成临时初始密码,需先修改才能正常使用:

# 1. 查看临时初始密码
grep 'temporary password' /var/log/mysqld.log# 2. 使用临时密码登录MySQL
mysql -uroot -p
-- 3. 修改root本地登录密码(密码需满足大小写+数字+特殊字符,长度≥8)
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的Root强密码';-- 4. 刷新权限,立即生效
FLUSH PRIVILEGES;-- 5. 退出MySQL
exit;

【踩坑记录】如果提示密码不满足策略要求,可临时降低密码策略(仅个人开发环境使用):

-- 登录MySQL后执行
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;

三、账号权限配置(生产级安全规范)

不建议直接使用root账号连接业务,这里按开发/测试环境创建两个专用账号,权限一致,遵循最小权限原则。

【面试考点】MySQL 8.0 权限语法变化

MySQL 8.0 不再支持GRANT语句中直接用IDENTIFIED BY创建用户,必须先创建用户,再单独授权,否则会报1064语法错误,这是和5.7版本的核心区别。

1. root账号远程访问授权

# 登录MySQL
mysql -uroot -p你的Root密码
-- 创建root远程访问账号(%表示允许所有IP访问)
CREATE USER 'root'@'%' IDENTIFIED BY '你的Root强密码';-- 授予超级管理员权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;-- 刷新权限
FLUSH PRIVILEGES;

2. 分环境专用账号创建

-- 1. 删除可能存在的旧账号,避免冲突
DROP USER IF EXISTS 'test_runner'@'%';
DROP USER IF EXISTS 'dev_debug'@'%';-- 2. 创建测试环境账号
CREATE USER 'test_runner'@'%' IDENTIFIED BY '测试环境账号强密码';-- 3. 创建开发环境账号
CREATE USER 'dev_debug'@'%' IDENTIFIED BY '开发环境账号强密码';-- 4. 授予全量操作权限(开发/测试环境用,生产环境需按库最小化授权)
GRANT ALL PRIVILEGES ON *.* TO 'test_runner'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'dev_debug'@'%' WITH GRANT OPTION;-- 5. 刷新权限
FLUSH PRIVILEGES;

3. 验证账号创建成功

-- 查看账号和host配置,host为%则允许远程访问
SELECT user, host, plugin FROM mysql.user WHERE user IN ('root', 'test_runner', 'dev_debug');-- 查看账号权限
SHOW GRANTS FOR 'test_runner'@'%';

四、网络与防火墙配置(远程连接失败核心排查点)

MySQL远程连接失败90%都是网络/防火墙问题,需同时配置云厂商安全组和服务器本地防火墙。

1. 阿里云安全组配置

登录阿里云ECS控制台,进入实例的「安全组」配置,添加入站规则:

配置项 取值 备注
协议类型 TCP 固定值
端口范围 3306/3306 MySQL默认端口
授权对象 0.0.0.0/0 个人开发用,生产环境需限制为业务服务器IP
策略 允许 固定值
必须确认:该安全组已绑定到你的ECS实例,否则规则不生效。

2. ECS本地firewalld防火墙永久配置

# 1. 启动firewalld服务
systemctl start firewalld# 2. 设置开机自启
systemctl enable firewalld# 3. 永久开放3306端口(--permanent参数,重启不丢失)
firewall-cmd --add-port=3306/tcp --permanent# 4. 重载规则,立即生效
firewall-cmd --reload# 5. 验证端口开放成功
firewall-cmd --list-ports --permanent

3. SELinux关闭配置

SELinux默认开启会拦截MySQL端口,个人开发环境建议永久关闭,避免复杂的规则配置:

# 1. 编辑SELinux配置文件
vim /etc/selinux/config# 2. 修改SELINUX值为disabled
SELINUX=disabled# 3. 保存退出,临时关闭SELinux(当前会话立即生效,无需重启)
setenforce 0# 4. 验证状态,看到Permissive/disabled则成功
getenforce

五、Navicat远程连接踩坑全解决

报错1:2002 - Can't connect to server (10060)

原因:TCP连接超时,网络层面不通,与MySQL账号权限无关。

解决方案

  1. 确认阿里云安全组已开放3306端口

  2. 确认ECS本地firewalld已开放3306端口

  3. 本地电脑测试端口连通性:

    # Windows CMD执行telnet测试
    telnet 你的ECS公网IP 3306
    # 或PowerShell执行
    Test-NetConnection 你的ECS公网IP -Port 3306
    
  4. 切换手机热点重试,排除本地网络封禁3306端口

报错2:1045 - Access denied for user 'xxx'@'xxx' (using password: YES)

原因&解决方案分3种场景

  1. 账号无远程访问权限:确认账号的host为%,按本文第三部分重新创建并授权账号

  2. Navicat配置错误:主机栏填了localhost,导致连接本地电脑的MySQL,需改为ECS公网IP

  3. 加密方式不兼容:MySQL 8.0默认使用caching_sha2_password加密,旧版Navicat不支持,修改为兼容的加密方式:

    -- 登录MySQL后执行,修改账号加密方式
    ALTER USER 'test_runner'@'%' IDENTIFIED WITH mysql_native_password BY '测试环境账号强密码';
    ALTER USER 'dev_debug'@'%' IDENTIFIED WITH mysql_native_password BY '开发环境账号强密码';
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的Root强密码';
    FLUSH PRIVILEGES;
    

六、数据导入与业务恢复

1. 上传SQL备份文件到ECS

使用WinSCP/FileZilla/scp命令,将本地的全量SQL备份文件上传到ECS的/root/目录:

# Windows本地CMD执行scp上传命令
scp C:\本地路径\备份文件.sql root@你的ECS公网IP:/root/

2. 数据库创建与SQL导入

# 1. 登录MySQL
mysql -uroot -p你的Root密码
-- 2. 创建业务数据库(与原RDS库名一致,避免业务配置修改)
CREATE DATABASE IF NOT EXISTS 你的业务库名 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 3. 退出MySQL
exit;
# 4. 执行全量SQL导入(核心步骤)
mysql -uroot -p你的Root密码 你的业务库名 < /root/备份文件.sql

3. 数据验证

-- 登录MySQL,进入业务库
USE 你的业务库名;-- 查看表结构
SHOW TABLES;-- 验证数据量,与原RDS一致则导入成功
SELECT COUNT(*) FROM 你的业务表;

4. 微服务业务配置修改

修改Spring Boot微服务的application.yml数据源配置,切换为自建MySQL,使用专用账号连接:

spring:datasource:# 同一台ECS优先使用内网IP,延迟更低、更安全url: jdbc:mysql://你的ECS内网IP:3306/你的业务库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=falseusername: test_runnerpassword: 测试环境账号强密码driver-class-name: com.mysql.cj.jdbc.Driver

修改完成后,重启微服务,测试接口正常返回数据,业务恢复完成。


七、后续优化(安全+高可用)

1. MySQL定时自动备份脚本

避免数据丢失,配置每日自动备份,自动清理7天前的备份文件:

# 1. 创建备份目录
mkdir -p /root/mysql_backup# 2. 编写备份脚本
vim /root/backup_mysql.sh

脚本内容:

#!/bin/bash
# 备份文件名称:库名+时间戳
BACKUP_FILE="/root/mysql_backup/你的业务库名_$(date +%Y%m%d_%H%M%S).sql"
# 执行备份
mysqldump -uroot -p你的Root密码 你的业务库名 > $BACKUP_FILE
# 删除7天前的备份文件
find /root/mysql_backup -name "你的业务库名_*.sql" -mtime +7 -delete
# 3. 给脚本添加执行权限
chmod +x /root/backup_mysql.sh# 4. 添加定时任务,每天凌晨2点执行备份
crontab -e
# 写入以下内容
0 2 * * * /root/backup_mysql.sh
# 保存退出

2. 1核2G服务器MySQL配置优化

编辑/etc/my.cnf,添加以下配置,适配低配置服务器:

[mysqld]
# 字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 最大连接数
max_connections=200
# 缓冲池大小(建议为服务器内存的50%)
innodb_buffer_pool_size=512M
# 慢查询日志开启,用于性能优化
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow.log
long_query_time=2

修改完成后重启MySQL生效:

systemctl restart mysqld

总结

本次应急处理,不仅完成了RDS过期后的业务快速恢复,还完整掌握了Linux环境下MySQL 8.0的安装、权限配置、网络排查、数据迁移全流程,踩过的坑也为后续MySQL运维积累了实操经验。

自建MySQL相比云RDS成本更低,灵活性更高,适合个人项目、开发测试环境使用;生产环境建议做好定时备份、主从同步等高可用配置,保障数据安全。

http://www.jsqmd.com/news/397933/

相关文章:

  • 前后端分离+智慧养老中心管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • SpringBoot+Vue “共享书角”图书借还管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • .计算机学习系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • .社区疫情管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • Java Web .仓库管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 前后端分离web新能源充电系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 2026年开年宜兴斜管填料工厂综合实力与选购指南 - 2026年企业推荐榜
  • 2026年漯河装修品牌实力深度解析与选购指南 - 2026年企业推荐榜
  • Java Web +智慧养老中心管理系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • 2026年漯河旧房翻新权威公司盘点与深度解析 - 2026年企业推荐榜
  • 基于SpringBoot+Vue的web新能源充电系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 基于SpringBoot+Vue的it职业生涯规划系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • SpringBoot+Vue .仓库管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 2026年临泉县外墙仿石漆公司选择指南与实力推荐 - 2026年企业推荐榜
  • 2026年临泉县外墙喷砂施工方综合评选与推荐指南 - 2026年企业推荐榜
  • 2026年唐山煤气脱硫设备供应商综合盘点与推荐 - 2026年企业推荐榜
  • PyTorch——第10章 图像风格迁移
  • 2026年工业铝材厂家综合评测:如何选择可靠的合作伙伴? - 2026年企业推荐榜
  • FastAPI实战(第二部分):用户注册接口开发详解
  • 广东艺术漆市场观察:2026年值得关注的五个品牌 - 2026年企业推荐榜
  • 基于Java+SpringBoot+SSM汽车租赁买卖管理系统(源码+LW+调试文档+讲解等)/汽车租赁系统/汽车买卖系统/汽车管理软件/租赁买卖管理系统/汽车租赁管理平台/汽车买卖交易系统
  • 46. 全排列
  • 78. 子集
  • 对于投稿的那些事,心态的变化由开始“激动”到“平常心”的变化过程
  • Java SpringBoot+Vue3+MyBatis it职业生涯规划系统系统源码|前后端分离+MySQL数据库
  • 基于SpringBoot+Vue的.社区疫情管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 企业级.计算机学习系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 2026年临沂干洗行业优质品牌综合评测 - 2026年企业推荐榜
  • 2026年湖南企业如何选择靠谱的循环水药剂品牌? - 2026年企业推荐榜
  • 【毕业设计】SpringBoot+Vue+MySQL it职业生涯规划系统平台源码+数据库+论文+部署文档