技术标签: oracle数据库 # 数据迁移 ora2pg psotgresql14.6 迁移升级 oracle12.2
SQL> SELECT a.table_name,a.num_rows FROM dba_tables a where a.OWNER='HR';
TABLE_NAME NUM_ROWS
---------------------------------------- ----------
REGIONS 4
COUNTRIES 25
LOCATIONS 23
DEPARTMENTS 27
JOBS 19
EMPLOYEES 107
JOB_HISTORY 10
7 rows selected.
SQL> select object_type,count(*) from dba_objects where owner='HR' group by object_type;
OBJECT_TYPE COUNT(*)
----------------------- ----------
INDEX PARTITION 4
SEQUENCE 3
TABLE PARTITION 4
PROCEDURE 2
TRIGGER 2
INDEX 19
TABLE 7
VIEW 1
8 rows selected.
.
SQL> select sum(bytes)/1024/1024 from dba_segments where owner='HR';
SUM(BYTES)/1024/1024
--------------------
1.9375
--用户授权
conn / as sysdba
GRANT dba to hr;
GRANT CREATE ANY TABLE, CREATE ANY VIEW ,CREATE ANY PROCEDURE TO hr;
GRANT ALTER ANY TABLE, ALTER ANY PROCEDURE TO hr;
GRANT DROP ANY TABLE, DROP ANY VIEW, SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE TO hr;
CREATE OR REPLACE PROCEDURE sp_generate_report_and_diff_and_highest_paid_emp
AS
-- 定义游标变量
CURSOR c_emp IS
SELECT e.first_name,
e.last_name,
e.job_id,
d.department_name,
e.salary
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
BEGIN
-- 打印表头信息
DBMS_OUTPUT.PUT_LINE('EMPLOYEE REPORT');
DBMS_OUTPUT.PUT_LINE('----------------');
-- 创建员工报告表
EXECUTE IMMEDIATE 'CREATE TABLE emp_report AS
SELECT emp.first_name,
emp.last_name,
emp.job_id,
dept.department_name,
emp.salary
FROM employees emp
INNER JOIN departments dept ON emp.department_id = dept.department_id';
-- 创建员工薪资差异表
EXECUTE IMMEDIATE 'CREATE TABLE emp_salary_diff AS
SELECT emp.employee_id,
emp.first_name,
emp.last_name,
emp.job_id,
emp.salary,
(emp.salary - AVG(emp.salary) OVER(PARTITION BY emp.job_id)) AS salary_diff
FROM employees emp';
-- 创建薪水最高员工表
EXECUTE IMMEDIATE 'CREATE TABLE highest_paid_emp AS
SELECT emp.employee_id,
emp.first_name,
emp.last_name,
emp.job_id,
dept.department_name,
emp.salary
FROM employees emp
INNER JOIN departments dept ON emp.department_id = dept.department_id
WHERE emp.salary = (SELECT MAX(salary) FROM employees)';
-- 打印表尾信息
DBMS_OUTPUT.PUT_LINE('----------------');
DBMS_OUTPUT.PUT_LINE('END OF REPORT');
END;
SQL> exec sp_generate_report_and_diff_and_highest_paid_emp
SQL> SELECT a.table_name,a.num_rows FROM dba_tables a where a.OWNER='HR';
TABLE_NAME NUM_ROWS
---------------------------------------- ----------
REGIONS 4
COUNTRIES 25
LOCATIONS 23
DEPARTMENTS 27
JOBS 19
EMPLOYEES 107
JOB_HISTORY 10
EMP_REPORT 106
EMP_SALARY_DIFF 107
HIGHEST_PAID_EMP 1
10 rows selected.
SQL> select object_type,count(*) from dba_objects where owner='HR' group by object_type;
OBJECT_TYPE COUNT(*)
----------------------- ----------
SEQUENCE 3
PROCEDURE 3
TRIGGER 2
INDEX 19
TABLE 10
VIEW 1
6 rows selected.
SQL> select sum(bytes)/1024/1024 from dba_segments where owner='HR';
SUM(BYTES)/1024/1024
--------------------
1.75
为使安装能够顺利通过,在安装 Ora2Pg 之前必须先确保系统已经安装了 Perl 模块以及 DBI、DBD::Oracle 模块。若需要直接导入到 PostgreSQL 则还需要安装 DBD::Pg 模块。
## 在编译安装了PG的机器上安装ora2pg(本测试oracle和pg在同一台机器Tencent上)
perl版本5.10以上
[root@tencent ~]# yum install -y gcc perl-DBD-Pg perl perl-devel perl-DBI perl-CPAN bzip2 \
perl-ExtUtils-eBuilder perl-ExtUtils-MakeMaker perl-Time-HiRes perl-tests perf cpan
官网下载地址:https://metacpan.org/release/DBI
[root@tencent ~]# tar -zxvf DBI-1.643.tar.gz
[root@tencent ~]# cd DBI-1.643
[root@tencent DBI-1.643]# perl Makefile.PL
[root@tencent DBI-1.643]#make && make install
下载地址:https://metacpan.org/pod/DBD::Oracle
[root@tencent ~]# tar -zxvf DBD-Oracle-1.83.tar.gz
[root@tencent ~]# cd DBD-Oracle-1.83
[root@tencent DBD-Oracle-1.83]# perl Makefile.PL
[root@tencent DBD-Oracle-1.83]# make && make install
#需要先配置root环境变量,添加oracle的信息
--配置root 环境变量,添加oracle的信息
cat >> /root/.bash_profile << "EOF"
export ORACLE_HOME=/oracle/app/oracle/product/12.2.0/db_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
EOF
source /root/.bash_profile
2.1.4 安装ora2pg
下载地址: https://sourceforge.net/projects/ora2pg/
[root@tencent ~]#tar -zxvf ora2pg-23.2.tar.gz
[root@tencent ~]# cd ora2pg-23.2/
[root@tencent ora2pg-23.2]# perl Makefile.PL
[root@tencent ora2pg-23.2]# make && make install
--查看ora2pg安装情况
[root@tencent ~]# which ora2pg
/usr/local/bin/ora2pg
[root@tencent tmp]# ora2pg –version
Ora2Pg v23.2
如果想直接将ora2pg导出的数据直接导入pg数据库,不生成本地文件,则可以安装该插件并配置使用
下载地址:http://www.cpan.org/authors/id/T/TU/TURNSTEP/
[root@tencent ~]# tar zxvf DBD-Pg-3.16.3.tar.gz
[root@tencent ~]# cd DBD-Pg-3.16.3
[root@tencent DBD-Pg-3.16.3]# perl Makefile.PL
Path to pg_config? 输入/postgresql/pg14/bin/pg_config
[root@tencent DBD-Pg-3.16.3]# make && make install
--创建检查脚本
cat > /root/check.pl <<"EOF"
#!/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);
}
exit;
EOF
--执行检查
[root@tencent DBD-Pg-3.16.3]# perl /root/check.pl
DBD::Oracle -- 1.83
DBD::Pg -- 3.16.3
DBI -- 1.643
Ora2Pg -- 23.2
配置参考:https://ora2pg.darold.net/documentation.html#CONFIGURATION
默认情况下,Ora2Pg会查找/etc/ora2pg/ora2pg.conf配置文件,如果文件存在,只需执行:/usr/local/bin/ora2pg,也可以通过-c选项指定配置文件路径,如:ora2pg -c ~/ora2pg/config/ora2pg.conf。
[root@tencent ~]# cp /etc/ora2pg/ora2pg.conf.dist /etc/ora2pg/ora2pg.conf
[root@tencent ~]# cat /etc/ora2pg/ora2pg.conf.dist | grep -v ^# | grep -v ^$ | wc -l
124
--编辑/ora2pg/config/ora2pg.conf,设置以下信息 ,可查看oracle版本
# Set Oracle database connection (datasource, user, password)
ORACLE_DSN dbi:Oracle:host= 10.0.4.16;sid=orcl;port=1521
ORACLE_USER system
ORACLE_PWD oracle
[root@tencent ora2pg]# ora2pg -t SHOW_VERSION
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
-- 表结构、约束(主外键等)、索引等
cat > /etc/ora2pg/ora2pg_table_ddl.conf <<"EOF"
ORACLE_HOME /oracle/app/oracle/product/12.2.0/db_1
ORACLE_DSN dbi:Oracle:host=10.0.4.16;sid=ORCL;port=1521
#ORACLE_DSN dbi:Oracle:tns_ora12c
ORACLE_USER system
ORACLE_PWD oracle
SCHEMA HR
EXPORT_SCHEMA 1
CREATE_SCHEMA 1
TYPE TABLE
PG_NUMERIC_TYPE 0
PG_INTEGER_TYPE 1
DEFAULT_NUMERIC float
SKIP fkeys checks
#SKIP keys pkeys ukeys indexes checks
NLS_LANG AMERICAN_AMERICA.UTF8
OUTPUT_DIR
OUTPUT table_ddl_output.sql
PG_VERSION 14
cat > /etc/ora2pg/ora2pg_other_ddl.conf <<"EOF"
ORACLE_HOME /oracle/app/oracle/product/12.2.0/db_1
ORACLE_DSN dbi:Oracle:host=10.0.4.16;sid=ORCL;port=1521
#ORACLE_DSN dbi:Oracle:tns_ora12c
ORACLE_USER system
ORACLE_PWD oracle
SCHEMA HR
EXPORT_SCHEMA 1
CREATE_SCHEMA 1
TYPE PACKAGE,PROCEDURE,TRIGGER,FUNCTION,VIEW,GRANT,SEQUENCE,MVIEW,TYPE,SYNONYM
PG_NUMERIC_TYPE 0
PG_INTEGER_TYPE 1
DEFAULT_NUMERIC float
SKIP fkeys
#SKIP keys pkeys ukeys indexes checks
NLS_LANG AMERICAN_AMERICA.UTF8
OUTPUT_DIR
OUTPUT other_ddl_output.sql
PG_VERSION 15
cat > /etc/ora2pg/ora2pg_data.conf <<"EOF"
ORACLE_HOME /oracle/app/oracle/product/12.2.0/db_1
ORACLE_DSN dbi:Oracle:host=10.0.4.16;sid=ORCL;port=1521
#ORACLE_DSN dbi:Oracle:tns_ora12c
ORACLE_USER system
ORACLE_PWD oracle
SCHEMA HR
TYPE INSERT
PG_NUMERIC_TYPE 0
PG_INTEGER_TYPE 1
DEFAULT_NUMERIC float
SKIP fkeys checks
#SKIP fkeys pkeys ukeys indexes checks
NLS_LANG AMERICAN_AMERICA.UTF8
OUTPUT_DIR
OUTPUT data_output.sql
PG_VERSION 15
#PG_DSN dbi:Pg:dbname=orcl;host= 10.0.4.16;port=4519
#PG_USER hr
#PG_PWD hr
注意:若去掉PG_DSN、PG_USER和PG_PWD参数的注释,则会将数据直接导入到PG中,而不会导出到中间文件。
导出数据type 可以设置为COPY或者INSERT,本测试设置为INSERT
[root@tencent ~]# ora2pg -t SHOW_VERSION -c /etc/ora2pg/ora2pg_table_ddl.conf
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0
[root@tencent ~]# ora2pg -t SHOW_REPORT --estimate_cost -c /etc/ora2pg/ora2pg_table_ddl.conf
[root@tencent ~]# ora2pg -c /etc/ora2pg/ora2pg_table_ddl.conf
[=====================>] 10/10 tables (100.0%) end of scanning.
[=====================>] 10/10 tables (100.0%) end of table export.
-rw-r--r-- 1 root root 8817 Aug 17 11:26 table_ddl_output.sql
#未指定导出目录,sql文件生成在执行命令时当前目录下
[root@tencent ~]# ora2pg -c /etc/ora2pg/ora2pg_other_ddl.conf
[===============>] 0/0 packages (100.0%) end of output.
[===============>] 3/3 procedures (100.0%) end of procedures export.
[===============>] 1/1 triggers (100.0%) end of output.
[===============>] 0/0 functions (100.0%) end of functions export.
[===============>] 1/1 views (100.0%) end of output.
[===============>] 3/3 sequences (100.0%) end of output.
[===============>] 0/0 materialized views (100.0%) end of output.
[===============>] 0/0 types (100.0%) end of output.
[===============>] 0/0 synonyms (100.0%) end of output.
Fixing function calls in output files...
-rw-r--r-- 1 root root 348 Aug 17 11:30 PACKAGE_other_ddl_output.sql
-rw-r--r-- 1 root root 2889 Aug 17 11:30 PROCEDURE_other_ddl_output.sql
-rw-r--r-- 1 root root 796 Aug 17 11:30 TRIGGER_other_ddl_output.sql
-rw-r--r-- 1 root root 349 Aug 17 11:30 FUNCTION_other_ddl_output.sql
-rw-r--r-- 1 root root 1083 Aug 17 11:30 VIEW_other_ddl_output.sql
-rw-r--r-- 1 root root 377 Aug 17 11:30 TYPE_other_ddl_output.sql
-rw-r--r-- 1 root root 348 Aug 17 11:30 SYNONYM_other_ddl_output.sql
-rw-r--r-- 1 root root 585 Aug 17 11:30 SEQUENCE_other_ddl_output.sql
-rw-r--r-- 1 root root 31 Aug 17 11:30 MVIEW_other_ddl_output.sql
-rw-r--r-- 1 root root 348 Aug 17 11:30 GRANT_other_ddl_output.sql
执行导出表数据的时候报错Out of memory!,导出终止。是由于系统内存资源不足,需要调整ora2pg.conf配置文件下DATA_LIMIT参数,默认值是10000,可以减小该值,如果资源充足,可以增加该值。
修改ora2pg.conf不生效的话,直接修改ora2pg_data.conf导出数据配置文件,添加DATA_LIMIT参数,如下
[root@tencent ~]# vi /etc/ora2pg/ora2pg.conf
添加DATA_LIMIT 300
[root@tencent ~]# ora2pg -c /etc/ora2pg/ora2pg_data.conf
-rw-r--r-- 1 root root 70672 Aug 17 12:17 data_output.sql
[postgres@tencent postgresql]$ psql
psql (14.6)
Type "help" for help.
postgres=# create database orcl;
CREATE DATABASE
postgres=# create user hr with password 'hr';
CREATE ROLE
postgres=# alter database orcl owner to hr;
ALTER DATABASE
postgres=# \c orcl hr
You are now connected to database " orcl " as user "hr".
postgres=> create schema hr;
CREATE SCHEMA
orcl=> \dn
List of schemas
Name | Owner
--------+----------
hr | hr
public | postgres
(2 rows)
由于导出的sql文件在/root目录下,postgres用户权限不足,copy所有sql文件到/postgresql/scripts目录下,并更改权限:
[root@tencent ~]# cp /root/*.sql /postgresql/scripts/
[root@tencent ~]# chmod -R 700 /postgresql/scripts/*
[root@tencent ~]# chown -R postgres. /postgresql/scripts/
--导入表结构
[postgres@tencent scripts]$ psql -d orcl -Uhr -f /postgresql/scripts/table_ddl_output.sql
--查看表是否创建成功
注意:由于有物化视图,在TABLE_sh.sql 里包含了物化视图的索引,会创建失败。需先创建表,在创建物化视图,最后创建索引。取消物化视图索引,后面单独创建。
[postgres@tencent scripts]$
psql -d orcl -Uhr -f /postgresql/scripts/PROCEDURE_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/PACKAGE_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/MVIEW_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/GRANT_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/FUNCTION_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/VIEW_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/TYPE_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/TRIGGER_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/SYNONYM_other_ddl_output.sql
psql -d orcl -Uhr -f /postgresql/scripts/SEQUENCE_other_ddl_output.sql
--导入日志如下:
有触发器缺失,所如导入失败,本次忽略。
--查看导入结果
视图:
序列
函数(存储过程)
索引
导入数据的sql默认是最后提交commit,如果前面的事务INSERT失败,后面的都会失败,所以可以在每个insert事务后面添加commit,这样保证每个事务的提交是独立的,即使报错也不影响其他事务数据的提交。编辑data_output.sql文件,为每段insert 添加commit;
--导入数据
[postgres@tencent scripts]$ psql -d orcl -Uhr -f /postgresql/scripts/data_output.sql
表数据如下:
序列数据如下:
--表、视图、序列总览
--表
orcl=> select relname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_tables where schemaname='hr' order by pg_relation_size(relid) desc;
--索引
--序列
--函数
--存储过程
--数据库大小
文章浏览阅读15次。空化气泡的大小和相应的空化能量可以通过调整完全标度的振幅水平来操纵和数字控制。通过强调超声技术中的更高通量处理和防止样品污染,Epigentek EpiSonic超声仪可以轻松集成到现有的实验室工作流程中,并且特别适合与表观遗传学和下一代应用的兼容性。Epigentek的EpiSonic已成为一种有效的剪切设备,用于在染色质免疫沉淀技术中制备染色质样品,以及用于下一代测序平台的DNA文库制备。该装置的经济性及其多重样品的能力使其成为每个实验室拥有的经济高效的工具,而不仅仅是核心设施。
文章浏览阅读4.2k次,点赞3次,收藏14次。目录点击这里查看所有博文 本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。 先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。 我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!..._合宙获取天气
文章浏览阅读7.7k次,点赞2次,收藏41次。1 关于meshMesh的意思是网状物,以前读书的时候,在自动化领域有传感器自组网,zigbee、蓝牙等无线方式实现各个网络节点消息通信,通过各种算法,保证整个网络中所有节点信息能经过多跳最终传递到目的地,用于数据采集。十多年过去了,在无线路由器领域又把这个mesh概念翻炒了一下,各大品牌都推出了mesh路由器,大多数是3个为一组,实现在面积较大的住宅里,增强wifi覆盖范围,智能在多热点之间切换,提升上网体验。因为节点基本上在3个以内,所以mesh的算法不必太复杂,组网形式比较简单。各厂家都自定义了组_802.11s
文章浏览阅读5.2k次,点赞8次,收藏21次。线程的几种状态_线程状态
文章浏览阅读4.2w次,点赞124次,收藏688次。stack翻译为栈,是STL中实现的一个后进先出的容器。要使用 stack,应先添加头文件include<stack>,并在头文件下面加上“ using namespacestd;"1. stack的定义其定义的写法和其他STL容器相同, typename可以任意基本数据类型或容器:stack<typename> name;2. stack容器内元素的访问..._stack函数用法
文章浏览阅读71次。<li> <a href = "“#”>-</a></li><li>子节点:文本节点(回车),元素节点,文本节点。不同节点树: 节点(各种类型节点)childNodes:返回子节点的所有子节点的集合,包含任何类型、元素节点(元素类型节点):child。node.getAttribute(at...
文章浏览阅读3.4k次。//config的设置是全局的layui.config({ base: '/res/js/' //假设这是你存放拓展模块的根目录}).extend({ //设定模块别名 mymod: 'mymod' //如果 mymod.js 是在根目录,也可以不用设定别名 ,mod1: 'admin/mod1' //相对于上述 base 目录的子目录}); //你也可以忽略 base 设定的根目录,直接在 extend 指定路径(主要:该功能为 layui 2.2.0 新增)layui.exten_layui extend
文章浏览阅读3.2k次,点赞6次,收藏13次。分层思想分层思想分层思想-1分层思想-2分层思想-2OSI七层参考模型物理层和数据链路层物理层数据链路层网络层传输层会话层表示层应用层OSI七层模型的分层结构TCP/IP协议族的组成数据封装过程数据解封装过程PDU设备与层的对应关系各层通信分层思想分层思想-1在现实生活种,我们在喝牛奶时,未必了解他的生产过程,我们所接触的或许只是从超时购买牛奶。分层思想-2平时我们在网络时也未必知道数据的传输过程我们的所考虑的就是可以传就可以,不用管他时怎么传输的分层思想-2将复杂的流程分解为几个功能_5g分层结构
文章浏览阅读191次。在激光雕刻中,单向扫描(Unidirectional Scanning)是一种雕刻技术,其中激光头只在一个方向上移动,而不是来回移动。这种移动方式主要应用于通过激光逐行扫描图像表面的过程。具体而言,单向扫描的过程通常包括以下步骤:横向移动(X轴): 激光头沿X轴方向移动到图像的一侧。纵向移动(Y轴): 激光头沿Y轴方向开始逐行移动,刻蚀图像表面。这一过程是单向的,即在每一行上激光头只在一个方向上移动。返回横向移动: 一旦一行完成,激光头返回到图像的一侧,准备进行下一行的刻蚀。
文章浏览阅读577次。强连通:在有向图G中,如果两个点u和v是互相可达的,即从u出发可以到达v,从v出发也可以到达u,则成u和v是强连通的。强连通分量:如果一个有向图G不是强连通图,那么可以把它分成躲个子图,其中每个子图的内部是强连通的,而且这些子图已经扩展到最大,不能与子图外的任一点强连通,成这样的一个“极大连通”子图是G的一个强连通分量(SCC)。强连通分量的一些性质:(1)一个点必须有出度和入度,才会与其他点强连通。(2)把一个SCC从图中挖掉,不影响其他点的强连通性。_强连通分量
文章浏览阅读3.9k次,点赞5次,收藏18次。在做web开发,要给用户提供一个页面,页面包括静态页面+数据,两者结合起来就是完整的可视化的页面,django的模板系统支持这种功能,首先需要写一个静态页面,然后通过python的模板语法将数据渲染上去。1.创建一个templates目录2.配置。_django templates
文章浏览阅读1.7k次。Ubuntu等Linux系统显卡性能测试软件 Unigine 3DUbuntu Intel显卡驱动安装,请参考:ATI和NVIDIA显卡请在软件和更新中的附加驱动中安装。 这里推荐: 运行后,F9就可评分,已测试显卡有K2000 2GB 900+分,GT330m 1GB 340+ 分,GT620 1GB 340+ 分,四代i5核显340+ 分,还有写博客的小盒子100+ 分。relaybot@re...