Stream 流环境配置流程过程介绍-阿里云开发者社区

开发者社区> 数据库> 正文

Stream 流环境配置流程过程介绍

简介: <p><br></p> <p><span style="font-size:14px"><span style="word-wrap:break-word"><span style="word-wrap:break-word"><a target="_blank" href="http://space.itpub.net/?uid-10804699-action-viewspace-it


1、 引言
2、数据库流环境配置
2.1 设定初始化参数
2.2 将数据库置为归档模式
2.3 创建复制管理员
2.4 创建DBlink
2.5 启用追加日志
3、设置STREAM
3.1 创建流队列
3.2 在源库上创建创建传播和创建捕获进程
3.3 实例化复制数据库:
3.4 在目标库上创建应用进程
4、启动、停止和删除STREAM.
4.1 启动
4.2 停止
4.3 清除配置信息
5、问题诊断
5.1 如何知道捕捉(Capture)进程是否运行正常?
5.2 如何知道Captured LCR是否有传播GAP?
5.3 如何知道Appy进程是否运行正常?
附1:Streams配置和管理相关package.
附2:利用EM设置流生成的脚本源文件(1)
     利用EM设置流生成的脚本源文件(2)



在Internet上运作数据库经常会有这样的需求:把遍布全国各城市相似的数据库应用统一起来,一个节点的数据改变不仅体现在本地,还反映到远端。复制技术给用户提供了一种快速访问共享数据的办法。
前提条件
要准备2台测试用的机器,开始制作如下:+
要保证2台机器安装oracle10g以及更高的版本,我这里是用的10.2.0.5做实验。

准备工具:

Xmanager4   Xftp工具、Xsell工具、Window DOS控制台、Redhat6.1操作系统、Oracle10.2.0.1 安装包 、升级包、补丁包。

 

1        安装操作系统 我的实验环境是 redhat6.1 2台 以最小化安装的。
2  安装操作系统:

Linux redhat6.1

最好在安装的时候配置好网卡,也可以手动写配置文件但是要遇到错误,还有就是Oracle做系统检测的时候要报错,说网卡不是活动网卡(DHCP)模式,所以最好安装的时候配置网卡,而且PREIXE=24直接关系到XP-DOS能不能Ping通linux系统。

安装本地YUM源。

拷贝系统ISO文件到/mnt/iso下

Mount –o loop 挂载该文件 到 /mnt/devices

Vim   /etc/yum.repos.d/rhel6

      [rhel6] -------à注意这儿必须紧挨着写不然一定会报错

      Name = rhel6

      Baseurl = file:///mnt/devices

      Gpgcheck = 0

      Enabled = 1

Yum clean all ------清楚所有的原来的yum源 OK了

停止防火墙 /etc/init.d/iptables   

上面做完了 保证 XP能够ping通2台主机IP地址 然后YUM install 能够安装上程序。

安装ORACLE
           Ftp
工具上传ISO文件到/mnt/iso下、上传升级包、补丁包、程序包el6-oracle-rpm.txt

   开始安装

 

 

安装步骤_10g安装

 

    安装前:

 

    环境要求

    free -m 查看内存的大小 

    内存为1G , swap空间为空间为内存的2倍

    内存为8G ,swap空间为内存的1.5倍

    内存为16G ,swap空间为内存的0.75倍

    内存为16G以上,swap空间为内存上的0.75倍

-----------------------------------------------------------

    增加swap空间

 

    dd if=/dev/zero of=/opt/swap.img bs=1M count=2048

    mkswap /opt/swap.img -f

    swapon /opt/swap.img

    开机启动

    vim /etc/fstab

    /opt/swap.img swap swap defaults 0 0

