去O--ora2pg使用
原文链接:https://blog.csdn.net/darking123456789/article/details/116749418
project建立
https://blog.csdn.net/shi229592533/article/details/102679887
1、导出整个数据库模式(表、视图、序列、索引),以及唯一性,主键、外键和检查约束。
2、导出用户和组的授权/权限。
3、导出筛选的表(通过制定表明)。
4、导出Oracle模式到一个PostgreSQL(7.3以后)模式中。
5、导出预定义函数、触发器、程序、包和包体。
6、导出范围和列表分区。
7、导出所有的数据或跟随一个WHERE子句。
8、充分支持Oracle BLOB对象作为PG的BYTEA。
9、导出Oracle视图作为PG表。
10、导出定义的Oracle用户格式。
11、提供关于转换PLSQL码为PLPGSQL的基本帮助(仍然需要手工完成)。
12、可在任何平台上工作。
13、Ora2Pg尽力将Oracle数据库转换到PostgreSQL中,但是仍需一部分的手动工作。Oracle特定的PL/SQL代码生成函数、过程 和触发器时必须进行审查,以便匹配PostgreSQL的语法
复制
这是允许导出的不同的格式,默认是TABLE:
table |
提取所有包括索引、主键、唯一键、外键和检查约束的表。 |
view |
提取视图。 |
grant |
提取在所有对象中转换为pg组、用户和权限的用户。 |
sequence |
提取所有的序列以及上一个位置。 |
tablespace |
提取表空间。 |
trigger |
提取通过动作触发的被指定的触发器。 |
function |
提取函数。 |
proceduers |
提取存储过程。 |
package |
提取包和包主体。 |
data |
提取数据,生成insert语句。 |
copy |
提取数据,生成copy语句。 |
partition |
提取范围和列表分区。 |
type |
提取oracle用户自定义的格式。(以下两条是10.0新加的) |
fdw |
提取外部数据封装表 |
partition |
提取作为快照刷新视图所建立的视图 |
oracle类型 |
postgresql类型 |
date |
timestamp |
long |
text |
long raw |
bytea |
clob |
text |
nclob |
text |
blob |
bytea |
bfile |
bytea |
raw |
bytea |
rowid |
oid |
float |
double precision |
dec |
decimal |
decimal |
decimal |
double precision |
double precision |
int |
integer |
integer |
integer |
real |
real |
smallint |
smallint |
binary_float |
double precision |
binary_double |
double precision |
tinestamp |
timestamp |
xmltype |
xml |
binary_integer |
integer |
pls_integer |
integer |
timestamp with time zone |
timestamp with time zone |
timestamp with local time zone |
timestamp with time zone |
yum install -y perf cpan
复制
oracle 客户端下载地址(下载basic/sqlplus/devel/jdbc后缀为rpm文件即可)https://www.oracle.com/database/technologies/instant-client/downloads.html
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
jdbc .rpm 可以不要,三个就可以了。 如果已经安装了oracle的,直接用root设定Oracle_Home
export ORACLE_HOME=/u01/app/oracle/product/19.2.0/db_1
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
安装下载的软件包
scp -r rpm -ivh oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
scp -r rpm -ivh oracle-instantclient19.3-devel-19.3.0.0.0-1.x86_64.rpm
scp -r rpm -ivh oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm
复制
测试客户端
sqlplus64 username/password@ip:port/sid或service_name
复制
cpan install -y DBI
需要网络环境,也可以将DBI包下载下来安装
exportORACLE_HOME=/usr/lib/oracle/19.3/client64
exportPATH=$ORACLE_HOME/bin:$PATHexportLD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH19.3 是安装的oracle客户端的版本号
复制
wget http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.74.tar.gz
tar -zxvf DBD-Oracle-1.74.tar.gz
cd DBD-Oracle-1.74
perl Makefile.PL-l
make && make test
make install
复制
wget https://github.com/darold/ora2pg/archive/v18.2.tar.gz
tar -zxvf v18.2.tar.gz
cd ora2pg-18.2/
perl Makefile.PL
make && make install
复制
# ora2pg --help
Usage: ora2pg [-dhpqv --estimate_cost --dump_as_html][--option value]-a |--allow str : 指定允许导出的对象列表,使用逗号分隔。也可以与 SHOW_COLUMN 选项一起使用。
-b |--basedir dir: 设置默认的导出目录,用于存储导出结果。
-c |--conf file : 设置非默认的配置文件,默认配置文件为 /etc/ora2pg/ora2pg.conf。
-d |--debug : 使用调试模式,输出更多详细信息。
-D|--data_type STR: 通过命令行设置数据类型转换。
-e |--exclude str: 指定导出时排除的对象列表,使用逗号分隔。也可以与 SHOW_COLUMN 选项一起使用。
-h |--help : 显示帮助信息。
-g |--grant_object type : 导出指定类型的对象上的授权信息,取值参见 GRANT_OBJECT 配置项。
-i |--input file : 指定要导入的 Oracle PL/SQL 代码文件,导入文件时不需要连接到 Oracle 数据库。
-j |--jobs num : 设置用于发送数据到 PostgreSQL 的并发进程数量。
-J|--copies num : 设置用于从 Oracle 导出数据的并发连接数量。
-l |--log file : 设置日志文件,默认为 stdout。
-L|--limit num : 导出数据时,每次写入磁盘之前在内存中缓冲的记录数量,默认值为 10000。
-m |--mysql : 导出 MySQL 数据库。
-n |--namespace schema : 设置需要导出的 Oracle 模式。
-N|--pg_schema schema : 设置 PostgreSQL 中的搜索路径 search_path。
-o |--out file : 设置导出的 SQL 文件的存储路径。默认值为当前目录下的 output.sql 文件。
-p |--plsql : 启用 PLSQL 代码到 PLPGSQL 代码的转换。
-P|--parallel num: 同时导出多个表,设置并发数量。
-q |--quiet : 不显示进度条。
-s |--source DSN: 设置 Oracle DBI 数据源。
-t |--type export: 设置导出类型。该参数将会覆盖配置文件中的导出类型(TYPE)。
-T|--temp_dir DIR: 为多个同时运行的 ora2pg 脚本指定不同的临时存储目录。
-u |--user name : 设置连接 Oracle 数据库连接的用户名。也可以使用 ORA2PG_USER 环境变量。
-v |--version : 显示 Ora2Pg 版本信息并退出。
-w |--password pwd : 设置连接 Oracle 数据库的用户密码。也可以使用 ORA2PG_PASSWD 环境变量。
--forceowner : 导入数据时,强制 ora2pg 将导入 PostgreSQL 的表和序列的拥有者设置为连接 Oracle 数据库时的用户。如果设置为指定的用户名,所有导入的对象属于该用户。默认情况下,对象的拥有者为连接 Pg 数据库的用户。
--nls_lang code: 设置 Oracle 客户端的 NLS_LANG 编码。
--client_encoding code: 设置 PostgreSQL 客户端编码。
--view_as_table str: 将视图导出为表,多个视图使用逗号分隔。
--estimate_cost : 在 SHOW_REPORT 结果中输出迁移成本评估信息。
--cost_unit_value minutes: 成本评估单位,使用分钟数表示。默认值为 5 分钟,表示一个 PostgreSQL 专家迁移所需的时间。如果是第一次迁移,可以设置为 10 分钟。
--dump_as_html : 生成 HTML 格式的迁移报告,只能与 SHOW_REPORT 选项一起使用。默认的报告是一个简单的文本文件。
--dump_as_csv : 与上个参数相同,但是生成 CSV 格式的报告。
--dump_as_sheet : 生成迁移评估时,为每个数据库生成一行 CSV 记录。
--init_project NAME: 创建一个ora2pg 项目目录结构。项目的顶级目录位于根目录之下。
--project_base DIR: 定义ora2pg 项目的根目录,默认为当前目录。
--print_header : 与 --dump_as_sheet 一起使用,输出 CSV 标题信息。
--human_days_limit num : 设置迁移评估级别从 B 升到 C 所需的人工日数量。默认值为 5 人工日。
--audit_user LIST: 设置查询 DBA_AUDIT_TRAIL 表时需要过滤的用户名,多个用户使用逗号分隔。该参数只能用于 SHOW_REPORT 和 QUERY 导出类型。
--pg_dsn DSN: 设置在线导入时的 PostgreSQL 数据源。
--pg_user name : 设置连接 PostgreSQL 的用户名。
--pg_pwd password : 设置连接 PostgreSQL 的用户密码。
--count_rows : 在 TEST 方式下执行真实的数据行数统计。
--no_header : 在导出文件中不添加 Ora2Pg 头部信息。
--oracle_speed : 用于测试 Oracle 发送数据的速度。不会真的处理或者写入数据。
--ora2pg_speed : 用于测试 Ora2Pg 发送转换后的数据的速度。不会写入任何数据。
复制
# vim ora2pg.conf
# oracle client 安装地址
ORACLE_HOME/usr/lib/oracle/19.3/client64
# oracle connent info
ORACLE_DSN dbi:Oracle:host=ipaddress;sid=orcl;port=1521
ORACLE_USER username
ORACLE_PWD password
# oracle schema
SCHEMA schemaname
# oracle type
TYPE TABLE COPY DATA ---copy data 重复了
# 输出的文件名字
OUTPUT output.sql
# 输出的路径(本地路径)OUTPUT_DIR./
#Ipaddress : 链接oracle的IP地址
#username: 链接oracle的用户名
#password: 链接oracle的密码
#schemaname: 链接oracle的schema信息
# oracle client 安装地址
ORACLE_HOME /u01/app/oracle/product/19.2.0/db_1
# oracle connent info
ORACLE_DSN dbi:Oracle:host=xx ;sid=xx;port=1521
ORACLE_USER ora2pg
ORACLE_PWD ora2pg
# oracle schema
SCHEMA xx
# oracle type
TYPE TABLE COPY DATA ---copy data 重复了
# 输出的文件名字
OUTPUT output.sql
# 输出的路径(本地路径)
OUTPUT_DIR ./
完成之后,只需要设置导出的类型:TABLE(包括约束)、VIEW、MVIEW、TABLESPACE、SEQUENCE、INDEXES、TRIGGER、GRANT、FUNCTION、PROCEDURE、PACKAGE、PARTITION、TYPE、---INSERT 或 COPY、FDW、QUERY、KETTLE 以及 SYNONYM。
默认情况下,Ora2Pg 导出一个文件,可以通过 psql 客户端将文件加载到 PostgreSQL 数据库;但是也可以在配置文件中设置一个数据库的 DSN,直接导入 PostgreSQL 数据库。通过 ora2pg.conf 中的配置选项,可以控制导出的内容和方式。
ORACLE_HOME /u01/app/oracle/product/11.2.0/dbhome_1
ORACLE_DSN dbi:Oracle:host=x.x.x.x;sid=PROD;port=xxx
ORACLE_USER xxxxxxx
ORACLE_PWD xxxx
LOGFILE /tmp/test.log
USER_GRANTS 0
SCHEMA xxxx
EXPORT_SCHEMA 0
#TYPE TABLE
PARALLEL_TABLES 4 ---开启这个后每个表单独一个sql文件
JOBS 4
PG_NUMERIC_TYPE 0
PG_INTEGER_TYPE 1
DEFAULT_NUMERIC float
SKIP fkeys pkeys ukeys indexes checks
NLS_LANG AMERICAN_AMERICA.UTF8
OUTPUT output.sql
LIMIT 100000
PG_DSN dbi:Pg:dbname=xxxx;host=x.x.x.x;port=xxx
PG_USER xxx
PG_PWD xxxxxx
PG_SCHEMA xxx
LOG_ON_ERROR 0
BLOB_LIMIT 100
TRUNCATE_TABLE 1
DISABLE_SEQUENCE 1
PG_VERSION 12
EMPTY_LOB_NULL
ORA_INITIAL_COMMAND
IMPORT imp_tab_1.conf
CREATE_SCHEMA 1
COMPILE_SCHEMA 0
debug 1
# vi imp_tab_1.conf
allow tablename
4. 执行导入
# nohup ora2pg -t COPY -c /data/ora2pg/huang/ora2pg_tab_1.conf -T /tmp/huang &
上面的type是注释的 -t 指定导数据
# time ora2pg -c ora2pg.conf -a tablename
[========================>]1/1tables(100.0%) end of scanning.[>]0/1tables(0.0%) end of scanning.[>]0/1tables(0.0%) end of scanning.[========================>]1/1tables(100.0%) end of table export.[========================>]541243/537749rows(100.6%) Table tablename(7959 recs/sec)[========================>]541243/537749 total rows(100.6%)-(68 sec.,avg:7959 recs/sec).[========================>]537749/537749rows(100.0%) on total estimated data(68 sec.,avg:7908 recs/sec)[========================>]541243/537749rows(100.6%) Table tablename(8591 recs/sec)[========================>]1082486/537749 total rows(201.3%)-(63 sec.,avg:17182 recs/sec).[========================>]537749/537749rows(100.0%) on total estimated data(63 sec.,avg:8535 recs/sec)
real 2m26.185s
user 2m9.606s
sys 0m1.153s
tablename:单表的名字
复制
# du -sh output.sql
79M output.sql
# wc -l output.sql
542914 output.sql
复制
# time psql -U postgres -d databasename -h 192.168.***.**-p 5432-f output.sql
SETSETCREATETABLECREATEINDEXALTERTABLESETSETBEGINALTERSEQUENCEALTERSEQUENCECOMMIT
real 0m10.196s
user 0m0.215s
sys 0m0.202s
databasename : 数据库的名字
复制
select count(*)from"public".tablename;--541243tablename: 表的名字
依赖安装
1、安装perl依赖
yum install -y perf cpan perl-Time-HiRes
安装oracle-instantclient安装包
oracle官网下载basic、devel、sqlplus三个rpm包。
http://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/index.html
直接下载
http://download.oracle.com/otn/linux/instantclient/122010/oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
http://download.oracle.com/otn/linux/instantclient/121020/oracle-instantclient12.1-devel-12.1.0.2.0-1.x86_64.rpm
http://download.oracle.com/otn/linux/instantclient/122010/oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64.rpm
安装
rpm -ivh oracle-instantclient*.rpm
rpm -ivh *.rpm
Preparing... ########################################### [100%]
package oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64 is already installed
package oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64 is already installed
package oracle-instantclient12.2-sqlplus-12.2.0.1.0-1.x86_64 is already installed
[root@10-0-98-60 ~]# echo "/usr/lib/oracle/12.2/client64/lib" > /etc/ld.so.conf.d/oracle_client.conf
[root@10-0-98-60 ~]# ldconfig
[root@10-0-98-60 ~]#
[root@10-0-98-60 ~]# ldconfig -p|grep oracle
libsqlplusic.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libsqlplusic.so
libsqlplus.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libsqlplus.so
liboramysql12.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/liboramysql12.so
libons.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libons.so
libocijdbc12.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libocijdbc12.so
libociei.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libociei.so
libocci.so.12.1 (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libocci.so.12.1
libocci.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libocci.so
libnnz12.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libnnz12.so
libmql1.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libmql1.so
libipc1.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libipc1.so
libclntshcore.so.12.1 (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libclntshcore.so.12.1
libclntshcore.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libclntshcore.so
libclntsh.so.12.1 (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libclntsh.so.12.1
libclntsh.so (libc6,x86-64) => /usr/lib/oracle/12.2/client64/lib/libclntsh.so
测试 sqlplus username/password@ip:port/sid
sqlplus64 scott/[email protected]:1521/orcl
3、安装 DBI
cpan install DBI
4、安装 DBD-Oracle
export ORACLE_HOME=/usr/lib/oracle/12.2/client64
export PATH=$ORACLE_HOME/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
wget http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.74.tar.gz
tar -zxvf DBD-Oracle-1.74.tar.gz
cd DBD-Oracle-1.74
perl Makefile.PL -l
make && make test
make install
5,DBD:PG安装
下载
http://search.cpan.org/~turnstep/DBD-Pg/
wget http://www.cpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.7.4.tar.gz
tar -zxf DBD-Pg-3.7.4.tar.gz
cd DBD-Pg-3.7.4
perl Makefile.PL
make
make install
history
6、Ora2pg install
wget https://github.com/darold/ora2pg/archive/v18.2.tar.gz
tar -zxvf v18.2.tar.gz
cd ora2pg-18.2/
perl Makefile.PL
make && make install
perl -MCPAN -e shell
cpan> get DBD::mysql
cpan> quit
cd ~/.cpan/build/DBD-mysql*
perl Makefile.PL
make
make install
7、检查
cat check.pl
#!/usr/bin/perl
use strict;
use ExtUtils::Installed;
my $inst=ExtUtils::Installed->new();
my @modules = $inst->modules();
foreach(@modules){
my $ver = $inst->version($_) || "???";
printf("%-12s -- %s\n",$_,$ver);
}
perl check.pl
DBD::Oracle -- 1.74
DBD::Pg -- 3.7.4
DBD::mysql -- 4.046
DBI -- 1.641
Ora2Pg -- 18.2
Perl -- 5.10.1
Test::Simple -- 1.302136
8、配置ora2pg
复制
cp /etc/ora2pg/ora2pg.conf.dist /etc/ora2pg/ora2pg.conf
编辑导出配置文件
cd /etc/ora2pg/
cat ora2pg.conf
ORACLE_HOME /usr/local/oracle/product/11.2.0/db_1
#Set Oracle database connection (data source, user, password)
ORACLE_DSN dbi:Oracle:host=10.0.98.60;sid=orcl
ORACLE_USER scott
ORACLE_PWD tiger
SCHEMA scott
DEBUG 1
ORA_INITIAL_COMMAND
EXPORT_SCHEMA 0
CREATE_SCHEMA 1
COMPILE_SCHEMA 0
TYPE TABLE #导出标结果
OUTPUT output.sql #导出的文件名
9、查看oracle的表数据
SQL> show user;
USER is "SCOTT"
SQL> select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') CURRENT_SCHEMA from dual;
CURRENT_SCHEMA
--------------------------------------------------------------------------------
SCOTT
SQL> select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
DEPT USERS
EMP USERS
BONUS USERS
SALGRADE USERS
TMP USERS
TEST USERS
T1 USERS
10、导出表结构
[oracle@10-0-98-60 ora2pg]$ ora2pg -c ora2pg.conf
Ora2Pg version: 18.2
Trying to connect to database: dbi:Oracle:host=10.0.98.60;sid=orcl
Isolation level: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Looking forward functions declaration in schema SCOTT.
Retrieving table information...
[1] Scanning table BONUS (0 rows)...
[2] Scanning table DEPT (4 rows)...
[3] Scanning table EMP (14 rows)...
[4] Scanning table SALGRADE (5 rows)...
[5] Scanning table T1 (1 rows)...
[6] Scanning table TEST (1 rows)...
[7] Scanning table TMP (1 rows)...
Dumping table T1...
Dumping table TEST...
Dumping table DEPT...
Dumping table BONUS...
Dumping table EMP...
Dumping table SALGRADE...
Dumping table TMP...
Dumping RI EMP...
问题
[oracle@10-0-98-60 ora2pg]$ ora2pg -c ora2pg.conf
Ora2Pg version: 18.2
Trying to connect to database: dbi:Oracle:host=10.0.98.60;sid=orcl
Isolation level: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Looking forward functions declaration in schema SCOTT.
DBD::Oracle::db prepare failed: ORA-00942: table or view does not exist (DBD ERROR: error possibly near
解决方案
oracle授予用户DBA权限
SQL> grant dba to scott;
Grant succeeded.
11、查看表结构
自动做了表结构数据类型转换
[oracle@10-0-98-60 ora2pg]$ more output.sql
-- Generated by Ora2Pg, the Oracle database Schema converter, version 18.2
-- Copyright 2000-2017 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=10.0.98.60;sid=orcl
SET client_encoding TO 'UTF8';
\set ON_ERROR_STOP ON
SET check_function_bodies = false;
CREATE TABLE dept (
deptno smallint NOT NULL,
dname varchar(14),
loc varchar(13)
) ;
ALTER TABLE dept ADD PRIMARY KEY (deptno);
CREATE TABLE bonus (
ename varchar(10),
job varchar(9),
sal bigint,
comm bigint
) ;
CREATE TABLE emp (
empno smallint NOT NULL,
ename varchar(10),
job varchar(9),
mgr smallint,
hiredate timestamp,
sal decimal(7,2),
comm decimal(7,2),
deptno smallint
) ;
ALTER TABLE emp ADD PRIMARY KEY (empno);
12、更改ora2pg配置导出数据
cat ora2pg.conf
ORACLE_HOME /usr/local/oracle/product/11.2.0/db_1
#Set Oracle database connection (data source, user, password)
ORACLE_DSN dbi:Oracle:host=10.0.98.60;sid=orcl
ORACLE_USER scott
ORACLE_PWD tiger
SCHEMA scott
DEBUG 1
ORA_INITIAL_COMMAND
EXPORT_SCHEMA 0
CREATE_SCHEMA 1
COMPILE_SCHEMA 0
TYPE DATA #导出数据内容
OUTPUT data.sql #导出的数据文件名
13、导出表内容
[oracle@10-0-98-60 ora2pg]$ ora2pg -c ora2pg.conf
Ora2Pg version: 18.2
Trying to connect to database: dbi:Oracle:host=10.0.98.60;sid=orcl
Isolation level: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Looking forward functions declaration in schema SCOTT.
Retrieving table information...
[1] Scanning table BONUS (0 rows)...
[2] Scanning table DEPT (4 rows)...
[3] Scanning table EMP (14 rows)...
[4] Scanning table SALGRADE (5 rows)...
[5] Scanning table T1 (1 rows)...
[6] Scanning table TEST (1 rows)...
[7] Scanning table TMP (1 rows)...
Trying to connect to database: dbi:Oracle:host=10.0.98.60;sid=orcl
Isolation level: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Retrieving partitions information...
Looking how to retrieve data from BONUS...
Fetching all data from BONUS tuples...
DEBUG: Formatting bulk of 10000 data for PostgreSQL.
DEBUG: Creating output for 10000 tuples
Dumping data from BONUS to file: data.sql
Extracted records from table BONUS: total_records = 0 (avg: 0 recs/sec)
[> ] 0/26 total rows (0.0%) - (0 sec., avg: 0 recs/sec).
Looking how to retrieve data from DEPT...
Fetching all data from DEPT tuples...
DEBUG: Formatting bulk of 10000 data for PostgreSQL.
DEBUG: Creating output for 10000 tuples
Dumping data from DEPT to file: data.sql
Extracted records from table DEPT: total_records = 4 (avg: 4 recs/sec)
....
[========================>] 51/26 total rows (196.2%) - (1 sec., avg: 51 recs/sec).
Looking how to retrieve data from TMP...
Fetching all data from TMP tuples...
DEBUG: Formatting bulk of 10000 data for PostgreSQL.
DEBUG: Creating output for 10000 tuples
Dumping data from TMP to file: data.sql
Extracted records from table TMP: total_records = 14 (avg: 14 recs/sec)
[========================>] 65/26 total rows (250.0%) - (1 sec., avg: 65 recs/sec).
Restarting sequences
14、导入表结构和数据
导入表结构
[oracle@10-0-98-60 ora2pg]$ psql -h 127.0.0.1 -U postgres < output.sql
SET
SET
CREATE TABLE
CREATE TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
CREATE TABLE
ALTER TABLE
CREATE TABLE
CREATE TABLE
ALTER TABLE
导入数据
[oracle@10-0-98-60 ora2pg]$ psql -h 127.0.0.1 -U postgres < data.sql
SET
SET
BEGIN
INSERT 0 1
INSERT 0 1
...
INSERT 0 1
INSERT 0 1
COMMIT
15、数据校验
oracle
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
postgres
postgres=# select * from emp;
empno | ename | job | mgr | hiredate | sal | comm | deptno
-------+--------+-----------+------+---------------------+---------+---------+--------
7369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | | 20
7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30
7521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30
7566 | JONES | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | | 20
7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30
7698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | | 30
7782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | | 10
7788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | | 20
7839 | KING | PRESIDENT | | 1981-11-17 00:00:00 | 5000.00 | | 10
7844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30
7876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | | 20
7900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | | 30
7902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | | 20
7934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | | 10
(14 rows)
16、连接Postgres
PG_DSN dbi:Pg:dbname=postgres;host=10.0.98.60;port=5432
PG_USER postgres
PG_PWD 123456
OUTPUT output.sql
更多用法 创建迁移模板
[root@centos8 ~]# sqlplus hr/Sqlite123@//192.168.56.130:1521/orclpdb1
"下一步是配置和测试,现在我们需要自己编写一个配置文件,然后使用配置文件连接Oracle数据库进行测试,正常情况下是能够连通的,如果有异常情况,则证明前面我们的安装有一些错误。"
DBA3号小哥一听来了兴趣,"终于到这一步了,配置文件怎么配?"
"你上网站http://ora2pg.darold.net/documentation.html
可以查看官方的配置文档,我的配置有点多,因为我需要应对各种不同的情况。不过,你现在可以从创建一个通用工程先开始"
DBA3号小哥说道:"好的,那我先来创建一个通用工程。"
[root@centos8 ora2pg]# ora2pg --project_base /root/ora2pg --init_project hr_migrate
Creating project hr_migrate.
/root/ora2pg/hr_migrate/ schema/ dblinks/ directories/ functions/ grants/ mviews/ packages/ partitions/ procedures/ sequences/ synonyms/ tables/ tablespaces/ triggers/ types/ views/ sources/ functions/ mviews/ packages/ partitions/ procedures/ triggers/ types/ views/ data/ config/ reports/
"现在你可以看到,咱们创建了一个迁移工程,自动生成默认的模板,config文件夹下包含配置文件,还有一个叫export_schema.sh
的shell脚本。你现在可以编辑config下的配置文件,配置好oracle相关的连接字符串、用户名、密码以及要导出的schema,然后执行export_schema.sh
脚本就会帮你把Oracle的DDL导出来,然后你在使用脚本输出的命令导出数据。你先试一下"。
DBA3号小哥又继续问道:"那具体的config下配置哪些内容?"
"我们现在测试,就先简单的配置一下。你配置下面这些选项,然后执行export_schema.sh
脚本。"
[root@centos8 hr_migrate]# vi config/ora2pg.conf
# Set the Oracle home directory
ORACLE_HOME /usr/lib/oracle/19.10/client64
# Set Oracle database connection (datasource, user, password)
ORACLE_DSN dbi:Oracle:host=192.168.56.130;port=1521;service_name=orclpdb1
ORACLE_USER hr
ORACLE_PWD Sqlite123
SCHEMA HR
DBA3号小哥摇摇头叹了口气说道:"还有好多配置选项,不知道干嘛用的,让人云里雾里。"
"你现在先把测试玩转起来,后面真正迁移你就会用到这些选项,那个时候在深入学习不迟。"
"好的,那我先把这搭起来。"DBA3号小哥信心满满的说道。
接下来DBA3号小哥运行了export_schema.sh
脚本。
所有的ddl语句都导出到了schema下的子目录里面。最后还输出了一条指令。
To extract data use the following command:ora2pg -t COPY -o data.sql -b ./data -c ./config/ora2pg.conf
"小哥,你注意执行完脚本有个命令需要你再手动执行一下,刚刚导出的是ddl脚本,现在最后这个手动的命令是导出数据的。"
"ok,我已经把数据导出来了。"DBA3号小哥按我的要求做完说道。
"嗯,有了结构和数据之后,你再配置好config里面的PostgreSQL连接字符串,执行import_all.sh就能完整的把刚刚的这些脚本导入了。不过在这之前你需要安装DBD :: Pg模块。"
DBA3号小哥又开始不耐烦的说道:"又要安装这些真是很烦躁啊"
"小哥,这里需要你注意的是还需要设置PostgreSQL的环境变量哦!"
[root@centos8 ~]# wget -c https://cpan.metacpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.14.2.tar.gz[root@centos8 ~]# gunzip DBD-Pg-3.14.2.tar.gz[root@centos8 ~]# tar -xvf DBD-Pg-3.14.2.tar[root@centos8 ~]# cd DBD-Pg-3.14.2/vi bash_parfileexport ORACLE_HOME=/usr/lib/oracle/19.10/client64export PGHOME=/data/postgresql/pgsqlexport LD_LIBRARY_PATH=$ORACLE_HOME/lib:$PGHOME/lib:$LD_LIBRARY_PATHexport PATH=$ORACLE_HOME/bin:$PGHOME/bin:$PATHsource .bash_profile[root@centos8 DBD-Pg-3.14.2]# perl Makefile.PL[root@centos8 DBD-Pg-3.14.2]# make && make install
DBA3号小哥利索的配置好环境变量,装完DBD :: Pg模块,然后说道:"现在肯定是又要修改配置文件那些连PostgreSQL的字符串吧。"
"是啊,小哥你现在是越来越知道我们的套路了。配置完成后你就可以执行导入脚本了,记得要使用-I选项,这个选项可以排除索引、约束、触发器,等完全导入数据之后在使用-i进行索引、约束、触发器的创建。"
PG_DSN还是在config/ora2pg.conf 下配置
grep -i PG_DSN *
import_all.sh:pgdsn_defined=`grep "^PG_DSN" config/ora2pg.conf | sed 's/.*dbi:Pg/dbi:Pg/'`
import_all.sh:echo "Running: ora2pg$IMPORT_JOBS$PARALLEL_TABLES -c config/ora2pg.conf -t COPY --pg_dsn \"$pgdsn_defined\" --pg_user $DB_OWNER"
import_all.sh:ora2pg$IMPORT_JOBS$PARALLEL_TABLES -c config/ora2pg.conf -t COPY --pg_dsn "$pgdsn_defined" --pg_user $DB_OWNER
PG_DSN dbi:Pg:dbname=postgres;host=192.168.56.119;port=5432PG_USER postgres PG_PWD Sqlite1、23
DBA3号小哥开心的说道:"我已经执行成功了。我现在去看一下数据是否已经导入了"。
"已经全部导进去了,大功告成!"。DBA3号小哥笑呵呵的说。
"不,你还要在运行-i执行导入索引、约束、触发器"。