最近需要将一份db2导出的历史数据入库gp集群,然后把每天的增量数据导出成txt文件和对应的log日志,再ftp传输给另外一台机器。其中陆续碰到一些坑,在此记录

历史文件数据清洗

列分隔符的选择

碰到的第一个问题是db2导出的文件格式。因为之前的db2脚本导出用的是export命令,coldel0x01 nochardel,指定16进制的不可见字符0x01当做列分隔符。而gp的copy命令虽然可以指定列分隔符,但是好像不能使用16进制字符,所以这里的操作时把0x01都sed替换成\((开始尝试使用,|等常见字符,但是后来发现有部分表入库失败,grep搜索后发现是数据本身带有这些字符,破坏了分列格式,最后尝试之后发现没有\),于是用$当成分隔符)

number类型字段的空值处理

历史文件里的空值,对用pg字段里的number类型字段,会提示字段类型不匹配入库失败。这里才去的是把$$替换成\(0\),用0来替换空值

特殊转义字符

经过前2步操作,大部分表已经入库成功。对于失败的表,发现清洗过的数据变成了乱码,猜测是之前的sed操作出了问题。查看对应的原始数据,定位到失败的具体行数,发现里面有右斜杠\,这样在ascii里面的16进制字符替换会出错。于是在清洗之前先把转义的右斜杠替换成空

shell脚本

#config begin
base_path="/data/" meta_host="*.*.*.*"
mete_user="postgres"
mete_databse="postgres"
mete_password="123456"
meta_port="5432" dw_host="*.*.*.*"
dw_user="postgres"
dw_database="postgres"
dw_password="123456"
#config end function insert_file(){
tb_name=$1;
file_name=${base_path}'C3208133000016-'${tb_name}'-20171024.txt' if [ -f "${file_name}" ]; then
#过滤\
sed -i 's/\\//g' ${file_name}
#16进制的列分隔0x01符替换成$
sed -i 's/\x01/\$/g' ${file_name} #把$$替换成$0$防止numeric类型的是空
for(( i=1;i<4;i++))
do
sed -i 's/\$\$/\$0\$/g' ${file_name}
done #psql入库
PGPASSWORD=${dw_database} psql -U ${dw_user} -d ${dw_database} -h ${dw_host} -c "copy sjck.${tb_name} from '${file_name}' WITH DELIMITER '$'"
echo $(date +%Y-%m-%d\ %H:%M:%S)','${tb_name}' end'
fi
} echo 'trans begin' count=0
for file in `PGPASSWORD=${mete_password} psql -U ${mete_user} -d ${mete_databse} -h ${meta_host} -p ${meta_port} -c "select distinct tb_name from sjck.table_columns where module='NEWCBRC'"|tail -n +3|head -n -2`
do
tb_name=${file}
((count++))
echo $(date +%Y-%m-%d\ %H:%M:%S)',num:'${count}',' ${tb_name}
insert_file ${tb_name}
done echo ${count}
echo 'trans end'

截取部分输出日志

发现其中最大的一张表大概2000多万的数据,入库大概花了15分钟

trans begin
2019-03-28 11:59:05,num:1? DGKH
COPY 24831
2019-03-28 11:59:11,DGKH end
******
2019-03-28 12:05:32,num:16? JYLS
COPY 21297993
2019-03-28 12:20:07,JYLS end

增量数据每天导出

gp导出文件权限

用gp的COPY命令导出文件时,发现touch创建文件还不够,会提示权限相关问题,于是改成777权限。

pg命令的环境变量

最后调好脚本在shell执行都是正常的,但是通过ssh连接远程服务器执行脚本时,发现psql相关命令不能执行,输出乱码。开始以为是gbk和utf8的编码问题,浪费了不少时间,后来是缺少gp的环境变量,将系统的相关的环境变量,在脚本里再写了一次,可以正常使用psql命令

shell脚本

#!/bin/bash

