华为云高斯数据库: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. 提交事务:确保所有操作生效。

相关推荐
小五传输1 分钟前
认准好用的跨网文件安全交换系统:安全传输与高效协作两全其美
大数据·运维·安全
天天摸鱼的java工程师4 分钟前
工作中 Java 程序员如何集成 AI?Spring AI、LangChain4j、JBoltAI 实战对比
java·后端
星辰_mya4 分钟前
RockerMQ之commitlog与consumequeue
java·开发语言
Gofarlic_oms14 分钟前
从手动统计到自动化:企业AutoCAD许可管理进化史
大数据·运维·网络·人工智能·微服务·自动化
tyatyatya5 分钟前
MySQL Group Replication(MGR)集群部署,实现自动故障切换
数据库·mysql
b***59435 分钟前
mysql 迁移达梦数据库出现的 sql 语法问题 以及迁移方案
数据库·sql·mysql
__万波__5 分钟前
二十三种设计模式(二十二)--策略模式
java·设计模式·策略模式
木风小助理5 分钟前
MySQL中COUNT()、COUNT(1)与COUNT
数据库
不想上班的小吕6 分钟前
采购申请创建(BAPI_PR_CREATE/BAPI_REQUISITION_CREATE)
java·服务器·数据库
j***89467 分钟前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql