免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2557 | 回复: 4
打印 上一主题 下一主题

emp_sequence使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-09 21:23 |只看该作者 |倒序浏览
http://blog.csdn.net/zhoufoxcn/article/details/1762351

先假设有这么一个表:
create table S_Depart  (
   DepartId             INT                             not null,
   DepartName           NVARCHAR2(40)                   not null,
   DepartOrder          INT                            default 0,
   constraint PK_S_DEPART primary key (DepartId)
);



在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
1、Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
针对S_Depart创建的sequence如下:
create sequence S_S_DEPART
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;



一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值,然后返回 sequence 值
比如:
emp_sequence.CURRVAL
emp_sequence.NEXTVAL

可以使用sequence的地方:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- NSERT语句的valueS中
- UPDATE 的 SET中

可以看如下例子:
insert into S_Depart(departId,Departname,Departorder)values(S_S_Depart.Nextval,'12345',1);



SELECT empseq.currval FROM DUAL;

但是要注意的是:
- 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?

- 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

2、Alter Sequence
你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .
Alter sequence 的例子
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXvalue 10000
CYCLE -- 到10000后从头开始
NOCACHE ;


影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。

可以很简单的Drop Sequence
DROP SEQUENCE order_seq;

一个简单的例子:
create sequence SEQ_ID
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order;

建解发器代码为:

create or replace trigger tri_test_id
  before insert on S_Depart   --S_Depart 是表名
  for each row
declare
  nextid number;
begin
  IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
    select SEQ_ID.nextval --SEQ_ID正是刚才创建的
    into nextid
    from sys.dual;
    :new.DepartId:=nextid;
  end if;
end tri_test_id;
OK,上面的代码就可以实现自动递增的功能了。
分享到:
# 上一篇:本人用GDI+写的一个盒装图片(用GDI+画变形图)
# 下一篇:101个微软提供的Visual Studio 2005示例

论坛徽章:
0
2 [报告]
发表于 2011-09-09 21:25 |只看该作者
Oracle Sequence之深入浅出
2009-11-18 13:30 佚名 博客园 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

这里介绍该Oracle Sequence的owner,或者有ALTER ANY Sequence 权限才能改动Sequence. 可以alter除start至以外的所有Oracle Sequence参数.

AD:


Oracle有很多值得学习的地方,这里我们主要介绍Oracle Sequence,包括介绍Alter Sequence的例子等方面。第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前Sequence的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次 Sequence的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?

如果指定CACHE值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的Sequence就会丢失. 所以可以在create Sequence的时候用nocache防止这种情况。

Alter Sequence

你或者是该Oracle Sequence的owner,或者有ALTER ANY Sequence 权限才能改动Sequence. 可以alter除start至以外的所有Oracle Sequence参数.如果想要改变start值,必须 drop Sequence 再 re-create.

Alter Sequence 的例子

   1. ALTER SEQUENCE emp_sequence  
   2. INCREMENT BY 10  
   3. MAXvalue 10000  
   4. CYCLE -- 到10000后从头开始  
   5. NOCACHE ;  

影响Oracle Sequence的初始化参数:Sequence_CACHE_ENTRIES =设置能同时被cache的Sequence数目。

可以很简单的Drop Sequence

   1. create sequence SEQ_ID  
   2. minvalue 1  
   3. maxvalue 99999999  
   4. start with 1  
   5. increment by 1  
   6. nocache  
   7. order;

建解发器代码为:

   1. createorreplacetriggertri_test_id  
   2. beforeinsertonS_Depart--S_Depart是表名  
   3. foreachrow  
   4. declare  
   5. nextidnumber;  
   6. begin  
   7. IF:new.DepartIdISNULLor:new.DepartId=0THEN--DepartId是列名  
   8. selectSEQ_ID.nextval--SEQ_ID正是刚才创建的  
   9. intonextid  
  10. fromsys.dual;  
  11. :new.DepartId:=nextid;  
  12. endif;  
  13. endtri_test_id;

