一个从oracle使用spool导出数据到kadb的脚本

devtools/2024/12/28 10:49:54/

1. dump_data.sh调用sql_dump.sh导出数据

2. load_data.sh将导出的数据加载至KADB

1. dump_data.sh

#!/bin/bash
begin_time=$(date +%Y%m%d -d '-1 day')
end_time=$(date +%Y%m%d)
echo "数据导出日期:"$begin_time
echo "数据导出日期:"$begin_time >> .//log/dump_data_$begin_time.log
echo "数据导出终止日期:"$end_time
echo "数据导出终止日期:"$end_time >> .//log/dump_data_$begin_time.log
while read LINE
do
  echo "表名:"$LINE
  echo "表名:"$LINE >> .//log/dump_data_$begin_time.log
  echo "执行参数: 表名 导出类型 开始时间 结束时间: "$LINE $begin_time $end_time
  echo "执行参数: 表名 导出类型 开始时间 结束时间: "$LINE $begin_time $end_time >> .//log/dump_data_$begin_time.log
  echo "./sql_dump.sh $LINE $begin_time $end_time"
  echo [`date +%Y-%m-%d_%H:%M:%S`]"执行导出操作:./sql_dump.sh $LINE $begin_time $end_time"
  echo [`date +%Y-%m-%d_%H:%M:%S`]"执行导出操作:./sql_dump.sh $LINE $begin_time $end_time" >> .//log/dump_data_$begin_time.log
  while [[ 1==1 ]]
  do
    echo '检查当前export进程数......'
    echo '检查当前export进程数......' >> .//log/dump_data_$begin_time.log
    sleep 2 
    ips=`ps -ef | grep -v grep| grep sql_dump | wc -l`
    echo 当前export进程数: $ips
    echo 当前export进程数: $ips >> .//log/dump_data_$begin_time.log
    if [ ${ips} -ge 4 ];then
      sleep 2 
    else
      #nohup sh ./sql_dump.sh $LINE $begin_time $end_time > .//"${LINE%% *}_`date +%Y%m%d`".log 2>&1 &
      nohup sh ./sql_dump.sh $LINE $begin_time $end_time >> .//log/dump_data_$begin_time.log 2>&1 &
      break;
    fi
  done
done < table.lst
 

2. sql_dump.sh

