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

相关推荐
JosieBook9 分钟前
【数据库】把数据优势转化为决策优势:TimechoAI时序大模型使用解析
数据库
原野池予22 分钟前
深入Java集合框架:HashMap源码解析(JDK 8)
java·开发语言
古法安卓28 分钟前
Android-Direct Boot 阶段与 getFilesDir() 路径变更问题深度分析
android·java·android studio
-今昭-31 分钟前
Logstash 管理
java·服务器·前端
测试运维日常笔记32 分钟前
VMware vSphere、ESXi 与 vCenter Server:核心概念与关系详解
java·开发语言
会编程的吕洞宾44 分钟前
MySQL 慢查询从5秒到50毫秒:索引失效六大场景定位与实战调优
数据库·mysql
浅念-1 小时前
MySQL 索引底层完整详解|磁盘Page|B+树推导|聚簇非聚簇索引|索引SQL操作
大数据·数据库·b树·sql·mysql·面试·职场和发展
风流 少年1 小时前
Spring AI 2.0:Flux
java·人工智能·spring
m0_547486661 小时前
《面向对象与Java程序设计》全套PPT课件2026
java·开发语言
小马过河R1 小时前
数据仓库入门:是什么、怎么做、和数据库有什么区别?
大数据·数据库·数据仓库·架构·驾驭工程·fde