OK,上面的代码就可以实现自动递增的功能了。http://database.51cto.com/art/200911/163783.htm

在oracle下如何创建database link全面总结

物理上存放于网络的多个ORACLE数据库,逻辑上可以看成一个单一的大型数据库,用户可以通过网络对异地数据库中的数据进行存取,而服务器之间的协同处理对于工作站用户及应用程序而言是完全透明的,开发人员无需关心网络的链接细节、数据在网络节点中的具体分布情况和服务器间的协调工作过程。

数据库之间的链接建立在DATABASE LINK上。要创建一个DATABASE LINK,必须首先在建立链接的数据库上设置链接字符串,即配置一个远程数据库的本地网络服务名。

链接字符串的配置参见《客户端连接服务器》一节。


数据库全局名称可以用以下命令查出:

SELECT * FROM GLOBAL_NAME;

修改可以用以下语句来修改参数值:

ALTER SYSTEM SET GLOBAL_NAME=TRUE/FALSE;

<1>、当数据库参数global_name=false时,就不要求数据库链接名称跟远端数据库名称一样。

oracle数据库之间进行连接通讯。
创建数据库链接的语法如下:
CREATE [PUBLIC] DATABASE LINK link

CONNECT TO username IDENTIFIED BY password

USING ‘connectstring’

其中:
--demona为用net8 easy config创建的连接字符串
目的方数据库的init.ora文件中的global_names设为false
重新启动数据库设置才能生效
或者用sys用户执行

注意:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。

一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。

创建数据库链接时,还可以使用缺省登录方式,即不指定远程数据库的用户名和密码:

create public database link zrhs_link

using ‘zrhs’;

在不指定用户名和口令的情况下,ORACLE使用当前的用户名和口令登录到远程数据库。

USING后面指定的是链接字符串,也就是远程数据库的网络服务名,这个服务名保存在TNSNAMES.ORA文件中,在该文件中定义了协议、主机名、端口和数据库名。

删除数据库链接的语句是:

DROP [PUBLIC] DATABASE LINK zrhs_link

数据库链接的引用

一般情况下引用数据库链接,可以直接将其放到调用的表名或视图名称后面,中间使用一个 @ 作为分割符:

SELECT * FROM worker@zrhs_link;

对于经常使用的数据库链接,可以建立一个本地的同义词,方便使用:

CREATE SYNONYM worker_syn FOR worker@zrhs_link;

还可以建立一个本地的远程视图,方便使用:

CREATE VIEW worker AS SELECT * FROM worker@zrhs_link where… ;

现在本视图可与本地数据库中的任何其它视图一样对待,也可以授权给其它用户,访问此视图,但该用户必须有访问数据库链接的权限。

对于另外一种情况,所要访问的表不在数据库链接中指定的远程帐户下,但该帐户有访问该表的权限,那么我们在表名前要加上该表的用户名:

SELECT * FROM camel.worker@zrhs_link ;

<2>、当数据库参数global_name=true时,那就要求数据库链接名称跟远端数据库名称一样
数据库全局名称可以用以下命令查出

SELECT * FROM GLOBAL_NAME;

atabase link(dblink)--数据库链路
创建dblink的语法:
sql>create database link 数据库链路名
connect to 用户名 identified by 口令
using '主机字符串名';
如:
sql>create database link ora9i.us.oracle.com ### 这里的us.oracle.com为oracle默认域名 ###
connect to scott identified by tiger
using 'sun';

1)dblink名必须与远程数据库的全局数据库名(global_name)相同;
2)用户名,口令为远程数据库用户名,口令;
3)主机字符串为本机tnsnames.ora中定义的串;
4)两个同名的数据库间不得建立dblink;
然后,你就可以通过dblink访问远程数据库了。
如:
sql>select * from 表名@ora9i.us.oracle.com;
还可以建立快照(snapshot)通过dblink实现远程数据自动传输。

