建筑网站上海,设计制造有限公司,免费做封面网站,搜索排名怎么做文章目录 前言一、大表数据附#xff1a;查询大表 二、解题思路1.导出排除大表的数据2.rowid切片导出大表数据Linux代码如下#xff08;示例#xff09;#xff1a;Windows代码如下#xff08;示例#xff09;#xff1a;手工执行代码如下#xff08;示例#xff09;查询大表 二、解题思路1.导出排除大表的数据2.rowid切片导出大表数据Linux代码如下示例Windows代码如下示例手工执行代码如下示例 3.rowid切片导入大表数据导入前准备linux代码如下示例windows代码如下示例 三、导出时业务卡顿如何停止 前言
Oracle在做数据迁移、还原测试库以及其他需要导出、导入数据的需求下我们常用到数据泵来进行数据的转移操作但往往很多事后我们要操作的库数据量都非常大且数据库中clob字段非常多就给我们导出带来了一些问题导出慢或者卡在那里很久不动等问题
有小伙伴可能会说你开并行不就行了吗事实上当你数据库中大对象数据量占用较大时候你会发现开并行没有任何用那么怎么解决这个问题呢那么思路是先排除大对象的表然后大表再通过rowid切片多个进程导出导入。 提示以下是本篇文章正文内容下面案例可供参考
一、大表数据 截图中可以看到此表占用446G数据量压缩完后大小为51G开了2个进程并行但没有效果最终执行了10小时时间是非常久的。
附查询大表
--查看大对象先排除导出然后再单独导出
SELECT owner,tablespace_name,case SEGMENT_typewhen LOBSEGMENT then(select table_name || . || column_namefrom dba_lobs twhere t.segment_name s.segment_name)elseSEGMENT_NAMEend as SEGMENT_NAME,BYTES / 1024 / 1024 MB,BYTES / 1024 / 1024 / 1024 GBFROM DBA_SEGMENTS sOrder By 4 Desc,3 asc;二、解题思路
1.导出排除大表的数据
命令参考:
expdp system/oracleip:1521/sidname directorydatapump_dir parallel8 clusterN dumpfileexp_full0824_%U.dmp logfileexp_full_20230824.log schemasusrname COMPRESSIONALL excludestatistics excludeTABLE:\in\(\table_name\\)\这里可以看到排除大表后整体导出时间下降到了17分钟
2.rowid切片导出大表数据
rowid切片导出数据是从0开始我们需要知道rowid的分配来控制最终想执行的并行数。
Linux代码如下示例
#!/bin/bash
chunk9
for ((i0;i8;i));
do
expdp system/oracle TABLEStablename QUERYtablename:\where mod\(dbms_rowid.rowid_block_number\(rowid\)\, ${chunk}\) ${i}\ directoryDMP dumpfileTX_${i}.DMP logfileTX_${i}.log
echo $i
sleep 10
done Windows代码如下示例
echo off
#这里可以带上IP地址、端口、sid
set connStrsystem/oracleip:1521/sid_name
#这里指的并行数
set chunk10
#sid_name
set oracle_sidorcl
#oracle_home路径注意bin后边的‘\’
set oracle_home_pathd:\oracle\product\10.2.0\db_1\bin\rem 格式FOR /L %variable IN (start,step,end) DO command [command-parameters]
#10个并行0~9(开始标号、每次增加量、结束标号)
for /l %%a in (0,1,9) do (
start /b %oracle_home_path%expdp %connStr% TABLEStable_name QUERYtable_name:\where mod\(dbms_rowid.rowid_block_number\(rowid\)\,%chunk%\) %%a\ directoryexpdpdump dumpfileTX_%%a.DMP logfileTX_%%a.log
timeout 10 nul 2nul
)手工执行代码如下示例
#如下打开三个窗口分别粘贴执行如果要开更多的进程需要更改3后后面的0~2
SQL create or replace directory dmp as D:\dump\;
SQL grant read,write on directory dmp to public;expdp system/oracle tablestable_name QUERYtable_name:\where mod\(dbms_rowid.rowid_block_number\(rowid\)\,3\) 0\ directoryDMP dumpfilexxxx_0.dmp logfilexxxx_0.log
expdp system/oracle tablestable_name QUERYtable_name:\where mod\(dbms_rowid.rowid_block_number\(rowid\)\,3\) 1\ directoryDMP dumpfilexxxx_1.dmp logfilexxxx_1.log
expdp system/oracle tablestable_name QUERYtable_name:\where mod\(dbms_rowid.rowid_block_number\(rowid\)\,3\) 2\ directoryDMP dumpfilexxxx_2.dmp logfilexxxx_2.log
)以上我拿一张14G数据表进行测试3个并行度执行实际4分半实际测试中切片导出数据也可以加压缩参数。 对比此张图可以看到我的切片测试已将导出实际提升了2倍左右如果并行度更高的话那么我们的整体时间会成倍降低。
3.rowid切片导入大表数据
导入前准备
在导入大表数据之前需要做的是
#确保大表所在的表空间存在
select table_name,tablespace from user_tables where table_nameTABLE_NAME;#创建用户以及表结构建议使用plsql查询
SELECT DBMS_METADATA.GET_DDL(TABLE,TABLE_NAME) from DUAL;linux代码如下示例
#!/bin/bash
for ((i0;i8;i));
do
#echo dumpfileTX_${i}.DMP
impdp \/ as sysdba\ directoryimpdpdump dumpfileTX_${i}.DMP logfileimpdp_TX_${i}.log DATA_OPTIONSDISABLE_APPEND_HINT TRANSFORMDISABLE_ARCHIVE_LOGGING:Y CONTENTDATA_ONLY
sleep 10
donewindows代码如下示例
echo offset connStrsystem/oracle
set oracle_sidorcl
set oracle_home_pathd:\oracle\product\10.2.0\db_1\bin\rem 格式FOR /L %variable IN (start,step,end) DO command [command-parameters]for /l %%a in (0,1,9) do (
rem 11g upper start /b %oracle_home_path%impdp %connStr% directoryimpdpdump dumpfileTX_%%a.DMP logfileimp_TX_%%a.log DATA_OPTIONSDISABLE_APPEND_HINT TRANSFORMDISABLE_ARCHIVE_LOGGING:Y CONTENTDATA_ONLYstart /b %oracle_home_path%impdp %connStr% directoryimpdpdump dumpfileTX_%%a.DMP logfileimp_TX_%%a.log CONTENTDATA_ONLY
timeout 10 nul 2nul
)测试表导入成功和切片导出的时间基本相同。
三、导出时业务卡顿如何停止
select s.inst_id,to_char(sysdate,YYYY-MM-DD HH24:MI:SS) DATE, s.program, s.sid, orakill orcl2 ||spid,kill -9 ||spid, s.status, s.username, d.job_name, p.spid, s.serial#, p.pid ,ALTER SYSTEM KILL SESSION ||||s.SID||,||s.SERIAL#||,||s.inst_id|||| IMMEDIATE; killsefrom gv$session s, gv$process p, dba_datapump_sessions d where p.addrs.paddr and s.saddrd.saddr and s.inst_idp.inst_id and s.inst_idd.inst_id; select orakill orcl ||spid ,ALTER SYSTEM KILL SESSION ||||t1.SID||,||t1.SERIAL#|||| IMMEDIATE; killse
--,kill -9 ||spidfrom sys.gV_$PROCESS t,gv$session t1,dba_datapump_sessions d where t.addrt1.paddr and t1.saddrd.saddrand t1.TypeUSER and t1.username is not null;select drop table || owner_name || . || job_name || purge; from dba_datapump_jobs where state NOT RUNNING ;参考文献https://mp.weixin.qq.com/s/pKNe2EzpB_PM0itpa4jrdA