zoukankan      html  css  js  c++  java
  • Ogg

    说明:这篇文章将介绍如何配置oracle到mysql的ogg同步

    源端:ip-192.168.56.11 数据库类型-oracle 11.2.0.4
    目标端:ip-192.168.56.71 数据库类型-mysql 5.7.25

    1. 解压并准备目录

    (源端)
    su - oracle
    mkdir -p /home/oracle/ogg1/
    tar -xvf fbo_ggs_Linux_x64_ora11g_64bit.tar -C /home/oracle/ogg1

    (目标端)
    su - mysql
    mkdir -p /home/mysql/ogg2/
    tar -xvf ggs_Linux_x64_MySQL_64bit.tar -C /home/mysql/ogg2

    创建socket软链接,mysql ogg默认使用/tmp/mysql.sock
    查看mysql socket的位置
    (root@localhost)[(none)]> show variables like 'socket';
    +---------------+-----------------------------+
    | Variable_name | Value |
    +---------------+-----------------------------+
    | socket | /opt/mydata/data/mysql.sock |
    +---------------+-----------------------------+

    ln -s /opt/mydata/data/mysql.sock /tmp/mysql.sock

    2. 创建目录,用户

    (源端)
    cd /home/oracle/ogg1
    ./ggsci
    GGSCI> create subdirs

    # 在sqlplus创建管理ogg需要的数据库用户ggs
    SQL> create user ggs identified by ggs;
    SQL> grant connect,resource,select any dictionary,select any table,alter any table,flashback any table to ggs;
    SQL> grant insert any table,update any table,delete any table to ggs;
    SQL> grant execute on dbms_flashback to ggs;
    SQL> grant execute on utl_file to ggs;

    # 授予用户查看数据字典的权力
    # 同步的表在哪个用户下,哪个用户就要拥有查看数据字典的权力,源端使用tom做测试
    SQL> create user tom identified by tom;
    SQL> grant connect,resource,select any dictionary to tom;

    # 打开追加日志数据模式
    SQL> alter database add supplemental log data;
    SQL> select supplemental_log_data_min from v$database; #须yes

    (目标端)
    cd /home/mysql/ogg2
    ./ggsci
    GGSCI> create subdirs

    # 在mysql创建管理ogg需要的数据库用户ggt
    (root@localhost)[(none)]> create user ggt@'%' identified by 'ggt';
    (root@localhost)[(none)]> grant all on *.* to ggt@'%';
    (root@localhost)[(none)]> flush privileges;

    3. 准备测试用的表

    (源端)
    # ogg的表必须有主键
    SQL> create table tom.test1(id number primary key, name varchar2(30), ctime date);

    (目标端)
    (root@localhost)[(none)]> create database hello;
    (root@localhost)[(none)]> use hello;
    (root@localhost)[hello]> create table test2(id int primary key, name varchar(30), ctime datetime);

    4. 配置define文件,异构的ogg需要这步

    (源端)
    GGSCI> edit params oracle_to_mysql
    ------------------------------------
    defsfile dirdef/oracle_to_mysql.prm
    userid ggs,password ggs
    table tom.test1;

    新开一个窗口
    [root@orasingle ~]# su - oracle
    [oracle@orasingle ~]$ cd ogg1
    [oracle@orasingle ogg1]$ ./defgen paramfile dirprm/oracle_to_mysql.prm
    [oracle@orasingle ogg1]$ scp dirdef/oracle_to_mysql.prm mysql@192.168.56.71:/home/mysql/ogg2/dirdef

    5. 添加需要同步的表

    (源端)
    # 这里是添加表的附加日志
    GGSCI> dblogin userid ggs, password ggs
    GGSCI> add trandata tom.test1
    GGSCI> info trandata tom.test1

    6. 添加checkpoint表

    (目标端)
    # 续传的功能
    GGSCI> dblogin sourcedb hello, userid ggt, password ggt
    GGSCI> edit params ./GLOBALS
    #或使用vi编辑参数文件,注意GLOBALS是在ogg的主目录下面,使用绝对路径或者./GLOBALS,不能使用edit params GlOBALS,否则会进到dirprm目录下面
    --------------------------------------------------------------------------
    checkpointtable hello.checkpoint

    GGSCI> view params ./GLOBALS #查看参数文件
    GGSCI> add checkpointtable hello.checkpoint #在数据库中创建检查点记录表
    GGSCI> info checkpointtable hello.checkpoint

    7. 配置管理进程的参数文件

    (源端)
    GGSCI> edit params mgr
    --------------------------------------------------------------------
    port 7788
    autorestart extract *,waitminutes 2,retries 5
    purgeoldextracts /home/oracle/ogg1/dirdat/*,usecheckpoints,minkeephours 1,frequencyminutes 30

    GGSCI> view params mgr

    (目标端)
    GGSCI> edit params mgr
    --------------------------------------------------------------------
    port 7788
    autorestart extract *,waitminutes 2,retries 5
    purgeoldextracts /home/mysql/ogg2/dirdat/*,usecheckpoints,minkeephours 1,frequencyminutes 30

    GGSCI> view params mgr
    # 参数解释autorestart-自动重启抽取进程,purgeoldextracts-定期清理trail文件

    8. 配置抽取进程

    (源端)
    8.1 编辑抽取参数文件
    GGSCI> edit params ext1
    -------------------------------------------------------------------------------------------
    extract ext1
    setenv(ORACLE_SID=orcl) #填源端的sid
    setenv(NLS_LANG=AMERICAN_AMERICA.ZHS16GBK) #填源端的字符集
    userid ggs,password ggs
    rmthost 192.168.56.11,mgrport 7788 #填源端的ip,抽取的文件放到哪个地方
    exttrail /home/oracle/ogg1/dirdat/et
    table tom.test1;

    8.2 添加抽取进程
    GGSCI> add extract ext1, tranlog, begin now

    8.3 添加抽取进程需要的文件
    GGSCI> add exttrail /home/oracle/ogg1/dirdat/et,extract ext1,megabytes 100 #设置trail文件最大100m,默认10m

    9. 配置投递进程

    (源端)
    9.1 编辑投递参数文件
    GGSCI> edit params pump1
    ------------------------------------------------------------------------
    extract pump1
    PASSTHRU #这是参数适用于源端和目标端表结构一致且没有过滤行
    RMTHOST 192.168.56.71, MGRPORT 7788 #目标端ip
    RMTTRAIL /home/mysql/ogg2/dirdat/p1 #目标端文件的目录
    TABLE tom.test1;

    9.2 添加投递进程
    GGSCI> add extract pump1,exttrailsource /home/oracle/ogg1/dirdat/et, begin now

    9.3 添加投递到远程的文件
    GGSCI> add rmttrail /home/mysql/ogg2/dirdat/p1, extract pump1,megabytes 100

    10. 配置复制进程

    (目标端)
    10.1 编辑复制参数文件
    GGSCI> edit params rep1
    -----------------------------------------------------------------
    replicat rep1
    sourcecharset ZHS16GBK #填源端的字符集
    targetdb hello, userid ggt, password ggt
    sourcedefs /home/mysql/ogg2/dirdef/oracle_to_mysql.prm
    discardfile /home/mysql/ogg2/dirdat/rep1.dsc,append
    MAP tom.test1, TARGET hello.test2;
    --------------------------------------------------------------------

    10.2 增加复制进程
    GGSCI> add replicat rep1,exttrail /home/mysql/ogg2/dirdat/p1
    #注意这一步可能提示下面错误
    ERROR: No checkpoint table specified for ADD REPLICAT.
    解决办法:退出重新登陆,再执行那步操作
    GGSCI> exit
    [mysql@mysqla ogg2]$ ./ggsci
    GGSCI> dblogin sourcedb hello, userid ggt, password ggt
    GGSCI> add replicat rep1,exttrail /home/mysql/ogg2/dirdat/p1

    11. 启动进程

    源端
    GGSCI> start mgr
    GGSCI> start ext1
    GGSCI> start pump1
    目标端
    GGSCI> start mgr
    GGSCI> start rep1

    在源端查看进程状态
    GGSCI> info all
    Program Status Group Lag at Chkpt Time Since Chkpt
    MANAGER RUNNING
    EXTRACT RUNNING EXT1 00:00:00 00:00:09
    EXTRACT RUNNING PUMP1 00:00:00 00:00:02

    在目标端查看进程状态
    GGSCI> info all
    Program Status Group Lag at Chkpt Time Since Chkpt
    MANAGER RUNNING
    REPLICAT RUNNING REP1 00:00:00 00:00:04

    12. 测试同步与否

    (源端)
    SQL> insert into test1 values(25,'小豹子加油',sysdate);
    SQL> commit;

    (目标端)
    (root@localhost)[hello]> select * from test2;
    +----+-----------------+---------------------+
    | id | name | ctime |
    +----+-----------------+---------------------+
    | 25 | 小豹子加油 | 2019-04-21 11:44:06 |
    +----+-----------------+---------------------+

    同步完成,中文显示也没有问题

    13. 记录报错的日志文件

    /home/oracle/ogg/ggserr.log

    14. 总结

    14.1从ogg到mysql有字段类型的变化,比如oracle中date类型就是“年月日 时分秒”类型,到了mysql中只有“年月日”,所以mysql中需要定义成datetime类型。还有mysql中字符类型是默认不区分大小写的,oracle中明确区分大小写,所以在同步时如果字符类型上面有唯一索引,还会报错。
    14.2异构的ogg比同构的ogg还需要define文件,定义表的结构。

  • 相关阅读:
    day15---作业
    day14---函数的参数
    day14作业
    day--13函数的基本使用
    day13--函数练习(作业)
    day12--文件处理
    day12--作业
    Python函数对象、函数嵌套和闭包函数
    每日作业以及周末作业
    Python名称空间与作用域
  • 原文地址:https://www.cnblogs.com/ddzj01/p/10745231.html
Copyright © 2011-2022 走看看