查看所有的数据库链接,进入系统管理员SQL>操作符下,运行命令:

SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK';

http://hi.baidu.com/mataoxf/blog ... 2a538e8d54306a.html
分类: DataBase
http://www.cnblogs.com/xinyuxin9 ... /01/09/1032261.html

论坛徽章:
0
3 [报告]
发表于 2011-09-09 21:28 |只看该作者
老菜鸟苦战oracle asm(1)
2011-07-27 10:40 田逸 b.formyz.org/ 我要评论(0) 字号:T | T
一键收藏,随时查看,分享好友!

oracle asm磁盘标签丢失导,而致整个集群和数据库启动失败。该如何排除故障呢?本文作者田逸将通过亲身经历来为您讲解“老菜鸟”如何苦战oracle asm

AD:


应用环境描述

一、硬件

1、 服务器:2台dell r610—16G内存、2颗6核xeon cpu、2个146G sas盘,做了raid1

2、 存储:dell MD3220 24个300G硬盘

3、 存储连接:6GB HBA卡,2个通道都连线了

二、软件

1、 系统:64位centos 5.5

2、 系统内核版本:Linux rac1 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

3、 asm软件racleasm-2.6.18-194.el5-2.0.5-1.el5.x86_64.rpm、oracleasm-support- 2.1.7-1.el5.x86_64.rpm、oracleasmlib-2.0.4-1.el5.x86_64.rpm

4、 数据库软件:linux.x64_11gR2_database_1of2.zip、linux.x64_11gR2_database_2of2.zip

5、 集群软件:linux.x64_11gR2_grid.zip

故障描述

一、故障前的情况:

1、 集群实例正常运行

2、 asm能用asmcmd查看目录和文件

3、 数据库实例正常

4、 监听器正常

5、 客户端远程连接正常

6、 多路径访问正常

7、 /dev/oracleasm/disks目录的下的文件全部存在

二、故障的起因:

1、 打算模拟服务器失效

2、 直接重启两个服务器 init 6

三、故障现象:

1、 两个服务器的asm实例都没有启动成功

2、 两个服务器的oracle实例都没有启动成功

3、 Crs等进程启动几个,但基本上不能正常工作

4、 手动启动crs,失败

5、 以grid用户手动连接实例,强制启动,失败
http://os.51cto.com/art/201107/278841.htm

Oracle数据库自动存储管理(ASM)
http://www.sina.com.cn 2008年06月20日 09:55  《程序员》
出处:IT专家网
关于ASM的讨论很多,但是到底什么是ASM?ASM是一个有效的抽象层,使你的Oracle数据库可以与叫做diskgroups的抽象空间一起使用,而不是直接使用datafiles。这带来了很多好处,但是也要求学习一些新的概念、命令、使用和管理任务。所以在投入你的生产系统之前,看看它解决什么、管理什么,以及对它的正反面评价。

  为什么创建它?

  回答这个问题的最好方式是直接追溯源头,Bill Bridge——自动存储管理的最初架构师。在Oracle Press标题中的Oracle ASM,Bill提供了一个链接,他在那里讨论了使用供应商特定操作系统的文件系统来管理Oracle数据文件放置所遇到的问题:

  1. 对于归档日志和备份,操作系统供应商不提供共享磁盘文件系统。

  2. 逻辑卷管理器隐藏了文件的位置,使得很难管理磁盘I/O和提供良好的统计。

  3. 当磁盘数超过100时,现有的lvm不能工作得很好。

  4. 当数据库有1000以上的数据文件时,操作系统和Oracle不能很好地处理数据库。

  5. 当有大量数据文件时命名就变得很困难了。

  6. 特性和文件系统限制随操作系统的不同而不同。

  7. 操作系统级的用户可以通过标准使用接触到Oracle文件,而Oracle并不知道。

  所以,他通过建立Oracle自己的文件系统开始解决这些问题。他的目标是提供这些特性:

  1. 与Oracle紧密集成,并与集群一起使用(并行服务器)。

  2. 自动使用新的存储,作为磁盘单元或磁盘组来管理。

  3. 支持成千上万的磁盘。

  4. 文件不会名字,并会在操作系统中隐藏起来。

  谁需要它?

  现在快速浏览一下上面那些问题和解决方案会帮助你确定谁需要ASM。起初,它是用来处理现在很大型的联机数据库。所以如果它包括你的商店,那么你可能已经在关注它了,或者开始执行ASM。如果你的数据库较小,数据文件也不多,那么你可能需要再一些理由使你考虑采用它。

  1. 你将要熟悉一些新技术,并且应该从在你的开发环境中建立它开始,并测试几个月。

  2. 如果你想从你现有的磁盘子系统中获得更高的性能,并获得更好的统计用于预测磁盘I/O。

  3. 如果你正在使用RAC,那么就需要考虑ASM了。

