暂无图片
暂无图片
9
暂无图片
暂无图片
暂无图片

「更易用的OceanBase」| OB导入导出小工具

8580

背景

  最近一个项目也在使用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环境变量

image.png

目录介绍

目录名称 目录含义
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
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论