---------------------------------------------------------OK

 

    修改hostname ,不需要修改/etc/sysconfig/network

 

    [root@mail oracle]# hostname up55.uplooking.com

    [root@mail oracle]# cat /etc/hosts

    192.168.0.55 up55.uplooking.com up55

 

    安装依赖包

 

    yum install libXp -y

    yum install libaio-devel -y

    yum install unixODBC-devel -y

    yum install *make* -y  安装10g做检查的时候会报错提示没有make-包。

    yum install `cat /opt/os/oracle/el6-oracle-rpm.txt` -y 安装所有需要的包

    --------yum groupinstall "Chinese Support" -y 安装中文支持-------NO

    --------注意 当界面不支持中文时候或者是乱码请修改LANG=en英文------

 

    伪造系统版本

 

    [root@mail oracle]# cat /etc/redhat-release 伪造系统版本

    Red Hat Enterprise Linux Server release 4.0 (Santiago)

 

    修改系统内核参数

 

    在做检查的时候1og始终要报错说内核参数有错,不要管它直接打个勾,还有做检查的时候

    到86%的时候会报错 直接忽略就是了打了补丁就好了。

 

    echo "kernel.sem = 250 32000 100 128" >>/etc/sysctl.conf

    echo "fs.file-max = 65536">>/etc/sysctl.conf

    echo "net.ipv4.ip_local_port_range = 1024 65000">>/etc/sysctl.conf

    echo "net.core.rmem_default = 1048576">>/etc/sysctl.conf

    echo "net.core.rmem_max = 1048576">>/etc/sysctl.conf

    echo "net.core.wmem_default = 262144">>/etc/sysctl.conf

    echo "net.core.wmem_max = 262144">>/etc/sysctl.conf

 

    修改用户权限(/etc/security/limits.conf

 

    oracle soft nofile 8192 --同时打开文件的数量

    oracle hard nofile 65536

    oracle soft nproc 4096  --同时使用运行多少线程

    oracle hard nproc 16384

 

    添加oracle用户及组

 

    groupadd -g 111 dba

    groupadd -g 110 oinstall

    useradd oracle -u 110 –g 110 –G 111

 

    修改oracle用户密码

  

    echo oracle|password oracle --stdin

 

    创建oracle安装目录

 

    mkdir /u01/app/oracle

    chown oracle.oinstall /u01/app/oracle -R

 

    修改环境变量 (~oracle/.bash_profile)

    export ORACLE_SID=o10g

    export ORACLE_BASE=/u01/app/oracle

    export ORACLE_HOME=$ORACLE_BASE/product/10.2.0.1/db

    PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin

 

    开始安装

 

    解压cpio.gz格式

   

    解压安装包

   

      解压文件

第一种方法:以cpio.gz 结尾的

zcat  lnx_920_disk1.cpio.gz | cpio -idmv

zcat  lnx_920_disk1.cpio.gz | cpio -idmv

zcat  lnx_920_disk1.cpio.gz | cpio -idmv

 

第二种方法 :

    第一步:

gunzip lnx_920_disk1.cpio.gz

gunzip lnx_920_disk2.cpio.gz

gunzip lnx_920_disk3.cpio.gz

    第二步:--以cpio结尾的---

cpio -idmv < lnx_920_disk1.cpio

cpio -idmv < lnx_920_disk2.cpio

cpio -idmv < lnx_920_disk3.cpio

   

 

    cpio -idmv < 10201_database_linux_x86_64.cpio.gz

   

    root用户执行  xhost +

 

    su - oracle

  

    注意  不要在当前目录下

    运行 <全路径>/database/runInstaller

    这个步骤只是指安装软件不建立数据库《》《》

    报错 : 内核参数直接打勾 报错网络错误DHCP需要重新配置/etc/sysconfig/network-

script/ifcfg-th0  修改为下面的标准

DEVICE="eth0"

NM_CONTROLLED="yes"

ONBOOT=yes

HWADDR=00:50:56:A8:6A:43

TYPE=Ethernet

BOOTPROTO=none

IPADDR=172.16.10.34

PREFIX=24

GATEWAY=172.16.10.1

DNS1=255.255.255.0

DEFROUTE=yes

IPV4_FAILURE_FATAL=yes

IPV6INIT=no

NAME="System eth0"

UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03

        注意: 以root身份运行脚本    

    

   

    升级包

    unzip p8202632_10205_Linux-x86-64.zip

   

    su - oracle  oracle用户下

    cd Disk1

    运行这个程序《》《》runInstaller

        注意 : 以root身份运行脚本

 

    补丁包

 

    unzip p8350262_10205_Generic.zip

    su - oracle

    Oracle身份:

    cd 8350262/

   

执行补丁如果遇到下面这个问题怎么解决?

 

[INS-20802] Oracle Net Configuration Assistant failed

执行下面的3句话就可以了:

/oracle/11g/product/11.2.0/dbhome_1/OPatch/opatch apply -invPtrLoc

/oracle/11g/product/11.2.0/dbhome_1/oraInst.loc

export ORACLE_HOME= /oracle/11g/product/11.2.0/dbhome_1/

 

在执行打补丁命令,搞定

需根据自己实际配置进行改动。

 

    Oracle身份执行:

   必须再8350262下输入这个路径/u01/app/oracle/product/10.2.0.1/db/OPatch/opatch apply 打补丁

    

   netca或者netmgr 

配置Listener监听 从而 生成 $ORACLE_HOME/network/admin/listener.ora,当然tnsnames.ora

也在这个下面 

 

    dbca 建库

 注意  Global_names  SID 的值 是数据库实例的值后台进程的名字,最好与

~oracle/.bash_profile SID中名字设置成一致 当然这个只是可以改的。

   ---------------------------------------这一步就不用运行脚本了。

 

 

    11g 安装步骤

 

        安装前与10g一样

 

        开始安装

 

        解压包

        unzip p10404530_112030_Linux-x86-64_1of7.zip

        unzip p10404530_112030_Linux-x86-64_2of7.zip

        root下---->   xhost +       

        su - oracle

        cd ~/database

        ./runInstaller

 

    安装后操作

 

        恢复 vim ~oracle/.bash_profile

        删除10g环境变量 使它成为如下:

        alias 10g=". /home/oracle/.10g" ——>添加别名

        alias 11g="source /home/oracle/.11g"

       

        查看

        cat ~oracle/.bash_profile

        alias 10g="source /home/oracle/.10g" ——>添加别名

        alias 11g="source /home/oracle/.11g"

 

        查看oracle安装的目录和sid

 

        [root@up55 11g]# tail -3 /etc/oratab

        XE:/u01/app/oracle/product/11.2.0/xe:N

        db10g:/u01/app/oracle/product/10.2.0.1/db:N

        orcl:/u01/app/oracle/product/10.2.0.1/db11g:N orcl——>sid

 

        su - oracle 在oracle用户下执行1 2

       1 添加(~/.10g

 

        # User specific environment and startup programs

        export ORACLE_BASE=/u01/app/oracle ——>base目录

        export ORACLE_HOME=/u01/app/oracle/product/10.2.0.1/db ——>HOME目录

        export ORACLE_SID=o10g

        PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/local/bin:$HOME/bin

        export PATH

 

       2 添加(~/.11g

 

        # User specific environment and startup programs

        export ORACLE_BASE=/u01/app/oracle

        export ORACLE_HOME=/u01/app/oracle/product/11g

        export ORACLE_SID=o11g

        PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/local/bin:$HOME/bin

        export PATH

 

      开机启动

      root:

cp /opt/soft/oracle/oracle-init/oracle10g /etc/init.d/

cp /opt/soft/oracle/oracle-init/oracle11g /etc/init.d/

vi /etc/init.d/oracle10g  --->  ORACLE_HOME

vi /etc/init.d/oracle11g  --->  ORACLE_HOME

 

chmod 755  /etc/init.d/oracle10g

chmod 755  /etc/init.d/oracle11g

 

chkconfig oracle10g on

chkconfig oracle11g on

 

su  - oracle

cp /opt/soft/oracle/oracle-init/.10g  ~oracle/

cp /opt/soft/oracle/oracle-init/.11g  ~oracle/

cp /opt/soft/oracle/oracle-init/db*  ~oracle/

chmod 755  ~oracle/db*

vi  ~oracle/.10g   ---> ORACLE_BASE  ORACLE_HOME  ORACLE_SID 

vi  ~oracle/.11g   ---> ORACLE_BASE  ORACLE_HOME  ORACLE_SID 

 

/etc/init.d/oracle10g start

/etc/init.d/oracle11g start

 

 

 

 

           

完成以上步骤后,基本工作就算做完了,现在开始配置高级复制。
假设数据库机器为 数据库机器A ...数据库机器B...
数据库机器A地址为;172.16.10.34      
数据库的Glob_name和SID     ciscosys                          
操作系统的
域名:ciscosys   -----》hostname ciscosys.maohuazhang.com   

                  
数据库机器B地址为;172.16.10.35      
数据库的Glob_name和SID:     book                          
操作系统的
域名:book                            
首先配置确认俩台机器可以互相访问,如下:

机器A操作:
用oracle登陆
修改如下文件;
vi $ORACLE_HOME/network/admin/tnsnames.ora 
添加:

book = --这个名称随便起

  (DESCRIPTION =    --注意这儿写机器B的地址及数据库端口号(填相反的)

    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.35)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = book) --机器B数据库SID的值

 

    )

  )

    注意 一定按照上面的格式来(我出错时因为空格空行),不然tnsping book不会OK

 

 

 

