华为云高斯数据库:gsqlexec用法

A。脚本功能

复制代码
source ~/.bash_profile
gsqlexec "copy (SELECT * FROM station_power_day --源表
WHERE  period_date >= '2025-08-01 00:00:00.000000' AND period_date <= '2026-01-07 00:00:00.000000' )  to STDOUT" "$DQUERY" | gsqlexec "begin;
truncate table station_power_day_test  --目标表
;copy station_power_day_test --目标表
from STDIN;commit;" "$DTEST"
1. 加载环境变量
复制代码
source ~/.bash_profile
  • 作用:加载当前用户的环境变量,确保脚本可以访问必要的环境变量,如数据库连接信息等。
2. 导出和导入数据
复制代码
gsqlexec "copy (SELECT * FROM station_power_day --源表
WHERE  period_date >= '2025-08-01 00:00:00.000000' AND period_date <= '2026-01-07 00:00:00.000000' )  to STDOUT" "$DQUERY" | gsqlexec "begin;
truncate table station_power_day_test  --目标表
;copy station_power_day_test --目标表
from STDIN;commit;" "$DTEST"
  • 导出数据

    • 从源表 station_power_day中导出满足条件的数据(period_date2025-08-012026-01-07 之间)。

    • 使用 COPY 命令将数据导出到标准输出(STDOUT)。

  • 导入数据

    • 清空目标表 station_power_day_test

    • 将从标准输入(STDIN)接收到的数据导入到目标表 station_power_day_test

    • 使用事务管理(BEGIN;COMMIT;)确保操作的原子性。

B。脚本功能

这个脚本的目的是将 station_power_day 表中的数据分批导出,并导入到目标表 station_power_day_test 中。脚本按天粒度处理数据,确保每个批次的操作是独立的事务。

脚本解析

1. 加载环境变量
复制代码
source ~/.bash_profile
  • 作用:加载当前用户的环境变量,确保脚本可以访问必要的环境变量,如数据库连接信息等。
2. 定义分批导出和导入的函数
复制代码
batch_copy() {
    local start_date=$1
    local end_date=$2

    echo "Processing data from $start_date to $end_date"

    # 导出指定日期范围内的数据
    gsqlexec "COPY (SELECT * FROM station_power_day WHERE period_date >= '$start_date'::date AND period_date < '$end_date'::date) TO STDOUT" "$DQUERY" | \
    # 导入数据到目标表
    gsqlexec "BEGIN; DELETE FROM station_power_day_test WHERE period_date = '$start_date'::date; COPY station_power_day_test FROM STDIN; COMMIT;" "$DTEST"
}
  • batch_copy 函数

    • 参数

      • $1start_date,表示当前批次的起始日期。

      • $2end_date,表示当前批次的结束日期。

    • 功能

      1. 导出数据

        • 从源表 station_power_day 中导出指定日期范围内的数据。

        • 使用 COPY 命令将数据导出到标准输出(STDOUT)。

      2. 导入数据

        • 开始一个事务。

        • 使用 DELETE 清空目标表 station_power_day_test 中指定日期的数据。

        • 使用 COPY 命令将数据导入到目标表。

        • 提交事务,确保所有操作生效。

3. 定义日期范围
复制代码
start_date="20251001"
end_date="20260107"
date_ranges=()

# 生成日期范围数组
while [[ "$start_date" < "$end_date" ]]; do
    date_ranges+=("$start_date")
    start_date=$(date -I -d "$start_date + 1 day" | tr -d '-')
done
  • 作用 :生成从 2025100120260107 的日期范围,按天粒度。

  • 逻辑

    • 使用 while 循环从 20251001 开始,逐天生成日期,直到 20260107

    • 使用 date 命令生成下一个日期,并将其格式化为 YYYYMMDD 格式(通过 tr -d '-' 去掉日期中的 -)。

    • 将每个日期添加到 date_ranges 数组中。

4. 遍历日期范围并执行分批导出和导入
复制代码
for start_date in "${date_ranges[@]}"; do
    end_date=$(date -I -d "$start_date + 1 day" | tr -d '-')
    echo "Processing data from $start_date to $end_date"
    batch_copy "$start_date" "$end_date"
done
  • 功能

    • 遍历 date_ranges 数组中的每个日期。

    • 对于每个日期,计算结束日期(当前日期的下一天)。

    • 调用 batch_copy 函数,处理当前日期范围内的数据。

    • 打印当前处理的日期范围,方便跟踪进度。

事务独立性

  • 每个批次的事务是独立的,因为每个批次都在自己的事务中完成操作。

  • 每个批次的操作包括:

    1. 导出数据:从源表导出指定日期范围内的数据。

    2. 清空数据 :使用 DELETE 清空目标表中指定日期的数据。

    3. 导入数据:将导出的数据导入到目标表。

    4. 提交事务:确保所有操作生效。

相关推荐
lekami_兰7 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
xiaoxue..7 小时前
合并两个升序链表 与 合并k个升序链表
java·javascript·数据结构·链表·面试
JQLvopkk7 小时前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
Dxy12393102167 小时前
别再让 ES 把你拖垮!5 个实战技巧让搜索性能提升 10 倍
大数据·elasticsearch·搜索引擎
忧郁的Mr.Li7 小时前
SpringBoot中实现多数据源配置
java·spring boot·后端
yq1982043011567 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class7 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人7 小时前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
golang学习记7 小时前
IntelliJ IDEA 2025.3 重磅发布:K2 模式全面接管 Kotlin —— 告别 K1,性能飙升 40%!
java·kotlin·intellij-idea
爬山算法7 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
java·压力测试·hibernate