Azure数据库迁移:从Single Server到Flexible Server

Azure数据库迁移:从Single Server到Flexible Server #

概述 #

Azure Database for MySQL和PostgreSQL的Single Server版本即将退役,需要迁移到更现代化的Flexible Server架构。本文档提供完整的迁移指南和最佳实践。

为什么要迁移? #

Single Server的限制 #

  • 性能限制:计算和存储紧密耦合
  • 功能受限:缺少高级功能和自定义配置
  • 扩展性差:垂直扩展选项有限
  • 即将停用:Microsoft计划停止支持

Flexible Server的优势 #

  • 灵活架构:计算和存储解耦
  • 更好性能:支持更多计算规格
  • 高可用性:内置高可用性选项
  • 成本优化:按需付费模式
  • 高级功能:支持更多数据库功能

迁移策略 #

1. 评估阶段 #

当前环境分析 #

# 检查当前数据库配置
az mysql server show --resource-group <rg-name> --name <server-name>

# 查看数据库列表
az mysql db list --resource-group <rg-name> --server-name <server-name>

# 检查当前工作负载
az monitor metrics list --resource <resource-id> --metric "cpu_percent,memory_percent"

兼容性检查 #

  • 版本兼容性:确认数据库版本支持
  • 功能兼容性:检查使用的功能是否支持
  • 连接字符串:更新应用程序连接配置

2. 迁移方法 #

方法一:Azure Database Migration Service (DMS) #

graph LR
    A[Source Single Server] --> B[Azure DMS]
    B --> C[Target Flexible Server]
    B --> D[监控和验证]

优点

  • 自动化程度高
  • 支持最小停机时间
  • 内置验证功能

方法二:mysqldump/pg_dump #

# MySQL导出
mysqldump -h source-server.mysql.database.azure.com \
  -u username@source-server -p \
  --single-transaction --routines --triggers \
  database_name > backup.sql

# 导入到Flexible Server
mysql -h target-server.mysql.database.azure.com \
  -u username -p \
  database_name < backup.sql

方法三:Azure CLI迁移命令 #

# 创建迁移任务
az mysql flexible-server migration create \
  --resource-group <rg-name> \
  --name <migration-name> \
  --source-server <source-server> \
  --target-server <target-server>

详细迁移步骤 #

步骤1:准备Flexible Server #

# 创建Flexible Server
az mysql flexible-server create \
  --resource-group <rg-name> \
  --name <new-server-name> \
  --location <location> \
  --admin-user <admin-username> \
  --admin-password <admin-password> \
  --sku-name Standard_B2s \
  --tier Burstable \
  --storage-size 20 \
  --version 8.0

步骤2:配置网络和安全 #

# 配置防火墙规则
az mysql flexible-server firewall-rule create \
  --resource-group <rg-name> \
  --name <server-name> \
  --rule-name AllowAll \
  --start-ip-address 0.0.0.0 \
  --end-ip-address 255.255.255.255

# 配置VNet集成(如果需要)
az mysql flexible-server vnet-rule create \
  --resource-group <rg-name> \
  --name <server-name> \
  --vnet-rule-name <rule-name> \
  --vnet-name <vnet-name> \
  --subnet <subnet-name>

步骤3:执行数据迁移 #

使用DMS迁移 #

  1. 创建DMS项目
  2. 配置源和目标
  3. 选择数据库
  4. 运行迁移
  5. 监控进度

使用脚本迁移 #

#!/bin/bash
# 迁移脚本示例

SOURCE_HOST="source-server.mysql.database.azure.com"
TARGET_HOST="target-server.mysql.database.azure.com"
USERNAME="admin_user"
DATABASE_LIST=("db1" "db2" "db3")