机器B操作:
用oracle登陆
修改如下文件;
vi $ORACLE_HOME/network/admin/tnsnames.ora 
添加:

ciscosys = --这个名称随便起

  (DESCRIPTION =    --注意这儿写机器A的地址及数据库端口号(填相反的)

    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.34)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ciscosys) --机器A数据库SID的值

 

    )

  )

    注意 一定按照上面的格式来(我出错时因为空格空行),不然tnsping book不会OK


测试数据库连通性,

机器A如下;
[oracle@localhost admin]$ tnsping book
显示如下;
TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production . 04-JAN-2009 16:53:23

Copyright (c) 1997, 2005, Oracle.  All rights reserved.

Used parameter files:
/home/oracle/oracle/product/10.2.0/network/admin/sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DE.ION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.226)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = music1)))
OK (10 msec)
 
测试数据库连通性

,在机器B如下;
[oracle@localhost admin]$ tnsping ciscosys
显示;
TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production . 04-JAN-2009 17:09:04

Copyright (c) 1997, 2005, Oracle.  All rights reserved.

Used parameter files:
/home/oracle/oracle/product/10.2.0/network/admin/sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DE.ION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.205)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = music1)))
OK (0 msec)

注意:这里我的2台机器没有加防火墙等其他安全措施,数据库也没有设置限制地址登陆。如果你连接不上,就仔细看看自己的其他配置。

