日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

gp数据库运维

發(fā)布時(shí)間:2024/1/4 综合教程 23 生活家
生活随笔 收集整理的這篇文章主要介紹了 gp数据库运维 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近需要將一份db2導(dǎo)出的歷史數(shù)據(jù)入庫(kù)gp集群,然后把每天的增量數(shù)據(jù)導(dǎo)出成txt文件和對(duì)應(yīng)的log日志,再ftp傳輸給另外一臺(tái)機(jī)器。其中陸續(xù)碰到一些坑,在此記錄

歷史文件數(shù)據(jù)清洗

列分隔符的選擇

碰到的第一個(gè)問題是db2導(dǎo)出的文件格式。因?yàn)橹暗膁b2腳本導(dǎo)出用的是export命令,coldel0x01 nochardel,指定16進(jìn)制的不可見字符0x01當(dāng)做列分隔符。而gp的copy命令雖然可以指定列分隔符,但是好像不能使用16進(jìn)制字符,所以這里的操作時(shí)把0x01都sed替換成((開始嘗試使用,|等常見字符,但是后來(lái)發(fā)現(xiàn)有部分表入庫(kù)失敗,grep搜索后發(fā)現(xiàn)是數(shù)據(jù)本身帶有這些字符,破壞了分列格式,最后嘗試之后發(fā)現(xiàn)沒有),于是用$當(dāng)成分隔符)

number類型字段的空值處理

歷史文件里的空值,對(duì)用pg字段里的number類型字段,會(huì)提示字段類型不匹配入庫(kù)失敗。這里才去的是把$$替換成(0),用0來(lái)替換空值

特殊轉(zhuǎn)義字符

經(jīng)過前2步操作,大部分表已經(jīng)入庫(kù)成功。對(duì)于失敗的表,發(fā)現(xiàn)清洗過的數(shù)據(jù)變成了亂碼,猜測(cè)是之前的sed操作出了問題。查看對(duì)應(yīng)的原始數(shù)據(jù),定位到失敗的具體行數(shù),發(fā)現(xiàn)里面有右斜杠,這樣在ascii里面的16進(jìn)制字符替換會(huì)出錯(cuò)。于是在清洗之前先把轉(zhuǎn)義的右斜杠替換成空

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進(jìn)制的列分隔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入庫(kù)
		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'

截取部分輸出日志

發(fā)現(xiàn)其中最大的一張表大概2000多萬(wàn)的數(shù)據(jù),入庫(kù)大概花了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

增量數(shù)據(jù)每天導(dǎo)出

gp導(dǎo)出文件權(quán)限

用gp的COPY命令導(dǎo)出文件時(shí),發(fā)現(xiàn)touch創(chuàng)建文件還不夠,會(huì)提示權(quán)限相關(guān)問題,于是改成777權(quán)限。

pg命令的環(huán)境變量

最后調(diào)好腳本在shell執(zhí)行都是正常的,但是通過ssh連接遠(yuǎn)程服務(wù)器執(zhí)行腳本時(shí),發(fā)現(xiàn)psql相關(guān)命令不能執(zhí)行,輸出亂碼。開始以為是gbk和utf8的編碼問題,浪費(fèi)了不少時(shí)間,后來(lái)是缺少gp的環(huán)境變量,將系統(tǒng)的相關(guān)的環(huán)境變量,在腳本里再寫了一次,可以正常使用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相關(guān)的環(huán)境變量,不然監(jiān)控平臺(tái)調(diào)用腳本執(zhí)行不了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/^[	]*//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傳輸?shù)竭h(yuǎn)程服務(wù)器

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

總結(jié)

以上是生活随笔為你收集整理的gp数据库运维的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。