for db in "${DATABASE_LIST[@]}"; do
    echo "Migrating database: $db"
    
    # 导出数据
    mysqldump -h $SOURCE_HOST -u $USERNAME -p \
        --single-transaction --routines --triggers \
        $db > ${db}_backup.sql
    
    # 创建目标数据库
    mysql -h $TARGET_HOST -u $USERNAME -p \
        -e "CREATE DATABASE IF NOT EXISTS $db;"
    
    # 导入数据
    mysql -h $TARGET_HOST -u $USERNAME -p \
        $db < ${db}_backup.sql
    
    echo "Migration completed for: $db"
done

步骤4:验证迁移 #

-- 检查表数量
SELECT COUNT(*) FROM information_schema.tables 
WHERE table_schema = 'your_database';

-- 检查数据行数
SELECT table_name, table_rows 
FROM information_schema.tables 
WHERE table_schema = 'your_database';

-- 验证索引
SHOW INDEX FROM your_table;

步骤5:更新应用程序 #

连接字符串更新 #

# 旧的连接字符串 (Single Server)
OLD_CONNECTION = "mysql://username@servername:[email protected]:3306/database"

# 新的连接字符串 (Flexible Server)
NEW_CONNECTION = "mysql://username:[email protected]:3306/database"

配置文件更新 #

# application.yml
spring:
  datasource:
    url: jdbc:mysql://new-server.mysql.database.azure.com:3306/mydb
    username: myuser
    password: ${DB_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver

最佳实践 #

1. 迁移前准备 #

  • 备份验证:确保现有备份可用
  • 停机窗口:规划合适的维护窗口
  • 回滚计划:准备回滚策略
  • 性能基线:记录当前性能指标

2. 迁移过程中 #

  • 分批迁移:对于大型数据库,考虑分批迁移
  • 实时监控:监控迁移进度和性能
  • 数据验证:持续验证数据完整性
  • 日志记录:详细记录迁移过程

3. 迁移后优化 #

  • 性能调优:根据新环境调整配置
  • 监控设置:配置新的监控和告警
  • 备份策略:更新备份和恢复策略
  • 文档更新:更新相关文档和流程

常见问题和解决方案 #

连接问题 #

# 测试连接
mysql -h server.mysql.database.azure.com -u username -p

# 检查防火墙规则
az mysql flexible-server firewall-rule list \
  --resource-group <rg-name> --name <server-name>

性能问题 #

-- 检查慢查询
SELECT * FROM mysql.slow_log WHERE start_time > '2024-01-01';

-- 优化表
OPTIMIZE TABLE your_table;

权限问题 #

-- 检查用户权限
SHOW GRANTS FOR 'username'@'%';

-- 授予权限
GRANT ALL PRIVILEGES ON database.* TO 'username'@'%';

监控和维护 #

关键指标监控 #

  • CPU使用率
  • 内存使用率
  • 存储使用率
  • 连接数
  • 查询性能

告警配置 #

# 创建CPU使用率告警
az monitor metrics alert create \
  --name "High CPU Usage" \
  --resource-group <rg-name> \
  --scopes <resource-id> \
  --condition "avg cpu_percent > 80" \
  --description "CPU usage is above 80%"

成本优化 #

1. 正确选择规格 #

  • Burstable:适用于轻载工作负载
  • General Purpose:适用于大多数工作负载
  • Memory Optimized:适用于内存密集型应用

2. 存储优化 #

  • 按需扩展:根据实际需求调整存储
  • 备份保留:合理设置备份保留期
  • 预留实例:考虑长期使用的预留折扣

总结 #

迁移到Flexible Server是一个重要的架构升级,能够带来更好的性能、灵活性和成本效益。通过careful planning和proper execution,可以实现smooth migration with minimal downtime。

关键要点 #

  1. 提前规划:充分评估和准备
  2. 选择合适的迁移方法:根据业务需求选择
  3. 充分测试:在生产环境迁移前进行充分测试
  4. 持续优化:迁移后持续监控和优化

注意:本文档基于Azure Database迁移最佳实践整理,具体实施时请根据实际环境调整。