Bootstrap

oracle数据迁移到pg库上

迁移工具:ora2pg
工具版本:v23.1

1、查询oracle信息

1.1、查看是否有分区表

1.2、查看用户对象占用空间(需要迁移的对象占用空间大小)

2、准备配置文件

vi *.conf

PG_VERSION 12
ORACLE_HOME /oracle/app/oracle/product/11.2.0/dbhome_1
ORACLE_DSN dbi:Oracle:host=xxx.xxx.xxx.xxx;sid=oradb;port=1521
ORACLE_USER user
ORACLE_PWD password
SCHEMA user
PG_NUMERIC_TYPE 0
PG_INTEGER_TYPE 1
DEFAULT_NUMERIC float
NLS_LANG AMERICAN_AMERICA.UTF8
#ALLOW TPR_* TSM_*
#ALLOW tpr_,tsm_,twf_*
#exclude 20 TSM_FUNCTION
#SKIP fkeys pkeys ukeys indexes checks
#OUTPUT table.sql

3、导出表结构和索引

ora2pg -p -c .conf -t TABLE -o table.sql
-e 'TABLE[XXX.
,XXX.]’ 排除指定的表
-a 'TABLE[XXX.
,XXX.*]’ 包括指定的表

4、导出表数据

测试表(数据量小)
[root@myoracle ~]# vi data.sh
ora2pg -p -c *.conf -t COPY -o data.sql -j 4
[root@myoracle ~]# chmod +x data.sh
[root@myoracle ~]# nohup ./data.sh > ./data.out & //后台运行
生产表(数据量大)
select ‘ora2pg -p -c *.conf -t COPY -a ‘‘TABLE[’|| table_name ||’]’’ -o ‘||table_name||’.sql -j 4’ from user_tables where
table_name not like ‘%xxx%’ and table_name not like ‘%xxx%’
order by 1 asc;
//not like 排除某些不需要的表
写成脚本使每个表单独导出
chmod +x data.sh
nohup ./data.sh > ./data.out & //后台运行
导出的.sql文件打包成.tar.gz压缩包

5、导出其他对象数据

vi other.sh //将以下命令放入other脚本中,统一执行
ora2pg -p -c db.conf -t VIEW -o VIEW.sql
ora2pg -p -c db.conf -t SEQUENCE -o SEQUENCE.sql
ora2pg -p -c db.conf -t TRIGGER -o TRIGGER.sql
ora2pg -p -c db.conf -t FUNCTION -o FUNCTION.sql
ora2pg -p -c db.conf -t PROCEDURE -o PROCEDURE.sql
ora2pg -p -c db.conf -t PACKAGE -o PACKAGE.sql
ora2pg -p -c db.conf -t MVIEW -o MVIEW.sql
ora2pg -p -c db.conf -t DBLINK -o DBLINK.sql
ora2pg -p -c db.conf -t SYNONYM -o SYNONYM.sql
ora2pg -p -c db.conf -t TYPE -o TYPE.sql
chmod +x other.sh //赋予执行权限
nohup ./other.sh > ./other.out & //后台执行
tail -f other.out //查看输出日志

6、导入type类型、表结构、表序列

export PGPASSWORD=password //避免手动输入密码
psql --host=xxx.xxx.xxx.xxx --port=5432 --username=user --echo-errors dbname -f TYPE.sql -1
psql --host=xxx.xxx.xxx.xxx --port=5432 --username=user --echo-errors dbname -f table.sql -1
psql --host=xxx.xxx.xxx.xxx --port=5432 --username=user --echo-errors dbname -f SEQUENCE.sql -1
psql:table.sql:1329: ERROR: function round(timestamp
without time zone) does not exist
LINE 14: fldvaliditydate timestamp DEFAULT
ROUND(LOCALTIMESTAMP + '2…
^
去掉ROUND

7、导入数据

测试表(数据量小)
psql --host=xxx.xxx.xxx.xxx --port=5432 --username=user --echo-errors dbname -f data.sql -1
生产表(数据量大)根据导出时的方法
select ‘ora2pg -p -c *.conf -t COPY -a ‘‘TABLE[’|| table_name ||’]’’ -o ‘||table_name||’.sql -j 4’ from user_tables where
table_name not like ‘%xxx%’ and table_name not like ‘%xxx%’
order by 1 asc;
//not like 排除某些不需要的表
写成脚本使每个表单独导出
chmod +x data.sh
nohup ./data.sh > ./data.out & //后台运行

;