前置条件
a.源端
源数据是txt格式,类似如下:
"1","1","PC00001","2021-10-12 00:00:00","测试理财产品001","CNY","1.35","98.1",".45",".18","2.36","2.36","0","2.36","1","2021-10-12 00:00:00","2021-10-14 00:00:00.000000","2021-10-12 00:00:00.000000"b.目标端
目标端版本信息 c.迁移方案比较
迁移工具比较
根据上述4种方案,个人推荐方案一
shell方案
1.脚本准备前
1.1创建数据库对象
1.1.1创建PRODUCT对应表空间
1select * from dba_data_files;
2create tablespace PRODUCT_DATA_DISK datafile '/data1/db1/PRODUCT_DATA_DISK.dbf' size 20m;
1.1.2创建用户
1create user PRODUCT identified by PRODUCT default tablespace PRODUCT_DATA_DISK ;
1.1.3用户授权
1GRANT connect,resource,dba TO PRODUCT;
2grant CREATE TABLE, CREATE VIEW, CREATE SEQUENCE to PRODUCT;
3GRANT SELECT ANY TABLE TO PRODUCT;
1.1.4创建表
1CREATE TABLE PRODUCT.PRD_INFO ( BANK_SEQ NUMBER(10) NOT NULL, INVEST_TYPE VARCHAR(2) NOT NULL, INVEST_CODE VARCHAR(32) NOT NULL, RELEASE_DATE DATE NOT NULL, INVEST_NAME VARCHAR(128), CURRENCY VARCHAR(3) DEFAULT 'CNY', INVEST_NAV NUMBER(20,6), INCOME NUMBER(20,2), INCOME_UNIT NUMBER(20,2), TOT_NAV NUMBER(20,6), INCOME_RATE NUMBER(20,6), ANNUALIZED_RATE NUMBER(20,6), ANNUALIZED_FLAG VARCHAR(2), MONTH_INCOME_RATE NUMBER(20,6), MONTH_FLAG VARCHAR(2), CREATE_DATE DATE, CREATE_TIME TIMESTAMP(6), UPDATE_TIME TIMESTAMP(6) ) ;
2COMMENT ON TABLE PRODUCT.PRD_INFO IS '产品净值收益表';
3COMMENT ON COLUMN PRODUCT.PRD_INFO .BANK_SEQ IS '银行顺序号';
4COMMENT ON COLUMN PRODUCT.PRD_INFO .INVEST_TYPE IS '基金/理财产品类别 0-基金、1-行内理财、2-境外理财产品';
5COMMENT ON COLUMN PRODUCT.PRD_INFO .INVEST_CODE IS '基金/理财产品代码';
6COMMENT ON COLUMN PRODUCT.PRD_INFO .RELEASE_DATE IS '发布日期';
7COMMENT ON COLUMN PRODUCT.PRD_INFO .INVEST_NAME IS '基金/理财产品名称';
8COMMENT ON COLUMN PRODUCT.PRD_INFO .CURRENCY IS '币种 默认 CNY-人民币';
9COMMENT ON COLUMN PRODUCT.PRD_INFO .INVEST_NAV IS '基金/理财产品净值';
10COMMENT ON COLUMN PRODUCT.PRD_INFO .INCOME IS '基金/理财产品收益';
11COMMENT ON COLUMN PRODUCT.PRD_INFO .INCOME_UNIT IS '万份产品单位收益';
12COMMENT ON COLUMN PRODUCT.PRD_INFO .TOT_NAV IS '产品累计净值';
13COMMENT ON COLUMN PRODUCT.PRD_INFO .INCOME_RATE IS '产品收益率';
14COMMENT ON COLUMN PRODUCT.PRD_INFO .ANNUALIZED_RATE IS '七日年化收益';
15COMMENT ON COLUMN PRODUCT.PRD_INFO .ANNUALIZED_FLAG IS '七日年化收;
16
1.1.5创建表主键和索引
1ALTER TABLE PRODUCT.PRD_INFO ADD PRIMARY KEY(BANK_SEQ,INVEST_TYPE,INVEST_CODE,RELEASE_DATE);
2CREATE INDEX IDX_PRD_INFC_1 ON PRODUCT.PRD_INFO(INVEST_CODE) TABLESPACE PRODUCT_TMP; CREATE INDEX IDX_PRD_INFO_2 ON PRODUCT.PRD_INFO(CREATE_DATE) TABLESPACE PRODUCT_TMP;
1.2创建文件目录
1.2.1创建总目录
1[oracle@gs08 ~]$ mkdir -p DATA_20211215
1.2.2创建schma目录
1 [oracle@gs08 ~]$ cd DATA_20211215
2 [oracle@gs08 DATA_20211215]$ mkdir -p PRODUCT_20211215
1.2.3创建schema下的子目录
1[oracle@gs08 DATA_20211215]$ cd PRODUCT_20211215
2[oracle@gs08 PRODUCT_20211215]$ mkdir -p control
3[oracle@gs08 PRODUCT_20211215]$ mkdir -p data
4[oracle@gs08 PRODUCT_20211215]$ mkdir -p export_log
5[oracle@gs08 PRODUCT_20211215]$ mkdir -p history
6[oracle@gs08 PRODUCT_20211215]$ mkdir -p import_log
7[oracle@gs08 PRODUCT_20211215]$ mkdir -p sh
8[oracle@gs08 PRODUCT_20211215]$ ll
9总用量 24
10drwxr-xr-x 2 oracle oinstall 4096 12月 15 16:24 control
11drwxr-xr-x 2 oracle oinstall 4096 12月 15 16:24 data
12drwxr-xr-x 2 oracle oinstall 4096 12月 15 16:24 export_log
13drwxr-xr-x 2 oracle oinstall 4096 12月 15 16:24 history
14drwxr-xr-x 2 oracle oinstall 4096 12月 15 16:24 import_log
15drwxr-xr-x 2 oracle oinstall 4096 12月 15 16:24 sh
16[oracle@gs08 PRODUCT_20211215]$ pwd
17/home/oracle/DATA_20211215/PRODUCT_20211215
1.2.4编辑控制文件
1[oracle@gs08 PRODUCT_20211215]$ cd control/
2[oracle@gs08 control]$ vi PRODUCT.PRD_INFO.ctl
3 [oracle@gs08 PRODUCT_20211215]$ cd control/
4[oracle@gs08 control]$ vi PRODUCT.PRD_INFO.ctl
5[oracle@gs08 control]$ cat PRODUCT.PRD_INFO.ctl
6[oracle@gs08 control]$ cat PRODUCT.PRD_INFO.ctl
1load data
2CHARACTERSET AL32UTF8
3infile './../data/PRODUCT.PRD_INFO.dat'
4append into table PRODUCT.PRD_INFO
5fields terminated by ','
6optionally enclosed by '"'
7(
8bank_seq,
9invest_type,
10invest_code,
11release_date "to_date(:release_date,'YYYY-MM-DD HH24:MI:SS')",
12invest_name,
13currency,
14invest_nav,
15income,
16income_unit,
17tot_nav,
18income_rate,
19annualized_rate,
20annualized_flag,
21month_income_rate,
22month_flag,
23create_date "to_date(:create_date,'YYYY-MM-DD HH24:MI:SS')",
24create_time "to_timestamp(:create_time,'YYYY-MM-DD HH24:MI:SS.FF')",
25update_time "to_timestamp(:update_time,'YYYY-MM-DD HH24:MI:SS.FF')"
26)
1.2.5编辑表清单文件
1[oracle@gs08 control]$ cd ../history/
2[oracle@gs08 history]$ vi TABLE_LIST.txt
3[oracle@gs08 history]$ cat TABLE_LIST.txt
4PRODUCT.PRD_INFO
1.2.6编辑shell文件
1[oracle@gs08 history]$ cd ../sh/
2[oracle@gs08 sh]$ vi import.sh
3[oracle@gs08 sh]$ cat import.sh
1SCHEMA=( `cat ../history/TABLE_LIST.txt | cut -d. -f1` )
2TABLE=( `cat ../history/TABLE_LIST.txt | cut -d. -f2` )
3CNT=${#TABLE[*]}
4
5 if [[ "$TARGET_SCHEMA" == "" ]]
6then
7sqlldr PRODUCT/PRODUCT control=./../control/PRODUCT.PRD_INFO.ctl log=./../import_log/PRODUCT.PRD_INFO.log bad=./../import_log/PRODUCT.PRD_INFO.bad parallel=true
8else
9 for((i=0;i<$CNT;i++))
10 do
11 if [[ ${SCHEMA[i]} == ${TARGET_SCHEMA^^} ]]
12 then
13 sqlldr PRODUCT/PRODUCT control=./../control/${SCHEMA[i]}.${TABLE[i]}.ctl log=./../export_log/${SCHEMA[i]}.${TABLE[i]}.log bad=./../export_log/${SCHEMA[i]}.${TABLE[i]}.bad
14fi
15 done
2.调用执行shell
1[oracle@gs08 sh]$ chmod +x import.sh
2[oracle@gs08 sh]$ ll
3总用量 8
4-rwxr-xr-x 1 oracle oinstall 658 12月 15 16:44 import.sh
5-rw-r--r-- 1 oracle oinstall 73 12月 15 16:48 log
6[oracle@gs08 sh]$ nohup ./import.sh >/dev/null 2>log &
3.验证结果
1select t.invest_name from PRODUCT.PRD_INFO t where rownum<10;
附录.
- 该方法可以作为Oracle定期的数据碎片清理方案,即:调用sqlldr导出数据txt,然后truncate表,然后sqlldr再导入txt数据(操作前先备份,export.sh脚本和导入脚本类似)。
- 该方法可以改写成其他国产或开源数据库的数据迁移方案,比如mysql
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。






