oracle数据同步到Sequoiadb

661 阅读16分钟

  

一、 背景

     oracle数据库是传统关系型数据库中的代表,也是目前最通用的数据库之一。Sequoiadb分布式数据库作为新一代的nosql数据库,拥有高并发、实时性、分布式、可扩展、灵活存储的操作。在国家提倡去IOE的大前提下,怎么将oracle的数据迁移到Sequoiadb,成为了摆在企业面前的难题。除了将oracle数据导出为csv文件,然后入库这种本办法之外,是否能够实时的将oracle数据同步到Sequoiadb中,响应时间控制在秒级。本文就从技术上阐述怎么实时同步oracle数据到Sequoiadb。

二、 目的

Oracle GoldenGate 是一款专门针对各种关系型数据库的数据同步工具,它支持直接解析关系型数据库的事务日志文件,包括:Oracle、DB2、SQL Server、Mysql等,然后通过它自身的程序对事务日志进行数据解析,然后再将数据同步到远端的其他数据库上。

Oracle GoldenGate上的3个模块分别是:extract、dpe(Distributed Processing Environment)、replica。它能够帮助用户对已有的数据库环境部署一个冗余数据库,并且数据同步效率能够保证在秒级单位。Oracle GoldenGate以下简称ogg。

方案一:oracle->ogg->Kafka->SparkStreaming(or Store)->SequoiaDB

方案二:oracle->ogg->SequoiaDB

相比较方案二,第一个方案进过的流程较为复杂、经过的环节多、同步时间久不建议使用。本文主要讲解方案二的操作过程,从搭建oracle、ogg、Sequoiadb到对接的过程。

三、 安装前准备

3.1机器介绍

linux操作系统版本

centos6.2

oracle版本

11g

Sequoiadb版本

2.8.2

python版本

2.7.11

ogg版本

OGG for bigdata 12.3.1.1.0.013

ogg 服务端口

1357

sdb集群机器IP

192.168.137.128 (sdb2)

192.168.137.135 (sdb3)

192.168.137.164 (sdb1)

ogg目标端机器IP

192.168.137.128

ogg源端的机器IP

192.168.137.164

3.2设置swap的大小

使用命令free -m查看Swap空间大小

[root@sdb1 swap]# free -m             total       used       free    shared    buffers     cachedMem:          3825       3229        595          0         24       2663-/+ buffers/cache:        541       3283Swap:         3999          0       3999

显示本机不够4g,安装oracle需要至少4g的swap空间。接下来演示扩大swap空间。


在tmp下创建swap目录

mkdir /tmp/swapcd /tmp/swap

使用dd命令创建1g的大小空间

dd if=/dev/zero of=swapfree bs=1M count=1024 ;

If表示infile, of表示outfile, bs=1M代表增加的模块大小,count=1024代表是1024个模块,也就是1G空间大小


创建交换空间

mkswap /tmp/swap/swapfree

启动交换空间

swapon /tmp/swap/swapfree 

将/tmp/swap/swapfree加入到/etc/fstab条目将可以使用得系统在init进程中调用swapon –a来自动挂载/tmp/swap/swapfree,这样每次机器重启后/tmp/swap/swapfree都处于有效的swap空间. 修改命令 vi /etc/fstab增加一行

/tmp/swap/swapfree    swap    swap defaults 0 0


重启系统

修改后使用swapon –s 或者free –m可以查看

[root@sdb1 swap]# free -m             total       used       free    shared    buffers     cachedMem:          3825       3088        736          0         20       2603-/+ buffers/cache:        464       3360Swap:         5023          0      5023


3.3 linux环境配置修改

在安装oracle之前,需要先对linux 的内核参数做一些调整。

首先修改 /etc/security/limits.conf 配置文件。
在末尾增加

#oracle softwareoracle soft nproc 2047oracle hard nproc 16384oracle soft nofile 1024oracle hard nofile 65536

修改 /etc/pam.d/login 配置文件。

在末尾增加

#oracle softwaresession required/lib/security/pam_limits.sosession requiredpam_limits.so

修改 /etc/sysctl.conf 配置文件,增加如下内容。

fs.file-max = 6815744 fs.aio-max-nr = 1048576 kernel.shmall = 2097152 kernel.shmmax= 2147483648 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128 net.ipv4.ip_local_port_range= 9000 65500 net.core.rmem_default = 4194304 net.core.rmem_max = 4194304 net.core.wmem_default =262144 net.core.wmem_max = 1048576

要使 /etc/sysctl.conf 更改立即生效,执行以下命令。 输入:sysctl -p 显示如下:

net.ipv4.icmp_echo_ignore_broadcasts= 1net.ipv4.conf.all.rp_filter= 1fs.file-max = 6815744fs.aio-max-nr = 1048576kernel.shmall = 2097152kernel.shmmax = 2147483648kernel.shmmni = 4096kernel.sem = 250 32000 100 128net.ipv4.ip_local_port_range = 9000 65500net.core.rmem_default = 4194304net.core.rmem_max = 4194304net.core.wmem_default = 262144net.core.wmem_max = 1048576

编辑 /etc/profile ,输入命令:vi /etc/profile,按i键进入编辑模式,将下列内容加入该文件。

if [ $USER ="oracle" ]; thenif [ $SHELL ="/bin/ksh" ]; then  ulimit -p 16384  ulimit -n 65536else  ulimit -u 16384 -n 65536fifi


3.4创建oracle 系统用户

创建系统用户组和用户。

groupadd oracleuseradd -g oracle -m oracle

修改oracle 用户密码。

passwd oracle

在usr目录下创建oracle目录。

mkdir /usr/oracle

切换到 /usr/oracle目录,将以下两个oracle压缩包拷贝到创建的oracle目录下。