开始

  ASM是由一个实例管理,非常类似于Oracle数据库。但是初始参数是非常有限的,而且启动过程也简单得多。

  a. 将你的ORACLE_SID设置为+ASM1

  b. 编辑init.ora


  # as opposed to RDBMS for a normal Oracle instance
  INSTANCE_TYPE=ASM
  # these names will be used in place of datafile names when you create tablespaces
  ASM_DISKGROUPS=SEAN, AARON
  processes=100
  # this parameter is platform specific and is the path to the raw disk device
  ASM_DISKSTRING='/dev/cciss/c0d0p1'
  # on 11g you should use diagnostic_dest instead of these
  background_dump_dest=/opt/oracle/admin/+ASM/bdump'
  core_dump_dest=/opt/oracle/admin/+ASM/cdump'
  user_dump_dest=/opt/oracle/admin/+ASM/udump'

  c. 启动ASM实例

  $ sqlplus / as sysdba
  SQL> startup


  d. 创建磁盘组

  SQL> create diskgroup SEAN disk '/dev/cciss/c0d0p1';

  e. 检查表空间的创建

  你可能会猜测,创建一个表空间会有轻微的改变。默认方法如下所示:

  SQL> create tablespace sean_space datafile ‘+SEAN’ size 1GB;

  不过想一下这个很好的特性。如果在你的数据库中init.ora文件你设置参数为:

db_create_file_dest=+SEAN

  那么你可以这样做:

  SQL> create tablespace sean_space;

  然后让Oracle做其余的工作。在这两种情形下,你将发现在v$datafile中列出的文件路径是和抽象的+SEAN 磁盘组有关,而不是与一个实际的操作系统数据文件。

  f. 更多的

  当然简化文件名称和表空间的创建只是ASM可以为你做的工作的冰山一角。它还可以提供一个冗余级别。

  在数据库方面,外部冗余能力主要是当你在硬件级别(RAID)上或Oracle可以看到的其它外部方法中具有冗余。换句话说,如果asm_diskstring设备是它们自己的逻辑,隐藏物理磁盘于一些冗余的硬件层后面,那么你就会有外部冗余能力。

  但是,如果你没有这个冗余能力,那么ASM可以提供。你可以指定冗余、失败组和一组其它的选项来防止损失一个或多个磁盘、控制器或甚至是整个SAM失效。ASM还提供了在磁盘组中均匀分布的I/O。因为ASM很好的了解背后发生了什么,所以Oracle可以自动的为你提供I/O到磁盘的一个更好的平衡。

  使用ASM遇到的挑战

  ASM当然是一个具有很大潜能的强大技术。但是对于每一个技术解决方案,都会有很多的挑战。对于ASM,它潜在地破坏了Unix系统管理组和数据库/数据库管理员组间力量的普通平衡。以前的组管理磁盘、硬件和操作系统级别,使数据库管理员与它们协作获取新的资源。这将在某种程度上挑战这个平衡,而这会引起一些来自于这个组的阻力。

  最后,应该是业务需求促使了它的采用。还要注意到ASM仍然是处于企业计算认识阶段,相对还比较新。有一些供应商他们的核心业务已经放在逻辑空间管理器/文件系统空间中很多年了。一般来说,对于软件系统和可靠性来说成熟是很重要的。

  总结

  ASM很强大,它为目前部署的不断发展的大型数据库系统提供了解决方案。它还可以为较小数据库安装或者那些使用集群的数据库提供解决方案。如同对于任何新技术一样,评估、测试,然后更多的测试。

