1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

数据倒换LOB字段过大解决方法

数据割接中遇到LOB字段过大的解决方法

您好,欢迎来到本际云服务器推荐网,我是小编小本本。在进行数据割接时,如果原库过于老旧,可能会遇到存在过大的LOB字段表导致表无法正常迁移报错的问题。针对这种情况,下面介绍两种解决方法。

数据倒换LOB字段过大解决方法

查询大的LOB字段表

首先,可以使用以下语句查询出大的LOB字段表:

select a.owner, a.table_name, a.SEGMENT_NAME, a.COLUMN_NAME, sum(b.bytes)/1024/1024/1024 SIZE_GB from dba_lobs a, dba_segments b where a.segment_name=b.segment_name and a.owner=b.owner and a.owner not in (SYS, SYSTEM, MDSYS, XDB, APEX_040200) group by a.owner, a.table_name, a.SEGMENT_NAME, a.COLUMN_NAME order by 5;

select owner, tablespace_name, segment_type, segment_name, PARTITION_NAME, sum(bytes)/1024 /1024 size_m from dba_segments where segment_type=LOBSEGMENT and owner not in (SYS, SYSTEM, XDB, APEX_040200, MDSYS) AND tablespace_name not in (SYSAUX, SYSTEM) group by owner, tablespace_name, segment_type, segment_name,PARTITION_NAME order by 6 desc;

如图所示,某个LOB字段大小为176G。

数据倒换LOB字段过大解决方法

切割表

当系统过于老旧时,无法使用expdp导出,这时可以选择将该表切割成多个部分分别导出。本文以表“AAAAAA.BBBBBB”为例,仅将其切割为5个部分。

首先,需要准备一个model脚本。示例脚本:

cat >exp_gg_big_XXOWNER_XXTAB_XXSEQ.mod_par
USERID=******/******
##FLASHBACK_SCN=15696871445525(如需要导出相应时刻的表数据请加上)
DIRECTORY=逻辑目录
CONTENT=DATA_ONLY
DUMPFILE=exp_gg_bcvbig_XXOWNER_XXTAB_XXSEQ.dmp
LOGFILE=exp_gg_bcvbig_XXOWNER_XXTAB_XXSEQ.log
TABLES=AAAAAA.BBBBBB
QUERY=AAAAAA.BBBBBB:"WHERE rowid IN (SELECT sou_rowid FROM system.seq_test_XXTAB where sb_seq=XXSEQ)"

然后,可以使用以下脚本将表切割成多个部分。

cat >create_exp_gg_bcvbig1.sh
/home/oracle/.profile

# Used by ogg.AUTOEXP WITH SCN
Usage(){
echo "------------------------------------------------------------"
echo "Usage"
echo "ksh create_exp_gg_bcvbig.sh -o OWNER -t OR_PRTCNTT_202205&"
echo "Sample:"
echo "ksh create_exp_gg_bcvbig.sh -o DBORDERADM -t OR_PRTCNTT_202205"
echo "------------------------------------------------------------"
}

# Main
if [$# -ne 4]
then
Usage
exit 1
fi

while getopts :o:t: OPTION do
case $OPTION in
o) V_OWNER=$OPTARG;;
t) V_TABLE_NAME=$OPTARG;;
?) Usage ; exit 1 ;;
esac
done

SQL_FILE=create_seq_test_$V_TABLE_NAME".sql"
cat /dev/null > $SQL_FILE
echo "set time on timing on">>$SQL_FILE
echo "ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8;">>$SQL_FILE
echo "ALTER SESSION FORCE PARALLEL DDL PARALLEL 8;">>$SQL_FILE
echo "ALTER SESSION FORCE PARALLEL DML PARALLEL 8;">>$SQL_FILE
echo "alter session enable parallel ddl;">>$SQL_FILE
echo "alter session enable parallel dml;">>$SQL_FILE
echo "create table system.seq_test_"$V_TABLE_NAME"
tablespace 表空间
as
select mod(rownum,5#将表切割为多少个#) sb_seq, rowid sou_rowid
from "$V_OWNER"."$V_TABLE_NAME"##as of scn 15696871445525##;">>$SQL_FILE
echo "alter session disable parallel ddl;">>$SQL_FILE
echo "alter table system.seq_test_"$V_TABLE_NAME" noparallel;">>$SQL_FILE
echo "exit">>$SQL_FILE

echo "cat exp_gg_big_XXOWNER_XXTAB_XXSEQ.mod_par | sed s/XXDIR/SOU_EXPA/g | sed s/XXSEQ/00/g | sed s/XXOWNER/"$V_OWNER"/g | sed s/XXTAB/"$V_TABLE_NAME"/g > exp_gg_bcvbig_"$V_TABLE_NAME"_00.par" | sh
echo "cat exp_gg_big_XXOWNER_XXTAB_XXSEQ.mod_par | sed s/XXDIR/SOU_EXPA/g | sed s/XXSEQ/01/g | sed s/XXOWNER/"$V_OWNER"/g | sed s/XXTAB/"$V_TABLE_NAME"/g > exp_gg_bcvbig_"$V_TABLE_NAME"_01.par" | sh
echo "cat exp_gg_big_XXOWNER_XXTAB_XXSEQ.mod_par | sed s/XXDIR/SOU_EXPA/g | sed s/XXSEQ/02/g | sed s/XXOWNER/"$V_OWNER"/g | sed s/XXTAB/"$V_TABLE_NAME"/g > exp_gg_bcvbig_"$V_TABLE_NAME"_02.par" | sh
echo "cat exp_gg_big_XXOWNER_XXTAB_XXSEQ.mod_par | sed s/XXDIR/SOU_EXPA/g | sed s/XXSEQ/03/g | sed s/XXOWNER/"$V_OWNER"/g | sed s/XXTAB/"$V_TABLE_NAME"/g > exp_gg_bcvbig_"$V_TABLE_NAME"_03.par" | sh
echo "cat exp_gg_big_XXOWNER_XXTAB_XXSEQ.mod_par | sed s/XXDIR/SOU_EXPA/g | sed s/XXSEQ/04/g | sed s/XXOWNER/"$V_OWNER"/g | sed s/XXTAB/"$V_TABLE_NAME"/g > exp_gg_bcvbig_"$V_TABLE_NAME"_04.par" | sh

执行脚本前,需要确保中间表已经创建成功。执行脚本语句:ksh create_exp_gg_bcvbig1.sh -o AAAAAA -t BBBBBB,其中-o为属主,-t为表名。执行脚本后,会生成一个sql文本和5个par文件。

Par文件示例:

USERID=******/******
##FLASHBACK_SCN=15696871445525(如需要导出相应时刻的表数据请加上)
DIRECTORY=逻辑目录
CONTENT=DATA_ONLY
DUMPFILE=exp_gg_big_AAAAAA_BBBBBB_00.dmp
LOGFILE=exp_gg_big_AAAAAA_BBBBBB_00.log
TABLES=AAAAAA.BBBBBB
QUERY=AAAAAA.BBBBBB:"WHERE rowid IN (SELECT sou_rowid FROM ogg.seq_test_BBBBBB where sb_seq=00)"

最后,执行生成的5个par文件:nohup expdp parfile=exp_gg_big_AAAAAA_BBBBBB_00.par &(一共5个),需要依次执行,不能同时执行。

以上就是解决数据割接中遇到LOB字段过大的两种方法,希望能够对大家有所帮助。

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6438.html