linux.x64_11gR2_database_1of2.ziplinux.x64_11gR2_database_2of2.zipcp /mnt/hgfs/1work/oracle/linux.x64_11gR2_database_1of2.zip ./cp /mnt/hgfs/1work/oracle/linux.x64_11gR2_database_2of2.zip ./


进行解压

unzip linux.x64_11gR2_database_1of2.zipunzip linux.x64_11gR2_database_2of2.zip

解压完,可以用ls查看(多出的database即为解压出来的文件)


在安装Oracle之前,用命令检查必需的RPM软件包有没有安装,检查的命令如下:

rpm -q binutils compat-libstdc++-33 elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibcglibc-common glibc-devel glibc-headers kernel-headers ksh libaio libaio-devel libgcc libgomp libstdc++ libstdc++-devel make numactl-develsysstat unixODBC unixODBC-devel


如果上图显示XXX is not installed,这个时候就要在安装必要的RPM包,安装命令如下所示:

yum install -y gcc-c++.x86_64yum install -y gcc.x86_64yum install -y libstdc++.i686yum install -y libaio-devel.i686yum install -y libaio-devel.x86_64yum install -y compat-libstdc++-33.x86_64yum install unixODBC.i686 -yyum install unixODBC.x86_64-yyum install unixODBC-devel.i686 -yyum install unixODBC-devel.x86_64 -yyum install libaio-devel.x86_64 -yyum install elfutils-libelf-devel.x86_64 -yyum install libaio.i686 -yyum install libgcc.i686 -yyum install ksh.x86_64 -yyum install numactl numactl-devel -y

执行以上命令进行安装。

3.5 yum安装插件时注意事项

使用yum安装插件时出现如下问题,显示python安装包存在问题

[root@sdb1 oracle]# yum install -y gcc-c++.x86_64There was a problem importing one of the Python modulesrequired to run yum. The error leading to this problem was:   No module named yumPlease install a package which provides this module, orverify that the module is installed correctly.It's possible that the above module doesn't match thecurrent version of Python,which is:2.7.11 (default, Oct 102017, 19:22:13) [GCC 4.4.7 20120313 (Red Hat4.4.7-4)]If you cannot solve this problem yourself, please go to the yum faq at:
http://yum.baseurl.org/wiki/Faq

解决办法:

查看python的版本,显示为2.7.11

[root@sdb1 oracle]# python --versionPython 2.7.11

查看python安装目录

[root@sdb1 oracle]# whereis pythonpython: /usr/bin/python2.6/usr/bin/python /usr/lib/python2.6 /usr/lib64/python2.6 /usr/include/python2.6/usr/share/man/man1/python.1.gz

查看yum安装目录

[root@sdb1 oracle]# whichyum/usr/bin/yum

打开/usr/bin/yum,将第一行中的#!/usr/bin/python修改为:

#!/usr/bin/python2.6

再次运行yum没有问题

[root@sdb1 ~]# vi/usr/bin/yum#!/usr/bin/python2.6import systry:    import yumexcept ImportError:    print >> sys.stderr,"""\There was a problem importing one of the Python modulesrequired to run yum. The error leading to this problem was:


3.6 oracle系统用户创建

groupadd oracleuseradd -g oracle -m oracle

修改oracle 用户密码

passwd oracle

切换oracle 用户(su – oracle),然后创建一些初始目录

#cd /usr/oraclemkdir appmkdir app/oraclemkdir app/datamkdir app/product

设置oracle环境变量

首先su到oracle用户下,编辑home目录下的.bash_profile

[oracle@oracledb~]$ vi ~/.bash_profileexport ORACLE_BASE=/home/oracle/appexport ORACLE_HOME=${ORACLE_BASE}/oracle/product/11.2.0/dbhome_1export ORACLE_HOME_LISTNER=${ORACLE_HOME}export ORACLE_SID=orclexport PATH=${PATH}:${ORACLE_HOME}/binexport LD_LIBRARY_PATH=${ORACLE_HOME}/lib:/usr/libexport DISPLAY=:0

Note:

    oracle_base是给oracle创建的app目录;

    oracle_home 为oracle安装目录;

    oracle_sid 起名为orcl;

设置环境变量PATH和LD_LIBRARY_PATH,其中需要注意DISPLAY需要根据自己的机器查询一下。

设置 DISPLAY 参数环境变量,用户可以通过以下命令查看

who

在sdb1这台机器的shell 中执行 who 命令显示

oracle   :0 2017-08-22 13:53oracle   pts/1 2017-08-22 13:54 (:0.0)oracle   pts/2 2017-08-22 14:13 (:0.0)

则在 ~/.bash_profile 中增加

export DISPLAY=:0.0

使配置生效

[oracle@oracledb ~]$ source.bash_profile  

关闭Selinux(在root用户下)

