暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

数据迁移

416

前置条件

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 TABLECREATE VIEW,  CREATE SEQUENCE to PRODUCT;
3GRANT SELECT ANY TABLE TO PRODUCT; 

1.1.4创建表

 1CREATE TABLE PRODUCT.PRD_INFO (   BANK_SEQ NUMBER(10NOT NULL,   INVEST_TYPE VARCHAR(2NOT NULL,   INVEST_CODE VARCHAR(32NOT NULL,   RELEASE_DATE DATE NOT NULL,   INVEST_NAME VARCHAR(128),   CURRENCY VARCHAR(3DEFAULT '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;

附录.

  1. 该方法可以作为Oracle定期的数据碎片清理方案,即:调用sqlldr导出数据txt,然后truncate表,然后sqlldr再导入txt数据(操作前先备份,export.sh脚本和导入脚本类似)。
  2. 该方法可以改写成其他国产或开源数据库的数据迁移方案,比如mysql
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论