注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL: Oracle_fdw 数据迁移之高效  

2012-07-05 14:18:14|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


        最近在做一个 Oracle  迁移 PostgreSQL 项目 ,数据迁移初步计划用 PostgreSQL 的外部表
oracle_fdw 来做,oracle,pg 测试环境搭好后,今天做了下测试,发现 Oracle_fdw 迁移数据效率
挺高, 22 GB 数据,迁移花了 55 分钟左右,下面是迁移的步骤:


--1 服务器配置信息
DELL R610
8 核 24 GB  
硬盘:两块 SCSI 300 GB  ( RAID 1)

 
--2 版本信息
OS:     Red Hat Enterprise Linux Server release 5.6
PG:      PostgreSQL 9.2beta2
Oracle:  10.2.0.4.0


--3 PG 部分参数配置

shared_buffers = 1024MB               
synchronous_commit = off 
autovacuum = off
checkpoint_segments = 128 
checkpoint_timeout = 60 min 
   
   备注:为了提高写入速度,数据导入过程中关闭 autovacuum。
  

--4 Oracle 参数配置

 sga_target=5G
pga_aggregate_target=1797M
db_file_multiblock_read_count=16
TEMP 表空间: 10GB
UNDO 表空间: 8GB 
   


--5 关于 oracle_fdw 安装

     pg 上需要安装 oracle_fdw 模块,关于 oracle_fdw 的安装,本文略,具体可以参考之前写的 blog
 http://francs3.blog.163.com/blog/static/4057672720122354546425/
 

--6 oracle 需要抽取的表的表结构

 create table francs.TBL_FDW_TEST
(
  USER_ID      NUMBER(10) not null,
  STATE       NUMBER(10) not null,
  USER_NAME   VARCHAR2(64),
  BIND_MOBILE VARCHAR2(20),
  BIND_EMAIL  VARCHAR2(64),
  PASSWD      VARCHAR2(64) not null,
  LOGIN_TIME  DATE,
  IMSI        VARCHAR2(20),
  IMEI        VARCHAR2(20),
  LOGIN_COUNT NUMBER(10) not null,
  LAST_STIME  DATE,
  UPTAG       NUMBER(10) not null
);

alter table francs.TBL_FDW_TEST  add primary key (USER_ID);

alter table francs.TBL_FDW_TEST
  add constraint UK_AUTH_USERNAME unique (USER_NAME)
  using index  
  tablespace TBS_francs_IDX
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );

create index francs.IDX_TBL_FDW_TEST_LOGIN_TIME on francs.TBL_FDW_TEST (LOGIN_TIME);

   

 

--7 PG 对应表结构

 create table TBL_FDW_TEST (
   USER_ID               NUMERIC(10)          not null,
   STATE                NUMERIC(10)          not null,
   USER_NAME            VARCHAR(64)          null,
   BIND_MOBILE          VARCHAR(20)          null,
   BIND_EMAIL           VARCHAR(64)          null,
   PASSWD               VARCHAR(64)          not null,
   LOGIN_TIME           timestamp(0) without time zone,
   IMSI                 VARCHAR(20)          null,
   IMEI                 VARCHAR(20)          null,
   LOGIN_COUNT          NUMERIC(10)          not null,
   LAST_STIME           timestamp(0) without time zone,
   UPTAG                NUMERIC(10)          not null,
   constraint PK_AUTH_SKYID primary key (USER_ID),
   constraint UK_AUTH_USERNAME unique (USER_NAME)
);

CREATE INDEX IDX_TBL_FDW_TEST_LOGIN_TIME ON TBL_FDW_TEST  USING btree (LOGIN_TIME);

   


--8 pg 中的外部表

 francs=> \det ft_TBL_FDW_TEST
         List of foreign tables
 Schema |      Table       |   Server  
--------+------------------+------------
 francs | ft_TBL_FDW_TEST | oracle_srv
(1 row)

francs-> \d ft_TBL_FDW_TEST
                Foreign table "francs.ft_TBL_FDW_TEST"
   Column    |              Type              | Modifiers | FDW Options
-------------+--------------------------------+-----------+-------------
 USER_ID      | numeric(10,0)                  | not null  |
 state       | numeric(10,0)                  | not null  |
 user_name   | character varying(64)          |           |
 bind_mobile | character varying(20)          |           |
 bind_email  | character varying(64)          |           |
 passwd      | character varying(64)          | not null  |
 login_time  | timestamp(0) without time zone |           |
 imsi        | character varying(20)          |           |
 imei        | character varying(20)          |           |
 login_count | numeric(10,0)                  | not null  |
 last_stime  | timestamp(0) without time zone |           |
 uptag       | numeric(10,0)                  | not null  |
Server: oracle_srv
FDW Options: (schema 'francs', "table" 'TBL_FDW_TEST')

   
   备注:PG中建立相应的外部表 ft_TBL_FDW_TEST ,表结构和pg目标表 TBL_FDW_TEST 结构一致,
             当然外部表有些限制,比如不能有 default 值等。
  
--9 迁移脚本

 --ORACLE 库中取最大 user_id

 SQL>  select max(sky_id) from  francs.TBL_USER_auth;

MAX(SKY_ID)
-----------
  295799801

  
--insert_auth_1.sql 脚本

 \timing
insert into TBL_USER_AUTH select * from ft_TBL_USER_AUTH where USER_ID <  100000000;
   

--insert_auth_2.sql 脚本

 \timing
insert into TBL_USER_AUTH select * from ft_TBL_USER_AUTH where USER_ID >= 100000000 and SKY_ID < 150000000;
   

--insert_auth_3.sql 脚本

 \timing
insert into TBL_FDW_TEST select * from ft_TBL_FDW_TEST where USER_ID >= 150000000 and USER_ID < 200000000;
   

--insert_auth_4.sql 脚本

 \timing
insert into TBL_FDW_TEST select * from ft_TBL_FDW_TEST where USER_ID >= 200000000 and USER_ID < 250000000;
   

--insert_auth_5.sql 脚本

 \timing
insert into TBL_FDW_TEST select * from ft_TBL_FDW_TEST where USER_ID >= 250000000 and USER_ID < 300000000;
   
   备注:由于在 PostgreSQL 中单个查询只能利用到一个 CPU 核,而不能像 Oracle 库中的 启用并行查询。
             所以这里逻辑上写了多个 sql,根据主键 USER_ID 进行划分,上面分成了五个脚本。


--10 同时后台执行脚本五个脚本
  
            同时后台执行上面五个脚本,测试后,最后执行完的脚本的执行时间为 55 分钟左右。注意 55 分钟只是数据

迁移时间,索引的创建时间并没有包括,索引的创建时间蛮长的,尤其是主键, unique index 的添加耗时更长。

 

-11 总结
 
    
22 GB 的数据从 Oracle 库中迁移到 PG 库只花费了 55 分钟左右,这个速度已经比较快了,oracle_fdw 模块

是 Oracle 转 PG的一大利器,使用得好可以大大提高 O 转 P 的效率。

 

  评论这张
 
阅读(25950)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016