[root@oracledb ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config  [root@oracledb ~]# setenforce 0

关闭防火墙(在root用户下)

[root@oracledb vsftpd]# service iptables stop[root@oracledb vsftpd]# chkconfig iptables off

四、 安装oracle

此时需要将虚拟机切换到oracle用户登录(需要重启虚拟机),在oracle目下的database中执行命令runInstaller 开始进行安装。oracle 11g 安装一定需要图形化界面,另外用户一定要在oracle 用户下登陆图形化界面执行 runInstaller 程序,否则将会出现“无法使用命令 /usr/bin/xdpyinfo 自动检查显示器颜色”这个错误。下面为详细安装步骤。

4.1oracle安装


可以选择第一个安装数据库软件并创建数据,也可以选择第二项仅安装数据库软件,这里选择的是第二个。




装到这一步,可以看到,可以查看到有很多的rpm包没有,我们可以从安装linux的光盘或ISO中查找所缺的包,使用ftp上传到linux中,然后使用rpm –ivh xxx.rpm --nodeps --force 来进行安装(其中加上--nodeps -- force 代表强制安装,是在直接使用rpm –ivh xxx.rpm安装不成功的情况下用的)安装过程略。

等到把包全部都安装好的情况下,再次在oracle图形界面中,执行安装过程2,下来在环境检查过程中,就通过了。如果机器中已经安装了更高版本的包请点击选择忽略。


其中需要注意一点,系统检测到pdksh这个安装包没有安装。发现pdksh是一个老包了,新的oracle都使用ksh包了,但是oracle的check机制里面并没有把这个check去掉,所以在执行界面安装oracle的时候,还会有告警信息,我们可以忽略掉它,然后看看ksh有没有安装,如果没有安装就安装ksh,用ksh就可以。

检测

yum install -ykshPackageksh-20120801-35.el6_9.x86_64 already installed and latest version

说明已经安装,选择忽略ignore掉就可以。


接下来的界面如下所示


安装过程


需要在root用户下执行这两个程序


安装完成后,系统会提示你需要用root权限执行2个shell脚本。按照其提示的路径,找到其所在的位置,如:我的就在

/home/oracle/app/oracle/product/11.2.0/dbhome_1/root.sh/home/oracle/app/oraInventory/orainstRoot.sh  

新开启一个终端,输入命令:

su – rootcd /home/oracle/app/oracle/product/11.2.0/dbhome_1sh  root.shcd /home/oracle/app/oraInventorysh  orainstRoot.sh

执行效果如下


4.2数据库新建

oracle用户的图形界面oracle用户中,新开启一个终端,直接输入命令dbca会弹出如下界面,这里需要说明,如果使用dbca启动不成功,输入dbca显示为bash: dbca: command not found,需要检查配置的bash_profile 配置是否有问题,然后在命令行中打印echo${PATH}进行检查。如没有问题需要重启下linux虚拟机,使用oracle用户进入到创建database页面中。


custom database


填写orcl,这里就是填写的环境变量中的SID。


不勾选任何选项,直接点击”next“


输入统一密码(也可以分别设置其密码),密码为oracle 管理员账户的密码,即“system”和 “sys” 用户的密码


数据库存放位置,我这里采用默认


不指定快速恢复和归档


去掉不常用的模块


内存分配及指定字符集


选择字符集,这里作者选择使用”utf8“


最后一个步骤,直接点击”next“和下一页的“finish”


点击Finish


出现页面,点击OK


出现创建database页面,创建过程比较慢。


当看到此界面,说明oracle建库完成


可以用sqlplus来检验下,新开启一个命令窗口,输入sqlplus,然后输入用户名和密码,可以测试下


其中用户名和密码为:

Enter user-name:sys as sysdbaEnter password:oracle

需要注意的是Enter user-name输入的是 :用户名+as sysdba 。 如sys as sysdba

select count(*) from all_tables;select count(*) from user_tables;


4.3设置监听及本地网络服务

在oracle 用户下执行 netca 命令,启动设置网络监听的设置窗口 (图形化界面的登陆用户依然是oracle)


选择新建一个监听服务,允许别的oracle客户端可以连接到本地的oracle 数据库服务。


选择端口 默认为1521,这里不做修改。


设置完成

,点击“next”


3)配置本地网络服务名(充当oracle客户端,连接别的oracle服务器)


输入连接的oracle服务器的数据库的实例名


输入本机的hostname 可以输入IP 也可可以输入配置好的hostname


选中测试


点击”change login“, 更换连接数据库服务其的账号

输入Username :system

Password为创建database时设置的密码。

出现successful则说明连接已经成功


为我们本地网络服务起一个名字,作者填写“orcl_ic"


选择”finish“ 结束设置

以上oracle服务器安装配置基本就完成了。

4.4设置开机自启动

首先切换root用户

新建一个 /etc/init.d/after.local 脚本,该脚本为开机后最后执行的步骤脚本,如果该文件已经存在,则直接打开即可

增加以下内容,包含关闭系统放火墙、开启oracle 监听和 oracle 数据库服务

#!/bin/bash/sbin/service iptables stop/sbin/chkconfig iptables offsu oracle -lc "/home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/lsnrctlstart"su oracle -lc "/home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/dbstart"

修改 /etc/oratab 文件 (在oracle 用户下操作)

将旧的内容

orcl:/home/oracle/app/oracle/product/11.2.0/dbhome_1:N

修改为以下内容,保存退出

orcl:/home/oracle/app/oracle/product/11.2.0/dbhome_1:Y

分别修改 /home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/dbstart (80行)

将以下代码注释

#ORACLE_HOME_LISTNER=$1

和 /home/oracle/app/oracle/product/11.2.0/dbhome_1/bin/dbshut (50行)文件

修改为如下:

ORACLE_HOME_LISTNER=${ORACLE_HOME}

4.5操作oracle步骤

创建临时表空间

-查询临时表空间文件的绝对路径。如果需要的话,可以通过查询来写定绝对路径。一般用${ORACLE_HOME}就可以了

select name from v$tempfile;create temporary tablespace mpg_temp98 tempfile '/home/oracle/app/oradata/orcl/mpg_temp98.bdf' size 100m reuse autoextend onnext 20m maxsize unlimited;

查询用户表空间文件的绝对路径:

select name from v$datafile;

创建表空间

create tablespace MPG_DATA98 datafile'/home/oracle/app/oradata/orcl/MPG_DATA98.dbf' size 100M reuse autoextend onnext 40M maxsize unlimited default storage(initial 128k next 128k minextents 2maxextents unlimited);

查看已经创建好的表空间:

select default_tablespace, temporary_tablespace, d.username  from dba_users d ;

创建用户havi和密码havi,指定上边创建的临时表空间mpg_temp98和表空间MPG_DATA98

create user havi identified by havi default tablespace MPG_DATA98 temporary tablespace mpg_temp98;

用create user语法创建用户使用语法如下:

CREATE USER user_name IDENTIFIED BY user_password DefaultTablespace tbs_users;

user_name 为数据库用户的用户名

user_password 为数据库用户的密码

tbs_users 为用户使用的表空间,默认是users表空间。

给用户授予详细权限(用户为havi)

grant create session, create any table, create any view ,create anyindex, create any procedure,alter any table, alter any procedure,drop anytable, drop any view, drop any index, drop any procedure,select any table,create any trigger,create table,insert any table, update any table, delete any table ,unlimited tablespace,connect,resource,dba to havi;

给用户赋简单的权限(用户为havi)

GRANT connect, resource TO havi;    

Connect用户能登录数据库的权限

Resource用户能创建一些数据库对像的权限,表、视图,存储过程,一般是授予开发人员的.

CONNECT ,RESOURCE,DBA是Oracle系统的三个内置角色,角色权限如下:

CONNECT:拥有Connect权限的用户只可以登录oracle,不可以创建实体,不可以创建数据库结构。

RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。

DBA:拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。

一般来说,对于普通用户,授予CONNECT, RESOURCE权限。 对于管理员用户,则授予CONNECT,RESOURCE, DBA权限。

退出oracle

exit;

使用用户名为havi重新登录/home/oracle/app sqlplus havi/havi

创建表插入数据

create table CAPITAL_ADJUST(  CAPITAL_ID    VARCHAR2(10),  CAPITAL_NAME  VARCHAR2(50),  TYPE          VARCHAR2(10),  BELONG        VARCHAR2(50),  IN_DEP        VARCHAR2(50),  ID            VARCHAR2(10) not null,  IN_DEP_LEADER VARCHAR2(50),  OUT_DEP_LEAD  VARCHAR2(50));

插入数据

INSERT INTO CAPITAL_ADJUST  (ID,   CAPITAL_ID,   CAPITAL_NAME,   TYPE,   BELONG,   IN_DEP,   IN_DEP_LEADER,   OUT_DEP_LEAD)VALUES  (1, '001', '002', '003','004', '005', '006', '007');

查询记录

SELECT * FROM CAPITAL_ADJUST;

删除记录

delete from CAPITAL_ADJUST t where t.ID = '1';

增加主键

alter table 表名 add constraint 主键名 primary key (字段名1);

给CAPITAL_ADJUST这张表创建主键

alter table CAPITAL_ADJUST add constraint ID primary key (ID);

增加外键

alter table 表名 add constraint 外键名 foreign key (字段名1) references 关联表 (字段名2);

创建索引

create index 索引名 on 表名 (GETSURE_UNIT_NO, SONSURE_UNIT_NO, UNIT_NO, FAMILY_NO, HOSPS_NO)

删除某个用户

drop user havi cascade;

查看用户下有哪些表

select * from tab;

查看临时表空间文件

select name from v$tempfile;

查看用户和表空间的关系

select USERNAME,TEMPORARY_TABLESPACE from DBA_USERS;

如果有用户的默认临时表空间是NOTIFYDB_TEMP的话,建议进行更改

alter user xxx temporary tablespace tempdefault;

设置 tempdefault 为默认临时表空间

alter database default temporary tablespace tempdefault;

删除表空间NOTIFYDB_TEMP及其包含数据对象以及数据文件

drop tablespace mpg_temp13 including contents and datafiles; 

删除临时表空间(删除之前要确定没用在使用)

drop tablespace mpg_temp98 including CONTENTS and datafiles; 

删除表空间

drop tablespace MPG_DATA98 including CONTENTS and datafiles; 

创建表时的命名规则和注意事项:

1)表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,#

2)大小写不区分

3)不用SQL里的保留字, 一定要用时可用双引号把字符串括起来

4)用和实体或属性相关的英文符号长度有一定的限制

5)约束名的命名规则和语法 约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字) 约束名字符串的命名规则同于表和字段名的命名规则

6)使用约束时的注意事项 约束里不能用系统函数,如SYSDATE和别的表的字段比较 可以用本表内字段的比较

注意事项:

1)建表时可以用中文的字段名, 但最好还是用英文的字段名

2)创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面

3)建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引

4)一个表的最多字段个数也是有限制的,254个.

执行startup,进行启动oracle服务

SQL> startupORACLE instance started. Total System Global Area 409194496 bytesFixed Size 2213856 bytesVariable Size 134219808 bytesDatabase Buffers  264241152 bytesRedo Buffers 8519680 bytesDatabase mounted.Database opened.


五、 Sequoiadb安装部署

5.1 Sequoiadb安装

解压安装包: tar -zxvf sequoiadb-2.8.1-linux_x86_64-enterprise-installer.tar.gz,则可以执行如下安装命令。其他步骤这里不做过多的讲解,具体请查看Sequoiadb安装文档。

命令行中执行命令:

./sequoiadb-2.8.2-linux_x86_64-enterprise-installer.run--mode text --installer-language en --prefix /opt/sequoiadb --upgrade false--force false --username sdbadmin --groupname sdbadmin_group --userpasswdsdbadmin --port 11790 --processAutoStart false --SMS true  

Note:

    SMS true表示安装OM

    SMS false 表示不安装OM

    Username 为sdb用户名不是数据库名不要混淆

    Userpasswd 为sdb用户密码不是数据库密码不要混淆

5.2集群部署

连接到本地 cm服务

var oma = new Oma("localhost", 11790)

创建临时协调节点

oma.createCoord(18800,"/opt/sequoiadb/database/coord/18800")

启动临时协调节点

oma.startNode(18800)

连接到临时协调节点

var db = new Sdb("localhost",18800)

创建一个编目节点组

db.createCataRG("sdbserver1", 11800,"/opt/sequoiadb/database/cata/11800")      

添加另外两个编目节点

> var cataRG = db.getRG("SYSCatalogGroup");> var node1 = cataRG.createNode("sdbserver2",11800,"/opt/sequoiadb/database/cata/11800")> var node2 = cataRG.createNode("sdbserver3", 11800,"/opt/sequoiadb/database/cata/11800")

