HaniBlindBox/docs/数据库迁移详细文档/阶段2-环境搭建和数据准备.md
2026-01-02 01:00:52 +08:00

9.9 KiB
Raw Blame History

阶段2环境搭建和数据准备

阶段概述

时间: 1天
目标: 搭建SQL Server 2022环境准备数据迁移工具和脚本
优先级: P0 (最高优先级)

详细任务清单

2.1 SQL Server 2022环境搭建 (0.5天)

任务描述

配置SQL Server 2022开发环境优化数据库参数

具体工作

  • 安装SQL Server 2022 Developer Edition
  • 配置数据库实例参数
  • 创建目标数据库
  • 配置安全和权限
  • 安装必要的管理工具

SQL Server安装配置

1. 数据库实例配置
-- 创建数据库
CREATE DATABASE [honey_box]
ON (
    NAME = 'honey_box_data',
    FILENAME = 'C:\Database\honey_box.mdf',
    SIZE = 500MB,
    MAXSIZE = 50GB,
    FILEGROWTH = 100MB
)
LOG ON (
    NAME = 'honey_box_log',
    FILENAME = 'C:\Database\honey_box.ldf',
    SIZE = 100MB,
    MAXSIZE = 10GB,
    FILEGROWTH = 10%
);

-- 设置数据库选项
ALTER DATABASE [honey_box] SET RECOVERY SIMPLE;
ALTER DATABASE [honey_box] SET AUTO_CREATE_STATISTICS ON;
ALTER DATABASE [honey_box] SET AUTO_UPDATE_STATISTICS ON;
ALTER DATABASE [honey_box] SET AUTO_UPDATE_STATISTICS_ASYNC ON;
ALTER DATABASE [honey_box] SET PAGE_VERIFY CHECKSUM;
ALTER DATABASE [honey_box] SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE [honey_box] SET READ_COMMITTED_SNAPSHOT ON;

-- 设置排序规则(支持中文)
ALTER DATABASE [honey_box] COLLATE Chinese_PRC_CI_AS;
2. 性能优化配置
-- 内存配置
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

-- 设置最大内存 (根据服务器配置调整)
EXEC sp_configure 'max server memory (MB)', 4096;
RECONFIGURE;

-- 设置并行度
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;

-- 设置成本阈值
EXEC sp_configure 'cost threshold for parallelism', 25;
RECONFIGURE;

-- 启用优化功能
EXEC sp_configure 'optimize for ad hoc workloads', 1;
RECONFIGURE;
3. 安全配置
-- 创建应用程序用户
CREATE LOGIN [honey_box_app] WITH PASSWORD = 'HoneyBox2024!@#';
USE [honey_box];
CREATE USER [honey_box_app] FOR LOGIN [honey_box_app];

-- 分配权限
ALTER ROLE [db_datareader] ADD MEMBER [honey_box_app];
ALTER ROLE [db_datawriter] ADD MEMBER [honey_box_app];
ALTER ROLE [db_ddladmin] ADD MEMBER [honey_box_app];

-- 创建只读用户(用于报表查询)
CREATE LOGIN [honey_box_readonly] WITH PASSWORD = 'HoneyBoxRead2024!@#';
CREATE USER [honey_box_readonly] FOR LOGIN [honey_box_readonly];
ALTER ROLE [db_datareader] ADD MEMBER [honey_box_readonly];

2.2 数据迁移工具准备 (0.3天)

任务描述

准备数据迁移所需的工具和脚本

具体工作

  • 安装SQL Server Management Studio (SSMS)
  • 安装SQL Server Integration Services (SSIS)
  • 准备MySQL连接驱动
  • 创建数据迁移脚本模板
  • 配置数据验证工具

工具安装清单

1. 必需工具
# SQL Server Management Studio 19
# 下载地址: https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

# MySQL ODBC Driver 8.0
# 下载地址: https://dev.mysql.com/downloads/connector/odbc/

