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

AI助手已提取文章相关产品:

一、迁移流程总览

流程: 集群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、准备工作:创建桶和创建仓库
#一、 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

# 一、创建桶
# 进入容器
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、 备份单个数据库
-- 备份数据库
-- 以下示例在数据库 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


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 取消备份(如需要)
-- 取消正在进行的备份
CANCEL BACKUP FROM db_name;

 

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

2.1 在中转机器配置MinIO客户端
# 配置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数据到本地
# 创建本地目录
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/

运行实例:

# 创建本地存储文件夹
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
# 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传输示例:

# 在可访问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、准备:创建库和仓库
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;
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、恢复数据库
-- 恢复数据库
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备份的时间戳

-- 恢复数据库
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、 验证恢复结果
-- 查看数据库
SHOW DATABASES;

-- 查看表
USE db_name;
SHOW TABLES;

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

-- 查看表结构
DESC table_name;

三、常见问题处理

4.1 备份失败处理

-- 查看备份错误详情
SHOW BACKUP FROM db_name \G;

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

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

4.2 恢复失败处理

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

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

-- 重新执行恢复

4.3 仓库删除

-- 删除仓库
DROP REPOSITORY `backup_repo_a`;
DROP REPOSITORY `backup_repo_b`;

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

4.4 查看备份/恢复历史

-- 查看所有备份历史
SHOW BACKUP;

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

4.5 MinIO数据迁移问题

# 如果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/

您可能感兴趣的与本文相关内容

### StarRocks 数据迁移工具与导入导出方案 StarRocks 提供了多种数据迁移、导入和导出的工具与方法,以满足不同的业务需求和场景。以下是几种常见的数据迁移工具或方案: #### 1. **Export 功能** StarRocks 的 `EXPORT` 功能允许用户将表中的数据导出到外部存储系统(如 OSS 或 HDFS)。通过该功能,可以灵活地定义导出文件的格式、分隔符等属性[^3]。 例如: ```sql EXPORT TABLE kanshu.nh_user TO "s3a://starrocks-backup/export_test/nh_user/" PROPERTIES ( "column_separator"="\\x01", "timeout"="86400" ) WITH BROKER ( "aws.s3.endpoint" = "tos-s3-cn-shanghai.ivolces.com", "aws.s3.access_key" = "xxxx", "aws.s3.secret_key" = "xxx" ); ``` 此方法适用于需要将数据从 StarRocks 导出到外部存储的场景,尤其是对于没有时间字段分区的大表。 #### 2. **Broker Load** Broker Load 是 StarRocks 提供的一种高效的数据导入方式,支持从外部存储(如 HDFS、OSS)中加载数据到 StarRocks 表中。结合 Export 功能,可以实现数据的导出与重新导入[^3]。 示例代码如下: ```sql LOAD LABEL kanshu.nh_user ( DATA INFILE("s3a://starrocks-backup/export_test/nh_user/*.csv") INTO TABLE nh_user COLUMNS TERMINATED BY "\\x01" FORMAT AS "CSV" ) WITH BROKER ( "aws.s3.endpoint" = "tos-s3-cn-shanghai.ivolces.com", "aws.s3.access_key" = "xxx", "aws.s3.secret_key" = "xxx" ); ``` #### 3. **备份与还原** StarRocks 支持通过备份与还原的方式进行数据迁移。这种方式适用于需要在不同集群之间迁移整个数据或表的情况。备份操作会将表的数据与元数据持久化到指定的存储路径中,而还原操作则可以从备份中恢复数据[^1]。 例如: - 备份命令: ```sql BACKUP DATABASE db_name TO "hdfs://path/to/backup"; ``` - 还原命令: ```sql RESTORE DATABASE db_name FROM "hdfs://path/to/backup"; ``` #### 4. **StarRocks外表** StarRocks 提供了创建外表的功能,可以直接访问外部存储(如 Hive、HDFS、MySQL 等)中的数据,而无需将其导入到 StarRocks 中。这种方式适合于临时查询或分析外部数据的场景[^4]。 创建外表的示例: ```sql CREATE EXTERNAL TABLE external_table_name ( id BIGINT, name STRING ) ENGINE=HIVE PROPERTIES ( "hive.metastore.uri" = "thrift://metastore:9083", "database" = "hive_db", "table" = "hive_table" ); ``` #### 5. **跨集群迁移最佳实践** 在跨集群迁移过程中,可以通过以下步骤降低对线上业务的影响并确保稳定性: - 使用 Export 和 Broker Load 组合完成数据迁移。 - 监控迁移过程中的系统压力,评估对生产服务的影响。 - 在迁移前,测试目标集群的性能与兼容性[^4]。 #### 6. **信息_schema.columns 表** 如果需要获取表结构信息(如字段名称、注释或类型),可以直接查询 `information_schema.columns` 表。这种方式适用于需要将表结构信息展示在页面或搜索中的场景[^2]。 查询示例: ```sql SELECT column_name, data_type, column_comment FROM information_schema.columns WHERE table_name = 'your_table_name'; ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值