论坛徽章:
0
4 [报告]
发表于 2011-09-09 21:31 |只看该作者
Oracle Stream功能是为提高数据库的高可用性而设计的,在Oracle 9i及之前的版本这个功能被称为Advance Replication。Oracle Stream利用高级队列技术,通过解析归档日志,将归档日志解析成DDL及DML语句,从而实现数据库之间的同步。这种技术可以将整个数据库、数据库中的对象复制到另一数据库中,通过使用Stream的技术,对归档日志的挖掘,可以在对主系统没有任何压力的情况下,实现对数据库对象级甚至整个数据库的同步。

    解析归档日志这种技术现在应用的比较广泛,Quest公司的shareplex软件及DSG公司的realsync都是这样的产品,一些公司利用这样的产品做应用级的容灾。但shareplex或是realsync都是十分昂贵的,因此你可以尝试用Stream这个Oracle提供的不用额外花钱的功能。 Oracle Stream对生产库的影响是非常小的,从库可以是与主库不同的操作系统平台,你可以利用Oracle Stream复制几个从库,从库可用于查询、报表、容灾等不同的功能。本文不谈技术细节,只是以手把手的方式一步一步的带你把Stream的环境搭建起来,细节内容可以查联机文档。

2 概述
主数据库:

操作系统:Solaris 9
IP地址:192.168.10.35
数据库:Oracle 10.2.0.2
ORACLE_SID:prod
Global_name:prod

从数据库:
操作系统:AIX 5.2
IP地址:192.168.10.43
数据库:Oracle 10.2.0.3
ORACLE_SID:h10g
Global_name:h10g


3 环境准备
3.1 设定初始化参数
使用pfile的修改init<SID>.ora文件,使用spfile的通过alter system命令修改spile文件。主、从数据库分别执行如下的语句:
Sqlplus ‘/ as sysdba’
alter system set aq_tm_processes=2 scope=both;
alter system set global_names=true scope=both;
alter system set job_queue_processes=10 scope=both;
alter system set parallel_max_servers=20 scope=both;
alter system set undo_retention=3600 scope=both;
alter system set nls_date_format='YYYY-MM-DD HH24:MI:SS' scope=spfile;
alter system set streams_pool_size=25M scope=spfile;
alter system set utl_file_dir='*' scope=spfile;
alter system set open_links=4 scope=spfile;

执行完毕后重启数据库。
3.2 将数据库置为归档模式
设置log_archive_dest_1到相应的位置;设定log_archive_start为TRUE,即启用自动归档功能;设定log_archive_format指定归档日志的命令格式。
举例:
sqlplus ‘/ as sysdba’
alter system set log_archive_dest_1=’location=/yang/arch’ scope=spfile;
alter system set log_archive_start=TRUE scope=spfile;
alter system set log_archive_format=’ arch%t_%s_%r.arc’ scope=spfile;
shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

数据库置为归档模式后,可以按如下方式检验一下:
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /yang/arch
Oldest online log sequence 534
Next log sequence to archive 536
Current log sequence 536

观注标红的部分。

3.3 创建stream 管理用户
3.3.1 创建主环境stream管理用户
#以sysdba身份登录
connect / as sysdba

#创建主环境的Stream专用表空间
create tablespace tbs_stream datafile '/yang/oradata/prod/tbs_stream01.dbf'
size 100m autoextend on maxsize unlimited segment space management auto;

