1. 迁移前准备
  1. 备份源数据

    • 使用 SHOW CREATE TABLE 获取源表结构,确保目标表结构一致。
    • 对源表进行全量备份:
      -- 备份源表数据到本地文件
      SELECT * FROM source_db.source_table INTO OUTFILE '/path/to/backup/source_table.csv' 
      FORMAT CSV;
      
    • 验证备份文件是否完整(例如通过文件大小和行数校验)。
  2. 检查目标集群存储空间

    • 确保目标集群(20G设备)的存储空间大于源集群的1.2倍(参考阿里云文档要求)。
    • 查询源集群数据总量:
      SELECT 
        formatReadableSize(sum(data_uncompressed_bytes)) AS total_uncompressed_size,
        formatReadableSize(sum(data_compressed_bytes)) AS total_compressed_size,
        sum(rows) AS total_rows
      FROM system.parts
      WHERE active AND database = 'source_db' AND table = 'source_table';
      
  3. 评估写入速度

    • 如果源集群写入速度 > 20MB/s,需检查目标集群的磁盘吞吐能力(参考阿里云文档要求)。
    • 使用 system.metrics 或监控工具(如Prometheus)查看目标集群的IO性能。

2. 数据迁移
  1. 分阶段迁移数据

    • 按分区迁移(适用于分区表):
      • 在目标集群中创建与源表结构相同的表:
        CREATE TABLE target_db.target_table ON CLUSTER 'target_cluster' 
        ENGINE = ReplicatedMergeTree(...) AS source_db.source_table;
        
      • 按分区逐个迁移:
        -- 从源集群获取分区数据
        ALTER TABLE target_db.target_table FETCH PARTITION 'partition_name' 
        FROM 'http://source_cluster_ip:8123/?query=SELECT%20*%20FROM%20source_db.source_table%20WHERE%20partition%3D%27partition_name%27';
        
        -- 将分区附加到目标表
        ALTER TABLE target_db.target_table ATTACH PARTITION 'partition_name';
        
    • 全量迁移(非分区表):
      • 使用 INSERT INTO ... SELECT 一次性迁移:
        INSERT INTO target_db.target_table SELECT * FROM source_db.source_table;
        
  2. 设置停写时间窗口

    • 根据阿里云文档要求,在迁移的最后10分钟暂停源集群写入:
      -- 暂停源集群写入(需在业务低峰期操作)
      -- 例如,通过应用层控制或关闭源集群的写入权限
      

3. 数据完整性校验
  1. 行数与大小校验

    • 对比源表和目标表的行数及数据大小:
      -- 源表统计
      SELECT 
        formatReadableSize(sum(data_uncompressed_bytes)) AS total_uncompressed_size,
        formatReadableSize(sum(data_compressed_bytes)) AS total_compressed_size,
        sum(rows) AS total_rows
      FROM system.parts
      WHERE active AND database = 'source_db' AND table = 'source_table';
      
      -- 目标表统计
      SELECT 
        formatReadableSize(sum(data_uncompressed_bytes)) AS total_uncompressed_size,
        formatReadableSize(sum(data_compressed_bytes)) AS total_compressed_size,
        sum(rows) AS total_rows
      FROM system.parts
      WHERE active AND database = 'target_db' AND table = 'target_table';
      
  2. 数据内容校验

    • 使用校验和工具(如 sumHashMD5)对比关键字段:
      -- 源表校验和
      SELECT sum(assumeNotNull(ifNull(cityHash64(*), 0))) AS checksum FROM source_db.source_table;
      
      -- 目标表校验和
      SELECT sum(assumeNotNull(ifNull(cityHash64(*), 0))) AS checksum FROM target_db.target_table;
      
    • 若校验和一致,则数据内容匹配。
  3. 随机抽样验证

    • 从源表和目标表中随机抽取部分数据对比:
      -- 源表抽样
      SELECT * FROM source_db.source_table ORDER BY random() LIMIT 1000;
      
      -- 目标表抽样
      SELECT * FROM target_db.target_table ORDER BY random() LIMIT 1000;
      

4. 迁移后操作
  1. 监控目标集群性能

    • 观察目标集群的 merge 操作频率(可能导致IO负载升高),根据阿里云文档调整合并策略。
    • 使用以下命令查看合并状态:
      SELECT * FROM system.merges WHERE table = 'target_table';
      
  2. 更新业务访问配置

    • 将业务流量指向目标集群(20G设备),并验证业务功能正常。
    • 将10G设备迁移至管理区,保留历史数据访问权限。
  3. 清理源数据(可选)

    • 若不再需要源数据,可删除源表以释放空间:
      DROP TABLE source_db.source_table;
      

注意事项

  • 停写时间窗口:确保迁移的最后10分钟内源集群无写入操作,避免数据不一致。
  • 网络稳定性:迁移过程中保持源集群与目标集群之间的网络稳定。
  • 回滚计划:若迁移失败,可通过备份文件恢复源数据,并重新尝试迁移。

更多推荐