1. 程式人生 > >mysql資料遷移shell 指令碼

mysql資料遷移shell 指令碼

有兩個指令碼第一個mysql_db_trans.sh,第二個mysql_all_db_trans.sh。這個兩個指令碼可能存在缺陷,放在這裡只是為了方便自己檢視。

mysql_db_trans.sh

#!/bin/sh

tmp_dbname=$1
db_old_name=$2
db_new_name=$3
db_ip=$4
db_port=$5
db_user=$6
trans_type=$7
db_pwd=$8

start_date=
end_date=

#---------function list
DO_LOG()
{
time=`date "+%Y-%m-%d %H:%M:%S"`
echo "[$time] $*";
}

do_db_trans()
{

if [ $trans_type -eq 0  ];then
  DO_LOG "(IP:$db_ip Port:$db_port) Prepare:(IP=$db_ip PORT=$db_port)..."
  mysql -h${db_ip} -P${db_port} -u${db_user} -D${db_new_name} -e"CREATE DATABASE ${tmp_dbname} DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;create table ${tmp_dbname}.gcjl_hphm_tmp as select * from ${db_new_name}.gcjl_hphm where 1=2;create table ${tmp_dbname}.gcjl_hphm_info_tmp as select * from ${db_new_name}.gcjl_hphm_info where 1=2;alter table ${db_old_name}.sjkk_gcjl add index idx_hphm_info_tmp(hphm, hpzl, hpys, clpp,cllx);"
  
elif [ $trans_type -eq 1  ];then
  
  DO_LOG "(IP:$db_ip Port:$db_port) Table:gcjl_hphm_tmp..."
  mysql -h${db_ip} -P${db_port} -u${db_user} -D${db_new_name} -e"insert into ${tmp_dbname}.gcjl_hphm_tmp (hphm) select distinct hphm from ${db_old_name}.sjkk_gcjl;"

  DO_LOG "(IP:$db_ip Port:$db_port) Table:gcjl_hphm_info_tmp..."
  mysql -h${db_ip} -P${db_port} -u${db_user} -D${db_new_name} -e"insert into ${tmp_dbname}.gcjl_hphm_info_tmp (hphm, hpzl, hpys, clpp, clzpp, clnk, cllx) select distinct hphm, hpzl, hpys, clpp,null, null, cllx from ${db_old_name}.sjkk_gcjl;alter table ${db_old_name}.sjkk_gcjl drop index idx_hphm_info_tmp;"
  
elif [ $trans_type -eq 2  ];then
  for((i=1;i<=730;i=i+1))
  do
    end_date=`mysql -h${db_ip} -P${db_port} -u${db_user} -e "select CONCAT(DATE_FORMAT(DATE_ADD(now(),INTERVAL 2-$i day),'%Y-%m-%d'),' 00:00:00') mysqltime;"`
	start_date=`mysql -h${db_ip} -P${db_port} -u${db_user} -e "select CONCAT(DATE_FORMAT(DATE_ADD(now(),INTERVAL 1-$i day),'%Y-%m-%d'),' 00:00:00') mysqltime;"`
	
	end_date=`echo $end_date|awk -F ' '  '{print $2 " " $3}'`
	start_date=`echo $start_date|awk -F ' '  '{print $2 " " $3}'`
	
    DO_LOG "(IP:$db_ip Port:$db_port) Table:sjkk_gcjl start_date:$start_date end_date:$end_date..."
    mysql -h${db_ip} -P${db_port} -u${db_user} -D${db_new_name} -e"insert into ${db_new_name}.sjkk_gcjl (jlbh, xzqh, kkbh, cdbh, hphm, hpzl, hpys, jgsj, clsd,  cllx, csys, clpp) select jlbh,xzqh, kkbh, cdbh, hphm, hpzl, hpys, jgsj, clsd,  cllx, csys, clpp from ${db_old_name}.sjkk_gcjl where jgsj>='$start_date' and jgsj<'$end_date';"

    DO_LOG "(IP:$db_ip Port:$db_port) Table:sjkk_gcxq start_date:$start_date end_date:$end_date..."
    mysql -h${db_ip} -P${db_port} -u${db_user} -D${db_new_name} -e"insert into ${db_new_name}.sjkk_gcxq (jlbh, sbbh, cdfx, xszt, cwkc, tplx, tztp, qjtp, rksj, yzsj, sjcz, yzd1, yzd2, yzd3, yzd4) select jlbh, sbbh, cdfx, xszt, cwkc, tplx, tztp, qjtp, rksj, yzsj, sjcz, ylzd1, ylzd2, ylzd3, ylzd4 from ${db_old_name}.sjkk_gcjl where jgsj>='$start_date' and jgsj<'$end_date';"
  done
fi

}