错误原因:   没有netca或者netmgr 配置监听 、没有按照上面的步骤来或者有空格。具体查看报错。

 

 

机器A
察看v$option,Advanced replication为TRUE,则支持高级复制功能;否则不支持
SYSDBA

Col parameter for a40

Col value for a10

select * from v$option;
以上察看结果默认为ture,支持高级复制。

 

 设置global_name

Alter system set global_name=true scope=both;

 

察看global_name参数


SQL> show parameter global_names


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     TRUE
看过大多数文章都将这里要设置成true


察看默认global_name,数据库域名
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
ciscosys.REGRESS.RDBMS.DEV.US.ORACLE.COM   我的不是 这步我没有做

修改global_name,数据库域名
SQL> alter database rename global_name to ciscosys;
察看修改结果;

SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
ciscosysy

-------------------------------------------我的不是 这步我没有做

创建帐户及数据:
SQL> create user wcms identified by abc123 default tablespace users;
SQL>grant connect,resource to wcms;

切换到wcms
SQL> conn wcms/abc123
创建表
SQL> create table test(id number,name varchar2(20),constraint test_id_pk primary key(id));   (主键一定是要的);

create table test(id number,name varchar2(20),constraint test_id_pk primary key(id));

插入数据
SQL> insert into test values(1,'abc');
SQL> insert into test values(2,'def');

建立管理数据库复制的用户strmadmin,并赋权。

SQL>conn /as sysdba
SQL> create user strmadmin identified by strmadmin default tablespace users temporary tablespace temp;
---------------------------
下面7步骤不要漏了--------------------

SQL> execute dbms_defer_sys.register_propagator('strmadmin');
SQL> grant execute any procedure to strmadmin;
SQL> execute dbms_repcat_admin.grant_admin_any_repgroup('strmadmin');
SQL> execute dbms_repcat_admin.grant_admin_any_schema(username => 'strmadmin');
SQL> grant comment any table to strmadmin;
SQL> grant lock any table to strmadmin;
SQL> grant select any dictionary to strmadmin;


用strmadmin 创建database link 连接
SQL> conn strmadmin/strmadmin
SQL> create database link "book" connect to strmadmin identified by strmadmin using 'book';


察看一下:SQL> select owner,db_link,host from all_db_links;
OWNER         DB_LINK                                 HOST  

STRMADMIN  book    book

 

 

机器B
察看v$option,Advanced replication为TRUE,则支持高级复制功能;否则不支持
SYSDBA登录:

Col parameter for a40

Col value for a10

select * from v$option;
以上察看结果默认为ture,支持高级复制。

 

 设置global_name

Alter system set global_name=true scope=both;

 

察看global_name参数


SQL> show parameter global_names


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
global_names                         boolean     TRUE
看过大多数文章都将这里要设置成true


察看默认global_name,数据库域名
SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
ciscosys.REGRESS.RDBMS.DEV.US.ORACLE.COM   我的不是 这步我没有做

修改global_name,数据库域名
SQL> alter database rename global_name to book;
察看修改结果;

SQL> select * from global_name;
GLOBAL_NAME
-------------------------------------------------------------------------------
BOOK

-------------------------------------------我的不是 这步我没有做

--------------------------------------------------------------------------------

创建帐户及数据:
SQL> create user wcms identified by abc123 default tablespace users;
SQL>grant connect,resource to wcms;
切换到wcms,
SQL> conn wcms/abc123
创建表
SQL> create table test(id number,name varchar2(20),constraint test_id_pk primary key(id));   (主键一定是要的);
插入数据
SQL> insert into test values(1,'zhao');
SQL> insert into test values(2,'yong');
配置复制管理用户

SQL>conn /as sysdba

建立管理数据库复制的用户strmadmin,并赋权。
SQL> create user strmadmin identified by strmadmin default tablespace users temporary tablespace temp;
---------------------------下面7步骤不要漏了--------------------

 

SQL> execute dbms_defer_sys.register_propagator('strmadmin');
SQL> grant execute any procedure to strmadmin;
SQL> execute dbms_repcat_admin.grant_admin_any_repgroup('strmadmin');
SQL> execute dbms_repcat_admin.grant_admin_any_schema(username => 'strmadmin');
SQL> grant comment any table to strmadmin;
SQL> grant lock any table to strmadmin;
SQL> grant select any dictionary to strmadmin;

