article/postgresql_and_edb/使用 ora2pg 将oracle 数据导入 postgresql.md
2022-11-01 23:53:13 +08:00

327 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 使用 ora2pg 将oracle 数据导入 postgresql
## 安装edb
准备 edb 安装过程看 [Centos搭建edb9.5.md](./Centos搭建edb9.5.md)
```sh
PGSETUP_INITDB_OPTIONS="-E UTF-8 -D /home/edbdata" /usr/edb/as14/bin/edb-as-14-setup initdb
#EDB12初始初始化
PGSETUP_INITDB_OPTIONS="-E UTF-8 -D /home/edbdata" /usr/edb/as12/bin/edb-as-12-setup initdb
```
##### 启动 edb
```sh
systemctl start edb-as-14
```
##### 连接edb
```sh
sudo su - enterprisedb
psql edb
```
### 常见问题
- 远程连接数据库失败 修改文件 data/pg_hba.conf 添加
```
host all all 0.0.0.0/0 md5
```
- 修改数据库密码在edb 库执行)
```
ALTER USER enterprisedb WITH PASSWORD 'yiing&654';
```
## 安装 ora2pg
### 安装 perl 环境
```sh
yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum -y install perl-CPAN
```
**安装 perl 依赖**
```sh
perl -MCPAN -e 'install DBD::Oracle'
perl -MCPAN -e 'install DBI'
perl -MCPAN -e 'install DBD::Pg'
```
**常见问题**
```
Can't locate Test/NoWarnings.pm in @INC (@INC contains: t/lib /root/.cpan/build/DBD-Oracle-1.83-LDK8k0/blib/lib /root/.cpan/build/DBD-Oracle-1.83-LDK8k0/blib/arch /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at t/26exe_array.t line 15.
```
安装 perl-Test-NoWarnings-1.04-2.el7.noarch 解决
提示测试不通过 手动下载源码 安装
下载地址https://metacpan.org/release/DBI
```sh
tar -zxvf DBI-1.642.tar.gz
cd DBI-1.642
perl Makefile.PL
make
make install
```
## 安装Oracle客户端
官网下载 Oracle Instant Client 等包 上传服务器安装
```sh
rpm -ivh oracle-instantclient19.15-basic-19.15.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient19.15-devel-19.15.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient19.15-jdbc-19.15.0.0.0-1.x86_64.rpm
rpm -ivh oracle-instantclient19.15-sqlplus-19.15.0.0.0-1.x86_64.rpm
```
**设置环境变量**ORACLE_HOME
```sh
export ORACLE_HOME=/usr/lib/oracle/19.15/client64/
```
**本地已安装有**Oracle数据库
ORACLE_HOME如下设置
```sh
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
```
按照自己 的路径设置 环境变量
例如:
```sh
export POSTGRES_HOME=/usr/edb/as14
export POSTGRES_HOME=/var/lib/edb/as14
```
## 安装ora2pg
下载软件包
https://github.com/darold/ora2pg/releases
默认安装在`/usr/local/bin/` 目录下
```
[root@Test01 ~]# tar -xjf ora2pg-20.0.tar.bz2
[root@Test01 ~]# cd ora2pg-xx/
[root@Test01 ~]# perl Makefile.PL PREFIX=<your_install_dir>
[root@Test01 ora2pg-18.2]# make && make install
```
**简单检查**
ora2pg --help
## 迁移数据
**初始化项目**
```sh
//初始化项目
ora2pg --init_project ora2pg
```
**配置配置文件**
默认配置文件即可 需要修改
```
# Set Oracle database connection (datasource, user, password)
ORACLE_DSN dbi:Oracle:host=dev-db.yldev.net;sid=hcc;port=1521
ORACLE_USER icc
ORACLE_PWD ICCICC
# Oracle schema/owner to use
SCHEMA ICC
# Set which object to export from. By default Ora2Pg export all objects.
# Value must be a list of object name or regex separated by space. Note
# that regex will not works with 8i database, use % placeholder instead
# Ora2Pg will use the LIKE operator. There is also some extended use of
# this directive, see chapter "Limiting object to export" in documentation.
# 可以使用正则 如 t_.* 可以排除 不想导出的对象 如!t_t2
#配置中文释义 https://blog.csdn.net/Loiterer_Y/article/details/110927688
#ALLOW TABLE_TEST
# The value can be a comma delimited list of schema but not when using TABLE
# export type because in this case it will generate the CREATE SCHEMA statement
# and it doesn't support multiple schema name. For example, if you set PG_SCHEMA
# to something like "user_schema, public", the search path will be set like this
# SET search_path = user_schema, public;
# forcing the use of an other schema (here user_schema) than the one from Oracle
# schema set in the SCHEMA directive. You can also set the default search_path
# for the PostgreSQL user you are using to connect to the destination database
# by using:
# ALTER ROLE username SET search_path TO user_schema, public;
#in this case you don't have to set PG_SCHEMA.
#PG_SCHEMA LLOW
PG_SCHEMA icc
```
**测试连接**
执行以下命令 返回oracle 版本则连接成功
```
ora2pg -t SHOW_VERSION -c config/ora2pg.conf
```
**常用命令**
```
ora2pg -t SHOW_VERSION -c config/ora2pg.conf
ora2pg -t SHOW_SCHEMA -c config/ora2pg.conf
ora2pg -t SHOW_TABLE -c config/ora2pg.conf
ora2pg -t SHOW_COLUMN -c config/ora2pg.conf
ora2pg -t SHOW_ENCODING -c config/ora2pg.conf
```
**安装 screen**
先安装 screen 防止意外断开 导出失败
```sh
yum install -y screen
```
screen 常用命令
```
//开启一个screen
screen -S name
//进入一个 screen
screen -r name
// screen 列表
screen -ls
可以用快捷键 Ctrl+a d(即按住 Ctrl依次再按 a,d),而会话中的程序不会关闭
```
#### **导出数据**
该命令根据数据库大小 表大小等待时间不一 建议使用screen 运行
```
ora2pg -t COPY -o data.sql -b ./data -c ./config/ora2pg.conf
```
**修改校验表结构**
导出完成后 在 `./schema/tables` 下有转换好的表结构(主要修改关键字段)
```
oid
tableoid
xmin
cmin
xmax
cmax
ctid
```
#### 导入数据库
切换到`enterprisedb` 用户
执行 `sh import_all.sh` 按照提示导入数据
## 附录
**修改用户组 权限**
```
chown [-R] ownname:groupname filename
chmod -R 777 filename
```
**追踪服务日志**
```sh
journalctl -f -u icc-analysis.service
```
**查看硬盘大小**
```sh
df -hl
df -h path
ls -lht
du -ah --max-depth=1 /path
#查看删除的文件
lsof -n | grep deleted
du -bsh /
```