启动编目节点组

> node1.start()> node2.start()

创建数据节点组

> var dataRG = db.createRG("datagroup")

添加数据节点

> dataRG.createNode("sdbserver1", 11820,"/opt/sequoiadb/database/data/11820")> dataRG.createNode("sdbserver2", 11820,"/opt/sequoiadb/database/data/11820")> dataRG.createNode("sdbserver3", 11820,"/opt/sequoiadb/database/data/11820")> dataRG.start()

创建协调节点组

> var rg = db.createCoordRG()

创建协调节点

> rg.createNode("sdbserver1", 11810,"/opt/sequoiadb/database/coord/11810")> rg.createNode("sdbserver2", 11810,"/opt/sequoiadb/database/coord/11810")> rg.createNode("sdbserver3", 11810,"/opt/sequoiadb/database/coord/11810")

启动协调节点

> rg.start()

删除临时协调节点

连接到本地的集群管理服务进程 sdbcm

> var oma = new Oma("localhost", 11790)

删除临时协调节点

> oma.removeCoord(18800)

六、 Oracle GoldenGate对接 Oracle 11g

机器介绍

目标端机器IP为 192.168.137.128 ogg 的mgr为1357

源端的机器IP为 192.168.137.164

6.1开始介绍部署与配置步骤

1. 开启日志自动归档

使用system用户登陆oracle 的sqlplus

sqlplus "system/oracle" as sysdba

首先检查oracle 是否已经开启 Archive logging

archive log list;

如果显示以下错误,则证明没有开启

ORA-01031: insufficient privileges

或者是Automatic archival Disabled也是没有开启的。


用户可以使用以下命令查看oracle 是否已经开启了 自动归档模式

select name,log_mode from v$database;

LOG_MODE 显示 NOARCHIVELOG 则代表没有开启


开启 Archive logging ,需要先停止数据库,执行以下命令

shutdown immediate;

然后将数据库启动到 mount 状态

startup mount

更改归档模式,启动 日志自动归档

ALTER DATABASE ARCHIVELOG;

想了解日志归档是否真的已经开启,以及查看归档日志存储在什么路径,可以再次执行

archive log list

例如作者机器就是显示

SQL> archive log listDatabase log mode   Archive ModeAutomatic archival  EnabledArchive destination  /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/archOldest online log sequence  49Next log sequence to archive 51Current log sequence  51


重新打开oracle 的 database

SQL> alter database open;

Database altered.

在shell中用户需要先创建好日志归档目录,例如作者的归档目录为 /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/arch,则该目录需要预先创建

mkdir -p /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/arch

测试归档

alter system switch logfile;

然后用户可以在 /home/oracle/app/oracle/product/11.2.0/dbhome_1/dbs/arch 目录下看到新的归档日志。


用户也可以使用sql 命令查看归档情况

select * from v$archived_log;

以上oracle 如何开启日志自动归档的方法就介绍完毕了。

2. 开启同步日志

检查是否开启forcelogging和 minimal supplemental logging

注意:如果不指定Primary key 和unique 属性,OGG将不会传送PK字段或Unique indiex字段信息。这样,下游的应用,在处理update数据时将失去依据。

SELECT supplemental_log_data_min,force_logging FROM v$database;

像作者的环境就没有开启(屏幕输出NO),所以我们还需要执行开启命令,执行完毕后,我们再来查看 forcelogging和 minimal supplemental logging 的开启情况

alter database add supplemental log data (primary key) columns;alter database add supplemental log data (unique) columns;alter database force logging;alter system switch logfile;

检查开启情况,显示如下则代表ok

SUPPLEME FOR-------- ---IMPLICIT YES

在oracle 中开启 enable_goldengate_replication 参数

alter system set ENABLE_GOLDENGATE_REPLICATION=true;

有些oracle版本会报错,这是正常情况忽略即可。


3. 创建ogg用户

在上面的SQL窗口中创建ogg用户

创建OGG 用户,用户名为ogg,密码也为ogg

create user ogg identified by ogg;grant connect,resource to ogg;grant select any dictionary to ogg;grant select any table to ogg;

6.2在Oracle 源端部署Oracle GoldenGate服务

1. 安装ogg

因为oracle 服务部署在 oracle 系统用户下,所以打算 ogg 也同样部署在 oracle 用户下

创建 ogg 的工作目录

mkdir -p /home/oracle/ogg

创建 oggapp目录

mkdir -p /home/oracle/ oggapp

将 ogg 软件拷贝到 /home/oracle/ogg 目录下,并且解压

cp /mnt/hgfs/mnt/orace_ogg/123010_fbo_ggs_Linux_x64_shiphome.zip /home/oracle/oggunzip 123010_fbo_ggs_Linux_x64_shiphome.zip

修改ogg 的配置文件

vi /home/oracle/ogg/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rspINSTALL_OPTION=ORA11gSOFTWARE_LOCATION=/home/oracle/oggappSTART_MANAGER=falseMANAGER_PORT=9001DATABASE_LOCATION=${ORACLE_HOME}

注意:上文中已经在~/.bash_profile 中设置好了 ORACLE_HOME 的环境变量。

运行安装 OGG 程序

cd /home/oracle/ogg/fbo_ggs_Linux_x64_shiphome/Disk1 ./runInstaller  -silent -responseFile /home/oracle/ogg/fbo_ggs_Linux_x64_shiphome/Disk1/response/oggcore.rsp

出现以下信息表示安装成功


修改oracle 用户的配置文件 ~/.bash_profile,主要是增加OGG_HOME 内容