用strmadmin 创建database link 连接


SQL> create database link "ciscosys" connect to strmadmin identified by strmadmin using 'ciscosys';

 

察看一下:


SQL> select owner,db_link,host from all_db_links;
OWNER            DB_LINK                                      HOST
--------------------------------------------------------------------------------
STRMADMIN     ciscosys     ciscosys

 

测试开始 
登陆机器A
测试数据库链接:
SQL> select * from global_name@book;
显示:
GLOBAL_NAME
-------------------------------------------------------------------------------
book
表示数据库到此连接成功

 

登陆机器B
测试数据库链接:
SQL> select * from global_name@ciscosys;
显示:
GLOBAL_NAME
-------------------------------------------------------------------------------
ciscosys
表示数据库到此连接成功。

3.5 启用追加日志 -----------10.2.0.x以上的不用追加日志了,我没有做这步。

可以基于Database级别或Table级别,启用追加日志(Supplemental Log)。在建立根据Schema粒度进行复制的Oracle Stream环境中,如果确认Schema下所有Table都有合理的主键(Primary Key),则不再需要启用追加日志。

------可以不用做--------

#启用Database 追加日志 

alter database add supplemental log data; 

#启用Table追加日志 

alter table add supplement log group log_group_name(table_column_name) always; 

 

3.7 创建流队列 

3.7.1创建Master流队列 

#strmadmin身份,登录主数据库。 

connect strmadmin/strmadmin 

 

begin 

dbms_streams_adm.set_up_queue( 

queue_table => 'ciscosys_queue_table', 

queue_name => 'ciscosys_queue'); 

end; 

3.7.2创建Backup流队列 

#strmadmin身份,登录从数据库。 

connect strmadmin/strmadmin 

 

begin 

dbms_streams_adm.set_up_queue( 

queue_table => 'book_queue_table', 

queue_name => 'book_queue'); 

end; 

 

3.8 创建捕获进程 

#strmadmin身份,登录主数据库。提醒一下,本文档以hr用户做示例。 需要解锁hrsystem用户:conn / as sysdba

        Alter user hr/system account unlock ; alter user  hr/system identified by hr

connect strmadmin/strmadmin 

 

begin 

dbms_streams_adm.add_schema_rules( 

schema_name => 'hr', 

streams_type => 'capture', 

streams_name => 'capture_ciscosys', 

queue_name => 'strmadmin.ciscosys_queue', 

include_dml => true, 

include_ddl => true, 

include_tagged_lcr => false, 

source_database => null, 

inclusion_rule => true); 

end; 

3.9 实例化复制数据库 

Oracle 用户:

Host  $ORACLE_HOME/rdbms/admin/catalog.sql 或者是 catasql.sql,注意执行上面的语句一定会报错,但是这个是正常的,不要着急

在主数据库环境中,执行如下Shell语句。如果从库的hr用户不存在,建立一个hr的空用户。 

Ho exp userid=hr/hr@ciscosys file='f:\hr.dmp' object_consistent=y rows=y 

Ho exp userid=hr/hr@ciscosys file='f:\hr.dmp' object_consistent=y rows=y

 

 

Ho imp userid=system/manager@book file='f:\hr.dmp' ignore=y commit=y log='f:\hr.log' streams_instantiation=y fromuser=hr touser=hr 

3.10 创建传播进程 

#strmadmin身份,登录主数据库。 

connect strmadmin/strmadmin 

 

begin 

dbms_streams_adm.add_schema_propagation_rules( 

schema_name => 'hr', 

streams_name => 'ciscosys_to_book', 

source_queue_name => 'strmadmin.ciscosys_queue', 

destination_queue_name => 'strmadmin.book_queue@book', 

include_dml => true, 

include_ddl => true, 

include_tagged_lcr => false, 

source_database => 'ciscosys', 

inclusion_rule => true); 

end; 

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

#strmadmin身份,登录主数据库。

#修改propagation休眠时间为0,表示实时传播LCR 

begin 

dbms_aqadm.alter_propagation_schedule( 

queue_name => 'ciscosys_queue', 

destination => 'book', 

latency => 0); 

end; 

 

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

3.11 创建应用进程 

#strmadmin身份,登录从数据库。 

connect strmadmin/strmadmin 

 

begin 

dbms_streams_adm.add_schema_rules( 

schema_name => 'hr', 

streams_type => 'apply', 

streams_name => 'apply_book', 

queue_name => 'strmadmin.book_queue', 

include_dml => true, 

include_ddl => true, 

include_tagged_lcr => false, 

source_database => 'ciscosys', 

inclusion_rule => true); 

end; 

 

 

 

 

 

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

3.12 启动STREAM 

#strmadmin身份,登录从数据库。 

connect strmadmin/strmadmin 

 

#启动Apply进程 

begin 

dbms_apply_adm.start_apply( 

apply_name => 'apply_book'); 

end; 

 

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

 

#strmadmin身份,登录主数据库。 

connect strmadmin/strmadmin 

 

#启动Capture进程 

begin 

dbms_capture_adm.start_capture( 

capture_name => 'capture_ciscosys'); 

end; 

 

 

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

--------================以上ORACLE单向流复制(主到从)就搭建好了=====

 

--------================以下ORACLE单向流复制(从到主)搭建=====

注意: 从到主搭建什么都不用改变。只是需要将下面的复制粘贴到Strmadmin用户下执行就可以了。

 

1

#strmadmin身份,登录从数据库。提醒一下,本文档以hr用户做示例。 需要解锁hrsystem用户:conn / as sysdba

        Alter user hr/system account unlock ; alter user  hr/system identified by hr

connect strmadmin/strmadmin 

strmadmin身份,登录从数据库

connect strmadmin/strmadmin

 

begin 

dbms_streams_adm.add_schema_rules( 

schema_name => 'hr', 

streams_type => 'capture', 

streams_name => 'capture_book', 

queue_name => 'strmadmin.book_queue', 

include_dml => true, 

include_ddl => true, 

include_tagged_lcr => false, 

source_database => null, 

inclusion_rule => true); 

end; 

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

2

3.10 创建传播进程 

 

#strmadmin身份,登录从数据库。 

connect strmadmin/strmadmin 

 

begin 

dbms_streams_adm.add_schema_propagation_rules( 

schema_name => 'hr', 

streams_name => 'book_to_ciscosys', 

source_queue_name => 'strmadmin.book_queue', 

destination_queue_name => 'strmadmin.ciscosys_queue@ciscosys', 

include_dml => true, 

include_ddl => true, 

include_tagged_lcr => false, 

source_database => 'book', 

inclusion_rule => true); 

end; 

3.11 创建应用进程 

#strmadmin身份,登录主数据库。 

connect strmadmin/strmadmin 

 

begin 

dbms_streams_adm.add_schema_rules( 

schema_name => 'hr', 

streams_type => 'apply', 

streams_name => 'apply_ciscosys', 

queue_name => 'strmadmin.ciscosys_queue', 

include_dml => true, 

include_ddl => true, 

include_tagged_lcr => false, 

source_database => 'book', 

inclusion_rule => true); 

end; 

创建SCN

#strmadmin身份,登录主数据库。

declare 

iscn number; 

begin 

iscn := dbms_flashback.get_system_change_number(); 

dbms_apply_adm.set_schema_instantiation_scn@ciscosys(     

source_schema_name   => 'hr',     

source_database_name => 'book',     

instantiation_scn    => iscn,     

recursive            => true);

end; 

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

5

#strmadmin身份,登录从数据库。 

connect strmadmin/strmadmin 

 

#启动Capture进程 

begin 

dbms_capture_adm.start_capture( 

capture_name => 'capture_book'); 

end; 

#strmadmin身份,登录从数据库。

#修改propagation休眠时间为0,表示实时传播LCR 

begin 

dbms_aqadm.alter_propagation_schedule( 

queue_name => 'book_queue', 

destination => 'ciscosys', 

latency => 0); 

end; 

6

strmadmin身份,登录主数据库。 

connect strmadmin/strmadmin 

 

#启动Apply进程 

begin 

dbms_apply_adm.start_apply( 

apply_name => 'apply_ciscosys'); 

end; 

 

 

 

 

 

测试场景 

本文档建立了针对hr用户的Stream 复制环境,如果没有特别声明,以下测试场景均以hr用户身份执行。

连接到HR用户

Conn  hr/hr 

4.1 建一张表测试 

主数据库 

SQL> CREATE TABLE aaa(id NUMBER PRIMARY KEY, name VARCHAR2(50))

Table created. 

从数据库 

SQL> desc aaa

Name Null? Type 

---------- -------- ------------- 

ID NOT NULL NUMBER 

NAME VARCHAR2(50) 

4.2 表中插入一行数据 

主数据库 

SQL> insert into aaa values (1,'毛华章'); 

1 row created. 

SQL> commit; 

Commit complete. 

从数据库 

SQL> select * from aaa; 

ID NAME 

---------- -------------------- 

1  毛华章 

---------------------------------------------------------------------

 

问题诊断 

5.1 如何知道捕捉(Capture)进程是否运行正常? 

strmadmin身份,登录主数据库,执行如下语句: 

SQL> SELECT CAPTURE_NAME,  QUEUE_NAME,  RULE_SET_NAME, NEGATIVE_RULE_SET_NAME,  STATUS  FROM DBA_CAPTURE;  

结果显示如下: 

CAPTURE_NAME QUEUE_NAME 

------------------------------ ------------------------------ 

RULE_SET_NAME NEGATIVE_RULE_SET_NAME STATUS 

------------------------------ ------------------------------

CAPTURE_PROD PROD_QUEUE 

RULESET$_14 ENABLED 

ENABLED 

 

如果STATUS状态是ENABLED,表示Capture进程运行正常; 

如果STATUS状态是DISABLED,表示Capture进程处于停止状态,只需重新启动即可; 

如果STATUS状态是ABORTED,表示Capture进程非正常停止,查询相应的ERROR_NUMBERERROR_MESSAGE列可以得到详细的信息;同时,Oracle会在跟踪文件中记录该信息。 

5.2 如何知道Captured LCR是否有传播GAP 

strmadmin身份,登录主数据库,执行如下语句: 

SQL> SELECT CAPTURE_NAME, QUEUE_NAME, STATUS, CAPTURED_SCN, APPLIED_SCN  FROM DBA_CAPTURE; 

 

结果显示如下: 

CAPTURE_NAME QUEUE_NAME STATUS 

------------------------------ ------------------------------

CAPTURED_SCN APPLIED_SCN 

------------ ----------- 

CAPTURE_PROD PROD_QUEUE ENABLED 

17023672 17023672 

 

如果APPLIED_SCN小于CAPTURED_SCN,则表示在主数据库一端,要么LCR没有被dequeue,要么Propagation进程尚未传播到从数据库一端。 

5.3 如何知道Appy进程是否运行正常? 

strmadmin身份,登录从数据库,执行如下语句: 

SQL> SELECT apply_name, apply_captured, status FROM dba_apply; 

 

结果显示如下: 

APPLY_NAME APPLY_ STATUS 

---------------------- ------ ---------------- 

APPLY_H10G YES ENABLED 

如果STATUS状态是ENABLED,表示Apply进程运行正常; 

如果STATUS状态是DISABLED,表示Apply进程处于停止状态,只需重新启动即可; 

如果STATUS状态是ABORTED,表示Apply进程非正常停止,查询相应的ERROR_NUMBERERROR_MESSAGE列可以得到详细的信息;同时,可以查询DBA_APPLY_ERROR视图,了解详细的Apply错误信息。 

清除所有配置信息 

要清楚Stream配置信息,需要先执行3.13,停止Stream进程。 

3.13  停止STREAM 

#strmadmin身份,登录主数据库。 

connect strmadmin/strmadmin 

#停止Capture进程 

begin 

dbms_capture_adm.stop_capture( 

capture_name => 'capture_ciscosys'); 

end; 

 

#strmadmin身份,登录从数据库。 

connect strmadmin/strmadmin 

 

#停止Apply进程 

begin 

dbms_apply_adm.stop_apply( 

apply_name => 'apply_book'); 

end; 

#strmadmin身份,登录主数据库。 

connect strmadmin/strmadmin 

exec DBMS_STREAMS_ADM.remove_streams_configuration(); 

#strmadmin身份,登录从数据库。 

connect strmadmin/strmadmin 

exec DBMS_STREAMS_ADM.remove_streams_configuration();

-------------------------------------------------好了清楚了所有信息

注意   

Conn  / as sysdba

Drop user strmadmin cascade    

Drop tablespace 《》

Drop table test 等等

还有路径下的文件 一定都要删除。才算彻底删除。

 

Q:如果高级复制环境中的主体定义站点损坏,如何将主体定义站点切换到另外的主体站点上?
A:分为两种情况。备注:每次运行完repcat包以后都应该执行一次commit,因为某些rep的存储过程是不会自动commit的,同时这也是一个troubleshooting,一般的rep脚本都会较快的返回结果,如果一条命令之后长时间没有结果返回,那么很可能是上面的命令没有commit,取消掉当前的命令,然后作一次commit,再重新执行,一般都能够解决问题。一是只有主体定义站点损坏。假设站点A是主体定义站点,已经损坏,在复制环境中还有站点B,想作为新的主体定义站点。
1.以repadmin身份登录站点B,执行主体站点切换。
connect repadmin/repadmin 
execute dbms_repcat.relocate_masterdef 
(gname =>'repg', 
old_masterdef =>'shenzhen.test.com.cn', 
new_masterdef =>'beijing.test.com.cn', 
notify_masters =>true, 
include_old_masterdef =>false); 

2.将站点A作为主体站点删除
execute dbms_repcat.remove_master_databases 
(gname =>'repg', 
master_list =>'shenzhen.test.com.cn');