do_db_trans

mysql_all_db_trans.sh

#!/bin/sh

#---variables list
trans_step=`echo $1|tr '[A-Z]' '[a-z]'`

count=2

opaq_id=192.168.60.150
opaq_port=3377

tmp_dbname=trans_tmp

db_ip[1]=192.168.60.150
db_port[1]=3306
db_user[1]=root
db_pwd[1]=
db_old_name[1]=shanghai_old_test
db_new_name[1]=shanghai_test

db_ip[2]=192.168.60.151
db_port[2]=3306
db_user[2]=root
db_pwd[2]=
db_old_name[2]=shanghai_old_test
db_new_name[2]=shanghai_test

#---------tmp dir & log file
mkdir -p /home/mysql_trans_tmp
chmod -R 777 /home/mysql_trans_tmp
tmp_dir=/home/mysql_trans_tmp
log_file=$tmp_dir/trans.log
rm -f $log_file

#---------function list
usage()
{
  echo "usage: sh mysql_all_db_trans.sh <trans_step>"
  echo "trans_step: first|second|clear"
		 
  echo "example:"
  echo "    sh mysql_all_db_trans.sh first"
  echo "    sh mysql_all_db_trans.sh second"
  echo "    sh mysql_all_db_trans.sh clear"
}

DO_LOG()
{
time=`date "+%Y-%m-%d %H:%M:%S"`
echo "[$time] $*"
echo "[$time] $*">>$log_file
}

DO_WARN_LOG()
{
  time=`date "+%Y-%m-%d %H:%M:%S"`
  echo -e "\033[33m[$time]WARNING: $*\033[0m"
  echo "[$time] $*">>$log_file
}

DO_ERR_LOG()
{
  time=`date "+%Y-%m-%d %H:%M:%S"`
  echo -e "\033[31m[$time]ERROR: $*\033[0m"
  echo "[$time] $*">>$log_file
}

DO_SUCC_LOG()
{
  time=`date "+%Y-%m-%d %H:%M:%S"`
  echo -e "\033[32m[$time]SUCCESS: $*\033[0m"
  echo "[$time] $*">>$log_file
}