#将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间
execute dbms_logmnr_d.set_tablespace('tbs_stream');

#创建Stream管理用户
create user strmadmin identified by strmadmin
default tablespace tbs_stream temporary tablespace temp;

#授权Stream管理用户
grant connect,resource,dba,aq_administrator_role to strmadmin;

begin
dbms_streams_auth.grant_admin_privilege(
grantee => 'strmadmin',
grant_privileges => true);
end;
/
3.3.2 创建从环境stream管理用户
#以sysdba身份登录
connect / as sysdba

#创建Stream专用表空间,我的从库用了ASM,这一步也可以参见3.3.1
create tablespace tbs_stream datafile '+VGDATA/h10g/datafile/tbs_stream01.dbf'
size 100m autoextend on maxsize unlimited segment space management auto;
#同样,将logminer的数据字典从system表空间转移到新建的表空间,防止撑满system表空间
execute dbms_logmnr_d.set_tablespace('tbs_stream');

#创建Stream管理用户
create user strmadmin identified by strmadmin
default tablespace tbs_stream temporary tablespace temp;

#授权Stream管理用户
grant connect,resource,dba,aq_administrator_role to strmadmin;

begin
dbms_streams_auth.grant_admin_privilege(
grantee => 'strmadmin',
grant_privileges => true);
end;
/

3.4 配置网络连接
3.4.1配置主环境tnsnames.ora
主数据库(tnsnames.ora)中添加从数据库的配置。
H10G =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.43)(PORT = 1521))
)
(CONNECT_DATA =
(SID = h10g)
(SERVER = DEDICATED)
)
)
3.4.2配置从环境tnsnames.ora
从数据库(tnsnames.ora)中添加主数据库的配置。
PROD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.35)(PORT = 1521))
)
(CONNECT_DATA =
(SID = prod)
(SERVER = DEDICATED)
)
)

3.5 启用追加日志
可以基于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.6 创建DBlink
根据Oracle 10gR2 Stream官方文档,针对主数据库建立的数据库链的名字必须和从数据库的global_name相同。
如果需要修改global_name,执行“alter database rename global_name to xxx”。
3.6.1创建主数据库数据库链
#以strmadmin身份,登录主数据库。
connect strmadmin/strmadmin
#建立数据库链
create database link h10g connect to strmadmin identified by strmadmin using 'h10g';
3.6.2创建从数据库数据库链
#以strmadmin身份,登录从数据库。
connect strmadmin/strmadmin
#建立数据库链
create database link prod connect to strmadmin identified by strmadmin using 'prod';
3.7 创建流队列
3.7.1创建Master流队列
#以strmadmin身份,登录主数据库。
connect strmadmin/strmadmin

begin
dbms_streams_adm.set_up_queue(
queue_table => 'prod_queue_table',
queue_name => 'prod_queue');
end;
/
3.7.2创建Backup流队列
#以strmadmin身份,登录从数据库。
connect strmadmin/strmadmin

begin
dbms_streams_adm.set_up_queue(
queue_table => 'h10g_queue_table',
queue_name => 'h10g_queue');
end;
/

3.8 创建捕获进程
#以strmadmin身份,登录主数据库。提醒一下,本文档以hr用户做示例。
connect strmadmin/strmadmin

begin
dbms_streams_adm.add_schema_rules(
schema_name => 'hr',
streams_type => 'capture',
streams_name => 'capture_prod',
queue_name => 'strmadmin.prod_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => null,
inclusion_rule => true);
end;
/
3.9 实例化复制数据库
在主数据库环境中,执行如下Shell语句。如果从库的hr用户不存在,建立一个hr的空用户。
exp userid=hr/hr@prod file='/tmp/hr.dmp' object_consistent=y rows=y