#config begin
base_path="/data/shell/txt_log/" meta_host="*.*.*.*"
mete_user="postgres"
mete_databse="postgres"
mete_password="123456"
meta_port="5432" dw_host="*.*.*.*"
dw_user="gpadmin"
dw_database="postgres"
dw_password="123456"
#config end #要配置psql相关的环境变量,不然监控平台调用脚本执行不了psql命令
source /uur/local/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/master/gpseg-1 DATE=`date -d '-'1' day' +%Y%m%d`
bg_dt_zcc=`date -d '-'1' day' +%Y-%m-%d` echo ${DATE}"-task begin" function make_file(){
tb_name=$1;
filenm="C3208133000016-"${tb_name}"-"${DATE}
file_name=${filenm}".txt"
log_name=${filenm}".log"
data_path=${base_path}${file_name}
data_temppath=${base_path}${filenm}"_temp.txt"
log_path=${base_path}${log_name} if [ ! -f "${data_temppath}" ];then
touch "${data_temppath}"
fi
echo ${data_temppath}
chmod 777 ${data_temppath}
PGPASSWORD=${dw_database} psql -U ${dw_user} -d ${dw_database} -h ${dw_host} -c "COPY (select * from tbbak.${tb_name} where bg_dt_zcc='${bg_dt_zcc}') to '${data_temppath}'" echo "select * from tbbak.${tb_name} where bg_dt_zcc='${bg_dt_zcc}'" #删除拉链日期字段
awk '{$1="";$2="";print $0}' ${data_temppath} > ${data_path}
#去除行首空格
sed -i 's/^[\t]*//g' ${data_path} if [ ! -f "${log_path}" ];then
touch "${log_path}"
fi
echo ${log_path}
echo ${file_name} >> ${log_path} filesize=$(wc -c ${data_path} | awk '{print $1}')
echo $filesize >> ${log_path} fileday=$(ls --full-time ${data_path} | awk '{print $6}')
filetime=$(ls --full-time ${data_path} | awk '{print $7}')
filetime1=$(echo ${filetime:0:8})
echo ${fileday}" "${filetime1}>>${log_path}
fileline=$(cat ${data_path} |wc -l)
echo 'Y'>> ${log_path}
echo $fileline >> ${log_path}
echo $(date +%Y-%m-%d\ %H:%M:%S)','${tb_name}" finish"
} count=0
for file in `PGPASSWORD=${mete_password} psql -U ${mete_user} -d ${mete_databse} -h ${meta_host} -p ${meta_port} -c "select distinct tb_name from sjck.table_columns where module='NEWCBRC'"|tail -n +3|head -n -2`
do
tb_name=${file}
((count++))
echo $(date +%Y-%m-%d\ %H:%M:%S)',num:'${count}',' ${tb_name}
make_file ${tb_name}
done make_file 'DGKH' echo "size is:"${count}
echo ${DATE}"-task end"

生成文件后,ftp传输到远程服务器

ftp -n<<!
open *.*.*.*
user guest 123456
binary
hash
cd /data/remote
lcd /data/local
prompt
mput *
close
bye
!