do_db_check()
{
declare db_old_name=$1
declare db_new_name=$2
declare db_ip=$3
declare db_port=$4
declare db_user=$5
declare db_pwd=$6

  if [ -z ${db_old_name} -o -z ${db_new_name} -o -z ${db_ip} -o -z ${db_port} -o -z ${db_user} ];then
      #沒有配置必要的引數
	  DO_ERR_LOG "Cann't connect to mysql. db_old_name=$1 db_new_name=$2 db_ip=$3 db_port=$4 db_user=$5 db_pwd=$6"
	  exit 1
  elif [ -z ${db_pwd} ];then
      #無密碼登入,資料庫連結檢測,和需要的database是否存在的檢測
      if [ $(mysql -h${db_ip} -u${db_user} -P${db_port} -e "select 'db_db_check';" 2>>/dev/null |wc -l) -ne 2 ];then
	      DO_ERR_LOG "Cann't connect to mysql. db_old_name=$1 db_new_name=$2 db_ip=$3 db_port=$4 db_user=$5 db_pwd=$6"
		  exit 1
	  elif [ $(mysql -h${db_ip} -u${db_user} -P${db_port} -D${db_old_name} -e "select 'db_db_check';" 2>>/dev/null |wc -l) -ne 2 -o $(mysql -h${db_ip} -u${db_user} -P${db_port} -D${db_new_name} -e "select 'db_db_check';" 2>>/dev/null |wc -l) -ne 2 ];then
	      DO_ERR_LOG "sechma $db_old_name or $db_new_name is not exists. db_old_name=$1 db_new_name=$2 db_ip=$3 db_port=$4 db_user=$5 db_pwd=$6"  
          exit 1
	  fi
  else
     #有密碼登入,資料庫連結檢測,和需要的database是否存在的檢測
	  if [ $(mysql -h${db_ip} -u${db_user} -P${db_port} -p{db_pwd} -e "select 'db_db_check';" 2>>/dev/null |wc -l) -ne 2 ];then
	      DO_ERR_LOG "Cann't connect to mysql(db_old_name=$1 db_new_name=$2 db_ip=$3 db_port=$4 db_user=$5 db_pwd=$6). "
		  exit 1
	  elif [ $(mysql -h${db_ip} -u${db_user} -P${db_port} -D${db_old_name} -e "select 'db_db_check';" 2>>/dev/null |wc -l) -ne 2 -o $(mysql -h${db_ip} -u${db_user} -P${db_port} -D${db_new_name} -e "select 'db_db_check';" 2>>/dev/null |wc -l) -ne 2 ];then
	      DO_ERR_LOG "sechma $db_old_name or $db_new_name is not exists. db_old_name=$1 db_new_name=$2 db_ip=$3 db_port=$4 db_user=$5 db_pwd=$6"  
          exit 1	  
	  fi
  fi
  
  DO_SUCC_LOG "DB(db_old_name=$1 db_new_name=$2 db_ip=$3 db_port=$4 db_user=$5 db_pwd=$6) check is OK."
  sleep 0.5
  return 0
}

do_opaq_check()
{
  if [ $(mysql -h${opaq_id} -P${opaq_port} -e"show tables;" 2>>/dev/null |wc -l) -lt 1 ];then
      DO_ERR_LOG "Cann't connect to OPAQ. opaq_id=${opaq_id} opaq_port=${opaq_port} "
	  exit 1
  else
     DO_SUCC_LOG "OPAQ(opaq_id=${opaq_id} opaq_port=${opaq_id}) check is OK."
  fi
}

do_check()
{
  
  for ((i=1;i<=$count;i=i+1));
  do
	  do_db_check ${db_old_name[$i]} ${db_new_name[$i]} ${db_ip[$i]} ${db_port[$i]} ${db_user[$i]} ${db_pwd[$i]}
  done
  
}

do_hphm_and_info_trans()
{
  
  for ((i=2;i<=$count;i=i+1));
  do
	  mysqldump -h${db_ip[$i]} -P${db_port[$i]} -u${db_user[$i]} --skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys --no-tablespaces  --complete-insert  --no-create-db=TRUE --no-create-info=TRUE --skip-quote-names --max-allowed-packet=4096 --net_buffer_length=4096 ${tmp_dbname} gcjl_hphm_tmp |mysql -h${db_ip[1]} -P${db_port[1]} -u${db_user[1]} -D${tmp_dbname} &
	  
	  mysqldump -h${db_ip[$i]} -P${db_port[$i]} -u${db_user[$i]} --skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys --no-tablespaces  --complete-insert  --no-create-db=TRUE --no-create-info=TRUE --skip-quote-names --max-allowed-packet=4096 --net_buffer_length=4096 ${tmp_dbname} gcjl_hphm_info_tmp |mysql -h${db_ip[1]} -P${db_port[1]} -u${db_user[1]} -D${tmp_dbname} &
  done
  wait
  
  mysql -h${db_ip[1]} -P${db_port[1]} -u${db_user[1]} -D${db_new_name[1]} -e"alter table ${tmp_dbname}.gcjl_hphm_tmp add index idx_hphm(hphm);create table ${tmp_dbname}.gcjl_hphm as select * from ${db_new_name[1]}.gcjl_hphm where 1=2;insert into ${tmp_dbname}.gcjl_hphm select distinct hphm from ${tmp_dbname}.gcjl_hphm_tmp;"
  mysql -h${db_ip[1]} -P${db_port[1]} -u${db_user[1]} -D${db_new_name[1]} -e"alter table ${tmp_dbname}.gcjl_hphm_info_tmp add index idx_hphm_info(hphm, hpzl, hpys, clpp, clzpp, clnk, cllx);create table ${tmp_dbname}.gcjl_hphm_info as select * from ${db_new_name[1]}.gcjl_hphm_info where 1=2;insert into ${tmp_dbname}.gcjl_hphm_info (hphm, hpzl, hpys, clpp, clzpp, clnk, cllx) select distinct hphm, hpzl, hpys, clpp,null, null, cllx from ${tmp_dbname}.gcjl_hphm_info_tmp;"
  
  mysqldump -h${db_ip[1]} -P${db_port[1]} -u${db_user[1]} --skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys --no-tablespaces  --complete-insert  --no-create-db=TRUE --no-create-info=TRUE --skip-quote-names --max-allowed-packet=4096 --net_buffer_length=4096 ${tmp_dbname} gcjl_hphm|grep -v ^/|mysql -h${opaq_id} -P${opaq_port}
  
  mysqldump -h${db_ip[1]} -P${db_port[1]} -u${db_user[1]} --skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys --no-tablespaces  --complete-insert  --no-create-db=TRUE --no-create-info=TRUE --skip-quote-names --max-allowed-packet=4096 --net_buffer_length=4096 ${tmp_dbname} gcjl_hphm_info|grep -v ^/|mysql -h${opaq_id} -P${opaq_port}
}

