Shell 数据库迁移实现

  • SQL数据Dump 可以使用 mysql 命令 或者 mysqldump命令进行源数据数据的导出

mysql -e "select * from trade_info" -u cs_beta -pqabeta settle_tradeflow -h l-hscdb1.h.beta.cn6.qunar.com >order_day_stat.sql

dump的数据格式如下

1  36586  QunarOTA  PPMTransform

  • 配置Mapping文件 order_day_stat.mapping  , 这个文件时用于目标源 和 源数据 表数据的关系映射

supplier_id=2
his_day=3
order_count=4
order_fee_sum=5
currency_type=6


配置config.properties 文件  ,配置数据库的连接信息等

db_host=***.h.beta.cn6.qunar.com
db_port=3306
db_name=settle_tradeflow
db_username=cs_beta
db_password=qabeta
sql_file=tmp.sql



  • Shell 脚本进行数据解析,和SQl 插入

sqlCreator.sh 生成执行需要的Sql ,存放在tmp.sql 临时文件中

#!/bin/bash
####################################################
#配置文件定义
DIR=`pwd`
CONFIG_FILE=$DIR"/config.properties"

####################################################
#输入文件
input_file=$2
#映射配置
mapping=$1
#table_name
table_name=`echo $input_file | awk -F '.' '{print $1}'`

input_file=$DIR"/"$input_file
mapping=$DIR"/"$mapping
#Sql存储位置
sql_file=`sudo cat $CONFIG_FILE | grep "sql_file" | awk -F '=' '{print $2}'`
sql_file=$DIR"/"$sql_file
####################################################

#######构造插入语句################################
#table 名字
insert_sql="insert into $table_name"
#构建Sql的name值
insert_name="("
for line in `cat $mapping`
do
	temp_name=`echo $line | awk -F '=' '{print $1}'`
	insert_name=$insert_name$temp_name","
done

last_index=`expr length $insert_name - 1` 
insert_name=`expr substr $insert_name 1 $last_index`
insert_sql=$insert_sql$insert_name') values '

values_str=''
while read line
do
	values_str=$values_str"("
	OLD_IFS="$IFS" 
	IFS="," 
	arr=($line)
	IFS="$OLD_IFS"
	len=${#arr[@]} 
	for ((i=0;i<len;++i));do		
		value=${arr[$i]}
		values_str=$values_str"'"$value"',"
	done
	last_index=`expr length "$values_str" - 1`
	values_str=`expr substr "$values_str" 1 $last_index`
	#values_str=$values_str"),"
	values_str=$values_str")"
	#将生成好的Sql写入到文件中
	echo $insert_sql$values_str";" >> $sql_file
	values_str=''
done<$input_file
last_index=`expr length "$values_str" - 1`
values_str=`expr substr "$values_str" 1 $last_index`

#最终组装好的执行Sql
#insert_sql=$insert_sql$values_str";"
#echo $insert_sql



sqlexcutor.sh 执行Sql 脚本

#!/bin/bash
####################################################
#配置文件定义
DIR=`pwd`
CONFIG_FILE=$DIR"/config.properties"

#####################################################
#数据库配置信息
#数据库地址
db_host=`sudo cat $CONFIG_FILE | grep "db_host" | awk -F '=' '{print $2}'`
#数据库
db_name=`sudo cat $CONFIG_FILE | grep "db_name" | awk -F '=' '{print $2}'`
#端口号
db_port=`sudo cat $CONFIG_FILE | grep "db_port" | awk -F '=' '{print $2}'`
#用户名
db_username=`sudo cat $CONFIG_FILE | grep "db_username" | awk -F '=' '{print $2}'`
#密码
db_password=`sudo cat $CONFIG_FILE | grep "db_password" | awk -F '=' '{print $2}'`

####################################################
#sql文件
sql_file=`sudo cat $CONFIG_FILE | grep "sql_file" | awk -F '=' '{print $2}'`
sql_file=$DIR"/"$sql_file

len=`cat $sql_file | wc -l`
sql=`cat $sql_file`
mysql -s -u$db_username -p$db_password $db_name -h $db_host -P $db_port -e "$sql"

#for((i=0;i<len;++i))
#do
#	echo `cat $sql_file | sed -n "${i}p"`
#	mysql -s -u$db_username -p$db_password $db_name -h $db_host -P $db_port -e "$sql"
#done



do.sh 执行脚本

#/bin/bash
dir=`pwd`
for line in `ls | grep '.mapping'`
do
	table_name=`echo $line | awk -F '.' '{print $1}'`
	data_file=$table_name".sql"
	# 执行生成Sql语句
	`$dir/sqlcreator.sh "$line" "$data_file"`
	# 执行Sql语句
	`$dir/sqlexcutor.sh`
	#删除Sql
#	`sudo rm $dir/tmp.sql`
done



你可能感兴趣的:(mysql,shell,存储,数据库迁移)