# SQL Server Data Tools (SSDT)
# 用于创建SSIS包进行数据迁移
2. PowerShell迁移脚本模板
# 数据迁移主脚本
param(
    [string]$SourceServer = "localhost",
    [string]$SourceDatabase = "youdas",
    [string]$TargetServer = "localhost",
    [string]$TargetDatabase = "honey_box",
    [string]$TableName = "",
    [switch]$ValidateOnly = $false
)

# MySQL连接字符串
$MySQLConnectionString = "Server=$SourceServer;Database=$SourceDatabase;Uid=root;Pwd=password;"

# SQL Server连接字符串
$SQLServerConnectionString = "Server=$TargetServer;Database=$TargetDatabase;Integrated Security=true;"

function Migrate-Table {
    param(
        [string]$SourceTable,
        [string]$TargetTable,
        [string]$MappingScript
    )
    
    Write-Host "开始迁移表: $SourceTable -> $TargetTable"
    
    # 执行数据迁移逻辑
    # ...
    
    Write-Host "完成迁移表: $TargetTable"
}

function Validate-Data {
    param(
        [string]$SourceTable,
        [string]$TargetTable
    )
    
    Write-Host "验证数据一致性: $TargetTable"
    
    # 执行数据验证逻辑
    # ...
}

2.3 MySQL数据备份和导出 (0.2天)

任务描述

备份MySQL数据并导出为迁移格式

具体工作

  • 创建MySQL完整备份
  • 导出核心表数据为CSV格式
  • 验证备份数据完整性
  • 准备增量备份策略

数据备份脚本

1. 完整备份脚本
#!/bin/bash
# MySQL完整备份脚本

MYSQL_HOST="localhost"
MYSQL_USER="root"
MYSQL_PASSWORD="password"
MYSQL_DATABASE="youdas"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p $BACKUP_DIR

# 完整备份
mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD \
  --single-transaction \
  --routines \
  --triggers \
  --events \
  --hex-blob \
  --default-character-set=utf8mb4 \
  $MYSQL_DATABASE > $BACKUP_DIR/full_backup_$DATE.sql

# 验证备份
if [ $? -eq 0 ]; then
    echo "备份成功: $BACKUP_DIR/full_backup_$DATE.sql"
    
    # 压缩备份文件
    gzip $BACKUP_DIR/full_backup_$DATE.sql
    echo "备份已压缩: $BACKUP_DIR/full_backup_$DATE.sql.gz"
else
    echo "备份失败!"
    exit 1
fi

# 备份文件大小
ls -lh $BACKUP_DIR/full_backup_$DATE.sql.gz
2. 核心表数据导出
#!/bin/bash
# 导出核心表数据为CSV格式

MYSQL_HOST="localhost"
MYSQL_USER="root"
MYSQL_PASSWORD="password"
MYSQL_DATABASE="youdas"
EXPORT_DIR="/export/csv"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建导出目录
mkdir -p $EXPORT_DIR/$DATE

# 核心表列表
CORE_TABLES=(
    "user"
    "user_account"
    "goods"
    "goods_list"
    "order"
    "order_list"
    "profit_money"
    "profit_integral"
    "profit_pay"
    "coupon"
    "coupon_receive"
    "task_list"
    "user_task_list"
    "shang"
    "config"
)

# 导出每个核心表
for table in "${CORE_TABLES[@]}"; do
    echo "导出表: $table"
    
    mysql -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD \
      --default-character-set=utf8mb4 \
      -e "SELECT * FROM $table;" \
      --batch --raw \
      $MYSQL_DATABASE > $EXPORT_DIR/$DATE/${table}.csv
    
    if [ $? -eq 0 ]; then
        echo "导出成功: ${table}.csv"
        # 显示记录数
        wc -l $EXPORT_DIR/$DATE/${table}.csv
    else
        echo "导出失败: $table"
    fi
done