do_prepare()
{
    DO_LOG "--------------------STRAT PREPARE ENVIRONMENT---------------------"
    
	for ((i=1;i<=$count;i=i+1));
	do
	    sh mysql_db_trans.sh ${tmp_dbname} ${db_old_name[$i]} ${db_new_name[$i]} ${db_ip[$i]} ${db_port[$i]} ${db_user[$i]} 0 ${db_pwd[$i]} |tee -a $log_file &
	done
    wait
	
	DO_LOG "--------------------END PREPARE ENVIRONMENT--------------------- "
}

do_trans_first()
{
    DO_LOG "--------------------START TRANSFER DATA(tables:gcjl_hphm gcjl_hphm_info)---------------------"
    
	for ((i=1;i<=$count;i=i+1));
	do
	    sh mysql_db_trans.sh ${tmp_dbname} ${db_old_name[$i]} ${db_new_name[$i]} ${db_ip[$i]} ${db_port[$i]} ${db_user[$i]} 1 ${db_pwd[$i]} |tee -a $log_file &
	done
    wait
    
	do_hphm_and_info_trans
	
	DO_LOG "--------------------END TRANSFER DATA(tables:gcjl_hphm gcjl_hphm_info)--------------------- "
}

do_trans_second()
{
    DO_LOG "--------------------START TRANSFER DATA(tables:sjkk_gcjl sjkk_gcxq)---------------------"
    
	for ((i=1;i<=$count;i=i+1));
	do
	    sh mysql_db_trans.sh ${tmp_dbname} ${db_old_name[$i]} ${db_new_name[$i]} ${db_ip[$i]} ${db_port[$i]} ${db_user[$i]} 2 ${db_pwd[$i]} |tee -a $log_file &
	done
    wait
	
	DO_LOG "--------------------END TRANSFER DATA(tables:sjkk_gcjl sjkk_gcxq)--------------------- "
}

do_clear()
{
    DO_LOG "--------------------START CLEAR TEMP DATABASE---------------------"
    for ((i=1;i<=$count;i=i+1));
	do
	    mysql -h${db_ip[$i]} -u${db_user[$i]} -P${db_port[$i]} -e "DROP DATABASE IF EXISTS ${tmp_dbname};"
	done
	DO_LOG "--------------------END CLEAR TEMP DATABASE---------------------"
}

if [ $# -ne 1 ];then
  DO_ERR_LOG "error! please use right method. "
  usage
elif [ "$1" != "first" -a "$1" != "second" -a "$1" != "clear" ];then
  DO_ERR_LOG "error! please use right method. "
  usage
fi

if [ "$trans_step" = "first" ];then
  do_check
  do_opaq_check
  do_prepare
  do_trans_first
elif [ "$trans_step" = "second" ];then
  do_check
  do_trans_second
  do_clear
elif [ "$trans_step" = "clear" ];then
  do_clear
fi