• OGG


    1 简介
      Oracle Golden Gate软件是一种基于日志的结构化数据复制备份软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。Oracle Golden Gate可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,从而在可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾、数据库升级和移植、双业务中心等多个场景下应用。同时,Oracle Golden Gate可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构
    
    2 GoldenGate安装
       2.1 GoldenGate的获取
      Oracle GoldenGate(下文简称ogg)软件可以通过ORACLE官方网站进行下载,根据ORACLE的版本及操作系统来下载对应版本的ogg,官方下载地址:http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html
        2.2 GoldenGate的安装
              ogg安装非常简单,但需在源数据库和目标数据库服务器上均安装ogg软件即可,具体请参考以下步骤:
              1) 将压缩包解压到系统目录/oracle/ogg (该路径可以根据需要自行选择)
              2)、 进入/oracle/ogg目录,运行./ggsci,进入ogg管理控制台
              3)、 在ogg控制台输入命令: create subdirs ,让ogg创建其需要用到的目录
              4)、 手工在ogg目录下创建discard文件夹,mkdir  discard
              5)、 配置操作系统环境变量(请确保环境变量配置了ORACLE_HOME和ORACLE_SID)(如果不配置环境变量的话,以下涉及的路径都需要用绝对路径)export LD_LIBRARY_PATH=/oradata/ogg:$ORACLE_HOME/lib:$LD_LIBRARY_PATH
              6)、 在ORACLE中创建ogg专属用户
            [oracle@local ~]$ sqlplus /nolog
            SQL> conn / as sysdba
            SQL> create user ogg identified by ogg;  (注:账号密码根据实际情况设置)
            SQL> grant connect,resource to ogg;
            SQL> grant unlimited tablespace to ogg;
            SQL> grant execute on utl_file to ogg;
               7)、 为新创建的ogg用户执行配置脚本
                在ogg的安装目录下登陆sqlplus,使用sys登陆sqlplus,然后执行如下配置
                 [oracle@local ~]$ sqlplus /nolog
                 SQL> conn / as sysdba
                 SQL> @marker_setup.sql
                 SQL> @ddl_setup.sql;
                 SQL> @role_setup.sql;
                 SQL> grant GGS_GGSUSER_ROLE to ogg;
                 SQL> @ddl_enable.sql;
                 进入ogg控制台,测试用户是否创建成功
                  GGSCI (local) 1> dblogin userid ogg
                  Password: ogg
                  Successfully logged into database.
                通过上述步骤,ogg就安装成功了。
    3 单项复制的配置
        为了能让ogg成功的将源数据库及目标数据库进行同步,下面还需要对ogg及oracle进行一系列配置(ogg支持多种复制方式,比如单项复制、双向复制等等,因实际需要,本文仅介绍单项复制相关配置)。
    首先说说ogg的一些概念:
        1)、 Manager:ogg所有服务必须依赖Manager,Manger如同ogg的总调度。
        2)、  Extract :ogg用来获取源数据库数据更新的,将变更的数据发送到目标数据库
        3)、 Replicat :ogg用来接收源数据库的更新,一旦源数据库Extract将数据发送过来后,Replicat会自动将更新脚本同步到目标数据库。
        3.1 源服务器配置
            1)、开启ORACLE归档模式,设置日志模式
                [oracle@local ~]$ sqlplus /nolog
                SQL> conn / as sysdba
                SQL> shutdown immediate;
                SQL> startup mount;
                SQL> alter database archivelog;
                SQL> alter database force logging;
                SQL> alter database add supplemental log data;
                SQL> alter database open;
            2)、 回收站功能会影响同步,需要关闭回收站
                   SQL>alter session set recyclebin=off;
                  SQL>alter system set recyclebin=off;(如果不成功可以使用alter system set recyclebin=off deferred;)
            3)、配置环境变量NLS_LANG(不配置中文同步会乱码)
                  首先在oracle中查询select userenv( 'language') from dual;
                  然后将查询的结果配置到linux环境变量中
                  如export NLS_LANG=” SIMPLIFIED CHINESE_CHINA.ZHS16GBK”
         4)、登陆ogg控制台,设置需要进行同步的oracle表
              GGSCI (local) 1> dblogin userid ogg
              GGSCI (local) 1> add trandata dbuser.*
         5)、配置ogg manager&启动manager(配置界面操作类似vi)
              GGSCI (local) 1> edit param mgr
               PORT 7809
              GGSCI (local) 1> info all(查看当前mgr状态)
              GGSCI (local) 1> start manager(启动manager,启动完后可以用info all再次查看状态)
         6)、 添加一个ogg extract进程,用于抽取源服务器数据
              GGSCI (local) 1> add extract ext4,tranlog,begin now (增加一个抽取进程ext4,ext4名                
               字可以根据需要修改)
              GGSCI (local) 1> add exttrail D: appAdministratorproduct11.2.0ogg11dirdatwf,extract ext4 (将ext4抽取的源数据变更数据写到该文件夹,没有设置系统环境变量的用绝对地址)
             GGSCI (local) 1> add rmttrail c:appAdministratorproduct11.2.0gg11dirdatwf,extract ext4(传递的路径)
             GGSCI (local) 1> edit params ext4 (修改ext4的配置参数,txt文档)
               extract ext4
               setenv (ORACLE_SID=REGULATORY)
               setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK)
               userid ogg,password oggPssword01
               rmthost 162.16.162.24,mgrport 7809 
               rmttrail C:appAdministratorproduct11.2.0gg11dirdatwf
               ddl include mapped all objname ihms2012syn_login.*;
               table ihms2012syn_login.*;配置完成后可以通过info all查看到新添加的extract的状态
         7)、启动ogg extract命令
               GGSCI (local) 1> start extract ext4 (等目标服务器ogg配置成功后再启动ext)
    
        3.2 目标服务器配置
            1)、登陆ogg控制台
                 GGSCI (local) 1> dblogin userid ogg
            2)、配置ogg manager&启动manager(配置界面操作类似vi)
                GGSCI (local) 1> edit param mgr
                PORT 7809
                DYNAMICPORTLIST 7840-7850  --远程队列端口范围
                GGSCI (local) 1> info all(查看当前mgr状态)
            3)、 添加一个ogg replicat进程,用于更新目标服务器数据
                GGSCI (local) 1> edit params ./GLOBAL
                GSSCHEMA ogg
                CHECKPOINTTABLE ogg.checkpoint
                GGSCI (local) 2> dblogin userid ogg
                      Password: ogg
                Successfully logged into database.
                GGSCI (local) 3> add checkpointtable ogg.checkpoint
                Successfully created checkpoint table ogg.CHECKPOINT.
                GGSCI (local) 4> ADD replicat rep2 EXTTRAIL /hom/wangfan/ggs/dirdat/wf,                 checkpointtable ogg.checkpoint(没有设置系统变量的就用绝对地址)
                GGSCI (local) 5> edit param rep2
               --Replicat group --(replicat实例)
               replicat rep2
               setenv (ORACLE_SID=jjzlfbackup)
               setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK)
               --source and target definitions
               ASSUMETARGETDEFS
               --target database login --
               userid ogg, password ogg
               --file for dicarded transaction --
               discardfile /oracle/ogg/discard/rep2_discard.txt, append, megabytes 10
               --ddl support DDL
               DDL INCLUDE  MAPPED ALL objname dbuser.*;
               DDLERROR DEFAULT IGNORE RETRYOP
              --Specify table mapping ---
              map dbuser.*, target dbuser.*;
              配置完成后可以通过info all查看到新添加的extract的状态
           4)、启动ogg manager & replicat命令
             GGSCI (local) 1> start manager
             GGSCI (local) 1> start replicat rep2
           最后参考源服务器配置,启动ext4
    
    4 维护相关
          4.1 OGG常用命令
           启动manager:start manager
           启动extract:start extract extn
           启动replicat:start replicat repn
           停止manager:stop manager
           停止 extract:stop extract extn
           停止replicat:stop replicat repn
           删除extract:delete extract extn
           删除replicat:delete extract repn
           查看ogg状态:info all
           修改manager参数:edit params mgr
           修改extract参数:edit params extn
           修改replicat参数:edit params repn
           修改全局参数:edit params ./GLOBAL
           更新抽取
         4.2 OGG日志路径
            $OGG_HOME/ggserr.log
         4.3 OGG开机自启
               操作系统设置(linux):
            1)、用oracle用户建立/oracle/ogg/autostart/info.txt,文件内容如下:
                   sh dat
                   start mgr
            2)、chmod x info.txt
            3)、用oracle用户建立/oracle/ogg/autostart/startmgr.sh,文件内如下:
              /oracle/ogg/ggsci paramfile /oracle/ogg/autostart/info.txt >> /oracle/ogg/autostart/log.txt
            4)、chmod x startmgr.sh
            5)、用root用户编辑 /etc/rc.local ,添加如下信息:
                su - oracle -c "/oracle/ogg/autostart/startmgr.sh"
    
    OGG各组参数说明:
    源mgr:
    MANAGER进程参数配置说明:
    PORT:指定服务监听端口;这里以7839为例,默认端口为7809
    DYNAMICPORTLIST:动态端口:可以制定最大256个可用端口的动态列表,当指定的端口不可用时,管理进程将会从列表中选择一个可用的端口,源端和目标段的Collector、Replicat、GGSCI进程通信也会使用这些端口;
    COMMENT:注释行,也可以用--来代替;
    AUTOSTART:指定在管理进程启动时自动启动哪些进程;
    AUTORESTART:自动重启参数设置:本处设置表示每3分钟尝试重新启动所有EXTRACT进程,共尝试5次;
    PURGEOLDEXTRACTS:定期清理trail文件设置:本处设置表示对于超过3天的trail文件进行删除。
    LAGREPORT、LAGINFO、LAGCRITICAL:
    定义数据延迟的预警机制:本处设置表示MGR进程每隔1小时检查EXTRACT的延迟情况,如果超过了30分钟就把延迟作为信息记录到错误日志中,如果延迟超过了45分钟,则把它作为警告写到错误日志中。
    
    EXTRACT组:
    EXTRACT进程参数配置说明:
    SETENV:配置系统环境变量
    USERID/ PASSWORD:指定OGG连接数据库的用户名和密码,这里使用3.4部分中创建的数据库用户OGG;
    COMMENT:注释行,也可以用--来代替;
    TABLE:定义需复制的表,后面需以;结尾
    TABLEEXCLUDE:定义需要排除的表,如果在TABLE参数中使用了通配符,可以使用该参数指定排除掉得表。
    GETUPDATEAFTERS|IGNOREUPDATEAFTERS:
    是否在队列中写入后影像,缺省复制
    GETUPDATEBEFORES| IGNOREUPDATEBEFORES:
    是否在队列中写入前影像,缺省不复制
    GETUPDATES|IGNOREUPDATES:
    是否复制UPDATE操作,缺省复制
    GETDELETES|IGNOREDELETES:
    是否复制DELETE操作,缺省复制
    GETINSERTS|IGNOREINSERTS:
    是否复制INSERT操作,缺省复制
    GETTRUNCATES|IGNORETRUNDATES:
    是否复制TRUNCATE操作,缺省不复制;
    RMTHOST:指定目标系统及其GoldengateManager进程的端口号,还用于定义是否使用压缩进行传输,本例中的compress为压缩传输;
    RMTTRAIL:指定写入到目标断的哪个队列;
    EXTTRAIL:指定写入到本地的哪个队列;
    SQLEXEC:在extract进程运行时首先运行一个SQL语句;
    PASSTHRU:禁止extract进程与数据库交互,适用于Data Pump传输进程;
    REPORT:定义自动定时报告;
    STATOPTIONS:定义每次使用stat时统计数字是否需要重置;
    REPORTCOUNT:报告已经处理的记录条数统计数字;
    TLTRACE:打开对于数据库日志的跟踪日志;
    DISCARDFILE:定义discardfile文件位置,如果处理中油记录出错会写入到此文件中;
    DBOPTIONS:指定对于某种特定数据库所需要的特殊参数;
    TRANLOGOPTIONS:指定在解析数据库日志时所需要的特殊参数,例如:对于裸设备,可能需要加入以下参数 rawdeviceoggset 0
    WARNLONGTRANS:指定对于超过一定时间的长交易可以在gsserr.log里面写入警告信息,本处配置为每隔3分钟检查一次场交易,对于超过2小时的进行警告;
    
    配置复制进程
    REPLICAT进程参数配置说明:
    ASSUMETARGETDEFS:假定两端数据结构一致使用此参数;
    SOURCEDEFS:假定两端数据结构不一致,使用此参数指定源端的数据结构定义文件,该文件需要由GlodenGate工具产生。
    MAP:用于指定源端与目标端表的映射关系;
    MAPEXCLUDE:用于使用在MAP中使用*匹配时排除掉指定的表;
    REPERROR:定义出错以后进程的响应,一般可以定义为两种:
    ABEND,即一旦出现错误即停止复制,此为缺省配置;
    DISCARD,出现错误后继续复制,只是把错误的数据放到discard文件中。
    DISCARDFILE:定义discardfile文件位置,如果处理中油记录出错会写入到此文件中;
    SQLEXEC:在进程运行时首先运行一个SQL语句;
    GROUPTRANSOPS:将小交易合并成一个大的交易进行提交,减少提交次数,降低系统IO消耗。
    MAXTRANSOPS:将大交易拆分,每XX条记录提交一次。
    TABLEEXCLUDE <schema>.<materialized view>
    
    OGG设置:
    在ogg中主进程是manager进程,使用startmgr启动。可以在mgr进程中添加一些参数用来在启动mgr进程的同时启动extract和replicat进程。
         1、以下是extract端的mgr参数配置
      GGSCI (gg01) 130> edit params mgr
      PORT 7809
      DYNAMICPORTLIST 7800-7909
      --启动mgr进程启动启动extract进程
      AUTOSTART EXTRACT *
      --extract异常终止时会自动启动,每5分钟尝试重新启动所有的extract进程,一共尝试3次,5分钟清零
      AUTORESTART EXTRACT *,RETRIES 3, WAITMINUTES 5, RESETMINUTES 10
     
        2、配置目标端replicat进程自启动,在mgr参数中添加如下
     GGSCI (gg02) 140> edit params mgr
     PORT 7809
     --动态端口,当指定端口不可用时,会从以下列表中选择一个可用端口
     DYNAMICPORTLIST 7800-7909
     --自动启动replicat进程
     AUTOSTART REPLICAT *
     --当replicat进程异常终止时会自动启动,每5分钟尝试重新启动所有的replicat进程,一共尝试5次
     AUTORESTART REPLICAT *, WAITMINUTES 2, RETRIES 5
     --mgr每隔1小时检查extract延时情况,超5分钟作为信息记录log中,超过7分钟作为警告记录log中
     LAGREPORTHOURS 1
     LAGINFOMINUTES 5
     LAGCRITICALMINUTES 7
     --删除10天前的trail文件
     PURGEOLDEXTRACTS /oracle/ogg/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 10
    
    
    OGG同步序列
    1.目标及源服务器均以sys登录sqlplus安装sequence.sql
    2.源:grant execute on ogg.updateSequence to ogg; grant execute on ogg.updateSequence to ihms2012syn_login;
    3目标:GRANT EXECUTE on ogg.replicateSequence TO ogg; GRANT EXECUTE on ogg.replicateSequence TO ihms2012syn_login;
    4.停止extract相关进程:edit param extractname;
      txt文档中加入sequence ihms2012syn_login.*;
    
    OGG抽取或复制出现错误
    1.停止mgr
    2.停止extract、replicat进程,删除目的端dirdat所有文件。
    3.删除对应extract、replicat进程、删除检查点。
    4.重建检查点、重建进程。
    5启动replicat、然后启动extract
    
             
             情况一:如果重新设置抓取文件和复制文件的话会丢失a_15归档数据。
                     停止进程 replicat 、extract
                     源 alter extract  exihms, extseqno 3, extrba 0
                        extseqno 3就是生成的文件名,extrba 数字 表示日志文件中的第几行开始读取
                        alter  extract  exihms ,extseqno 3, extrba 0的意思就是新生成一个wf000003文件。
                        alter extract exihms,tranlog,begin 2013-12-26 15:00
                         从某一时刻抽取归档日志。(这个设置很重要)
                     目标 alter rep2, extseqno 3,extrba 0
                        从wf000003文件的第一行开始读取
              
              情况二:通过ogg文件夹中的logdump进行日志分析,然后使用alter rep2,  extseqno  3,extrba  0 精确的跳过错误行。
            情况三:缺什么补什么,本例中只要在目标数据库建立一个同名的可更新的物化视图。重启replicat即可。
    
    
    OGG配置实验
    2013-12-27:1.说明源与目标服务器均要求配置完成并启动mgr进程
                2.配置源extract、目标replicat进程后先不启动(replicat也可imp之后配置)
                3.源数据库停机exp,exp导出之后开启extract进程,源服务器可开始正常工作。extract会自动向目标服务器的指定dirdat文件夹中推送                  同步文件(此文件夹最好为空,有利用设定开始节点)
                4.目标机imp
                5.imp结束后alter repname,extseqno 0,extrba 0设置replicat从第一个文件的第一行开始读取
                6.开启replicat
                7.此方案减少源服务器的停机时间。
    
    OGG出错 ogg-01168
    数据同步出问题的表没有主键,客户执行insert的时候没有问题,在执行update的时候报了上面的错误。以上的报错涉及三个参数,KEYCOLS,ALLOWNOOPUPDATES,APPLYNOOPUPDATES。下面我们分别讨论这3个参数:
    
            1)KEYCOLS
            KEYCOLS关键字用于对没有主键的表,指定能够唯一标识数据的字段,这样Oracle GoldenGate同样可以完成数据的同步(同步UPDATE操作)。
            将目标数据库的replicat配置修改为:
    MAP CCENSE.ST_CARDOPERATORSTATTMP, TARGET CCENSE.ST_CARDOPERATORSTATTMP, KEYCOLS(cardsfid)
            重启目标数据库的replicat进程即可完成数据的同步,但需要注意的是,使用这种方式必须把所有的表列出来,不能指定为<username>.*。
    
            2)ALLOWNOOPUPDATES
            
            官方文档解释如下:
    ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES
    Valid for Replicat
    Use ALLOWNOOPUPDATES and NOALLOWNOOPUPDATES to control how Replicat responds to a “noop”
    operation. A no-op operation is one in which there is no effect on the target table. The
    following are some examples of how this can occur.
    ● The source table has a column that does not exist in the target table, or has a column
    that was excluded from replication (with a COLSEXCEPT clause). In either case, if that
    source column is updated, there will be no target column name to use in the SET clause
    within the Replicat SQL statement.
    ● An update is made that sets a column to the same value as the current one. The
    database does not log the new value, because it did not really change. However, Oracle
    GoldenGate extracts the operation as a change record because the primary key was
    logged — but there is no column value for the SET clause in the Replicat SQL statement.
    By default (NOALLOWNOOPUPDATES), Replicat abends with an error because these types of
    operations do not update the database. With ALLOWNOOPUPDATES, Replicat ignores the
    operation instead of abending. The statistics reported by Replicat will show that an update
    was made, but the database will not be updated.
    You can use the internal parameter APPLYNOOPUPDATES to force the update to be applied.
    APPLYNOOPUPDATES overrides ALLOWNOOPUPDATES. If both are specified then updates with
    only key columns will be applied. By default, Oracle GoldenGate will abend with the
    following message if it only has source key columns but there is no key defined for the target table.
    
    2011-01-25 02:28:42 GGS ERROR 160 Encountered an update for target
    table TELLER, which has no unique key defined. KEYCOLS can be used to
    define a key. Use ALLOWNOOPUPDATES to process the update without applying
    it to the target database. Use APPLYNOOPUPDATES to force the update to
    be applied using all columns in both the SET and WHERE clause.
    
    Exceptions when error-handling is in place
    If ALLOWNOOPUPDATES is specified when the HANDLECOLLISIONS or INSERTMISSINGUPDATES
    parameters are being used, and if Oracle GoldenGate has all of the target key values, then
    Oracle GoldenGate will not ignore the update, but instead will apply it using all key
    columns in the SET clause and the WHERE clause (invoking APPLYNOOPUPDATES behavior). This
    is necessary so Oracle GoldenGate can detect if the row being updated is missing. If it is,
    then Oracle GoldenGate turns the update into an insert.
    Default NOALLOWNOOPUPDATES (only applies if the table does not have a key)
    Syntax ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES 
    
            该参数的含义就是在同步到目标数据库的时候忽略出现的NO-OP操作,NO-OP操作包括目标数据库没有主数据库的字段(两边数据库字段不同),还有一种情况是执行UPDATE语句修改的数据和原有数据一样,没有发生变化。以上两种情况叫做NO-OP操作,遭遇NO-OP操作gg会被终止。
    
             3)APPLYNOOPUPDATES 
            该参数的含义就是不忽略出现的NO-OP操作,而是在目标数据库强制执行UPDATE修改操作,且只更新键值数据(主键或KEYCOLS指定的键值),如果表没有主键,也没有使用KEYCOLS关键字指定字段,那么将更新表数据的所有字段,如果没有相应记录,将INSERT新插入一条。
            官方文档解释如下:
    
    APPLYNOOPUPDATES | NOAPPLYNOOPUPDATES
    Valid for Replicat
    Use APPLYNOOPUPDATES to force a “no-op” update to be applied using all columns in both the
    SET and WHERE clauses. See ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES for a description of
    “no-op.”
    APPLYNOOPUPDATES uses whatever data is in the trail. If there is a primary key update
    record, it uses the before columns from the source. If there is a regular (non-key) update,
    it assumes that the after value is the same as the before value (otherwise it would be a
    primary key update). The preceding assumes source and target keys are identical. If they
    are not, you must use a KEYCOLS clause in the TABLE statement on the source.
    Default NOAPPLYNOOPUPDATES
    Syntax APPLYNOPUPDATES | NOAPPLYNOPUPDATES
    
            请注意,我们在讨论NO-OP操作的时候,NO-OP操作并不包含UPDATE没有主键的表,所以我们遇到的这个问题和ALLOWNOOPUPDATES和APPLYNOOPUPDATES这两个参数没有关系。通过实践证明,在replicat配置文件中加入这两个参数(或只加入ALLOWNOOPUPDATE参数),在更新没有主键,也没有指定KEYCOLS字段的表的时候同样会报错。对没有主键,但加上了KEYCOLS字段后的表执行UPDATE操作成功同步了数据。
    
            如果没有在源数据库启用记录表的supplement log,同样会收到以上的报错,原因是在于没有记录没有主键表的supplement log数据,并将其传递到目标数据库,执行以下操作可以启用记录表的supplement log:
    cd $GGHOME
    ./ggsci
    dblogin userid <username>,password <password>
    add trandata <username>.<tablename>
             完成以上操作之后,可以解决由此问题导致的update不能同步。
    
    
    ora-01403  no data found的处理
    此错误可能为源端与目标端表结构不同或数据不同而造成。
    处理过程:停止源端与目标端进程,
    源端:
    从日志表中删除问题对象名称
    Delete trandata 用户名.对象名
    删除此表,重新新建此表,恢复数据。
    添加至日志中。
    Add trandata 用户名.对象名
    
    目标端:
    从日志表中删除问题对象名称
    Delete trandata 用户名.对象名
    删除此表,重新新建此表,恢复数据。
    添加至日志中。
    Add trandata 用户名.对象名
    
    开启源端进程。
    开启目标端进程。
    
    一次恢复流程
    源库和目标库的expdp、impdp
    1、源库select current_scn from v$database  确定scn。
    2、修改scn号为上面当前值,从源库导出。
    expdp directory=EXPDIR FLASHBACK_SCN= 9015228145167 schemas=tjrealms2014_login dumpfile=bdc.dmp
    3、目标库导入数据impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login
    4、生成expdp、impdp的sql:create directory dump_dir as 'e:appexpdp';select * from dba_directories;
    5、impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login
    6、start repHp,aftercsn 9015228145167

    ————————————————————————————————————————————————————————————————————————————————————————————

    ==================================================================================================================================================================

    1 简介

      Oracle Golden Gate软件是一种基于日志的结构化数据复制备份软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。Oracle Golden Gate可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,从而在可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾、数据库升级和移植、双业务中心等多个场景下应用。同时,Oracle Golden Gate可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构

    2 GoldenGate安装

       2.1 GoldenGate的获取

      Oracle GoldenGate(下文简称ogg)软件可以通过ORACLE官方网站进行下载,根据ORACLE的版本及操作系统来下载对应版本的ogg,官方下载地址:http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html

        2.2 GoldenGate的安装

              ogg安装非常简单,但需在源数据库和目标数据库服务器上均安装ogg软件即可,具体请参考以下步骤:

              1) 将压缩包解压到系统目录/oracle/ogg (该路径可以根据需要自行选择)

              2)、 进入/oracle/ogg目录,运行./ggsci,进入ogg管理控制台

              3)、 在ogg控制台输入命令: create subdirs ,让ogg创建其需要用到的目录

              4)、 手工在ogg目录下创建discard文件夹,mkdir  discard

              5)、 配置操作系统环境变量(请确保环境变量配置了ORACLE_HOME和ORACLE_SID)(如果不配置环境变量的话,以下涉及的路径都需要用绝对路径)export LD_LIBRARY_PATH=/oradata/ogg:$ORACLE_HOME/lib:$LD_LIBRARY_PATH

              6)、 在ORACLE中创建ogg专属用户

            [oracle@local ~]$ sqlplus /nolog

            SQL> conn / as sysdba

            SQL> create user ogg identified by ogg;  (注:账号密码根据实际情况设置)

            SQL> grant connect,resource to ogg;

            SQL> grant unlimited tablespace to ogg;

            SQL> grant execute on utl_file to ogg;

               7)、 为新创建的ogg用户执行配置脚本

                在ogg的安装目录下登陆sqlplus,使用sys登陆sqlplus,然后执行如下配置

                 [oracle@local ~]$ sqlplus /nolog

                 SQL> conn / as sysdba

                 SQL> @marker_setup.sql

                 SQL> @ddl_setup.sql;

                 SQL> @role_setup.sql;

                 SQL> grant GGS_GGSUSER_ROLE to ogg;

                 SQL> @ddl_enable.sql;

                 进入ogg控制台,测试用户是否创建成功

                  GGSCI (local) 1> dblogin userid ogg

                  Password: ogg

                  Successfully logged into database.

                通过上述步骤,ogg就安装成功了。

    3 单项复制的配置

        为了能让ogg成功的将源数据库及目标数据库进行同步,下面还需要对ogg及oracle进行一系列配置(ogg支持多种复制方式,比如单项复制、双向复制等等,因实际需要,本文仅介绍单项复制相关配置)。

    首先说说ogg的一些概念:

        1)、 Manager:ogg所有服务必须依赖Manager,Manger如同ogg的总调度。

        2)、  Extract :ogg用来获取源数据库数据更新的,将变更的数据发送到目标数据库

        3)、 Replicat :ogg用来接收源数据库的更新,一旦源数据库Extract将数据发送过来后,Replicat会自动将更新脚本同步到目标数据库。

        3.1 源服务器配置

            1)、开启ORACLE归档模式,设置日志模式

                [oracle@local ~]$ sqlplus /nolog

                SQL> conn / as sysdba

                SQL> shutdown immediate;

                SQL> startup mount;

                SQL> alter database archivelog;

                SQL> alter database force logging;

                SQL> alter database add supplemental log data;

                SQL> alter database open;

            2)、 回收站功能会影响同步,需要关闭回收站

                   SQL>alter session set recyclebin=off;

                  SQL>alter system set recyclebin=off;(如果不成功可以使用alter system set recyclebin=off deferred;)

            3)、配置环境变量NLS_LANG(不配置中文同步会乱码)

                  首先在oracle中查询select userenv( 'language') from dual;

                  然后将查询的结果配置到linux环境变量中

                  如export NLS_LANG=” SIMPLIFIED CHINESE_CHINA.ZHS16GBK”

         4)、登陆ogg控制台,设置需要进行同步的oracle表

              GGSCI (local) 1> dblogin userid ogg

              GGSCI (local) 1> add trandata dbuser.*

         5)、配置ogg manager&启动manager(配置界面操作类似vi)

              GGSCI (local) 1> edit param mgr

               PORT 7809

              GGSCI (local) 1> info all(查看当前mgr状态)

              GGSCI (local) 1> start manager(启动manager,启动完后可以用info all再次查看状态)

         6)、 添加一个ogg extract进程,用于抽取源服务器数据

              GGSCI (local) 1> add extract ext4,tranlog,begin now (增加一个抽取进程ext4,ext4名                

               字可以根据需要修改)

              GGSCI (local) 1> add exttrail D: appAdministratorproduct11.2.0ogg11dirdatwf,extract ext4 (将ext4抽取的源数据变更数据写到该文件夹,没有设置系统环境变量的用绝对地址)

             GGSCI (local) 1> add rmttrail c:appAdministratorproduct11.2.0gg11dirdatwf,extract ext4(传递的路径)

             GGSCI (local) 1> edit params ext4 (修改ext4的配置参数,txt文档)

               extract ext4

               setenv (ORACLE_SID=REGULATORY)

               setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK)

               userid ogg,password oggPssword01

               rmthost 162.16.162.24,mgrport 7809 

               rmttrail C:appAdministratorproduct11.2.0gg11dirdatwf

               ddl include mapped all objname ihms2012syn_login.*;

               table ihms2012syn_login.*;配置完成后可以通过info all查看到新添加的extract的状态

         7)、启动ogg extract命令

               GGSCI (local) 1> start extract ext4 (等目标服务器ogg配置成功后再启动ext)

        3.2 目标服务器配置

            1)、登陆ogg控制台

                 GGSCI (local) 1> dblogin userid ogg

            2)、配置ogg manager&启动manager(配置界面操作类似vi)

                GGSCI (local) 1> edit param mgr

                PORT 7809

                DYNAMICPORTLIST 7840-7850  --远程队列端口范围

                GGSCI (local) 1> info all(查看当前mgr状态)

            3)、 添加一个ogg replicat进程,用于更新目标服务器数据

                GGSCI (local) 1> edit params ./GLOBAL

                GSSCHEMA ogg

                CHECKPOINTTABLE ogg.checkpoint

                GGSCI (local) 2> dblogin userid ogg

                      Password: ogg

                Successfully logged into database.

                GGSCI (local) 3> add checkpointtable ogg.checkpoint

                Successfully created checkpoint table ogg.CHECKPOINT.

                GGSCI (local) 4> ADD replicat rep2 EXTTRAIL /hom/wangfan/ggs/dirdat/wf,                 checkpointtable ogg.checkpoint(没有设置系统变量的就用绝对地址)

                GGSCI (local) 5> edit param rep2

               --Replicat group --(replicat实例)

               replicat rep2

               setenv (ORACLE_SID=jjzlfbackup)

               setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK)

               --source and target definitions

               ASSUMETARGETDEFS

               --target database login --

               userid ogg, password ogg

               --file for dicarded transaction --

               discardfile /oracle/ogg/discard/rep2_discard.txt, append, megabytes 10

               --ddl support DDL

               DDL INCLUDE  MAPPED ALL objname dbuser.*;

               DDLERROR DEFAULT IGNORE RETRYOP

              --Specify table mapping ---

              map dbuser.*, target dbuser.*;

              配置完成后可以通过info all查看到新添加的extract的状态

           4)、启动ogg manager & replicat命令

             GGSCI (local) 1> start manager

             GGSCI (local) 1> start replicat rep2

           最后参考源服务器配置,启动ext4

    4 维护相关

          4.1 OGG常用命令

           启动manager:start manager

           启动extract:start extract extn

           启动replicat:start replicat repn

           停止manager:stop manager

           停止 extract:stop extract extn

           停止replicat:stop replicat repn

           删除extract:delete extract extn

           删除replicat:delete extract repn

           查看ogg状态:info all

           修改manager参数:edit params mgr

           修改extract参数:edit params extn

           修改replicat参数:edit params repn

           修改全局参数:edit params ./GLOBAL

           更新抽取

         4.2 OGG日志路径

            $OGG_HOME/ggserr.log

         4.3 OGG开机自启

               操作系统设置(linux):

            1)、用oracle用户建立/oracle/ogg/autostart/info.txt,文件内容如下:

                   sh dat

                   start mgr

            2)、chmod x info.txt

            3)、用oracle用户建立/oracle/ogg/autostart/startmgr.sh,文件内如下:

              /oracle/ogg/ggsci paramfile /oracle/ogg/autostart/info.txt >> /oracle/ogg/autostart/log.txt

            4)、chmod x startmgr.sh

            5)、用root用户编辑 /etc/rc.local ,添加如下信息:

                su - oracle -c "/oracle/ogg/autostart/startmgr.sh"

    OGG各组参数说明:

    源mgr:

    MANAGER进程参数配置说明:

    PORT:指定服务监听端口;这里以7839为例,默认端口为7809

    DYNAMICPORTLIST:动态端口:可以制定最大256个可用端口的动态列表,当指定的端口不可用时,管理进程将会从列表中选择一个可用的端口,源端和目标段的Collector、Replicat、GGSCI进程通信也会使用这些端口;

    COMMENT:注释行,也可以用--来代替;

    AUTOSTART:指定在管理进程启动时自动启动哪些进程;

    AUTORESTART:自动重启参数设置:本处设置表示每3分钟尝试重新启动所有EXTRACT进程,共尝试5次;

    PURGEOLDEXTRACTS:定期清理trail文件设置:本处设置表示对于超过3天的trail文件进行删除。

    LAGREPORT、LAGINFO、LAGCRITICAL:

    定义数据延迟的预警机制:本处设置表示MGR进程每隔1小时检查EXTRACT的延迟情况,如果超过了30分钟就把延迟作为信息记录到错误日志中,如果延迟超过了45分钟,则把它作为警告写到错误日志中。

    EXTRACT组:

    EXTRACT进程参数配置说明:

    SETENV:配置系统环境变量

    USERID/ PASSWORD:指定OGG连接数据库的用户名和密码,这里使用3.4部分中创建的数据库用户OGG;

    COMMENT:注释行,也可以用--来代替;

    TABLE:定义需复制的表,后面需以;结尾

    TABLEEXCLUDE:定义需要排除的表,如果在TABLE参数中使用了通配符,可以使用该参数指定排除掉得表。

    GETUPDATEAFTERS|IGNOREUPDATEAFTERS:

    是否在队列中写入后影像,缺省复制

    GETUPDATEBEFORES| IGNOREUPDATEBEFORES:

    是否在队列中写入前影像,缺省不复制

    GETUPDATES|IGNOREUPDATES:

    是否复制UPDATE操作,缺省复制

    GETDELETES|IGNOREDELETES:

    是否复制DELETE操作,缺省复制

    GETINSERTS|IGNOREINSERTS:

    是否复制INSERT操作,缺省复制

    GETTRUNCATES|IGNORETRUNDATES:

    是否复制TRUNCATE操作,缺省不复制;

    RMTHOST:指定目标系统及其GoldengateManager进程的端口号,还用于定义是否使用压缩进行传输,本例中的compress为压缩传输;

    RMTTRAIL:指定写入到目标断的哪个队列;

    EXTTRAIL:指定写入到本地的哪个队列;

    SQLEXEC:在extract进程运行时首先运行一个SQL语句;

    PASSTHRU:禁止extract进程与数据库交互,适用于Data Pump传输进程;

    REPORT:定义自动定时报告;

    STATOPTIONS:定义每次使用stat时统计数字是否需要重置;

    REPORTCOUNT:报告已经处理的记录条数统计数字;

    TLTRACE:打开对于数据库日志的跟踪日志;

    DISCARDFILE:定义discardfile文件位置,如果处理中油记录出错会写入到此文件中;

    DBOPTIONS:指定对于某种特定数据库所需要的特殊参数;

    TRANLOGOPTIONS:指定在解析数据库日志时所需要的特殊参数,例如:对于裸设备,可能需要加入以下参数 rawdeviceoggset 0

    WARNLONGTRANS:指定对于超过一定时间的长交易可以在gsserr.log里面写入警告信息,本处配置为每隔3分钟检查一次场交易,对于超过2小时的进行警告;

    配置复制进程

    REPLICAT进程参数配置说明:

    ASSUMETARGETDEFS:假定两端数据结构一致使用此参数;

    SOURCEDEFS:假定两端数据结构不一致,使用此参数指定源端的数据结构定义文件,该文件需要由GlodenGate工具产生。

    MAP:用于指定源端与目标端表的映射关系;

    MAPEXCLUDE:用于使用在MAP中使用*匹配时排除掉指定的表;

    REPERROR:定义出错以后进程的响应,一般可以定义为两种:

    ABEND,即一旦出现错误即停止复制,此为缺省配置;

    DISCARD,出现错误后继续复制,只是把错误的数据放到discard文件中。

    DISCARDFILE:定义discardfile文件位置,如果处理中油记录出错会写入到此文件中;

    SQLEXEC:在进程运行时首先运行一个SQL语句;

    GROUPTRANSOPS:将小交易合并成一个大的交易进行提交,减少提交次数,降低系统IO消耗。

    MAXTRANSOPS:将大交易拆分,每XX条记录提交一次。

    TABLEEXCLUDE <schema>.<materialized view>

    OGG设置:

    在ogg中主进程是manager进程,使用startmgr启动。可以在mgr进程中添加一些参数用来在启动mgr进程的同时启动extract和replicat进程。

         1、以下是extract端的mgr参数配置

      GGSCI (gg01) 130> edit params mgr

      PORT 7809

      DYNAMICPORTLIST 7800-7909

      --启动mgr进程启动启动extract进程

      AUTOSTART EXTRACT *

      --extract异常终止时会自动启动,每5分钟尝试重新启动所有的extract进程,一共尝试3次,5分钟清零

      AUTORESTART EXTRACT *,RETRIES 3, WAITMINUTES 5, RESETMINUTES 10

        2、配置目标端replicat进程自启动,在mgr参数中添加如下

     GGSCI (gg02) 140> edit params mgr

     PORT 7809

     --动态端口,当指定端口不可用时,会从以下列表中选择一个可用端口

     DYNAMICPORTLIST 7800-7909

     --自动启动replicat进程

     AUTOSTART REPLICAT *

     --当replicat进程异常终止时会自动启动,每5分钟尝试重新启动所有的replicat进程,一共尝试5次

     AUTORESTART REPLICAT *, WAITMINUTES 2, RETRIES 5

     --mgr每隔1小时检查extract延时情况,超5分钟作为信息记录log中,超过7分钟作为警告记录log中

     LAGREPORTHOURS 1

     LAGINFOMINUTES 5

     LAGCRITICALMINUTES 7

     --删除10天前的trail文件

     PURGEOLDEXTRACTS /oracle/ogg/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 10

    OGG同步序列

    1.目标及源服务器均以sys登录sqlplus安装sequence.sql

    2.源:grant execute on ogg.updateSequence to ogg; grant execute on ogg.updateSequence to ihms2012syn_login;

    3目标:GRANT EXECUTE on ogg.replicateSequence TO ogg; GRANT EXECUTE on ogg.replicateSequence TO ihms2012syn_login;

    4.停止extract相关进程:edit param extractname;

      txt文档中加入sequence ihms2012syn_login.*;

    OGG抽取或复制出现错误

    1.停止mgr

    2.停止extract、replicat进程,删除目的端dirdat所有文件。

    3.删除对应extract、replicat进程、删除检查点。

    4.重建检查点、重建进程。

    5启动replicat、然后启动extract

             

             情况一:如果重新设置抓取文件和复制文件的话会丢失a_15归档数据。

                     停止进程 replicat 、extract

                     源 alter extract  exihms, extseqno 3, extrba 0

                        extseqno 3就是生成的文件名,extrba 数字 表示日志文件中的第几行开始读取

                        alter  extract  exihms ,extseqno 3, extrba 0的意思就是新生成一个wf000003文件。

                        alter extract exihms,tranlog,begin 2013-12-26 15:00

                         从某一时刻抽取归档日志。(这个设置很重要)

                     目标 alter rep2, extseqno 3,extrba 0

                        从wf000003文件的第一行开始读取

              

              情况二:通过ogg文件夹中的logdump进行日志分析,然后使用alter rep2,  extseqno  3,extrba  0 精确的跳过错误行。

            情况三:缺什么补什么,本例中只要在目标数据库建立一个同名的可更新的物化视图。重启replicat即可。

    OGG配置实验

    2013-12-27:1.说明源与目标服务器均要求配置完成并启动mgr进程

                2.配置源extract、目标replicat进程后先不启动(replicat也可imp之后配置)

                3.源数据库停机exp,exp导出之后开启extract进程,源服务器可开始正常工作。extract会自动向目标服务器的指定dirdat文件夹中推送                  同步文件(此文件夹最好为空,有利用设定开始节点)

                4.目标机imp

                5.imp结束后alter repname,extseqno 0,extrba 0设置replicat从第一个文件的第一行开始读取

                6.开启replicat

                7.此方案减少源服务器的停机时间。

    OGG出错 ogg-01168

    数据同步出问题的表没有主键,客户执行insert的时候没有问题,在执行update的时候报了上面的错误。以上的报错涉及三个参数,KEYCOLS,ALLOWNOOPUPDATES,APPLYNOOPUPDATES。下面我们分别讨论这3个参数:

            1)KEYCOLS

            KEYCOLS关键字用于对没有主键的表,指定能够唯一标识数据的字段,这样Oracle GoldenGate同样可以完成数据的同步(同步UPDATE操作)。

            将目标数据库的replicat配置修改为:

    MAP CCENSE.ST_CARDOPERATORSTATTMP, TARGET CCENSE.ST_CARDOPERATORSTATTMP, KEYCOLS(cardsfid)

            重启目标数据库的replicat进程即可完成数据的同步,但需要注意的是,使用这种方式必须把所有的表列出来,不能指定为<username>.*。

            2)ALLOWNOOPUPDATES

            

            官方文档解释如下:

    ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES

    Valid for Replicat

    Use ALLOWNOOPUPDATES and NOALLOWNOOPUPDATES to control how Replicat responds to a “noop”

    operation. A no-op operation is one in which there is no effect on the target table. The

    following are some examples of how this can occur.

    ● The source table has a column that does not exist in the target table, or has a column

    that was excluded from replication (with a COLSEXCEPT clause). In either case, if that

    source column is updated, there will be no target column name to use in the SET clause

    within the Replicat SQL statement.

    ● An update is made that sets a column to the same value as the current one. The

    database does not log the new value, because it did not really change. However, Oracle

    GoldenGate extracts the operation as a change record because the primary key was

    logged — but there is no column value for the SET clause in the Replicat SQL statement.

    By default (NOALLOWNOOPUPDATES), Replicat abends with an error because these types of

    operations do not update the database. With ALLOWNOOPUPDATES, Replicat ignores the

    operation instead of abending. The statistics reported by Replicat will show that an update

    was made, but the database will not be updated.

    You can use the internal parameter APPLYNOOPUPDATES to force the update to be applied.

    APPLYNOOPUPDATES overrides ALLOWNOOPUPDATES. If both are specified then updates with

    only key columns will be applied. By default, Oracle GoldenGate will abend with the

    following message if it only has source key columns but there is no key defined for the target table.

    2011-01-25 02:28:42 GGS ERROR 160 Encountered an update for target

    table TELLER, which has no unique key defined. KEYCOLS can be used to

    define a key. Use ALLOWNOOPUPDATES to process the update without applying

    it to the target database. Use APPLYNOOPUPDATES to force the update to

    be applied using all columns in both the SET and WHERE clause.

    Exceptions when error-handling is in place

    If ALLOWNOOPUPDATES is specified when the HANDLECOLLISIONS or INSERTMISSINGUPDATES

    parameters are being used, and if Oracle GoldenGate has all of the target key values, then

    Oracle GoldenGate will not ignore the update, but instead will apply it using all key

    columns in the SET clause and the WHERE clause (invoking APPLYNOOPUPDATES behavior). This

    is necessary so Oracle GoldenGate can detect if the row being updated is missing. If it is,

    then Oracle GoldenGate turns the update into an insert.

    Default NOALLOWNOOPUPDATES (only applies if the table does not have a key)

    Syntax ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES 

            该参数的含义就是在同步到目标数据库的时候忽略出现的NO-OP操作,NO-OP操作包括目标数据库没有主数据库的字段(两边数据库字段不同),还有一种情况是执行UPDATE语句修改的数据和原有数据一样,没有发生变化。以上两种情况叫做NO-OP操作,遭遇NO-OP操作gg会被终止。

             3)APPLYNOOPUPDATES 

            该参数的含义就是不忽略出现的NO-OP操作,而是在目标数据库强制执行UPDATE修改操作,且只更新键值数据(主键或KEYCOLS指定的键值),如果表没有主键,也没有使用KEYCOLS关键字指定字段,那么将更新表数据的所有字段,如果没有相应记录,将INSERT新插入一条。

            官方文档解释如下:

    APPLYNOOPUPDATES | NOAPPLYNOOPUPDATES

    Valid for Replicat

    Use APPLYNOOPUPDATES to force a “no-op” update to be applied using all columns in both the

    SET and WHERE clauses. See ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES for a description of

    “no-op.”

    APPLYNOOPUPDATES uses whatever data is in the trail. If there is a primary key update

    record, it uses the before columns from the source. If there is a regular (non-key) update,

    it assumes that the after value is the same as the before value (otherwise it would be a

    primary key update). The preceding assumes source and target keys are identical. If they

    are not, you must use a KEYCOLS clause in the TABLE statement on the source.

    Default NOAPPLYNOOPUPDATES

    Syntax APPLYNOPUPDATES | NOAPPLYNOPUPDATES

            请注意,我们在讨论NO-OP操作的时候,NO-OP操作并不包含UPDATE没有主键的表,所以我们遇到的这个问题和ALLOWNOOPUPDATES和APPLYNOOPUPDATES这两个参数没有关系。通过实践证明,在replicat配置文件中加入这两个参数(或只加入ALLOWNOOPUPDATE参数),在更新没有主键,也没有指定KEYCOLS字段的表的时候同样会报错。对没有主键,但加上了KEYCOLS字段后的表执行UPDATE操作成功同步了数据。

            如果没有在源数据库启用记录表的supplement log,同样会收到以上的报错,原因是在于没有记录没有主键表的supplement log数据,并将其传递到目标数据库,执行以下操作可以启用记录表的supplement log:

    cd $GGHOME

    ./ggsci

    dblogin userid <username>,password <password>

    add trandata <username>.<tablename>

             完成以上操作之后,可以解决由此问题导致的update不能同步。

    ora-01403  no data found的处理

    此错误可能为源端与目标端表结构不同或数据不同而造成。

    处理过程:停止源端与目标端进程,

    源端:

    从日志表中删除问题对象名称

    Delete trandata 用户名.对象名

    删除此表,重新新建此表,恢复数据。

    添加至日志中。

    Add trandata 用户名.对象名

    目标端:

    从日志表中删除问题对象名称

    Delete trandata 用户名.对象名

    删除此表,重新新建此表,恢复数据。

    添加至日志中。

    Add trandata 用户名.对象名

    开启源端进程。

    开启目标端进程。

    一次恢复流程

    源库和目标库的expdp、impdp

    1、源库select current_scn from v$database  确定scn。

    2、修改scn号为上面当前值,从源库导出。

    expdp directory=EXPDIR FLASHBACK_SCN= 9015228145167 schemas=tjrealms2014_login dumpfile=bdc.dmp

    3、目标库导入数据impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login

    4、生成expdp、impdp的sql:create directory dump_dir as 'e:appexpdp';select * from dba_directories;

    5、impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login

    6、start repHp,aftercsn 9015228145167

    1 简介  Oracle Golden Gate软件是一种基于日志的结构化数据复制备份软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。Oracle Golden Gate可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,从而在可以在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中/分发、容灾、数据库升级和移植、双业务中心等多个场景下应用。同时,Oracle Golden Gate可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构
    2 GoldenGate安装   2.1 GoldenGate的获取  Oracle GoldenGate(下文简称ogg)软件可以通过ORACLE官方网站进行下载,根据ORACLE的版本及操作系统来下载对应版本的ogg,官方下载地址:http://www.oracle.com/technetwork/middleware/goldengate/downloads/index.html    2.2 GoldenGate的安装          ogg安装非常简单,但需在源数据库和目标数据库服务器上均安装ogg软件即可,具体请参考以下步骤:          1) 将压缩包解压到系统目录/oracle/ogg (该路径可以根据需要自行选择)          2)、 进入/oracle/ogg目录,运行./ggsci,进入ogg管理控制台          3)、 在ogg控制台输入命令: create subdirs ,让ogg创建其需要用到的目录          4)、 手工在ogg目录下创建discard文件夹,mkdir  discard          5)、 配置操作系统环境变量(请确保环境变量配置了ORACLE_HOME和ORACLE_SID)(如果不配置环境变量的话,以下涉及的路径都需要用绝对路径)export LD_LIBRARY_PATH=/oradata/ogg:$ORACLE_HOME/lib:$LD_LIBRARY_PATH          6)、 在ORACLE中创建ogg专属用户        [oracle@local ~]$ sqlplus /nolog        SQL> conn / as sysdba        SQL> create user ogg identified by ogg;  (注:账号密码根据实际情况设置)        SQL> grant connect,resource to ogg;        SQL> grant unlimited tablespace to ogg;        SQL> grant execute on utl_file to ogg;           7)、 为新创建的ogg用户执行配置脚本            在ogg的安装目录下登陆sqlplus,使用sys登陆sqlplus,然后执行如下配置             [oracle@local ~]$ sqlplus /nolog             SQL> conn / as sysdba             SQL> @marker_setup.sql             SQL> @ddl_setup.sql;             SQL> @role_setup.sql;             SQL> grant GGS_GGSUSER_ROLE to ogg;             SQL> @ddl_enable.sql;             进入ogg控制台,测试用户是否创建成功              GGSCI (local) 1> dblogin userid ogg              Password: ogg              Successfully logged into database.            通过上述步骤,ogg就安装成功了。3 单项复制的配置    为了能让ogg成功的将源数据库及目标数据库进行同步,下面还需要对ogg及oracle进行一系列配置(ogg支持多种复制方式,比如单项复制、双向复制等等,因实际需要,本文仅介绍单项复制相关配置)。首先说说ogg的一些概念:    1)、 Manager:ogg所有服务必须依赖Manager,Manger如同ogg的总调度。    2)、  Extract :ogg用来获取源数据库数据更新的,将变更的数据发送到目标数据库    3)、 Replicat :ogg用来接收源数据库的更新,一旦源数据库Extract将数据发送过来后,Replicat会自动将更新脚本同步到目标数据库。    3.1 源服务器配置        1)、开启ORACLE归档模式,设置日志模式            [oracle@local ~]$ sqlplus /nolog            SQL> conn / as sysdba            SQL> shutdown immediate;            SQL> startup mount;            SQL> alter database archivelog;            SQL> alter database force logging;            SQL> alter database add supplemental log data;            SQL> alter database open;        2)、 回收站功能会影响同步,需要关闭回收站               SQL>alter session set recyclebin=off;              SQL>alter system set recyclebin=off;(如果不成功可以使用alter system set recyclebin=off deferred;)        3)、配置环境变量NLS_LANG(不配置中文同步会乱码)              首先在oracle中查询select userenv( 'language') from dual;              然后将查询的结果配置到linux环境变量中              如export NLS_LANG=” SIMPLIFIED CHINESE_CHINA.ZHS16GBK”     4)、登陆ogg控制台,设置需要进行同步的oracle表          GGSCI (local) 1> dblogin userid ogg          GGSCI (local) 1> add trandata dbuser.*     5)、配置ogg manager&启动manager(配置界面操作类似vi)          GGSCI (local) 1> edit param mgr           PORT 7809          GGSCI (local) 1> info all(查看当前mgr状态)          GGSCI (local) 1> start manager(启动manager,启动完后可以用info all再次查看状态)     6)、 添加一个ogg extract进程,用于抽取源服务器数据          GGSCI (local) 1> add extract ext4,tranlog,begin now (增加一个抽取进程ext4,ext4名                           字可以根据需要修改)          GGSCI (local) 1> add exttrail D: appAdministratorproduct11.2.0ogg11dirdatwf,extract ext4 (将ext4抽取的源数据变更数据写到该文件夹,没有设置系统环境变量的用绝对地址)         GGSCI (local) 1> add rmttrail c:appAdministratorproduct11.2.0gg11dirdatwf,extract ext4(传递的路径)         GGSCI (local) 1> edit params ext4 (修改ext4的配置参数,txt文档)           extract ext4           setenv (ORACLE_SID=REGULATORY)           setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK)           userid ogg,password oggPssword01           rmthost 162.16.162.24,mgrport 7809            rmttrail C:appAdministratorproduct11.2.0gg11dirdatwf           ddl include mapped all objname ihms2012syn_login.*;           table ihms2012syn_login.*;配置完成后可以通过info all查看到新添加的extract的状态     7)、启动ogg extract命令           GGSCI (local) 1> start extract ext4 (等目标服务器ogg配置成功后再启动ext)
        3.2 目标服务器配置        1)、登陆ogg控制台             GGSCI (local) 1> dblogin userid ogg        2)、配置ogg manager&启动manager(配置界面操作类似vi)            GGSCI (local) 1> edit param mgr            PORT 7809            DYNAMICPORTLIST 7840-7850  --远程队列端口范围            GGSCI (local) 1> info all(查看当前mgr状态)        3)、 添加一个ogg replicat进程,用于更新目标服务器数据            GGSCI (local) 1> edit params ./GLOBAL            GSSCHEMA ogg            CHECKPOINTTABLE ogg.checkpoint            GGSCI (local) 2> dblogin userid ogg                  Password: ogg            Successfully logged into database.            GGSCI (local) 3> add checkpointtable ogg.checkpoint            Successfully created checkpoint table ogg.CHECKPOINT.            GGSCI (local) 4> ADD replicat rep2 EXTTRAIL /hom/wangfan/ggs/dirdat/wf,                 checkpointtable ogg.checkpoint(没有设置系统变量的就用绝对地址)            GGSCI (local) 5> edit param rep2           --Replicat group --(replicat实例)           replicat rep2           setenv (ORACLE_SID=jjzlfbackup)           setenv (NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK)           --source and target definitions           ASSUMETARGETDEFS           --target database login --           userid ogg, password ogg           --file for dicarded transaction --           discardfile /oracle/ogg/discard/rep2_discard.txt, append, megabytes 10           --ddl support DDL           DDL INCLUDE  MAPPED ALL objname dbuser.*;           DDLERROR DEFAULT IGNORE RETRYOP          --Specify table mapping ---          map dbuser.*, target dbuser.*;          配置完成后可以通过info all查看到新添加的extract的状态       4)、启动ogg manager & replicat命令         GGSCI (local) 1> start manager         GGSCI (local) 1> start replicat rep2       最后参考源服务器配置,启动ext4
    4 维护相关      4.1 OGG常用命令       启动manager:start manager       启动extract:start extract extn       启动replicat:start replicat repn       停止manager:stop manager       停止 extract:stop extract extn       停止replicat:stop replicat repn       删除extract:delete extract extn       删除replicat:delete extract repn       查看ogg状态:info all       修改manager参数:edit params mgr       修改extract参数:edit params extn       修改replicat参数:edit params repn       修改全局参数:edit params ./GLOBAL       更新抽取     4.2 OGG日志路径        $OGG_HOME/ggserr.log     4.3 OGG开机自启           操作系统设置(linux):        1)、用oracle用户建立/oracle/ogg/autostart/info.txt,文件内容如下:               sh dat               start mgr        2)、chmod x info.txt        3)、用oracle用户建立/oracle/ogg/autostart/startmgr.sh,文件内如下:          /oracle/ogg/ggsci paramfile /oracle/ogg/autostart/info.txt >> /oracle/ogg/autostart/log.txt        4)、chmod x startmgr.sh        5)、用root用户编辑 /etc/rc.local ,添加如下信息:            su - oracle -c "/oracle/ogg/autostart/startmgr.sh"
    OGG各组参数说明:源mgr:MANAGER进程参数配置说明:PORT:指定服务监听端口;这里以7839为例,默认端口为7809DYNAMICPORTLIST:动态端口:可以制定最大256个可用端口的动态列表,当指定的端口不可用时,管理进程将会从列表中选择一个可用的端口,源端和目标段的Collector、Replicat、GGSCI进程通信也会使用这些端口;COMMENT:注释行,也可以用--来代替;AUTOSTART:指定在管理进程启动时自动启动哪些进程;AUTORESTART:自动重启参数设置:本处设置表示每3分钟尝试重新启动所有EXTRACT进程,共尝试5次;PURGEOLDEXTRACTS:定期清理trail文件设置:本处设置表示对于超过3天的trail文件进行删除。LAGREPORT、LAGINFO、LAGCRITICAL:定义数据延迟的预警机制:本处设置表示MGR进程每隔1小时检查EXTRACT的延迟情况,如果超过了30分钟就把延迟作为信息记录到错误日志中,如果延迟超过了45分钟,则把它作为警告写到错误日志中。
    EXTRACT组:EXTRACT进程参数配置说明:SETENV:配置系统环境变量USERID/ PASSWORD:指定OGG连接数据库的用户名和密码,这里使用3.4部分中创建的数据库用户OGG;COMMENT:注释行,也可以用--来代替;TABLE:定义需复制的表,后面需以;结尾TABLEEXCLUDE:定义需要排除的表,如果在TABLE参数中使用了通配符,可以使用该参数指定排除掉得表。GETUPDATEAFTERS|IGNOREUPDATEAFTERS:是否在队列中写入后影像,缺省复制GETUPDATEBEFORES| IGNOREUPDATEBEFORES:是否在队列中写入前影像,缺省不复制GETUPDATES|IGNOREUPDATES:是否复制UPDATE操作,缺省复制GETDELETES|IGNOREDELETES:是否复制DELETE操作,缺省复制GETINSERTS|IGNOREINSERTS:是否复制INSERT操作,缺省复制GETTRUNCATES|IGNORETRUNDATES:是否复制TRUNCATE操作,缺省不复制;RMTHOST:指定目标系统及其GoldengateManager进程的端口号,还用于定义是否使用压缩进行传输,本例中的compress为压缩传输;RMTTRAIL:指定写入到目标断的哪个队列;EXTTRAIL:指定写入到本地的哪个队列;SQLEXEC:在extract进程运行时首先运行一个SQL语句;PASSTHRU:禁止extract进程与数据库交互,适用于Data Pump传输进程;REPORT:定义自动定时报告;STATOPTIONS:定义每次使用stat时统计数字是否需要重置;REPORTCOUNT:报告已经处理的记录条数统计数字;TLTRACE:打开对于数据库日志的跟踪日志;DISCARDFILE:定义discardfile文件位置,如果处理中油记录出错会写入到此文件中;DBOPTIONS:指定对于某种特定数据库所需要的特殊参数;TRANLOGOPTIONS:指定在解析数据库日志时所需要的特殊参数,例如:对于裸设备,可能需要加入以下参数 rawdeviceoggset 0WARNLONGTRANS:指定对于超过一定时间的长交易可以在gsserr.log里面写入警告信息,本处配置为每隔3分钟检查一次场交易,对于超过2小时的进行警告;
    配置复制进程REPLICAT进程参数配置说明:ASSUMETARGETDEFS:假定两端数据结构一致使用此参数;SOURCEDEFS:假定两端数据结构不一致,使用此参数指定源端的数据结构定义文件,该文件需要由GlodenGate工具产生。MAP:用于指定源端与目标端表的映射关系;MAPEXCLUDE:用于使用在MAP中使用*匹配时排除掉指定的表;REPERROR:定义出错以后进程的响应,一般可以定义为两种:ABEND,即一旦出现错误即停止复制,此为缺省配置;DISCARD,出现错误后继续复制,只是把错误的数据放到discard文件中。DISCARDFILE:定义discardfile文件位置,如果处理中油记录出错会写入到此文件中;SQLEXEC:在进程运行时首先运行一个SQL语句;GROUPTRANSOPS:将小交易合并成一个大的交易进行提交,减少提交次数,降低系统IO消耗。MAXTRANSOPS:将大交易拆分,每XX条记录提交一次。TABLEEXCLUDE <schema>.<materialized view>
    OGG设置:在ogg中主进程是manager进程,使用startmgr启动。可以在mgr进程中添加一些参数用来在启动mgr进程的同时启动extract和replicat进程。     1、以下是extract端的mgr参数配置  GGSCI (gg01) 130> edit params mgr  PORT 7809  DYNAMICPORTLIST 7800-7909  --启动mgr进程启动启动extract进程  AUTOSTART EXTRACT *  --extract异常终止时会自动启动,每5分钟尝试重新启动所有的extract进程,一共尝试3次,5分钟清零  AUTORESTART EXTRACT *,RETRIES 3, WAITMINUTES 5, RESETMINUTES 10     2、配置目标端replicat进程自启动,在mgr参数中添加如下 GGSCI (gg02) 140> edit params mgr PORT 7809 --动态端口,当指定端口不可用时,会从以下列表中选择一个可用端口 DYNAMICPORTLIST 7800-7909 --自动启动replicat进程 AUTOSTART REPLICAT * --当replicat进程异常终止时会自动启动,每5分钟尝试重新启动所有的replicat进程,一共尝试5次 AUTORESTART REPLICAT *, WAITMINUTES 2, RETRIES 5 --mgr每隔1小时检查extract延时情况,超5分钟作为信息记录log中,超过7分钟作为警告记录log中 LAGREPORTHOURS 1 LAGINFOMINUTES 5 LAGCRITICALMINUTES 7 --删除10天前的trail文件 PURGEOLDEXTRACTS /oracle/ogg/dirdat/*, USECHECKPOINTS, MINKEEPDAYS 10

    OGG同步序列1.目标及源服务器均以sys登录sqlplus安装sequence.sql2.源:grant execute on ogg.updateSequence to ogg; grant execute on ogg.updateSequence to ihms2012syn_login;3目标:GRANT EXECUTE on ogg.replicateSequence TO ogg; GRANT EXECUTE on ogg.replicateSequence TO ihms2012syn_login;4.停止extract相关进程:edit param extractname;  txt文档中加入sequence ihms2012syn_login.*;
    OGG抽取或复制出现错误1.停止mgr2.停止extract、replicat进程,删除目的端dirdat所有文件。3.删除对应extract、replicat进程、删除检查点。4.重建检查点、重建进程。5启动replicat、然后启动extract
                      情况一:如果重新设置抓取文件和复制文件的话会丢失a_15归档数据。                 停止进程 replicat 、extract                 源 alter extract  exihms, extseqno 3, extrba 0                    extseqno 3就是生成的文件名,extrba 数字 表示日志文件中的第几行开始读取                    alter  extract  exihms ,extseqno 3, extrba 0的意思就是新生成一个wf000003文件。                    alter extract exihms,tranlog,begin 2013-12-26 15:00                     从某一时刻抽取归档日志。(这个设置很重要)                 目标 alter rep2, extseqno 3,extrba 0                    从wf000003文件的第一行开始读取                    情况二:通过ogg文件夹中的logdump进行日志分析,然后使用alter rep2,  extseqno  3,extrba  0 精确的跳过错误行。        情况三:缺什么补什么,本例中只要在目标数据库建立一个同名的可更新的物化视图。重启replicat即可。

    OGG配置实验2013-12-27:1.说明源与目标服务器均要求配置完成并启动mgr进程            2.配置源extract、目标replicat进程后先不启动(replicat也可imp之后配置)            3.源数据库停机exp,exp导出之后开启extract进程,源服务器可开始正常工作。extract会自动向目标服务器的指定dirdat文件夹中推送                  同步文件(此文件夹最好为空,有利用设定开始节点)            4.目标机imp            5.imp结束后alter repname,extseqno 0,extrba 0设置replicat从第一个文件的第一行开始读取            6.开启replicat            7.此方案减少源服务器的停机时间。
    OGG出错 ogg-01168数据同步出问题的表没有主键,客户执行insert的时候没有问题,在执行update的时候报了上面的错误。以上的报错涉及三个参数,KEYCOLS,ALLOWNOOPUPDATES,APPLYNOOPUPDATES。下面我们分别讨论这3个参数:
            1)KEYCOLS        KEYCOLS关键字用于对没有主键的表,指定能够唯一标识数据的字段,这样Oracle GoldenGate同样可以完成数据的同步(同步UPDATE操作)。        将目标数据库的replicat配置修改为:MAP CCENSE.ST_CARDOPERATORSTATTMP, TARGET CCENSE.ST_CARDOPERATORSTATTMP, KEYCOLS(cardsfid)        重启目标数据库的replicat进程即可完成数据的同步,但需要注意的是,使用这种方式必须把所有的表列出来,不能指定为<username>.*。
            2)ALLOWNOOPUPDATES                官方文档解释如下:ALLOWNOOPUPDATES | NOALLOWNOOPUPDATESValid for ReplicatUse ALLOWNOOPUPDATES and NOALLOWNOOPUPDATES to control how Replicat responds to a “noop”operation. A no-op operation is one in which there is no effect on the target table. Thefollowing are some examples of how this can occur.● The source table has a column that does not exist in the target table, or has a columnthat was excluded from replication (with a COLSEXCEPT clause). In either case, if thatsource column is updated, there will be no target column name to use in the SET clausewithin the Replicat SQL statement.● An update is made that sets a column to the same value as the current one. Thedatabase does not log the new value, because it did not really change. However, OracleGoldenGate extracts the operation as a change record because the primary key waslogged — but there is no column value for the SET clause in the Replicat SQL statement.By default (NOALLOWNOOPUPDATES), Replicat abends with an error because these types ofoperations do not update the database. With ALLOWNOOPUPDATES, Replicat ignores theoperation instead of abending. The statistics reported by Replicat will show that an updatewas made, but the database will not be updated.You can use the internal parameter APPLYNOOPUPDATES to force the update to be applied.APPLYNOOPUPDATES overrides ALLOWNOOPUPDATES. If both are specified then updates withonly key columns will be applied. By default, Oracle GoldenGate will abend with thefollowing message if it only has source key columns but there is no key defined for the target table.
    2011-01-25 02:28:42 GGS ERROR 160 Encountered an update for targettable TELLER, which has no unique key defined. KEYCOLS can be used todefine a key. Use ALLOWNOOPUPDATES to process the update without applyingit to the target database. Use APPLYNOOPUPDATES to force the update tobe applied using all columns in both the SET and WHERE clause.
    Exceptions when error-handling is in placeIf ALLOWNOOPUPDATES is specified when the HANDLECOLLISIONS or INSERTMISSINGUPDATESparameters are being used, and if Oracle GoldenGate has all of the target key values, thenOracle GoldenGate will not ignore the update, but instead will apply it using all keycolumns in the SET clause and the WHERE clause (invoking APPLYNOOPUPDATES behavior). Thisis necessary so Oracle GoldenGate can detect if the row being updated is missing. If it is,then Oracle GoldenGate turns the update into an insert.Default NOALLOWNOOPUPDATES (only applies if the table does not have a key)Syntax ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES 
            该参数的含义就是在同步到目标数据库的时候忽略出现的NO-OP操作,NO-OP操作包括目标数据库没有主数据库的字段(两边数据库字段不同),还有一种情况是执行UPDATE语句修改的数据和原有数据一样,没有发生变化。以上两种情况叫做NO-OP操作,遭遇NO-OP操作gg会被终止。
             3)APPLYNOOPUPDATES         该参数的含义就是不忽略出现的NO-OP操作,而是在目标数据库强制执行UPDATE修改操作,且只更新键值数据(主键或KEYCOLS指定的键值),如果表没有主键,也没有使用KEYCOLS关键字指定字段,那么将更新表数据的所有字段,如果没有相应记录,将INSERT新插入一条。        官方文档解释如下:
    APPLYNOOPUPDATES | NOAPPLYNOOPUPDATESValid for ReplicatUse APPLYNOOPUPDATES to force a “no-op” update to be applied using all columns in both theSET and WHERE clauses. See ALLOWNOOPUPDATES | NOALLOWNOOPUPDATES for a description of“no-op.”APPLYNOOPUPDATES uses whatever data is in the trail. If there is a primary key updaterecord, it uses the before columns from the source. If there is a regular (non-key) update,it assumes that the after value is the same as the before value (otherwise it would be aprimary key update). The preceding assumes source and target keys are identical. If theyare not, you must use a KEYCOLS clause in the TABLE statement on the source.Default NOAPPLYNOOPUPDATESSyntax APPLYNOPUPDATES | NOAPPLYNOPUPDATES
            请注意,我们在讨论NO-OP操作的时候,NO-OP操作并不包含UPDATE没有主键的表,所以我们遇到的这个问题和ALLOWNOOPUPDATES和APPLYNOOPUPDATES这两个参数没有关系。通过实践证明,在replicat配置文件中加入这两个参数(或只加入ALLOWNOOPUPDATE参数),在更新没有主键,也没有指定KEYCOLS字段的表的时候同样会报错。对没有主键,但加上了KEYCOLS字段后的表执行UPDATE操作成功同步了数据。
            如果没有在源数据库启用记录表的supplement log,同样会收到以上的报错,原因是在于没有记录没有主键表的supplement log数据,并将其传递到目标数据库,执行以下操作可以启用记录表的supplement log:cd $GGHOME./ggscidblogin userid <username>,password <password>add trandata <username>.<tablename>         完成以上操作之后,可以解决由此问题导致的update不能同步。

    ora-01403  no data found的处理此错误可能为源端与目标端表结构不同或数据不同而造成。处理过程:停止源端与目标端进程,源端:从日志表中删除问题对象名称Delete trandata 用户名.对象名删除此表,重新新建此表,恢复数据。添加至日志中。Add trandata 用户名.对象名
    目标端:从日志表中删除问题对象名称Delete trandata 用户名.对象名删除此表,重新新建此表,恢复数据。添加至日志中。Add trandata 用户名.对象名
    开启源端进程。开启目标端进程。
    一次恢复流程源库和目标库的expdp、impdp1、源库select current_scn from v$database  确定scn。2、修改scn号为上面当前值,从源库导出。expdp directory=EXPDIR FLASHBACK_SCN= 9015228145167 schemas=tjrealms2014_login dumpfile=bdc.dmp3、目标库导入数据impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login4、生成expdp、impdp的sql:create directory dump_dir as 'e:appexpdp';select * from dba_directories;5、impdp dumpfile=hp.dmp directory=dump_dir schemas=Xxx_login6、start repHp,aftercsn 9015228145167

    ————————————————版权声明:本文为CSDN博主「大巧不工」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/saijie1983/article/details/101926093

  • 相关阅读:
    FZU-2087 统计树边(最小生成树)
    HDU-1599 find the mincost route(floyd求最小环)
    BZOJ-1191 [HNOI2006]超级英雄Hero(二分图匹配)
    FZU-2020 组合(Lucas定理)
    FZU-2232 炉石传说(二分图匹配)
    NOIP2016模拟 拼接mf(模拟)
    2016年11月10日00:26:08
    BZOJ2986 Non-Squarefree Numbers
    BZOJ3624 [Apio2008]免费道路
    BZOJ3224 Tyvj 1728 普通平衡树
  • 原文地址:https://www.cnblogs.com/wangjp-1233/p/11870529.html
Copyright © 2020-2023  润新知