imp userid=system/manager@h10g file='/tmp/hr.dmp' ignore=y commit=y log='/tmp/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 => 'prod_to_h10g',
source_queue_name => 'strmadmin.prod_queue',
destination_queue_name => 'strmadmin.h10g_queue@h10g',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'prod',
inclusion_rule => true);
end;
/

#修改propagation休眠时间为0,表示实时传播LCR。
begin
dbms_aqadm.alter_propagation_schedule(
queue_name => 'prod_queue',
destination => 'h10g',
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_h10g',
queue_name => 'strmadmin.h10g_queue',
include_dml => true,
include_ddl => true,
include_tagged_lcr => false,
source_database => 'prod',
inclusion_rule => true);
end;
/
3.12 启动STREAM
#以strmadmin身份,登录从数据库。
connect strmadmin/strmadmin

#启动Apply进程
begin
dbms_apply_adm.start_apply(
apply_name => 'apply_h10g');
end;
/

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

#启动Capture进程
begin
dbms_capture_adm.start_capture(
capture_name => 'capture_prod');
end;
/
3.13 停止STREAM
#以strmadmin身份,登录主数据库。
connect strmadmin/strmadmin

#停止Capture进程
begin
dbms_capture_adm.stop_capture(
capture_name => 'capture_prod');
end;
/

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

#停止Apply进程
begin
dbms_apply_adm.stop_apply(
apply_name => 'apply_h10g');
end;
/
3.14 清除所有配置信息
要清楚Stream配置信息,需要先执行3.13,停止Stream进程。

#以strmadmin身份,登录主数据库。
connect strmadmin/strmadmin
exec DBMS_STREAMS_ADM.remove_streams_configuration();

#以strmadmin身份,登录从数据库。
connect strmadmin/strmadmin
exec DBMS_STREAMS_ADM.remove_streams_configuration();

4 测试场景
    本文档建立了针对hr用户的Stream 复制环境,如果没有特别声明,以下测试场景均以hr用户身份执行。
4.1 建一张表测试
主数据库
SQL> CREATE TABLE TTT(id NUMBER PRIMARY KEY,
2 name VARCHAR2(50)
3 )
4 /

Table created.

从数据库
SQL> desc TTT
Name Null? Type
---------- -------- -------------
ID NOT NULL NUMBER
NAME VARCHAR2(50)
4.2 表中插入一行数据
主数据库
SQL> insert into ttt values (1,'sdfsdfsdfsdf');
1 row created.
SQL> commit;
Commit complete.

SQL>
从数据库
SQL> select * from TTT;
ID NAME
---------- --------------------
1 sdfsdfsdfsdf
4.3 变更一下表的结构,添加一列
主数据库
SQL> ALTER TABLE TTT ADD(age NUMBER(2));
Table altered

从数据库
SQL> desc TTT
Name Null? Type
----------- -------- --------------
ID NOT NULL NUMBER
NAME VARCHAR2(50)
AGE NUMBER(2)
4.4 将表换一个表空间
主数据库
SQL> SELECT table_name,tablespace_name FROM user_tables
2    WHERE table_name='TTT';

TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TTT USERS

SQL> ALTER TABLE TTT MOVE TABLESPACE tbs_stream;
Table altered

SQL> SELECT table_name,tablespace_name FROM user_tables
   WHERE table_name='TTT';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TTT TBS_STREAM

从数据库
SQL> SELECT table_name,tablespace_name FROM user_tables
   WHERE table_name='TTT';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TTT TBS_STREAM
4.5 表上Name列建一索引
主数据库
SQL> CREATE INDEX ttt_name_idx ON TTT(name);
Index created

从数据库
SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TTT';
TABLE_NAME INDEX_NAME
------------------------------     ------------------------------
TTT TTT_NAME_IDX
TTT SYS_C005721

4.6 Rebuild索引测试
主数据库
SQL> ALTER INDEX ttt_name_idx REBUILD;
Index altered

