背景
最近一个项目也在使用Oceanbase,在运维的过程中,经常有以下的需求: 一、把某个租户下的一个数据库导入到另外一个租户或者数据。
二、把某一个租户数据库下的表导入到另外一个租户下的数据库。
三、因为疫情原因,部分人员需要居家隔离远程办公,由于电脑资源不足只能使用mysql做临时方案,需要经常从项目现场导出mysql格式的数据给居家办公的同事。
为了简化以上操作,编写了几个脚本。
前提条件
一、安装mysql客户端(简略步骤如下,不进行详述)
1. 上传mysql客户端到root用户
2. 删除如下冲突包
rpm -e mariadb-libs --nodeps
3. 执行rpm安装
rpm -ivh mysql-community-common-5.7.38-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.38-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.38-1.el7.x86_64.rpm
二、下载obloader和obdumper,并配置环境变量
下载地址:https://open.oceanbase.com/softwareCenter/community
下载完成后直接解压就可以,然后配置path环境变量
目录介绍
目录名称 | 目录含义 |
---|---|
qymain | 主目录,上传到linux用户的home目录 |
- -bin | Shell脚本路径 |
- -data | 数据文件路径 |
- -log | 日志路径 |
- -cfg | 配置文件路径 |
脚本概述
一、impob.cfg 配置源库和目标库的参数
#源库
S_OB_HOST=192.33.77.20 #observer地址或者obproxy地址
S_OB_PORT=2883 #observer端口或者obproxy端口
S_OB_USER=xduser #普通用户
S_OB_PASSWD=OceanBASE #普通用户密码
S_OB_SYSUSR=load_user #sys租户下具有查询权限的用户
S_OB_SYSPWD=OceanBASE #sys租户下具有查询权限的用户密码
S_OB_TEN=xdsit #租户名称
S_OB_CLU=obdemo #集群名称
#目标库参数含义同上
T_OB_HOST=192.33.77.22
T_OB_PORT=2883
T_OB_USER=xduser
T_OB_PASSWD=OceanBASE2021DB
T_OB_SYSUSR=load_user
T_OB_SYSPWD=OceanBASE2021DB
T_OB_TEN=xdqy
T_OB_CLU=obdemo
二、dbinit.cfg 把源库作为基础库,初始化为一个新库
注:此配置文件只用于按照配置初始化一个新目标库,普通导入导出不需要
ngiccs:part:fnc_conf_def_fmt,fnc_conf_items apolloportaldb:all ngicps:part:t_inrat_admt ngicrs:part:t_ind_lib ngilcs:none ngigcs:part:t_guar_class_info,t_guar_model ngipcs:all ngipub:allexclude:n_wf_instance_his microservice:all apolloconfigdb:all nacos:none ngifox:none old_xindai:part:migrate_table sjck:none
配置文件格式为 db_name:init_type:table_list
db_name:数据库名称
Init_type:操作类型
all:表示把数据库的所有表结构和数据全部初始化到目标库,table_list可为空
part:表示把数据库的所有表结构以及部分表数据初始化到目标库,table_list表示需要数据的表
none:表示把所有的表结构初始化到目标库,不包含数据,table_list可为空
allexclude:表示只导入table_list指定的表结构(数据不导入),其余的表结构和数据都初始化到目标库
table_list:表清单,根据init_type不同类型表示不同含义
all:可以为空
part:初始化的时候带数据的表
none:可以为空
allexclude:除了这些表不带数据,其他的都带数据
三、obimpandexp.sh 导入导出程序主脚本
#!/bin/bash
source ~/.bash_profile
thisname=`basename $0`
usage(){
echo
echo "OB导入导出工具"
echo "========================================================="
echo "author by:random"
echo "date :2022-06-13"
echo "version :v1.0.0"
echo
echo "Option:"
echo " -o option="
echo " imp 从指定路径把数据导入到ob "
echo " exp 导出ob里的数据到指定路径 "
echo " table 把一个表从A库到到B库,包括表结构 $thisname -o all source_db.tab1 target_db.tab2 "
echo " init 初始化一个新库 包括表结构和基础数据"
echo " -h 帮助"
echo " 以下三个参数不可以同时存在 -o=all时此参数无效"
echo " -d 可选:只导出导入表结构"
echo " -s 可选:只导出导入表数据"
echo " -a 可选:导出导入表结构和数据"
echo " 以上三个参数不可以同时存在"
echo " -i 可选:是否使用mysqldump命令,此参数只对exp 有效"
echo " source_db 要导出的数据库"
echo " target_db 要导入的数据库"
echo " filepath 当type为exp或者imp的时候需要手动指定文件目录,文件夹里必须为空,否则会报错"
echo
echo "Example:"
echo " $thisname -o exp source_db filepath"
echo " $thisname -o imp target_db filepath"
echo " $thisname -o all source_db target_db "
echo " $thisname -o init "
echo " 配置文件../cfg/dbandtable.cfg.文件格式 dbname:[all|part|none]:tablelist "
echo " all:表示把数据库的所有表结构和数据全部导出"
echo " part:表示把数据库的素有表结构和部分表数据导出"
echo " none:表示把数据库的表所有结构导出"
echo " 参数详解 "
echo " 如果目标库和源库在同一网段,后面不需要再跟其他参数;例如 $thisname -o init "
echo " 如果目标库和源库在不在同一网段,导出和导入需要分开执行,通过指定 参数[exp|imp]"
echo " [exp]从源库和迁移库导出数据到 ~/qymain/data/obsource/INIT_${DBNAME}_DDL; 示例 $thisname -o init exp"
echo " [imp]把exp导出的文件,拷贝到相同路径下~/qymain/data/obsource/INIT_${DBNAME}_DDL中加载数据到目标库; 示例 $thisname -o init imp"
echo
echo "========================================================="
exit 1
}
. ~/qymain/cfg/impob.cfg
LOG_PATH=~/qymain/log
CLUSTER=""
if [ $S_OB_PORT == '2883' ];then
S_CLUSTER_STR=" -c ${S_OB_CLU} "
S_CLUSTER="#${S_OB_CLU}"
fi
if [ $T_OB_PORT == '2883' ];then
T_CLUSTER_STR=" -c ${T_OB_CLU} "
T_CLUSTER="#${T_OB_CLU}"
fi
if [ $M_OB_PORT == '2883' ];then
M_CLUSTER_STR=" -c ${M_OB_CLU} "
M_CLUSTER="#${M_OB_CLU}"
fi
createDB(){
echo "mysql -u${T_OB_USER}@${T_OB_TEN}"${T_CLUSTER}" -p$T_OB_PASSWD -h $T_OB_HOST -P $T_OB_PORT -e \"CREATE DATABASE IF NOT EXISTS $1 DEFAULT CHARACTER SET = utf8mb4;\" " >> ${LOG_PATH}/impob.log
mysql -u${T_OB_USER}@${T_OB_TEN}"${T_CLUSTER}" -p$T_OB_PASSWD -h$T_OB_HOST -P$T_OB_PORT -B -e "CREATE DATABASE IF NOT EXISTS $1 DEFAULT CHARACTER SET = utf8mb4 ;" >> ${LOG_PATH}/impob.log
}
dropTab(){
echo "mysql -u${T_OB_USER}@${T_OB_TEN}"${T_CLUSTER}" -p$T_OB_PASSWD -h $T_OB_HOST -P $T_OB_PORT -D $1 -e \"drop table if exists $2\" " >> ${LOG_PATH}/impob.log
mysql -u${T_OB_USER}@${T_OB_TEN}"${T_CLUSTER}" -p$T_OB_PASSWD -h$T_OB_HOST -P$T_OB_PORT -D $1 -B -e "drop table if exists $2 ;" >> ${LOG_PATH}/impob.log
}
exponlyddlmysql(){
echo "mysqldump -u${S_OB_USER}@${S_OB_TEN}${S_CLUSTER} -p$S_OB_PASSWD -h $S_OB_HOST -P $S_OB_PORT -d $1 > $2/$1.sql"
mysqldump -u${S_OB_USER}@${S_OB_TEN}"${S_CLUSTER}" -p$S_OB_PASSWD -h $S_OB_HOST -P $S_OB_PORT -d $1 > $2/$1.sql
}
expallmysql(){
echo "mysqldump -u${S_OB_USER}@${S_OB_TEN}${S_CLUSTER} -p$S_OB_PASSWD -h $S_OB_HOST -P $S_OB_PORT $1 > $2/$1.sql"
mysqldump -u${S_OB_USER}@${S_OB_TEN}"${S_CLUSTER}" -p$S_OB_PASSWD -h $S_OB_HOST -P $S_OB_PORT $1 > $2/$1.sql
#mysqldump -u${S_OB_USER}@${S_OB_TEN}"${S_CLUSTER}" -p$S_OB_PASSWD -h $S_OB_HOST -P $S_OB_PORT -B ngicrs ngilcs ngigcs nacos > $2/alldatabases.sql
}
exponlyddl(){
if [ $1 == "old_xindai" ] || [ $1 == "sjck" ];then
echo "obdumper -h $M_OB_HOST -P $M_OB_PORT -u ${M_OB_USER} -p $M_OB_PASSWD --sys-user $M_OB_SYSUSR --sys-password $M_OB_SYSPWD $M_CLUSTER_STR -t $M_OB_TEN -D $1 $3 --drop-object --ddl -f $2" >> ${LOG_PATH}/impob.log
obdumper -h $M_OB_HOST -P $M_OB_PORT -u ${M_OB_USER} -p $M_OB_PASSWD --sys-user $M_OB_SYSUSR --sys-password $M_OB_SYSPWD $M_CLUSTER_STR -t $M_OB_TEN -D $1 $3 --drop-object --ddl -f $2 >> ${LOG_PATH}/impob.log
else
echo "obdumper -h $S_OB_HOST -P $S_OB_PORT -u ${S_OB_USER} -p $S_OB_PASSWD --sys-user $S_OB_SYSUSR --sys-password $S_OB_SYSPWD $S_CLUSTER_STR -t $S_OB_TEN -D $1 $3 --drop-object --ddl -f $2" >> ${LOG_PATH}/impob.log
obdumper -h $S_OB_HOST -P $S_OB_PORT -u ${S_OB_USER} -p $S_OB_PASSWD --sys-user $S_OB_SYSUSR --sys-password $S_OB_SYSPWD $S_CLUSTER_STR -t $S_OB_TEN -D $1 $3 --drop-object --ddl -f $2 >> ${LOG_PATH}/impob.log
fi
}
exptabddl(){
echo "obdumper -h $S_OB_HOST -P $S_OB_PORT -u ${S_OB_USER} -p $S_OB_PASSWD --sys-user $S_OB_SYSUSR --sys-password $S_OB_SYSPWD $S_CLUSTER_STR -t $S_OB_TEN -D $1 $3 --ddl -f $2" >> ${LOG_PATH}/impob.log
obdumper -h $S_OB_HOST -P $S_OB_PORT -u ${S_OB_USER} -p $S_OB_PASSWD --sys-user $S_OB_SYSUSR --sys-password $S_OB_SYSPWD $S_CLUSTER_STR -t $S_OB_TEN -D $1 $3 --ddl -f $2 >> ${LOG_PATH}/impob.log
}
exptabdata(){
echo "obdumper -h $S_OB_HOST -P $S_OB_PORT -u ${S_OB_USER} -p $S_OB_PASSWD --sys-user $S_OB_SYSUSR --sys-password $S_OB_SYSPWD $S_CLUSTER_STR -t $S_OB_TEN -D $1 $3 --csv -f $2 " >> ${LOG_PATH}/impob.log
obdumper -h $S_OB_HOST -P $S_OB_PORT -u ${S_OB_USER} -p $S_OB_PASSWD --sys-user $S_OB_SYSUSR --sys-password $S_OB_SYSPWD $S_CLUSTER_STR -t $S_OB_TEN -D $1 $3 --skip-header --csv -f $2 >> ${LOG_PATH}/impob.log
}
exponlydata(){
if [ $1 == "old_xindai" ] || [ $1 == "sjck" ];then
echo "obdumper -h $M_OB_HOST -P $M_OB_PORT -u ${M_OB_USER} -p $M_OB_PASSWD --sys-user $M_OB_SYSUSR --sys-password $M_OB_SYSPWD $M_CLUSTER_STR -t $M_OB_TEN -D $1 $3 --sql -f $2 " >> ${LOG_PATH}/impob.log
obdumper -h $M_OB_HOST -P $M_OB_PORT -u ${M_OB_USER} -p $M_OB_PASSWD --sys-user $M_OB_SYSUSR --sys-password $M_OB_SYSPWD $M_CLUSTER_STR -t $M_OB_TEN -D $1 $3 --sql -f $2 >> ${LOG_PATH}/impob.log
else
echo "obdumper -h $S_OB_HOST -P $S_OB_PORT -u ${S_OB_USER} -p $S_OB_PASSWD --sys-user $S_OB_SYSUSR --sys-password $S_OB_SYSPWD $S_CLUSTER_STR -t $S_OB_TEN -D $1 $3 --sql -f $2 " >> ${LOG_PATH}/impob.log
obdumper -h $S_OB_HOST -P $S_OB_PORT -u ${S_OB_USER} -p $S_OB_PASSWD --sys-user $S_OB_SYSUSR --sys-password $S_OB_SYSPWD $S_CLUSTER_STR -t $S_OB_TEN -D $1 $3 --sql -f $2 >> ${LOG_PATH}/impob.log
fi
}
imponlyddl(){
echo "obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 $3 --replace-object --ddl -f $2 " >> ${LOG_PATH}/impob.log
obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 $3 --replace-object --ddl -f $2 >> ${LOG_PATH}/impob.log
}
impall(){
echo "obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 $3 --replace-object --all -f $2 " >> ${LOG_PATH}/impob.log
obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 $3 --replace-object --all -f $2 >> ${LOG_PATH}/impob.log
}
imponlydata(){
echo "obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 $3 --truncate-table --sql -f $2 " >> ${LOG_PATH}/impob.log
obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 $3 --truncate-table --sql -f $2 >> ${LOG_PATH}/impob.log
}
imptabddl(){
echo "obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 $3 --ddl -f $2 " >> ${LOG_PATH}/impob.log
obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 --all --ddl --external-data -f $2 >> ${LOG_PATH}/impob.log
}
imptabdata(){
echo "obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 $3 --csv -f $2 " >> ${LOG_PATH}/impob.log
obloader -h $T_OB_HOST -P $T_OB_PORT -u ${T_OB_USER} -p $T_OB_PASSWD --sys-user $T_OB_SYSUSR --sys-password $T_OB_SYSPWD $T_CLUSTER_STR -t $T_OB_TEN -D $1 --all --csv --external-data -f $2 >> ${LOG_PATH}/impob.log
}
#默认是表结构和数据一起操作
TYPE=both
DBTYPE=OB
#默认是全库操作
while getopts :o:hdsait: OPTION
do
case $OPTION in
o) ACTION=$OPTARG ;;
d) TYPE=ddl ;;
s) TYPE=sql ;;
a) TYPE=both ;;
t) SCOPE=$OPTARG ;;
i) DBTYPE=mysql ;;
h) usage ;;
esac
done
S_TABLE_STR=" --all "
if [ -z "$SCOPE" ];then
S_TABLE_STR=" --all "
else
S_TABLE_STR=" --table '${SCOPE}' "
fi
if [ ! -n "$ACTION" ];then
usage
exit
fi
STARTTIME=`date +'%Y-%m-%d %H:%M:%S'`
STARTSED=$(date --date="$STARTTIME" +%s);
shift `expr $OPTIND - 1`
if [ $ACTION == 'exp' ];then
if [ $# -eq 2 ];then
DBNAME=$1
FILE_PATH=$2
if [ $TYPE == "ddl" ];then
if [ $DBTYPE == "mysql" ];then
exponlyddlmysql $DBNAME $FILE_PATH
#由于导出的ddl中存在一些ob特有的ddl格式,需要进行替换,方便导入到mysql中
MYSQL_PATH=${FILE_PATH}/${DBNAME}.sql
sed -i "s/DEFAULT CHARSET = utf8mb4/; -- DEFAULT CHARSET = utf8mb4 /g" $MYSQL_PATH
sed -i "s/AUTO_INCREMENT = /; -- AUTO_INCREMENT = 1 /g" $MYSQL_PATH
sed -i "s/BLOCK_SIZE 16384 GLOBAL//g" $MYSQL_PATH
sed -i "s/BLOCK_SIZE 16384 LOCAL//g" $MYSQL_PATH
else
exponlyddl $DBNAME $FILE_PATH $S_TABLE_STR
fi
elif [ $TYPE == "sql" ];then
exponlydata $DBNAME $FILE_PATH $S_TABLE_STR
elif [ $TYPE == "both" ];then
if [ $DBTYPE == "mysql" ];then
expallmysql $DBNAME $FILE_PATH
#由于导出的ddl中存在一些ob特有的ddl格式,需要进行替换,方便导入到mysql中
MYSQL_PATH=${FILE_PATH}/${DBNAME}.sql
sed -i "s/DEFAULT CHARSET = utf8mb4/; -- DEFAULT CHARSET = utf8mb4 /g" $MYSQL_PATH
sed -i "s/AUTO_INCREMENT = /; -- AUTO_INCREMENT = 1 /g" $MYSQL_PATH
sed -i "s/BLOCK_SIZE 16384 GLOBAL//g" $MYSQL_PATH
sed -i "s/BLOCK_SIZE 16384 LOCAL//g" $MYSQL_PATH
else
DDL_PATH=${FILE_PATH}/${DBNAME}_DDL
SQL_PATH=${FILE_PATH}/${DBNAME}_SQL
if [ -d ${DDL_PATH} ];then
rm -rf ${DDL_PATH}
fi
mkdir -p ${DDL_PATH}
if [ -d ${SQL_PATH} ];then
rm -rf ${SQL_PATH}
fi
mkdir -p ${SQL_PATH}
exponlyddl $DBNAME $DDL_PATH $S_TABLE_STR
exponlydata $DBNAME $SQL_PATH $S_TABLE_STR
fi
else
echo "nothing to to ,please check input parameters"
exit;
fi
else
echo "请输入源数据库;文件存放位置 exa : $thisname -o exp source_db filepath"
exit
fi
elif [ $ACTION == 'imp' ];then
if [ $# -eq 2 ];then
DBNAME=$1
FILE_PATH=$2
if [ $TYPE == "ddl" ];then
imponlyddl $DBNAME $FILE_PATH $S_TABLE_STR
elif [ $TYPE == "sql" ];then
imponlydata $DBNAME $FILE_PATH $S_TABLE_STR
elif [ $TYPE == "both" ];then
echo "undo please wait next version"
exit;
else
echo "nothing to to ,please check input parameters"
exit;
fi
else
echo "请输入源数据库;文件存放位置 exa : $thisname -type=exp source_db filepath"
exit
fi
elif [ $ACTION == 'all' ];then
if [ $# -eq 2 ];then
S_DBNAME=$1
T_DBNAME=$2
else
echo "请输入源数据库 目标数据库 exa: $thisname -o all source_db target_db"
exit
fi
DATA_TEMP=~/qymain/data/obsource
DDL_PATH=${DATA_TEMP}/${S_DBNAME}_DDL
SQL_PATH=${DATA_TEMP}/${S_DBNAME}_SQL
if [ -d ${DDL_PATH} ];then
rm -rf ${DDL_PATH}
fi
mkdir -p ${DDL_PATH}
if [ -d ${SQL_PATH} ];then
rm -rf ${SQL_PATH}
fi
mkdir -p ${SQL_PATH}
exponlyddl $S_DBNAME $DDL_PATH $S_TABLE_STR
exponlydata $S_DBNAME $SQL_PATH $S_TABLE_STR
createDB ${T_DBNAME}
imponlyddl $T_DBNAME $DDL_PATH $S_TABLE_STR
imponlydata $T_DBNAME $SQL_PATH $S_TABLE_STR
elif [ $ACTION == 'table' ];then
if [ $# -eq 2 ];then
S_STR=$1
T_STR=$2
else
echo "请输入源数据库 目标数据库 exa: $thisname -o all source_db.tab1 target_db.tab2"
exit
fi
S_DB=${S_STR%.*}
S_TAB=${S_STR#*.}
T_DB=${T_STR%.*}
T_TAB=${T_STR#*.}
S_TABLE_STR=" --table $S_TAB "
T_TABLE_STR=" --table $T_TAB "
DATA_TEMP=~/qymain/data/tmp
DDL_PATH=${DATA_TEMP}/${S_TAB}_DDL
SQL_PATH=${DATA_TEMP}/${S_TAB}_SQL
if [ -d ${DDL_PATH} ];then
rm -rf ${DDL_PATH}
fi
mkdir -p ${DDL_PATH}
if [ -d ${SQL_PATH} ];then
rm -rf ${SQL_PATH}
fi
mkdir -p ${SQL_PATH}
exptabddl $S_DB $DDL_PATH "$S_TABLE_STR"
exptabdata $S_DB $SQL_PATH "$S_TABLE_STR"
dropTab $T_DB $T_TAB
imptabddl $T_DB $DDL_PATH $T_TABLE_STR
imptabdata $T_DB $SQL_PATH $T_TABLE_STR
elif [ $ACTION == 'init' ];then
if [ $# -eq 0 ];then
#源库+目标库在统一网段
NETWORK=SAME
else
NETWORK=DIFF
PROCTYPE=$1
#如果参数不是exp 或者imp 提示参数无效
if [ $PROCTYPE != "exp" ] && [ $PROCTYPE != "imp" ];then
echo "请检查参数是否合法"
exit
fi
fi
TL=~/qymain/cfg/dbinit.cfg
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!开始执行初始化数据程序!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" > ${LOG_PATH}/impob.log
cat $TL | while read LINE
do
DBNAME=`echo $LINE | cut -d ':' -f 1`
INITTYPE=`echo $LINE | cut -d ':' -f 2`
#创建基础库
#echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!第一步:创建数据库--${DBNAME}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOG_PATH}/impob.log
#createDB ${DBNAME}
DATA_TEMP=~/qymain/data/obsource
DDL_PATH=${DATA_TEMP}/INIT_${DBNAME}_DDL
SQL_PATH=${DATA_TEMP}/INIT_${DBNAME}_SQL
if ( [ $NETWORK == "DIFF" ] && [ $PROCTYPE == "exp" ] ) || [ $NETWORK == "SAME" ] ;then
if [ -d ${DDL_PATH} ];then
rm -rf ${DDL_PATH}
fi
mkdir -p ${DDL_PATH}
if [ -d ${SQL_PATH} ];then
rm -rf ${SQL_PATH}
fi
mkdir -p ${SQL_PATH}
#导出所有数据结构
S_TABLE_STR=" --all "
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!第1步:导出数据库DDL--${DBNAME}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOG_PATH}/impob.log
exponlyddl $DBNAME $DDL_PATH $S_TABLE_STR
#echo "exponlyddl $DBNAME $DDL_PATH $S_TABLE_STR"
#导出所有空库中的配置表
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!第2步:导出配置表,参数表--${DBNAME}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOG_PATH}/impob.log
if [ $INITTYPE == "all" ];then
S_TABLE_STR=" --all "
exponlydata $DBNAME $SQL_PATH $S_TABLE_STR
#echo "exponlydata $DBNAME $SQL_PATH $S_TABLE_STR"
elif [ $INITTYPE == "allexclude" ];then
TABLELIST=`echo $LINE | cut -d ':' -f 3`
S_TABLE_STR=" --all --exclude-table ${TABLELIST} "
exponlydata $DBNAME $SQL_PATH "${S_TABLE_STR}"
elif [ $INITTYPE == "part" ];then
TABLELIST=`echo $LINE | cut -d ':' -f 3`
S_TABLE_STR=" --table ${TABLELIST} "
exponlydata $DBNAME $SQL_PATH "${S_TABLE_STR}"
#echo "exponlydata $DBNAME $SQL_PATH "${S_TABLE_STR}" "
fi
fi
if [ $NETWORK == "DIFF" ] && [ $PROCTYPE == "exp" ];then
continue
fi
#创建基础库
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!第1步:创建数据库--${DBNAME}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOG_PATH}/impob.log
createDB ${DBNAME}
#echo "createDB ${DBNAME}"
#导入表结构
S_TABLE_STR=" --all "
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!第2步:导入DDL--${DBNAME}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOG_PATH}/impob.log
imponlyddl $DBNAME $DDL_PATH $S_TABLE_STR
#echo "imponlyddl $DBNAME $DDL_PATH $S_TABLE_STR"
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!第3步:导入配置表,参数表--${DBNAME}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" >> ${LOG_PATH}/impob.log
#导入数据
if [ $INITTYPE == "all" ] || [ $INITTYPE == "allexclude" ];then
S_TABLE_STR=" --all "
imponlydata $DBNAME $SQL_PATH $S_TABLE_STR
#echo "imponlydata $DBNAME $SQL_PATH $S_TABLE_STR"
elif [ $INITTYPE == "part" ];then
TABLELIST=`echo $LINE | cut -d ':' -f 3`
S_TABLE_STR=" --table ${TABLELIST} "
imponlydata $DBNAME $SQL_PATH "${S_TABLE_STR}"
#echo "imponlydata $DBNAME $SQL_PATH "${S_TABLE_STR}""
fi
done
else
usage;
fi
ENDTTIME=`date +'%Y-%m-%d %H:%M:%S'`
ENDSED=$(date --date="$ENDTTIME" +%s);
TIMEDIFSEC=$((ENDSED-STARTSED))
echo "当前操作总共用时 "${TIMEDIFSEC}"秒"
脚本使用参考
- 替代参数解释:
参数名称 | 参数注释 |
---|---|
source_db | 源库的数据库名称 |
filepath | 导入导出的数据文件路径 |
target_db | 目标数据库名称 |
table_name | 表的名字 |
- 导出一个库的表结构
obimpandexp.sh -o exp -d source_db filepath
- 导出一个库的表数据
obimpandexp.sh -o exp -s source_db filepath
- 导出一个库的表结构和数据
obimpandexp.sh -o exp source_db filepath
- 按照mysql模式导出表结构和数据
sh obimpandexp.sh -o exp -i -a source_db filepath
- 只导出一个表
obimpandexp.sh -o exp -t table_name source_db filepath
- 导入一个库的表结构
obimpandexp.sh -o imp -d source_db filepath
- 导入一个库的表数据
obimpandexp.sh -o imp -s source_db filepath
- 导入一个库包括结构和数据
obimpandexp.sh -o imp source_db filepath
- 从source集群导出数据库,导入到target集群
obimpandexp.sh -o all source_db target_db
- 从source集群导出一个表,格式[dbname.tablename]导入到target集群
obimpandexp.sh -o table source_db.table_name target_db.table_name
- 从source集群按照dbinit.cfg配置文件初始化一个新库
obimpandexp.sh -o init
- 从source集群按照dbinit.cfg配置文件初始化一个新库,两个库不在一个网段.先执行导出,再执行导入
导出
obimpandexp.sh -o init exp
然后把data目录下的内容拷贝到目标机器,然后执行导入
obimpandexp.sh -o init imp
最后修改时间:2023-05-18 11:24:04
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。