test=$1
flag=$2
begin_time=$3
end_time=$4
line=`wc -l $test.sql | cut -d ' ' -f 1`
export line
#echo 表名:$test 导出类型:$flag 列数:$line
echo 表名:$test 导出类型:$flag 列数:$line >> .//log/dump_data_$begin_time.log
if [ $flag = 'E' ];then
#  echo 当前表导出类型:$flag
  #echo 当前表导出类型:$flag >> .//log/"${test}_$begin_time".log
  awk -v line="$line" 'BEGIN{sql="select "}{if(NR<line){if($2~/char/){sql='sql'"replace("$1",chr(10),'\'''\'')\n""||'\'''\''||"}else{sql='sql'$1"||'\'''\''||"}}else{if($2~/char/){sql='sql'"replace("$1",chr(10),'\'''\'')"}else{sql='sql'$1}}}END{print 'sql'" from ""'$test'"" where fd_ie_flag=""'\''""'$flag'""'\''"" and fd_cus_release_time >= to_date(""'\''""'$begin_time'""'\'','\''yyyymmdd'\'')"" and fd_cus_release_time < to_date(""'\''""'$end_time'""'\'','\''yyyymmdd'\'')"";"}' ${test}.sql > ${test}_E.out
  cat ${test}_E.out
#  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test开始导出数据
  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test开始导出数据 >> .//log/dump_data_$begin_time.log
sqlplus -s / as sysdba << EOF 
set trimspool on;
set heading off;
set term off;
set feedback off;
set echo off;
SET SQLPROMPT "";
SET NEWPAGE NONE;
spool /home/oracle/${test}_E_${begin_time}.txt
@ ${test}_E.out
spool off;
set SQLPROMPT "SQL>";
exit;
EOF
touch ${test}_E_${begin_time}.done
#  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test导出数据完成
  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test导出数据完成 >> .//log/dump_data_$begin_time.log
  chmod 777 /home/oracle/${test}_E_${begin_time}.txt
elif [ $flag = 'I' ];then
  echo 当前表导出类型:$flag
#  echo 当前表导出类型:$flag >> .//"${test}_$begin_time".log
  awk -v line="$line" 'BEGIN{sql="select "}{if(NR<line){if($2~/char/){sql='sql'"replace("$1",chr(10),'\'''\'')\n""||'\'''\''||"}else{sql='sql'$1"||'\'''\''||"}}else{if($2~/char/){sql='sql'"replace("$1",chr(10),'\'''\'')"}else{sql='sql'$1}}}END{print 'sql'" from ""'$test'"" where fd_ie_flag=""'\''""'$flag'""'\''"" and fd_cus_clear_time >= to_date(""'\''""'$begin_time'""'\'','\''yyyymmdd'\'')"" and fd_cus_clear_time < to_date(""'\''""'$end_time'""'\'','\''yyyymmdd'\'')"";"}' ${test}.sql > ${test}_I.out
  cat ${test}_I.out
#  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test开始导出数据
  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test开始导出数据 >> .//log/dump_data_$begin_time.log
sqlplus -s / as sysdba << EOF 
set trimspool on;
set heading off;
set term off;
set feedback off;
set echo off;
SET SQLPROMPT "";
SET NEWPAGE NONE;
spool /home/oracle/${test}_I_${begin_time}.txt
@ ${test}_I.out
spool off;
set SQLPROMPT "SQL>";
exit;
EOF
touch ${test}_I_${begin_time}.done
#  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test导出数据完成
  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test导出数据完成 >> .//log/dump_data_$begin_time.log
  chmod 777 /home/oracle/${test}_I_${begin_time}.txt
else
  echo 当前表导出类型:$flag
  echo 当前表导出类型:$flag >> .//"${test}_$begin_time".log
  awk -v line="$line" 'BEGIN{sql="select "}{if(NR<line){if($2~/char/){sql='sql'"replace("$1",chr(10),'\'''\'')\n""||'\'''\''||"}else{sql='sql'$1"||'\'''\''||"}}else{if($2~/char/){sql='sql'"replace("$1",chr(10),'\'''\'')"}else{sql='sql'$1}}}END{print 'sql'" from ""'$test'"" where fd_cus_release_time >= to_date(""'\''""'$begin_time'""'\'','\''yyyymmdd'\'')"" and fd_cus_release_time < to_date(""'\''""'$end_time'""'\'','\''yyyymmdd'\'')"";"}' ${test}.sql > ${test}.out
  cat ${test}.out
#  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test开始导出数据
  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test开始导出数据 .//log/dump_data_$begin_time.log
sqlplus -s / as sysdba << EOF 
set trimspool on;
set heading off;
set term off;
set feedback off;
set echo off;
SET SQLPROMPT "";
SET NEWPAGE NONE;
spool /home/oracle/${test}_${begin_time}.txt
@ $test.out
spool off;
set SQLPROMPT "SQL>";
exit;
EOF
touch ${test}_${begin_time}.done
#  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test导出数据完成
  echo [`date +%Y-%m-%d_%H:%M:%s`]..表$test导出数据完成 .//log/dump_data_$begin_time.log
  chmod 777 /home/oracle/${test}_${begin_time}.txt
fi
 

3. load_data.sh

#!/bin/bash
begin_time=$(date +%Y%m%d -d '-1 day')
end_time=$(date +%Y%m%d)
echo 导入开始日期: $begin_time
echo 导入结束日期: $end_time
WORKPATH=`dirname $0`

get_port()
{
  kbport=$1
  while [ $kbport -le 50000 ]   
  do
    /usr/sbin/lsof -i:$kbport > /dev/null
    if [ $? -eq 1 ]
    then
      echo $kbport
      break
    else
      let kbport+=2
    fi
  done
}

while read LINE
do
  #echo 表名: $LINE
  type=${LINE##* }
  if [ $type = 'O' ];then
    table_name=${LINE%% *}
  else
    table_name=${LINE%% *}_$type
  fi
  echo 待导入表: $table_name
  KB_PORT=`get_port 40000`        #获取gpfdist可用的端口
  while true
  do
    /usr/sbin/lsof -i:${KB_PORT} 
    if [ $? -eq 1 ]
    then
      if [ ! -d $WORKPATH/${KB_PORT} ]; 
      then
        mkdir $WORKPATH/${KB_PORT}
        if [ $? -ne 0 ];then
          echo $KB_PORT端口已经被使用
          let KB_PORT+=2
          KB_PORT=`get_port $KB_PORT`
          continue;
        fi
        if [[ "$table_name" =~ _I$ ]];then 
          table_name_r=${table_name%_*}
          echo $table_name_r
          sed -e "s#THISISDATADIRECTORY#\./${table_name}_${begin_time}.txt#g;s#zhuyongzhuyong#${table_name_r}#g;s/KBPORT/${KB_PORT}/g;s/EXECSQLSTAT/delete from ${table_name_r} where fd_ie_flag='I' and fd_cus_clear_time >= to_date('${begin_time}','yyyymmdd') and fd_cus_clear_time < to_date('${end_time}','yyyymmdd');/g" z.mod > $table_name.yml
          cat $table_name.yml
          break;
        elif [[ "$table_name" =~ _E$ ]]; then
          table_name_r=${table_name%_*}
          echo $table_name_r
          sed -e "s#THISISDATADIRECTORY#\./${table_name}_${begin_time}.txt#g;s#zhuyongzhuyong#${table_name_r}#g;s/KBPORT/${KB_PORT}/g;s/EXECSQLSTAT/delete from ${table_name_r} where fd_ie_flag='E' and fd_cus_release_time >= to_date('${begin_time}','yyyymmdd') and fd_cus_release_time < to_date('${end_time}','yyyymmdd');/g" z.mod > $table_name.yml
          cat $table_name.yml
          break;
        else
          echo $table_name
          sed -e "s#THISISDATADIRECTORY#\./${table_name}_${begin_time}.txt#g;s#zhuyongzhuyong#${table_name}#g;s/KBPORT/${KB_PORT}/g;s/EXECSQLSTAT/delete from ${table_name} where fd_cus_release_time >= to_date('${begin_time}','yyyymmdd') and fd_cus_release_time < to_date('${end_time}','yyyymmdd');/g" z.mod > $table_name.yml
          cat $table_name.yml
          break;
        fi
      else
        let KB_PORT+=2
         KB_PORT=`get_port $KB_PORT`
      fi 
    else
      sleep $(($RANDOM%5))
      let KB_PORT+=2      
      KB_PORT=`get_port $KB_PORT`  
    fi  
  done
  while true
  do
    if [ -f ${table_name}_${begin_time}.done ];then
      ips=`ps -ef | grep -v grep| grep sql_dump | wc -l`
      if [ ${ips} -ge 4 ];then
        sleep 2
      else
        echo "begin load"
        #echo "`date "+%Y-%m-%d_%H:%M:%S"`开始装载表:${table_name}"
        #nohup gpload -f $table_name.yml > ./log/gpload_$table_name_`date +%Y%m%d`.log &
        #grep "errors = [^0]\|failed\|ERROR" ./log/gpload_${table_name}_`date +%Y%m%d`.log > /dev/null    #检查gpload是否成功
        #if [ $? -eq 0 ]; then
    #  echo "GPLOAD ERROR!"
    #  echo $table_name >> ./log/error_`date +%Y%m%d`.lst
     #fi
        #echo "`date "+%Y-%m-%d_%H:%M:%S"`结束装载表:${table_name}"
        #ROWSLOAD=`cat $WORKPATH/load_log/gpload_${table_name}_$(date +%Y%m%d).log | grep "rows Inserted" | cut -d "=" -f 2 | sed 's/^ //'`    #获取装载数据行数
    #echo $ROWSLOAD
    #echo "`date "+%Y-%m-%d_%H:%M:%S"`本次装载数据${ROWSLOAD}行"
        rm -rf $WORKPATH/${KB_PORT}
        break;
      fi
    else
      echo ${table_name}_${begin_time}.txt have not done 
      sleep 10
      continue;
    fi
  done
done < table.lst


 


http://www.ppmy.cn/devtools/146090.html

相关文章

《机器学习》KNN算法实现手写数字识别

目录 一、项目介绍 二、数据集介绍 三、需要解决的问题 四、代码实际展示 代码展示 实验结果 五、使用自己的数据进行测试 代码展示 结果展示 六、总结 一、项目介绍 通过对一张2000*1000像素写满0-9手写数字的图片进行处理。分割出训练集和测试集使用KNN算法进行训练…

STM32使用UART发送字符串与printf输出重定向

首先我们先看STM32F103C8T6的电路图 由图可知&#xff0c;其PA9和PA10引脚分别为UART的TX和RX(注意&#xff1a;这个电路图是错误的&#xff0c;应该是PA9是X而PA9是RX&#xff0c;我们看下图的官方文件可以看出)&#xff0c;那么接下来我们应该找到该引脚的定义是什么&#xf…

[银河麒麟] Geogebra

Geogebra 几何作图工具 是一款跨平台的几何作图工具软件&#xff0c; 目前已经覆盖了&#xff0c; windows&#xff0c;android&#xff0c; mac, linux 等操作系统。 Geogebra 官网 Geogebra 官网提供了 Geogebra 5.0 版本下载包, Linux Portable 双击 geogebra-portable…

基于自然语言处理(NLP)的智能客服系统

基于自然语言处理&#xff08;NLP&#xff09;的智能客服系统是现代客户服务领域的一项重要技术&#xff0c;它通过模拟人类对话的方式&#xff0c;为用户提供及时、准确和个性化的服务。以下是关于基于NLP的智能客服系统的一些关键要素和功能&#xff1a; 1. 自然语言理解&am…

无人机+自组网+通信指挥车:应急救援空地技术详解

“无人机自组网通信指挥车”这一组合在应急救援领域展现出了强大的空地协同能力&#xff0c;为救援行动提供了高效、实时的信息支持和指挥决策。以下是对这一应急救援空地技术的详细解析&#xff1a; 一、系统组成 1. 无人机 作为空中平台&#xff0c;无人机具备广阔的视野和…

通过Cephadm工具搭建Ceph分布式存储以及通过文件系统形式进行挂载的步骤

1、什么是Ceph Ceph是一种开源、分布式存储系统&#xff0c;旨在提供卓越的性能、可靠性和可伸缩性。它是为了解决大规模数据存储问题而设计的&#xff0c;使得用户可以在无需特定硬件支持的前提下&#xff0c;通过普通的硬件设备来部署和管理存储解决方案。Ceph的灵活性和设计…

Android 之 Activity 的启动模式(launchMode)

一、Activity 启动模式 在实际项目中&#xff0c;应该根据项目的实际需要来为每个 Activity 指定恰当的启动模式 launchMode。启动模式一共有四种&#xff0c;分别是 standard、singleTop、singleTask 和 singleInstance。可以在 AndroidManifest.xml 中通过给 <activity&g…

【ETCD】【实操篇(十四)】etcd 集群备份与还原指南

etcd 是一个高可用的分布式键值存储&#xff0c;常用于分布式系统的配置共享和服务注册。本文将基于提供的启动脚本&#xff0c;详细讲解如何对 etcd 集群进行数据的备份与还原。 目录 一、启动 etcd 集群二、备份 etcd 数据1. 使用 etcdctl 保存快照2. 验证快照文件 三、还原 …