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用户做示例。 需要解锁hr和system用户: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用户做示例。 需要解锁hr和system用户: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;
/
4 创建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;
/
4 测试场景
本文档建立了针对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 问题诊断
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_NUMBER、ERROR_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_NUMBER、ERROR_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.如果原站点恢复正常后,可以再次添加到复制组中