【Starrocks】以库为单位StarRocks数据迁移实战

文章目录

    • 一、迁移流程总览
    • 二、操作步骤
      • [1、 数据库数据备份到minioA](#1、 数据库数据备份到minioA)
      • [2、 MinIO A数据迁移到MinIO B(minio互通可省略)](#2、 MinIO A数据迁移到MinIO B(minio互通可省略))
        • [2.1 在中转机器配置MinIO客户端](#2.1 在中转机器配置MinIO客户端)
        • [2.2 下载MinIO A数据到本地](#2.2 下载MinIO A数据到本地)
        • [2.3 上传数据到MinIO B](#2.3 上传数据到MinIO B)
      • [3、 集群B从MinIO B恢复](#3、 集群B从MinIO B恢复)
    • 三、常见问题处理
      • [4.1 备份失败处理](#4.1 备份失败处理)
      • [4.2 恢复失败处理](#4.2 恢复失败处理)
      • [4.3 仓库删除](#4.3 仓库删除)
      • [4.4 查看备份/恢复历史](#4.4 查看备份/恢复历史)
      • [4.5 MinIO数据迁移问题](#4.5 MinIO数据迁移问题)

一、迁移流程总览

流程: 集群A → MinIO A → 本地中转 → MinIO B → 集群B

复制代码
1. 在MinIO A创建存储桶
2. 在集群A创建仓库并备份数据库
3. 从MinIO A下载备份到本地
4. 上传本地备份到MinIO B
5. 在集群B创建仓库并恢复数据库

环境说明:

使用docker-compose部署的minio与Starrocks三节点高可用集群

其中Starrocks的版本为3.2.12、minio的版本为:RELEASE.2024-12-13T22-19-12Z

二、操作步骤

1、 数据库数据备份到minioA

1.1、准备工作:创建桶和创建仓库
shell 复制代码
#一、 minio创建桶
## 1. 创建MinIOA的别名
/usr/bin/mc alias set minio_a http://ip:9000 admin Administrator123
## 2. 创建存储桶
/usr/bin/mc mb minio_a/srbackupa
## 3. 验证桶创建成功
/usr/bin/mc ls minio_a/


# 二、创建仓库:
# 进入mysql连接starrocks
mysql -h${cluster_a_fe_leader} -P9030 -uroot -p${password}


# 创建仓库(指向MinIO A)
CREATE REPOSITORY `backup_repo_a`
WITH BROKER
ON LOCATION "s3a://srbackupa/backup"
PROPERTIES
(
    "aws.s3.enable_ssl" = "false",
    "aws.s3.access_key" = "admin",
    "aws.s3.enable_path_style_access" = "true",
    "aws.s3.secret_key" = "Administrator123",
    "aws.s3.endpoint" = "minio_a_server:9000"
);

# 验证仓库
SHOW REPOSITORIES;

运行实例:minio的桶为srbackupa

shell 复制代码
# 一、创建桶
# 进入容器
docker exec it minio1 bash
# 创建minio别名为minio_a
/usr/bin/mc alias set minio_a http://11.73.242.177:9000 admin Administrator123
# 创建minio桶:srbackupa
/usr/bin/mc mb minio_a/srbackupa
# 查看桶信息
/usr/bin/mc ls minio_a/
[2025-11-28 08:36:42 UTC]     0B srbackupa/


# 二、创建仓库
docker exec -it starrocks-fe bash
mysql -h11.73.242.177 -P9030 -uroot 

CREATE REPOSITORY `backup_repo_a`
WITH BROKER
ON LOCATION "s3a://srbackupa/backup"
PROPERTIES
(
    "aws.s3.enable_ssl" = "false",
    "aws.s3.access_key" = "admin",
    "aws.s3.enable_path_style_access" = "true",
    "aws.s3.secret_key" = "Administrator123",
    "aws.s3.endpoint" = "11.73.242.177:9000"
);
# 验证仓库
SHOW REPOSITORIES;
1.2、 备份单个数据库
sql 复制代码
-- 备份数据库
-- 以下示例在数据库 db_name 中创建数据快照 snapshot_name(命名随意) 并备份至仓库 backup_repo_a 中。
BACKUP SNAPSHOT db_name.snapshot_name
TO `backup_repo_a`
PROPERTIES ("type" = "full");
-- 查看备份进度
SHOW BACKUP FROM db_name \G;
-- 查看所有备份快照
SHOW SNAPSHOT ON `backup_repo_a`;

备份完成标志: StateFINISHEDStatus[OK]

示例:数据库名为test_db

shell 复制代码
docker exec -it starrocks-fe bash
mysql -h11.73.242.177 -P9030 -uroot   
# 创建仓库
BACKUP SNAPSHOT test_db.snapshot_name
TO `backup_repo_a`
PROPERTIES ("type" = "full");

# 查看备份过程
mysql> SHOW BACKUP FROM test_db \G;
*************************** 1. row ***************************
               JobId: 12051
        SnapshotName: snapshot_name
              DbName: test_db
               State: FINISHED
          BackupObjs: [test_db.test_table]
          CreateTime: 2025-11-28 16:42:32
SnapshotFinishedTime: 2025-11-28 16:42:42
  UploadFinishedTime: 2025-11-28 16:42:48
        FinishedTime: 2025-11-28 16:42:54
     UnfinishedTasks:
            Progress:
          TaskErrMsg:
              Status: [OK]
             Timeout: 86400
# 查看备份的快照:
-- 注意时间戳恢复的时候要用
mysql> SHOW SNAPSHOT ON `backup_repo_a`;
+---------------+-------------------------+--------+
| Snapshot      | Timestamp               | Status |
+---------------+-------------------------+--------+
| snapshot_name | 2025-11-28-16-42-32-077 | OK     |
+---------------+-------------------------+--------+
1 row in set (0.02 sec)
1.3 取消备份(如需要)
sql 复制代码
-- 取消正在进行的备份
CANCEL BACKUP FROM db_name;

2、 MinIO A数据迁移到MinIO B(minio互通可省略)

2.1 在中转机器配置MinIO客户端
shell 复制代码
# 配置MinIO A别名
/usr/bin/mc alias set minio_a http://minio_a_server:9000 admin Administrator123

# 配置MinIO B别名
/usr/bin/mc alias set minio_b http://minio_b_server:9000 admin Administrator123
2.2 下载MinIO A数据到本地
shell 复制代码
# 创建本地目录
mkdir -p /tmp/starrocks_backup

# 进入容器
docker exec -it minio1 bash

# 下载MinIO A中的数据
/usr/bin/mc  cp --recursive minio_a/srbackupa/ /tmp/starrocks_backup

# 退出容器, 导出的minio数据传递到宿主机
exit
docker cp minio1:/tmp/starrocks_backup/ /tmp/starrocks_backup/
Successfully copied 50.2kB to /tmp/starrocks_backup/


# 验证下载
ls -lh /tmp/starrocks_backup/
du -sh /tmp/starrocks_backup/

运行实例:

shell 复制代码
# 创建本地存储文件夹
mkdir -p /tmp/starrocks_backup

# 进入容器
docker exec -it minio1 bash

# 下载MinIO A中的数据到本地
/usr/bin/mc  cp --recursive minio_a/srbackupa/ /tmp/starrocks_backup
# ...0e58823af131c747080: 17.92 KiB / 17.92 KiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 456.07 KiB/s 0s

# 退出容器, 导出的备份数据传递到宿主机
exit
docker cp minio1:/tmp/starrocks_backup/ /tmp/starrocks_backup/
Successfully copied 50.2kB to /tmp/starrocks_backup/


# 验证下载
ls -lh /tmp/starrocks_backup/
du -sh /tmp/starrocks_backup/
104K    /tmp/starrocks_backup/
2.3 上传数据到MinIO B
shell 复制代码
# 1. 创建MinIO B存储桶
/usr/bin/mc mb minio_b/starrocks_backup_b

# 2. 上传数据到MinIO B
/usr/bin/mc cp --recursive /tmp/starrocks_backup/ minio_b/starrocks_backup_b/

# 3. 验证上传
/usr/bin/mc ls -r minio_b/starrocks_backup_b/

注意: 如果中转机器无法同时访问两个MinIO,需要:

  1. 在可访问MinIO A的机器下载数据
  2. 将数据文件传输到可访问MinIO B的机器(使用scp、rsync等)
  3. 在可访问MinIO B的机器上传数据

使用scp传输示例:

shell 复制代码
# 在可访问MinIO A的机器上打包
tar -czf starrocks_backup.tar.gz /tmp/starrocks_backup/

# 传输到可访问MinIO B的机器
scp starrocks_backup.tar.gz user@minio_b_client_host:/tmp/

# 在可访问MinIO B的机器上解压
ssh user@minio_b_client_host "cd /tmp && tar -xzf starrocks_backup.tar.gz"

3、 集群B从MinIO B恢复

3.1、准备:创建库和仓库
sql 复制代码
mysql -h${cluster_b_fe_leader} -P9030 -uroot -p${password}

-- 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS db_name;

-- 创建仓库(指向MinIO B)
CREATE REPOSITORY `backup_repo_a`
WITH BROKER
ON LOCATION "s3a://srbackupa/backup"
PROPERTIES
(
    "aws.s3.enable_ssl" = "false",
    "aws.s3.access_key" = "admin",
    "aws.s3.enable_path_style_access" = "true",
    "aws.s3.secret_key" = "Administrator123",
    "aws.s3.endpoint" = "minio_b_server:9000"
);

-- 验证仓库
SHOW REPOSITORIES;
shell 复制代码
docker exec -it starrocks-fe bash 
mysql -h11.73.242.177 -P9030 -uroot     
create database test_db;

# 我这里还是同一个minio所以还是指向旧的仓库名,用于恢复
CREATE REPOSITORY `backup_repo_a`
WITH BROKER
ON LOCATION "s3a://srbackupa/backup"
PROPERTIES
(
    "aws.s3.enable_ssl" = "false",
    "aws.s3.access_key" = "admin",
    "aws.s3.enable_path_style_access" = "true",
    "aws.s3.secret_key" = "Administrator123",
    "aws.s3.endpoint" = "11.73.242.177:9000"
);


-- 查看仓库中的快照
SHOW SNAPSHOT ON `backup_repo_a`;
3.2、恢复数据库
sql 复制代码
-- 恢复数据库
RESTORE SNAPSHOT db_name.snapshot_name
FROM `backup_repo_a`
PROPERTIES (
    "backup_timestamp" = "2025-11-28-16-42-32-077",
    "replication_num" = "3"
);

-- 查看恢复进度
SHOW RESTORE FROM db_name \G;

恢复完成标志: StateFINISHEDStatus[OK]

执行实例

backup_timestamp=2025-11-28-16-42-32-077为旧的starrocks备份的时间戳

sql 复制代码
-- 恢复数据库
RESTORE SNAPSHOT test_db.snapshot_name
FROM `backup_repo_a`
PROPERTIES (
    "backup_timestamp" = "2025-11-28-16-42-32-077",
    "replication_num" = "3"
);

-- 查看恢复进度:FINISHED表示成功
mysql> SHOW RESTORE FROM test_db \G;
*************************** 1. row ***************************
               JobId: 10262
               Label: snapshot_name
           Timestamp: 2025-11-28-16-42-32-077
              DbName: test_db
               State: FINISHED
           AllowLoad: false
      ReplicationNum: 3
         RestoreObjs: test_table
          CreateTime: 2025-11-28 17:29:43
    MetaPreparedTime: 2025-11-28 17:29:44
SnapshotFinishedTime: 2025-11-28 17:29:47
DownloadFinishedTime: 2025-11-28 17:29:53
        FinishedTime: 2025-11-28 17:29:59
     UnfinishedTasks:
            Progress:
          TaskErrMsg:
              Status: [OK]
             Timeout: 86400
3.3、 验证恢复结果
sql 复制代码
-- 查看数据库
SHOW DATABASES;

-- 查看表
USE db_name;
SHOW TABLES;

-- 验证数据量
SELECT COUNT(*) FROM table_name;

-- 查看表结构
DESC table_name;

三、常见问题处理

4.1 备份失败处理

sql 复制代码
-- 查看备份错误详情
SHOW BACKUP FROM db_name \G;

-- 取消失败的备份
CANCEL BACKUP FROM db_name;

-- 删除失败的仓库重新创建
DROP REPOSITORY `backup_repo_a`;

4.2 恢复失败处理

sql 复制代码
-- 查看恢复错误详情
SHOW RESTORE FROM db_name \G;

-- 如果表已存在导致恢复失败,先删除表
DROP TABLE IF EXISTS table_name;

-- 重新执行恢复

4.3 仓库删除

sql 复制代码
-- 删除仓库
DROP REPOSITORY `backup_repo_a`;
DROP REPOSITORY `backup_repo_b`;

-- 注意:删除仓库后需要手动清理MinIO中的文件

4.4 查看备份/恢复历史

sql 复制代码
-- 查看所有备份历史
SHOW BACKUP;

-- 查看所有恢复历史
SHOW RESTORE;

4.5 MinIO数据迁移问题

shell 复制代码
# 如果MinIO客户端连接失败,检查网络和认证信息
/usr/bin/mc admin info minio_a
/usr/bin/mc admin info minio_b

# 如果下载/上传中断,可以断点续传(mc支持)
/usr/bin/mc cp --recursive --continue minio_a/bucket/ /tmp/backup/
相关推荐
青啊青斯1 小时前
Dify Docker部署
运维·docker·容器·dify
saber_andlibert1 小时前
【docker】入门基础和镜像、容器
linux·运维·docker·容器
羑悻的小杀马特2 小时前
Docker Compose高手实践之路:简单拓扑、数据库代理、基于WordPress的个人博客站点一键搞定!
数据库·docker·容器·wordpress·docker compose
k***21602 小时前
使用 Docker 部署 RabbitMQ 的详细指南
docker·容器·rabbitmq
The star"'2 小时前
docker
docker·云计算
Lynnxiaowen2 小时前
今天我们开始学习Docker概述与安装
linux·学习·docker·容器·云计算
Lee-Aiya2 小时前
MacBook M4芯片 Arm64架构 基于docker安装Oracle 19c
macos·docker·oracle·arm
曦云沐2 小时前
Docker双模式实战:从零到精通,Dockerfile与Docker Compose全方位构建部署
docker
风逸柏2 小时前
dockerfile说明
docker·容器