gp数据库运维的更多相关文章

  1. Oracle数据库运维优化六脉神剑口诀

    我们知道数据库性能是数据库运维中至关重要的一个部分,据传在Oracle数据库的江湖中也有威力无比的六脉神剑技能,下面与大家免费分享Oracle大师们广为流传的六脉神剑口诀,一般人我不告诉他哦:) 少商 ...

  2. MySQL数据库运维课程

    MySQL数据库运维课程 http://www.dataguru.cn/article-4834-1.html?union_site=comm100 课程大纲 第一课:机器选型.系统规划 第二课:安装 ...

  3. 一个兼职DBA的数据库运维经验 小米科技 xx@xiaomi.com 2011

    一个兼职DBA的数据库运维经验 小米科技  xx@xiaomi.com 2011 内存扩容 16G->64G ,调大bp后,凌晨说监控物理内存有余量情况下,开吃swap,内存泄露措施1  定时 ...

  4. MySQL数据库运维的五大指标

    如何评价一个公司数据库运维水平的高低?用什么来进行横向与纵向对比?自动化平台建设的目标是什么?必须有相应的指标体系来指导,此指标体系必须满足以下条件: • 可以用数字来测算和衡量 • 最终指标,而不是 ...

  5. 数栈运维实例:Oracle数据库运维场景下,智能运维如何落地生根?

    从马车到汽车是为了提升运输效率,而随着时代的发展,如今我们又希望用自动驾驶把驾驶员从开车这项体力劳动中解放出来,增加运行效率,同时也可减少交通事故发生率,这也是企业对于智能运维的诉求. 从人工运维到自 ...

  6. 数据库运维之路——关于tempdb暴增实战案例

    转眼间,2021年的第一个季度已经到了最后一个月了,由于疫情原因,最近一段时间一直在北京,基本上没有出差,每天上班下班的日子感觉时间过的好快,新的一年继续努力奋斗啊. 仔细回想一下,自己踏入到sql ...

  7. 从一个简单的约束看规范性的SQL脚本对数据库运维的影响

    之前提到了约束的一些特点,看起来也没什么大不了的问题,http://www.cnblogs.com/wy123/p/7350265.html以下以实际生产运维中遇到的一个问题来说明规范的重要性. 如下 ...

  8. 【数据库运维】数据库(server)的时区设置及世界主要地区的时区

    [时区设置不当会有什么问题] 当进行海外项目运维的时候,常常会遇到时区设置的问题.假设时区设置不当 或者 同样项目的server之间的时区不一致,都会有导致项目的数据异常的风险. 假设数据表的字段使用 ...

  9. mysql数据库运维方案

    数据库不仅仅是dba的工作,每一个测试人员也应该懂得基本的数据运维操作,因为数据库是数据承载的地方并且是系统中非常重要的一部分,所以我们也需要熟练的对数据库进行基本维护. 01.常用备份恢复命令 第1 ...

随机推荐

  1. 奇葩字符 "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎" 的简单分析

    这个其实之前火过一阵子,当时也没怎么注意,今天看到空间里又有人在刷这个字符了,所以决定分析下他是什么东西.复制这个字符在控制台查看 "a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎".l ...

  2. 知识笔记:jQuery 事件对象属性小结

    使用事件自然少不了事件对象.因为不同浏览器之间事件对象的获取,以及事件对象的属性都有差异,导致我们很难跨浏览器使用事件对象.jQuery中统一了事件对象,当绑定事件处理函数时,会将jQuery格式化后 ...

  3. Android 动态添加Spinner(.java文件内实现) 实现 改变spinner 内文字属性

    动态添加spinner 控件 Spinner s = new Spinner(this); String []items={"自己定义的要显示的数组"}; my_SpinnerAd ...

  4. CodeForces 816B 前缀和

    To stay woke and attentive during classes, Karen needs some coffee! Karen, a coffee aficionado, want ...

  5. promise顺序执行,返回结果存放在数组

    遇到面试的一个编程题:三个返回promise对象的异步操作,让你写一个函数可以将这些操作顺序执行,并返回一个数组包含三个异步对象的结果 异步对象: // 异步函数a var a = function ...

  6. 【leetcode 简单】 第一百一十一题 可怜的小猪

    有1000只水桶,其中有且只有一桶装的含有毒药,其余装的都是水.它们从外观看起来都一样.如果小猪喝了毒药,它会在15分钟内死去. 问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少 ...

  7. 34、Collections工具类简介

    Collections工具类简介 就像数组中的Arrays工具类一样,在集合里面也有跟Arrays类似的工具类Collections package com.sutaoyu.Collections; ...

  8. Linux服务-nginx+nfs实现共享存储

    任务目标:一台服务器进行更改,其他两台服务器访问均同步 现在的情况是: web1.html文件访问的结果是web1 现在我在Web1这台机器上更改web1.html,内容为change in web1 ...

  9. yii验证系统学习记录,基于yiicms(二)

    /** * Validates the specified object. * @param \yii\base\Model $model the data model being validated ...

  10. 树形dp(B - Computer HDU - 2196 )

    题目链接:https://cn.vjudge.net/contest/277955#problem/B 题目大意:首先输入n代表有n个电脑,然后再输入n-1行,每一行输入两个数,t1,t2.代表第(i ...