echo "所有表导出完成,位置: $EXPORT_DIR/$DATE"
3. 数据验证脚本
-- 数据完整性验证脚本
-- 在MySQL中执行验证导出数据的完整性

-- 检查核心表记录数
SELECT 
    'user' as table_name,
    COUNT(*) as record_count,
    MAX(id) as max_id,
    MIN(addtime) as min_time,
    MAX(addtime) as max_time
FROM user
UNION ALL
SELECT 
    'goods' as table_name,
    COUNT(*) as record_count,
    MAX(id) as max_id,
    MIN(addtime) as min_time,
    MAX(addtime) as max_time
FROM goods
UNION ALL
SELECT 
    'order' as table_name,
    COUNT(*) as record_count,
    MAX(id) as max_id,
    MIN(addtime) as min_time,
    MAX(addtime) as max_time
FROM `order`
UNION ALL
SELECT 
    'order_list' as table_name,
    COUNT(*) as record_count,
    MAX(id) as max_id,
    MIN(addtime) as min_time,
    MAX(addtime) as max_time
FROM order_list;

-- 检查关键业务数据
SELECT 
    '用户总数' as metric,
    COUNT(*) as value
FROM user
UNION ALL
SELECT 
    '活跃用户数' as metric,
    COUNT(*) as value
FROM user WHERE status = 1
UNION ALL
SELECT 
    '商品总数' as metric,
    COUNT(*) as value
FROM goods
UNION ALL
SELECT 
    '上架商品数' as metric,
    COUNT(*) as value
FROM goods WHERE status = 1
UNION ALL
SELECT 
    '订单总数' as metric,
    COUNT(*) as value
FROM `order`
UNION ALL
SELECT 
    '已支付订单数' as metric,
    COUNT(*) as value
FROM `order` WHERE status = 1;

-- 检查数据一致性
SELECT 
    '用户余额总计' as metric,
    CAST(SUM(money) AS CHAR) as value
FROM user
UNION ALL
SELECT 
    '用户积分总计' as metric,
    CAST(SUM(integral) AS CHAR) as value
FROM user
UNION ALL
SELECT 
    '订单金额总计' as metric,
    CAST(SUM(order_total) AS CHAR) as value
FROM `order` WHERE status = 1;

验收标准

环境验收

  • SQL Server 2022安装成功并正常运行
  • 数据库实例配置正确
  • 性能参数优化完成
  • 安全配置符合要求
  • 管理工具安装完成

数据准备验收

  • MySQL数据完整备份成功
  • 核心表CSV导出完成
  • 数据验证脚本执行正常
  • 备份文件完整性验证通过

工具准备验收

  • 数据迁移工具安装完成
  • 迁移脚本模板准备就绪
  • 连接测试通过
  • 权限配置正确

风险点和注意事项

环境风险

  1. SQL Server版本兼容性: 确保版本选择正确
  2. 内存和磁盘空间: 确保硬件资源充足
  3. 网络连接: 确保MySQL和SQL Server网络连通
  4. 权限问题: 确保数据库用户权限配置正确

数据风险

  1. 备份失败: MySQL备份过程中可能出现错误
  2. 字符集问题: 中文数据导出可能出现乱码
  3. 数据完整性: 导出过程中数据可能丢失
  4. 大表导出: 大表导出可能超时或失败

解决方案

  1. 分步验证: 每个步骤完成后立即验证
  2. 多重备份: 创建多个备份副本
  3. 字符集统一: 统一使用UTF-8字符集
  4. 分批处理: 大表分批导出和处理

下一阶段准备

为阶段3准备的内容

  • 表结构创建脚本
  • 数据类型转换规则
  • 字段映射配置
  • 索引创建脚本

交接文档

  • SQL Server环境配置文档
  • 数据备份验证报告
  • 迁移工具使用指南
  • 环境连接配置文档

阶段2完成标志: SQL Server环境搭建完成MySQL数据备份和导出完成迁移工具准备就绪为数据迁移做好充分准备。