从数据库
SQL> SELECT table_name, index_name FROM user_indexes WHERE table_name = 'TTT';
TABLE_NAME INDEX_NAME
------------------------------     ------------------------------
TTT TTT_NAME_IDX
TTT SYS_C005721

4.7 索引换一个表空间测试
主数据库
SQL> ALTER INDEX ttt_name_idx REBUILD TABLESPACE tbs_stream;
Index altered

从数据库
SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes
   WHERE table_name = 'TTT';

TABLE_NAME INDEX_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TTT TTT_NAME_IDX TBS_STREAM
TTT SYS_C005721 USERS

4.8 删除索引测试
主数据库
SQL> DROP INDEX ttt_name_idx;
Index dropped

从数据库
SQL> SELECT table_name,index_name,tablespace_name FROM user_indexes
   WHERE table_name = ‘TTT’;

TABLE_NAME INDEX_NAME TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TTT SYS_C005721 USERS
4.9 删除表测试
主数据库
SQL> DROP TABLE ttt;
Table dropped

从数据库
SQL> DESC ttt;
Object ttt does not exist.

4.10 建一张带有LOB类型字段的表测试
主数据库
SQL> CREATE TABLE tttclob(id NUMBER PRIMARY KEY, memo CLOB);
Table created

从数据库
SQL> DESC tttclob;
Name Null? Type
----------- -------- --------------
ID NOT NULL NUMBER
MEMO CLOB

4.11 表中插入一行数据
主数据库
SQL> INSERT INTO tttclob VALUES(1,'clob_test');
1 row inserted
SQL> commit;
Commit complete

从数据库
SQL> SELECT * FROM tttclob;

ID MEMO
---------- --------------------------------------------------------------------------------
1 clob_test

4.12 创建Type测试
主数据库
SQL> CREATE or REPLACE TYPE ttttype;
2 /
Type created

从数据库
SQL> SELECT * FROM user_types WHERE type_name='TTTTYPE';
TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID
------------------------------ -------------------------------- ------------------------------ ---------- ---------- ---------- ---------- ----- ------------ ------------------------------ ------------------------------ ---------------- ------------- --------------------------------
TTTTYPE 1B36AAF10DA8301DE040A8C0289A77B4 OBJECT 0 0 NO YES YES YES

4.13 删除Type测试
主数据库
SQL> DROP TYPE ttttype;
Type dropped

从数据库
SQL> SELECT * FROM user_types WHERE type_name='TTTTYPE';
TYPE_NAME TYPE_OID TYPECODE ATTRIBUTES METHODS PREDEFINED INCOMPLETE FINAL INSTANTIABLE SUPERTYPE_OWNER SUPERTYPE_NAME LOCAL_ATTRIBUTES LOCAL_METHODS TYPEID
------------------------------ -------------------------------- -

5 问题诊断
5.1 如何知道捕捉(Capture)进程是否运行正常?
以strmadmin身份,登录主数据库,执行如下语句:
SQL> SELECT CAPTURE_NAME,
2 QUEUE_NAME,
3 RULE_SET_NAME,
4      NEGATIVE_RULE_SET_NAME,
5 STATUS
6 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
2 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错误信息。

6 结篇
    通过如上的测试可以看出stream的功能还是十分强大的,通过配置Oracle Stream可以更大的提升数据库的可用性和安全性,如此一个好用且不用花费高昂额外费用的功能还是很值得一用的。

http://jingh3209.blog.163.com/blog/static/15696672008758438641/

论坛徽章:
5
天蝎座
日期:2014-01-23 12:27:392015亚冠之德黑兰石油
日期:2015-05-14 13:33:042015年亚洲杯之乌兹别克斯坦
日期:2015-03-06 14:10:38天秤座
日期:2014-01-24 15:03:052015亚冠之德黑兰石油
日期:2015-08-27 13:43:58
5 [报告]
发表于 2011-09-10 22:23 |只看该作者
个人总结还是转贴?标题里面注明一下比较好吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP