【AntDB数据库】AntDB数据库迁移(三)

2023-10-29

导出导入数据

导入数据

导出的数据文件为copy命令的sql文件,可以直接使用psql -f参数执行。但是在文件数量比较多的时候,建议采用脚本封装的方式,可控的进行数据导入。

编写导入脚本

该脚本通过命令行参数来控制是通过表名查找文件导入还是按照文件大小排序后取一定的文件数来进行导入。用法如下:

sh psqlcopy.sh -u party -d /adbdata/ora2pg/data/party  -l /adbdata/ora2pg/log -s 11

按照文件大小正序排序后取前11个文件

sh psqlcopy.sh -u party -d /adbdata/ora2pg/data/party  -l /adbdata/ora2pg/log -S 11

按照文件大小正序倒序后取前11个文件

sh psqlcopy.sh -u party -d /adbdata/ora2pg/data/party  -l /adbdata/ora2pg/log -t  INS_DES_ACCREL

导入以INS_DES_ACCREL开头的表文件

vi psqlcopy.sh
#!/bin/bash

source /home/postgres/.bashrc

function check_dir
{
 if [ ! -d "$2" ]; then
     echo "the $1 direcory $2 does not exist!"
     exit 0
 fi
}

function usage
{
  echo "Usage: "
  echo "    `basename $0` -u username -d datadir -t tablename -l logdir"
  echo "    `basename $0` -u username -d datadir -s|S filecnt -l logdir"
  exit 0
}

function psql_copy_file
{
$psqlconn -f ${datadir}/$file"_importing" > ${logdir}/"psqlcopy_"$file.log 2>&1 
errcnt=`grep -E "ERROR|FATAL" ${logdir}/"psqlcopy_"$file.log | wc -l`
if [ "$errcnt" -gt 0 ];then
 echo `date "+%Y-%m-%d %H:%M:%S" `": file ${datadir}/$file"_importing" copy failed,please check log ${logdir}/"psqlcopy_"$file.log!" >> ${logdir}/"psqlcopy_error".log
elif [ "$errcnt" -eq 0 ]; then
 mv ${datadir}/$file"_importing" ${datadir}/import_done/$file"_done"
fi
}

function exe_psql_copy
{
if [ "x$tablelike" != "x" ]; then
   files=`ls -rt $datadir  |grep -E '*sql$' |grep -v tmp | grep -v done |grep -v import |grep $tablelike`
elif [ $filecnt -gt 0 ]; then
   if [ $file_sort -eq 0 ]; then 
      lsopt="ls -rS"
   elif [ $file_sort -eq 1 ]; then
      lsopt="ls -S"
   fi       
   files=`$lsopt $datadir  |grep -E '*sql$' |grep -v tmp | grep -v done |grep -v import |head -$filecnt`
fi

# rename file to filename_importing
for file in ${files[@]}
do 
  mv ${datadir}/$file ${datadir}/$file"_importing"
done 

# execute copy, after move file to done dir
for file in ${files[@]}
do 
  echo `date "+%Y-%m-%d %H:%M:%S"` " execute file: $file ,file size :`du -sh ${datadir}/$file"_importing" |awk '{print $1}'`"
  #echo `date "+%Y-%m-%d %H:%M:%S"` " execute file: $file ,file size :`du -sh ${datadir}/$file |awk '{print $1}'`"

  # sh /data/ora2pg/scripts/psqlcopyfile.sh  $dbname $tableowner $file_dir $file >> ${logdir}/"psqlcopy".log 2>&1 &
  psql_copy_file &
done
}

function check_adb_conn
{
result==`$psqlconn -q -t -c "select 1"`
if [ "x$result" = "x" ];then
    echo "connect to adb is invalid,please check!"
    exit 1
}

function dir_stat
{
exporting_cnt=`ls -rt $datadir  |grep  'exporting' |grep -v done |wc -l`
importing_cnt=`ls -rt $datadir  |grep  'importing' |grep -v done |wc -l`
noimport_cnt=`ls -rt $datadir  |grep -E '*sql$' |grep -v tmp | grep -v done |grep -v import |wc -l`
done_cnt=`ls -rt $datadir/import_done |grep "done" |wc -l`
echo `date "+%Y-%m-%d %H:%M:%S"` "data directory $datadir stat: exporting:$exporting_cnt,noimport:$noimport_cnt,importing:$importing_cnt,import_done:$done_cnt"
}

while getopts 'u:d:t:s:S:l:' OPT; do
    case $OPT in
        u)
            username="$OPTARG";;
        d)
            datadir="$OPTARG";;
        t)
            tablelike="$OPTARG";;
        s)
            file_sort=0
            filecnt="$OPTARG";;
        S)
            file_sort=1
            filecnt="$OPTARG";;            
        l)
            logdir="$OPTARG";;            
        ?)
            usage
    esac
done

check_dir "data" $datadir
check_dir "log" $logdir
# should use -t or -s|S option.
if [ "x$tablelike" != "x" -a "x$filecnt" != "x" ]; then
   echo "you should use -t or -s|S option."
   usage
fi   
dbname='shcrm1'
hostname='10.10.152.77'
port="5432"
psqlconn="psql -h $hostname -p $port -d $dbname -U $username "

echo "username:$username,datadir:$datadir,tablelike:$tablelike,file_sort:$file_sort,filecnt:$filecnt,logdir:$logdir"
check_adb_conn
exe_psql_copy
dir_stat

查找文件

提供一个脚本,根据文件名查找文件是否存在:

vi findfile.sh
echo  "-------------------------------------`date`"
dir=$1
find $dir -maxdepth 2 -name "*$2*"  -exec ls -lhr {} \;

因为导出文件是以表名命名的,所以,根据表名(大写)查找出来的文件,通过标识(exporting,done等)可以知道表的状态(导出中、导出完成、导入中、导入完成)。

查看日志

日志文件在指定的日志目录中存放,命名方式为:

psqlcopy_filename.log

在日志目录中,会有一个总的记录导入失败的文件的日志:psqlcopy_error.log,记录导入失败的文件,并提供对应的日志文件全路径。

数据稽核

两边数据库计算count(*)

同样,表少的情况下,可以直接使用select count(*) 在两边数据库查询。

表多的时候,依然建议将查询结果存表。

Oracle侧查询

oracle侧查询脚本,默认在Oracle起三个并行进行查询,通过配置表取表名,然后更新配置表的o_cnt字段:

vi o_cnt.sh
#/bin/bash
# sh o.sh so1 ins_des_user_ext_210 > o_cnt.log 2>&1 &
dbname="shhis"
owner=$1
tablename=$2

psqlconn="psql -d $dbname -U adb -q -t"
selectsql="select tablename 
from t_ora2adb_tableinfo_cnt
where dbname='$dbname' 
and owner='$owner' 
and upper(tablename) like '$tablename%'
--and o_cnt is null or o_cnt=0
"

usertns="username/password@10.10.10.10/shhis"
oracleparallel=3
tables=(`$psqlconn -c "$selectsql"`)
# oracle count
for t in ${tables[@]}
do 
# oracle count
o_cnt=`sqlplus -S /nolog <<EOF
set heading off feedback off pagesize 0 verify off echo off
conn $usertns
select /*+ parallel($oracleparallel)*/ count(*) from $owner.$t;
exit
EOF`
# oracle size 
o_size_m=`sqlplus -S /nolog <<EOF
set heading off feedback off pagesize 0 verify off echo off
conn $usertns
select round(sum(bytes)/1024/1024,2)  
from dba_segments
--from user_segments
where 1=1
and owner=upper('$owner')
and segment_name=upper('$t');
exit
EOF`

echo `date "+%Y-%m-%d %H:%M:%S"` "table_cnt on oracle: $owner:$t:$o_cnt:$o_size_m MB"
$psqlconn << EOF
update t_ora2adb_tableinfo_cnt set o_cnt=$o_cnt,o_size_m=$o_size_m,o_cnt_time=now() 
where 1=1
and owner='$owner' 
and tablename like '$t'
;
EOF
done

ADB侧查询

同样通过配置表取表名,然后更新配置表的a_cnt字段:

vi a_cnt.sh
#!/bin/bash
# sh a.sh so1 ins_des_user_ext_210 > o_cnt.log 2>&1 &

source /home/adb/.bashrc
# init parameter
dbnname="shhis"
owner=$1
tablename=$2
# oracle connect info
# adb connect info
updatepsqlconn="psql -d $dbnname -U adb -q -t"
cntpsqlconn="psql -d $dbnname -U $owner -q -t"
selectsql="select tablename 
from t_ora2adb_tableinfo_cnt
where dbname='$dbnname' 
and owner='$owner' 
and upper(tablename) like '$tablename%'
--and o_cnt>0
--and (a_cnt is null or a_cnt=0 or o_minus_a <> 0)
"

tables=(`$updatepsqlconn -c "$selectsql"`)
# oracle count
for t in ${tables[@]}
do 
a_cnt=`$cntpsqlconn << EOF 
select count(*) from $owner.$t;
EOF`
a_size_m=`$cntpsqlconn << EOF 
select pg_relation_size('$owner.$t')/1024/1024;
EOF`
echo `date "+%Y-%m-%d %H:%M:%S"` "table_cnt on adb: $owner:$t:$a_cnt:$a_size_m MB"
$updatepsqlconn << EOF
update t_ora2adb_tableinfo_cnt set a_cnt=$a_cnt,a_size_m=$a_size_m,a_cnt_time=now() 
where 1=1
and owner='$owner' 
and tablename like '$t'
;
EOF
done 
$updatepsqlconn -c "update t_ora2adb_tableinfo_cnt set o_minus_a=o_cnt-a_cnt;"

两个脚本中获取表名的sql为selectsql,可以根据实际情况进行修改。

AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔电信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【AntDB数据库】AntDB数据库迁移(三) 的相关文章

随机推荐

  • 司守奎《数学建模算法与应用》 第二版

    内容介绍 本书涵盖了很多同类型书籍较少涉及的新算法和热点技术 主要内容包括时间序列 支持向量机 偏最小二乘面归分析 现代优化算法 数字图像处理 综合评价与决策方法 预测方法以及数学建模经典算法等内容 本书既可以作为数学建模课程教材和辅导书
  • Tesseract OCR 训练字库

    Tesseract OCR是一款由HP实验室开发由Google维护的开源OCR引擎 在字符识别领域发挥着举足轻重的作用 除了使用软件自带的中英文识别库 我们可以使用Tesseract OCR训练属于自己的字库 下面 我简要介绍一下操作步骤
  • Node.js GET/POST请求

    Node js 中的 HTTP 模块提供了创建 HTTP 服务器和发送 HTTP 请求的功能 在本文中 我们将探讨如何使用 Node js 发送 GET 和 POST 请求 首先 您需要使用 http 模块发送 GET 请求 可以使用 ht
  • 局域网——MC无法访问服务器或Ping通

    和室友玩MC的时候 他在局域网内创建服务器后 我一直无法搜索到他的服务器 我也连了他的热点 IP地址也是同一网段的 ping了一下他的机器 请求超时 上网搜了一下 最后发现是因为我装了VM 机器上有VM创建给虚拟机用的虚拟网卡 应该是因为游
  • 解析JSON有俩种方式:JSONObject和GSON

    JSONObject JSONObject解析JSON文件 private void parseJSONWithJSONObject String json data try JSONArray jsonArray new JSONArra
  • 【论文精读】CVPR2022 - 解耦知识蒸馏

    论文精读 CVPR2022 解耦知识蒸馏 论文原文 Decoupled Knowledge Distillation 获取地址 https ieeexplore ieee org stamp stamp jsp tp arnumber 98
  • 使用QTDesigner实现简易的信号与槽

    前言 在pyqt5中使用信号与槽的概念 来实现组件的相关交互动作 信号 外界对组件执行的动作 比如 用鼠标勾选 用鼠标滑过 在文本框中输入文字 鼠标点击按钮等 也可以理解为信号就是一种输入 是用户对界面的各种动作 这些动作通过界面传到了代码
  • Spawn-FCGI安装

    Spawn FCGI安装 获取spawn fcgi编译安装包 在 http redmine lighttpd net projects spawn fcgi wiki 上可 以获取当 前最新的版本 tar zxvf spawn fcgi x
  • 基于视觉的服装尺寸自动测量系统

    文章目录 前言 一 系统性能介绍 1 测量误差 2 测量速度 3 测量服装类型与参数 4 系统的其他功能 二 系统工作条件 三 系统的解决方案 1 相机畸变校正 2 采集待测服装图片 3 分割服装 4 基于最小圆的距离向量特征的提取 5 基
  • SpringBoot拦截器失效问题excludePathPatterns失效问题

    excludePathPatterns失效问题 做项目的时候想添加拦截器白名单 不做拦截的项目 然后添加过滤 registry addInterceptor loginInterceptor addPathPatterns excludeP
  • 全局加载less变量文件

    css preprocessorOptions less modifyVars hack true import reference pathResolve src design var index less additionalData
  • 什么是websocket协议

    websocket和http协议一样 都是基于tcp协议而发展起来的 在TCP两端 同一时间内 双方都可以主动向对方发送数据 这就是所谓的全双工 http协议 是基于tcp的 但是在同一时间内 客户端和服务器只能有一方主动发数据 这就是所谓
  • MapStruct中文文档(一)——定义映射器

    文章目录 3 定义映射器 3 1 基本映射 示例1 定义映射器的Java接口 3 2 映射组合 实验性功能 3 3 向映射器添加自定义方法 示例2 由抽象类定义的映射器 3 4 映射方法具有多个源参数 示例3 具有多个源参数的映射方法 示例
  • 基于Spring+SpringMVC+Mybatis 开发的web在线租房系统

    项目介绍 本项目包含用户端和管理端 采用JSP模板引擎渲染页面 使用Ajax实现前后端异步交互 用户端包含房屋列表 房屋详情 房屋筛选 租房 二手房 新房可按租金 出租方式 面积 房型进行筛选 按价格 发布时间进行排序 并提供登录 注册 收
  • 机器学习技术(五)——特征工程与模型评估

    机器学习技术 五 特征工程与模型评估 2 文章目录 机器学习技术 五 特征工程与模型评估 two 二 模型评估 1 Accuracy score 2 Confusion matrix混淆矩阵 1 多值 2 二值 3 Hamming loss
  • 使用antd3.x版本实现选择年份,并设置默认年份

    在使用antd3 x的时候 需要用到只选择年份的选择器 会遇到的很多问题 点击可以查看这个文档 可能会对你有所帮助 下面的代码的实现部分 import React Component from react import DatePicker
  • NNIE的运行机制

    NNIE的运行机制 一 背景 由于当前主流算法中都使用了深度学习算法 而深度学习算法在移植过程中 基于带有的NNIE推理单元的Hisi芯片将极大的提高算法模型的推理 加速算法计算 从而便于算法落地上车 故而本文将简要说明NNIE的运行机制
  • 基于深度学习的对联自动生成系统

    对联自动生成系统 1 项目目标 设计一个基于深度学习的对联生成系统 最终结果可以是一个简单的界面 在界面中 我输入一句上联 通过点击相应按钮 系统生成相应下联并显示出来 2 国内外相关工作 对联是属于我们中华民族独有的一种文学形式 国外研究
  • 类中的向上转型与向下转型详解

    我们的类与类之间会存在继承关系 子类继承父类 一个父类可以有多个子类 例如Animal类就可以有Cat子类 Dog子类 等等 那么我们在运用的时候根据不同的场景会出现向上转型和向下转型的情况 一 向上转型 1 Animal a1 new C
  • 【AntDB数据库】AntDB数据库迁移(三)

    导出导入数据 导入数据 导出的数据文件为copy命令的sql文件 可以直接使用psql f参数执行 但是在文件数量比较多的时候 建议采用脚本封装的方式 可控的进行数据导入 编写导入脚本 该脚本通过命令行参数来控制是通过表名查找文件导入还是按