3.当站点A重新可用时,用repadmin用户登录站点A,删除其中的复制组信息
connect repadmin/repadmin 
execute dbms_repcat.drop_master_repgroup 
(gname =>'repg', 
drop_contents =>true, 
all_sites => false);
如果要使站点A重新称为复制环境中的一个主体站点,继续执行下面的4,5两步,否则切换主体定义站点就已经完成了。
4. 登录站点B(新的主体定义站点)
connect repadmin/repadmin

execute dbms_repcat.suspend_master_activity 
(gname =>'repg') 

execute dbms_repcat.add_master_database 
(gname => 'repg', 
master =>'shenzhen.test.com.cn', 
use_existing_objects =>true, 
copy_rows =>false); 

5.重新开始复制
execute dbms_repcat.resume_master_activity 
(gname =>'repg',true)
第二种情况是一些主体站点和主体定义站点同时损坏了。
1.依次登录所有正常运行的主体站点,执行主体定义站点切换
execute dbms_repcat.relocate_masterdef 
(sname =>; 'schemaname', 
old_masterdef =>; 'oldmaster.world', 
new_masterdef =>; 'newmaster.world', 
notify_masters =>; false, /*此处是false,而第一种情况中这个参数是true */ 
include_old_masterdef =>; false); 
后面的操作步骤跟情况一相同,依次执行2-5就可以了

 

这是一个同步复制环境,在同步复制中,任何一个站点Down掉都会导致数据库服务中断。

1.
停掉主体定义站点(CONNER.HURRAY.COM.CN)

[oracle@jumper oracle]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Thu Feb 17 16:07:26 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Connected to:

Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

With the Partitioning option

JServer Release 9.2.0.4.0 - Production

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 

2.登陆主体站点(TESTORA9.HURRAY.COM.CN)

SQL> select * from dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

        60 ORACLE         BEIJING

        70 oracle         beijing

6 rows selected.


此时主体站点上对于扶植对象的任何DML操作都不能进行了。

SQL> insert into dept values(80,'oracle','beijing');

insert into dept values(80,'oracle','beijing')

*

ERROR at line 1:

ORA-02068: following severe error from CONNER

ORA-03113: end-of-file on communication channel

ORA-02068: following severe error from CONNER

ORA-03113: end-of-file on communication channel


3.使用复制管理员登陆主体站点

如果此时尝试删除复制对象,打破复制关系都会收到错误。
ORA-23312说明这不是主体定义站点。

SQL> connect repadmin/repadmin                                                               

Connected.

SQL> exec DBMS_REPCAT.DROP_MASTER_REPOBJECT(sname => 'scott',oname => 'dept',type => 'table');

BEGIN DBMS_REPCAT.DROP_MASTER_REPOBJECT(sname => 'scott',oname => 'dept',type => 'table'); END;

*

ERROR at line 1:

ORA-23312: not the masterdef according to TESTORA9.HURRAY.COM.CN

ORA-06512: at "SYS.DBMS_SYS_ERROR", line 86

ORA-06512: at "SYS.DBMS_REPCAT_UTL4", line 2928

ORA-06512: at "SYS.DBMS_REPCAT_UTL4", line 2720

ORA-06512: at "SYS.DBMS_REPCAT", line 643

ORA-06512: at line 1


4.使用DBMS_REPCAT.RELOCATE_MASTERDEF切换主体定义站点

SQL> BEGIN

  2  DBMS_REPCAT.RELOCATE_MASTERDEF (

  3        gname => 'rep_tt',

  4        old_masterdef => 'CONNER.HURRAY.COM.CN',

  5        new_masterdef => 'TESTORA9.HURRAY.COM.CN',

  6        notify_masters => TRUE,

  7        include_old_masterdef => FALSE);

  8  END;

  9  /

PL/SQL procedure successfully completed.


5.把原主体定义站点(CONNER.HURRAY.COM.CN)从主体库中删除

SQL> execute dbms_repcat.remove_master_databases(gname=>'rep_tt',master_list=>'CONNER.HURRAY.COM.CN');

PL/SQL procedure successfully completed.


6.复制关系打破以后,DML操作得以继续

SQL> connect scott/tiger

Connected.

SQL> select * from dept;

    DEPTNO DNAME          LOC

---------- -------------- -------------

        10 ACCOUNTING     NEW YORK

        20 RESEARCH       DALLAS

        30 SALES          CHICAGO

        40 OPERATIONS     BOSTON

        60 ORACLE         BEIJING

        70 oracle         beijing

6 rows selected.

SQL> insert into dept values (80,'oracle','beijing');

1 row created.

SQL> commit;

Commit complete.

SQL>


7.
如果原站点恢复正常后,可以再次添加到复制组中

 





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章