export JAVA_HOME=/opt/java1.7/jdk1.7.0_80export CLASSPATH=${JAVA_HOME}/lib/tools.jar:${JAVA_HOME}/lib/dt.jarexport PATH=${JAVA_HOME}/bin:${PATH}export ORACLE_BASE=/home/oracle/appexport ORACLE_HOME=${ORACLE_BASE}/oracle/product/11.2.0/dbhome_1export ORACLE_HOME_LISTNER=${ORACLE_HOME}export OGG_HOME=/home/oracle/oggappexport ORACLE_SID=orclexport PATH=${PATH}:${ORACLE_HOME}/bin:${OGG_HOME}export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:/usr/lib:${OGG_HOME}export DISPLAY=:0

Note:

1) 配置OGG_HOME为ogg安装的地址

2) PATH中添加ogg的目录

3) LD_LIBRARY_PATH中添加ogg的目录

2)源端的jak版本配置1.7 ,目标端jdk版本为1.8。

登陆 ogg 控制台

cd /home/oracle/oggapp./ggsci


给ogg 创建目录,注意此操作是在 ggsci 中执行

create subdirs

执行后,屏幕输出

Parameter file                /home/oracle/oggapp/dirprm: created.Report file                   /home/oracle/oggapp/dirrpt: created.Checkpoint file               /home/oracle/oggapp/dirchk: created.Process status files          /home/oracle/oggapp/dirpcs: created.SQL script files              /home/oracle/oggapp/dirsql: created.Database definitions files    /home/oracle/oggapp/dirdef: created.Extract data files            /home/oracle/oggapp/dirdat: created.Temporary files               /home/oracle/oggapp/dirtmp: created.Credential store files        /home/oracle/oggapp/dircrd: created.Masterkey wallet files        /home/oracle/oggapp/dirwlt: created.Dump files                    /home/oracle/oggapp/dirdmp: created.


2. 配置源端manager

配置源端manager进程,注意:此操作是在 ggsci 中执行

edit params mgr

然后操作会调到 VI 上,用户再输入以下内容后保存退出

port 9001autostart er *autorestart er *

启动 manager ,注意:此操作是在 ggsci 中执行

start mgr


查看manager 的状态,可以看到 MANAGER 为RUNNING,注意:此操作是在 ggsci 中执行

info all


3. 配置EXT_TEST服务

编辑ext_test服务,该服务是专门用来抽取oracle 新增日志的进程,注意:此操作是在 ggsci 中执行

edit params ext_test

然后操作会跳到 VI 上,用户再输入以下内容后保存退出

EXTRACT ext_test
Setenv (NLS_LANG="AMERICAN_AMERICA.UTF8")USERID ogg, PASSWORD ogggettruncatesDISCARDFILE ./dirrpt/ext_test.dsc, APPEND, MEGABYTES 1024DBOPTIONS  ALLOWUNUSEDCOLUMNREPORTCOUNT EVERY 1 MINUTES, RATEFETCHOPTIONS NOUSESNAPSHOTTRANLOGOPTIONS DBLOGREADEREXTTRAIL ./dirdat/exWILDCARDRESOLVE DYNAMICGETUPDATEBEFORESNOCOMPRESSUPDATESNOCOMPRESSDELETESdynamicresolutiontable ogg.test;

然后执行命令创建ext_test 的服务,并且指定将抽取到的日志存放在 ./dirdat/ 目录下,并且文件名以ex 开头,注意:此操作是在 ggsci 中执行

add extract ext_test, TRANLOG, BEGIN NOWADD EXTTRAIL ./dirdat/ex , EXTRACT ext_test, MEGABYTES 200


注意,指定的目录末尾一定只能是两个字符,否则报错为如下信息

file portion must be two characters.

启动该日志抽取服务,注意:此操作是在 ggsci 中执行

start ext_test


日志抽取部分的配置就ok了,下面开始配置日志发送的服务dpe_test

4. 配置DPE_TEST服务

同样的先编辑服务的配置

edit param dpe_test               

然后界面会进入VI 模式,在文件上填写以下内容后保存退出,同样的dirdat 路径下的文件名只能够用两个字符,否则会报告错误

EXTRACT dpe_testPASSTHRURMTHOST 192.168.137.128, MGRPORT 1357RMTTRAIL ./dirdat/reTABLE scott.test;

1)RMTHOST 这个IP 地址,是远端接收日志的服务的IP地址(目标端的IP不是源端的IP)。

2)MGRPORT 端口是远端接收日志的MGR 服务端口,这里千万不要搞混淆了。

3)RMTTAIL 这个是远端接收日志的路径,并非本机的,即是在 88.162 机器上的dirdata 目录上的存放接收到的日志路径。

后面的步骤就是,将ext_test 抽取到的日志存放路径 配置给 dpe_test 发送日志服务,注意:此操作是在 ggsci 中执行

ADD EXTRACT dpe_test, EXTTRAILSOURCE ./dirdat/exADD RMTTRAIL ./dirdat/re, EXTRACT dpe_test, MEGABYTES 200


注意:红色字体是ext_test 的路径,绿色字体是发送到远端服务的路径

配置好dpe_test 服务后,还不能够立马启动,因为远端接收的MGR 服务还没有起来,所以这块还遗留一个小尾巴

6.3部署目标端的Oracle GoldenGate

1. 安装ogg

在目标端机器(192.168.88.162)上事先创建oracle:oracle 用户组和用户

groupadd  oracleuseradd  -s /bin/bash -m -g oracle oraclepasswd oracle

切换oracle 用户,为ogg adapter 创建目录

mkdir /home/oracle/ogg

拷贝ogg adapter 压缩包,并且解压

cp /mnt/hgfs/mnt/orace_ogg/123110_ggs_Adapters_Linux_x64.zip  /home/oracle/ogg_adapter ; 
unzip 123110_ggs_Adapters_Linux_x64.zip 

将解压的 ogg_adapter/ggs_Adapters_Linux_x64.tar 文件拷贝到 /home/oracle/oggapp 目录(如果不存在此目录,请事先创建)

cp ogg/ggs_Adapters_Linux_x64.tar /home/oracle/oggapp

在 /home/oracle/oggapp 目录下解压 ggs_Adapters_Linux_x64.tar.gz 文件

tar xvf ggs_Adapters_Linux_x64.tar.gz

为oracle 用户设置JDK 和 ogg 的环境变量

vi ~/.bash_profile export JAVA_HOME=/opt/jdk1.8.0_144export CLASSPATH=${JAVA_HOME}/lib/tools.jar:${JAVA_HOME}/lib/dt.jarexport PATH=${JAVA_HOME}/bin:${PATH}export OGG_HOME=/home/oracle/oggappexport PATH=$PATH:$OGG_HOMEexport LD_LIBRARY_PATH=$OGG_HOME:$JAVA_HOME/jre/lib/amd64/libjsig.so:$JAVA_HOME/jre/lib/amd64/server/libjvm.so:$JAVA_HOME/jre/lib/amd64/server:$JAVA_HOME/jre/lib/amd64

Note:

如果不设置JDK的LD_LIBRARY_PATH环境变量,会在启动后面的rep_test 服务时,报错。

用户也要注意 /etc/hosts 的设置,一定需要将机器的hostname 和 IP 地址配置好映射关系,否者也会出现错误。

如果用户出现此错误,需要先重启目标端的mgr 服务,直接在 ggsci 命令窗口执行 stop mgr 命令是不能够停止mgr 服务的,还需要用户在shell 中通过 kill -15 PID 的方法停止mgr。

用户正确修改 /etc/hosts 配置文件后,再重启 目标端的 mgr 和 rep_test 服务,然后需要 重新启动 源端 的 dpe_test 服务,因为目标段的 mgr 服务一旦停止, dpe_test 就可能出现异常。

拷贝模板文件

cp /home/oracle/ogg/AdapterExamples/big-data/kafka/*  /home/oracle/ogg/dirprm/

启动 ggsci 控制程序

/home/oracle/oggapp/ggsci

创建目录,注意:此操作是在 ggsci 中执行

create subdirs


2. 配置目标端manager

配置目标端manager进程,注意:此操作是在 ggsci 中执行

edit params mgr

然后出现VI 界面,输入以下内容后保存退出

port 1357autostart er *autorestart er *

在目标端的MGR 配置中,端口号设置是需要和源端的 dpe_test 配合的,这个需要注意。

启动manager 进程并且确认,注意此操作是在 ggsci 中执行 。

start mgr

确认命令,如果正常运行,则显示 MANAGER RUNNING ,注意:此操作是在 ggsci 中执行。

info all

可以看到manager服务已经启动。

3. 配置REP_TEST

修改接收服务配置,注意:此操作是在 ggsci 中执行

edit params rep_test

修改内容如下

REPLICAT rep_testTARGETDB LIBFILE libggjava.so SET property=dirprm/sequoiadb.propsGETTRUNCATESSOURCEDEFS dirdef/source.defREPORTCOUNT EVERY 1 MINUTES, RATEGROUPTRANSOPS 10000MAP scott.*, TARGET scott.*;

dirprm/ sequoiadb.props 是sequoiadb的配置文件,下面会介绍到。

dirdef/source.def 是源端的表结构定义文件,这个暂时还没有介绍到,等一下会介绍。

然后就是添加rep_test 该服务,并且指定 dirdat/re 路径作为 rep_test 服务的日志来源,可以留意一下dirdat/re 路径,实际上就是远端dpe_test 指定的路径。

因为rep_test 的服务作用就是将日志文件解析,然后再做相应的处理,本文就是将解析后的日志发送到sequoiadb上。

为 ogg 增加rep_test 服务,注意:此操作是在 ggsci 中执行

add replicat rep_test, exttrail ./dirdat/re

创建sequoiadb_libs目录,放置sequoiadb两个驱动包

>cd  /home/oracle/oggapp/mkdir sequoiadb_libscp ../sequoiadb-driver-2.9.0-SNAPSHOT.jar ./sequoiadb_libs/cp ../sequoiadb_ogg_2.8.2.jar ./sequoiadb_libs/

在ogg的dirprm目录下创建sequoiadb.props文件

gg.handlerlist=sequoiadbgg.handler.sequoiadb.type=oracle.goldengate.handler.sequoiadb.SequoiaDBHandler #The following handlerproperties are optional. #Please refer to the OracleGoldenGate for BigData documentation#for details about theconfiguration.#gg.handler.sequoiadb.hosts=sdb1:11810,sdb2:11810,sdb3:11810gg.handler.sequoiadb.hosts=localhost:11810#gg.handler.sequoiadb.password=sdbadmin#gg.handler.sequoiadb.username=sdbadmin#gg.handler.sequoiadb.bulkWrite=<true|false>#gg.handler.sequoiadb.bulkSize=1024#gg.handler.sequoiadb.checkMaxRowSizeLimit=<true|false>#gg.handler.sequoiadb.ignoreMissingColumns=<true|false>#gg.handler.sequoiadb.changeFieldToLowCase=<true|false>#gg.handler.sequoiadb.changeTableToLowCase=<true|false>gg.handler.sequoiadb.isPrintInfo=true goldengate.userexit.timestamp=utcgoldengate.userexit.writers=javawriterjavawriter.stats.display=TRUEjavawriter.stats.full=TRUEgg.log=log4jgg.log.level=INFOgg.report.time=30sec #Path to SequoiaDB Javadriver.# maven co-ordinates#        <dependency>#           <groupId>com.sequoiadb</groupId>#            <artifactId>sequoiadb-driver</artifactId>#           <version>2.8.1</version>#        </dependency>gg.classpath=/home/oracle/oggapp/sequoiadb_libs/sequoiadb-driver-2.9.0-SNAPSHOT.jar:/home/oracle/oggapp/sequoiadb_libs/sequoiadb_ogg_2.8.2.jarjavawriter.bootoptions=-Xmx512m-Xms32m -Djava.class.path=.:ggjava/ggjava.jar:./dirprm

Note:

gg.handler.sequoiadb.hosts是需要对接的Sequoiadb的IP和协调节点和地址,当有多台机器构成的集群可以使用多个连接。

gg.handler.sequoiadb.username数据库鉴权用户名。

gg.handler.sequoiadb.password是数据库鉴权密码。

gg.handler.sequoiadb.bulkWrite是否起开批量插入,默认为打开的。

gg.handler.sequoiadb.bulkSize当打开批量插入后,每次批量插入的条数。

gg.handler.sequoiadb.checkMaxRowSizeLimit是否检查写入数据库的记录大小,如果打开,则超过16MB的BSON记录将会报错,默认是关闭的。

gg.handler.sequoiadb.ignoreMissingColumns写入记录时,是否要忽略值为null的字段,默认是打开的。

gg.handler.sequoiadb.changeFieldToLowCase连接器在获取源端的表结构时,是否要对其转换为小写字母,默认为打开。

gg.handler.sequoiadb.changeTableToLowCase连接器在获取源端的表名时,是否要对其转换成小写字母,默认为打开。

gg.handler.sequoiadb.isPrintInfo是GoldenGate的replica程序在运行时是否要打印OGG-SequoiaDB连接器的日志信息,默认是关闭的。

以上操作后,rep_test 的服务配置已经基本完了,但是源端表结构的配置还没有开始做,所以也暂时对 rep_test 服务不能启动。

4. 源端表结构文件初始化

回到源端的ggsci 客户端的交互命令窗口上来,执行以下命令,创建一个新的初始化源端表结构的配置文件,注意:此操作是在 ggsci 中执行

edit param defgen

此时界面会跳转到VI界面上,用户直接在上面编辑以下内容。

DEFSFILE dirdef/source.def,PURGEUSERID ogg, PASSWORD oggTABLE ogg.test ;

userid 和 password 参数是 oracle 数据库中的用户名和密码登录方式

table 参数就是需要初始化的表名

然后用户在 linux shell 窗口下执行以下命令(源端执行shell 命令)

defgen paramfile dirprm/defgen.prm

然后把在源端新生成的 dirdef/source.def 文件scp 到 目标端 的 dirdef/source.def

scp -r dirdef/source.def oracle@sdb2:/home/oracle/oggapp/dirdef/source.def

首先来启动rep_test 服务(目标端的ggsci 执行),注意:此操作是在 ggsci 中执行

start rep_test

再来启动 dpe_test 服务(源端的ggsci 执行),注意:此操作是在 ggsci 中执行

start dpe_test

用户也可以分别在源端和目标端的 ggsci 中查看rep_test 和 dpe_test 服务的启动状态。

info  all

七、 Oracle GoldenGate对接Sequoiadb

7.1 对接准备

进入到oracle用户中

cd – oracle

切换到ogg的安装目录中

/home/oracle/oggapp/dirprm

查看源端的ogg机器MANAGER、DPE_TEST、EXT_TEST服务是否已经启动。


如果显示为非RUNNING状态,可以执行以下语句进行启动

start mgrstart rep_teststart ext_test

查看目标端的MANAGER和REP_TEST服务是否已经启动


如果没启动,也是同理执行start进行启动。

start mgrstart rep_test

在oracle中创建需要同步的表

使用ogg用户进入到oracle中,这里创建test这张表。

SQL>create table test(  a  INT,  b VARCHAR2(10),  c  INT);

//插入一条记录,验证可以进行操作。

SQL>INSERT INTO test     (a,b,c)   VALUES    (2, '2',4);


在配置的Sequoiadb中创建需要同步的表,此表在oracle数据库中已经存在(也就是上面创建的test这张表)。其中cs为oracle的登录用户,cl为oracle用户中的表。


7.2 基本功能测试

1. insert测试

首先在oracle中将test表清空。

SQL> select * from test ;no rows selected

在Sequoiadb中检查ogg.test这个集合也没有记录存在。

> db.ogg.test.find()Return 0 row(s).Takes 0.014508s.

在oracle中插入一条记录,并且进行提交。

SQL> INSERT INTO test(a,b,c)VALUES(1, '01',3);1 row created.SQL> commit;Commit complete.

在Sequoiadb中进行查询已经提交成功。

> db.ogg.test.find(){  "_id": {    "$oid":"5a17c6dde4b0035abe90a3a0"  },  "a": 1,  "b": "01",  "c": 3}

Sequoiadb中显示记录和插入到oracle中的记录相同。

2. update测试

在oracle中将插入记录a字段由原来的1改为10,并进行提交。

SQL> update test set a=10where a= 1; 1 row updated.SQL> commit;Commit complete.在Sequoiadb中进行查询。> db.ogg.test.find(){  "_id": {    "$oid":"5a17c6dde4b0035abe90a3a0"  },  "a": 10,  "b": "01",  "c": 3}Return 1 row(s).

注意:

同步时,一定是commit提交后才进行同步的。

3. delete测试

在oracle中将test表中a字段为10的记录删除,并进行提交。

SQL> delete from test where a = 10;1 row deleted.SQL> commit;Commit complete.

在oracle中进行查询,显示已经不存在记录。

SQL> select * from test;  no rows selected

在Sequoiadb中进行查询,显示记录已经不存在,表示delete同步成功。

> db.ogg.test.find()Return 0 row(s).Takes 0.002469s.


八、 总结

      相比较oracle 11g的安装,Sequoiadb数据库的安装是比较容易的,部署集群也仅仅需要几步即可,通过直接使用ogg将oracle和Sequoiadb进行数据迁移,使得同步过程大大的简化,提高了同步的效率。使得oracle数据迁移到nosql数据库得以在生产中广泛使用。