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_date在2025-08-01到2026-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函数:-
参数:
-
$1:start_date,表示当前批次的起始日期。 -
$2:end_date,表示当前批次的结束日期。
-
-
功能:
-
导出数据:
-
从源表
station_power_day中导出指定日期范围内的数据。 -
使用
COPY命令将数据导出到标准输出(STDOUT)。
-
-
导入数据:
-
开始一个事务。
-
使用
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
-
作用 :生成从
20251001到20260107的日期范围,按天粒度。 -
逻辑:
-
使用
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函数,处理当前日期范围内的数据。 -
打印当前处理的日期范围,方便跟踪进度。
-
事务独立性
-
每个批次的事务是独立的,因为每个批次都在自己的事务中完成操作。
-
每个批次的操作包括:
-
导出数据:从源表导出指定日期范围内的数据。
-
清空数据 :使用
DELETE清空目标表中指定日期的数据。 -
导入数据:将导出的数据导入到目标表。
-
提交事务:确保所有操作生效。
-