OceanBase export/import

Table of contents

  1. ob环境导入导出使用
    1. obclient和 obloader安装
      1. 1、上传安装包
      2. 2、安装obclient
      3. 3、安装ob-loader-obdumper
    2. 导入导出使用
    3. 导出
    4. 导入

ob环境导入导出使用

obclient和 obloader安装

1、上传安装包

两个obclient的包

  • libobclient-2.1.2-20211201104607.el7.alios7.x86_64_rpm
  • obclient-2.1.2-20220507120550.el7.alios7.x86_64_rpm

1个obloader-obdumper的包

  • loader-obdumper-4.0.1-SNAPSHOT.zip

如上传到 /home/dcos/data 目录。

2、安装obclient

安装:

安装需要root权限。且依赖jdk1.8或以上版本。

cd /home/dcos/data
# 先安装依赖
rpm -ivh libobclient-2.1.2-20211201104607.el7.alios7.x86_64.rpm
rpm -ivh obclient-2.1.2-20220507120550.el7.alios7.x86_64.rpm


rpm -ivh --prefix=/data/obclient  obclient-2.1.2-20220507120550.el7.alios7.x86_64.rpm

rpm -ivh --prefix=/data/jdk1.8  /home/dcos/data/jdk-8u341-linux-x64.rpm
cd /data/jdk1.8
mv *  jdk1.8.0_341
/data/jdk1.8/jdk1.8.0_341/bin/java -version

应用不是1.8,也需要按照jdk1.8,本身是jdk1.8的环境,jdk可省。

如果安装错了,也可以卸载

rpm -e libobclient-2.1.2-20211201104607.el7.alios7.x86_64_rpm
rpm -e obclient-2.1.2-20220507120550.el7.alios7.x86_64_rpm

也可以安装到自己指定的目录。记得配置环境变量。

验证:

执行连接串命令进入控制台。

# 有环境变量
obclient -h192.168.88.123  -P2883 -uAMSDB01@amsdb01#cx_xc_obcluster -p123456

# 无环境变量
cd /data/obclient
./obclient -h192.168.88.123  -P2883 -uAMSDB01@amsdb01#cx_xc_obcluster -p123456

命令串格式:oclient -h连接IP地址 -P连接端口 -u

参数含义如下:

  • -h:提供 OceanBase 数据库连接的 IP,通常是一个 OBProxy 地址。
  • -u:提供租户的连接帐号,格式包含两种: 用户名@租户名#集群名 或者 集群名:租户名:用户名。Oracle 租户的管理员用户名默认是 sys。
  • -P:提供 OceanBase 数据库连接端口,也是 OBProxy 的监听端口,默认是 2883,可以自定义。
  • -p:提供帐号密码。为了安全可以不提供,改为在后面提示符下输入,密码文本不可见。
  • -A:表示在连接数据库时不去获取全部表信息,可以使登录数据库速度最快。

登录成功之后可以执行查询

select sysdate from dual ;

3、安装ob-loader-obdumper

cd /home/dcos/data
# 解压到当前文件夹
unzip ob-loader-obdumper-4.0.1-SNAPSHOT.zip

# 解压到当前文件夹
unzip -d /data  ob-loader-obdumper-4.0.1-SNAPSHOT.zip
# 写完整路径,就可以在任意目录执行
unzip -d /data  /home/dcos/data/ob-loader-obdumper-4.0.1-SNAPSHOT.zip

解压即可。

注意使用obloader/obdumper 需要jdk1.8的环境。

如果是容器化部署。可以将 obclient的安装路径和 ob-loader-dumper路径映射到容器中使用。

如果容器中的应用低于jdk1.8,也需要将jdk的安装环境映射到容器中。导入导出可以在shell脚本中使用这边路径作为环境变量。

示例如下

-v /data/obclient:/app/obclient

-v /data/ob-loader-obdumper-4.0.1-SNAPSHOT:/app/ob-loader-obdumper-4.0.1-SNAPSHOT

-v /data/jdk1.8/jdk1.8.0_341:/app/jdk1.8.0_341

导入导出使用

导出

方式一:直接命令

cd /data/ob-loader-obdumper-4.0.1-SNAPSHOT

./obdumper-debug -h29.30.130.208 -P2883 -u AMSDB01 -t amsdb01 -c cx_xc_obcluster -p '@5EDcft%7' -D AMSDB01 -f /home/admin/data --cut --column-splitter '||' --query-sql "SELECT ID||'||'||VARCHAR_COL||'||'||CHAR_COL||'||'||CLOB_COL||'||'||RAW_COL||'||'||DATE_COL||'||'||TIMESTAMP_COL||'||'||FLOAT_COL FROM ALL_DATA_TYPES" --table ALL_DATA_TYPES --no-sys

此种方式要求安装jdk1.8环境且配置好环境变量,obclient环境变量。否则会提示找不到命令。

方式二: shell脚本配合使用

一般通过脚本文件操作,vi dumper_test.sh

#!/bin/bash

echo "参数1" $1
echo "参数2" $2
echo "参数3" $4

# 路径可以通过参数传递
JAV_HOME=/data/jdk1.8/jdk1.8.0_341
OBC_HOME=/data/obclient
OBLD_HOME=/data/ob-loader-obdumper-4.0.1-SNAPSHOT

export JAVA_HOME=$JAV_HOME;
export JRE_HOME=${JAVA_HOME}/jre;
export CLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib;
export OBCLIENT_HOME=$OBC_HOME;
export PATH=${JAVA_HOME}/bin:${OBCLIENT_HOME}/bin:${PATH};

# 定义OB_DUMPER路径,
OB_DUMPER=${OBLD_HOME}/bin/obdumper

#检查 OBCLIENT_HOME 是否存在
if [! -d ${OBCLIENT_HOME} ]; then
    echo "OBCLIENT_HOME目录未找到!退出脚本!"
    exit 1 ;
fi

#检查 OB_DUMPER 是否存在
if [! -d ${OB_DUMPER} ]; then
    echo "OB_DUMPER 目录未找到!退出脚本!"
    exit 1 ;
fi

HOST=192.168.130.208
PORT=2883
USER=AMSDB01
PASSWORD=123456Pwd
DATABASE=AMSDB01
TENANT=amsdb01
OBCLUSTER=cx_xc_obcluster


client_param=-h${HOST} -P${PORT} -u${USER} -p ${PASSWORD} -c ${OBCLUSTER} -t ${TENANT} -D ${DATABASE}
DUMPER_PARAM=

v_data_log=$4/log
v_data_file=$4/export_fen

notime='date +%Y%m%d`;
v_filesuffix=.txt;
v_file_flag=_;

v_count=0;

v_subcompay=$(obclient ${client_param} -N -e 'select t.subcompany from ams_subcompany_tc where 1=1 and exists (select 1 from ams_department_tc p where p.subcompany = t.subcompany)')

echo company: ${v_subcompany}

for i in ${v_subcompany}
do
echo sub $i

v_count=$(obclient ${client_param} -N -e 'select count(1) from ams_department_tc p where p.subcompany = to_char('$i')')

if [ ${v_count} -ne 0 ] 
then
    echo "分公司"$i"的数据条数":
    echo count:'${v_count}'
    
v_now = 'date +%Y%m%d%H%M';
v_name=$v_data_file/$iv_file_flag$v_nowv_filesuffix

#执行导出命令
$OB_DUMPER ${DUMPER} --non-sys --trail-delimiter -f ${v_data_file} --file-name ${v_name} --skip-check-dir --log-path ${v_data_log} --query-sql "select 
departmentcode|| '||' ||
subcompany|| '||' ||
realldept|| '||' ||
departmentname|| '||' ||
timestamp|| '||' ||
orgcode|| '||' ||
deptgroupcode|| '||' ||
deptgroupname|| '||' ||
taxpayercode|| '||' ||
taxmanagementcode|| '||' ||
status|| '||' ||
ifvalid
from ams_department_tc t where t.subcompany = to_char($i)" --cut --column-splitter '\\||'

fi

okfile=${v_data_file}/$i$v_now.ok
echo okfile ${okfile}

# 输出ok文件
if [ ${v_count} -ne 0 ]; then
    echo $v_now\;${v_count}>${okfile};
fi

done

导入

控制文件: vi AMS_DEPARTMENT_TC.ctrl

lang=java
(
DEPARTMENTCODE,
SUBCOMPANY,
REALLDEPT,
DEPARTMENTNAME,
TIMESTAMP,
ORGCODE,
DEPTGROUPCODE,
DEPTGROUPNAME,
TAXPAYERCODE,
TAXMANAGEMENTCODE,
STATUS,
IFVALID
);

几个要注意的点:

1、表名大写;2、控制文件名大写,小写的控制文件名不起作用。

#!/bin/bash

echo 'importdepartment shell start '
fileprerfix=$(cd `dirname $0`; pwd)
cd fileprerfix
echo fileprerfix : ${fileprerfix}

echo "参数1" $1
echo "参数2" $2
echo "参数3" $4

# 路径可以通过参数传递
JAV_HOME=/data/jdk1.8/jdk1.8.0_341
OBC_HOME=/data/obclient
OBLD_HOME=/data/ob-loader-obdumper-4.0.1-SNAPSHOT

export JAVA_HOME=$JAV_HOME;
export JRE_HOME=${JAVA_HOME}/jre;
export CLASS_PATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib;
export OBCLIENT_HOME=$OBC_HOME;
export PATH=${JAVA_HOME}/bin:${OBCLIENT_HOME}/bin:${PATH};

# 定义OB_DUMPER路径,
OB_DUMPER=${OBLD_HOME}/bin/obdumper

#检查 OBCLIENT_HOME 是否存在
if [! -d ${OBCLIENT_HOME} ]; then
    echo "OBCLIENT_HOME目录未找到!退出脚本!"
    exit 1 ;
fi

#检查 OB_DUMPER 是否存在
if [! -d ${OB_DUMPER} ]; then
    echo "OB_DUMPER 目录未找到!退出脚本!"
    exit 1 ;
fi

HOST=192.168.130.208
PORT=2883
USER=AMSDB01
PASSWORD=123456Pwd
DATABASE=AMSDB01
TENANT=amsdb01
OBCLUSTER=cx_xc_obcluster

TABLE=AMS_DEPARTMENT_TC
OUTPUT_FIEL=/home/dcos/data/file



client_param=-h${HOST} -P${PORT} -u${USER} -p ${PASSWORD} -c ${OBCLUSTER} -t ${TENANT} -D ${DATABASE}
DUMPER_PARAM=

PRIDIR=$4/export
LOGDIR=$4/log
BADDIR=$4/bad
BACKDIR=$4/backup

nowtime=`date +%Y%m%d`;
echo 'file:importing...'

echo ${PRIDIR}

echo 'get subcompany:'%5

filecount=$(ls $PRIDIR/$5${nowtime}*.ok 2> /dev/null | wc -l)
if [ ${filecount} -ne 0 ]; then

echo 'start insert AMS_DEPARTMENT_TC ...'
echo '数据库连接是:'
echo database:${DBALIAS}

subcompany_value=$5
ret_delete=$(obclient ${client_param} -N -e 'delete from AMS_DEPARTMENT_TC where subcompany = to_char('$subcompany_value');commit;')

echo '输入删除的数据'
echo ret+delete:${ret_delete}
CONTROL_FILE=$fileprerfix/ctrl/AMS_DEPARTMENT_TC.ctrl

for FILE in $PRIDIR/$5_${nowtime}.txt
do
#执行导入
echo LOADER : ${LOADER}
echo FILE : ${FILE}

$OB_LOADER ${LOADER} -f ${FILE} --no-sys --log-path ${LOGDIR} --column-splitter '||' --file-suffix '.txt' --table  AMS_DEPARTMENT_TC --ctl-path ${CONTROL_FILE} --external-data --cut

mv $PRIDIR/$5_${nowtime}.txt  /${BACKDIR}
mv $PRIDIR/$5${nowtime}.ok  /${BACKDIR}
echo 'move the file back dir end!'

done

echo 'insert AMS_DEPARTMENT_TC end '
fi

echo 'file:imported'