本文作者:
				junsansi     
				转载网址:
				
						
								
										http://www.5ienet.com/index.shtml
								
						
				
		
		
				
				 
		
				
				 
		
				
						第三部分逻辑standby(2)创建示例  2008.02.18
				
		
		
				
				
						
								    假设当前架构为一个primary+二个物理standby,我们转换其中一个物理standby 成为逻辑standby,专用于查询服务,另一个物理standby 用于执行备份操作及提供灾备。这里我们直接借用之前创建的物理standby,只演示创建过程,我们假设当前primary 数据库状态良好,没有任何不被逻辑standby 支持的对象或类型。
				
		
		
				
						
						
				 
		
				
						
								    为了方便区分当前操作的数据库,我们设置一下操作符:
				
		
		
				
						
								    SQL> set sqlprompt JSSWEB> --表示primary 数据库
    SQL> set sqlprompt JSSPDG> --表示物理standby
    SQL> set sqlprompt JSSLDG> --表示逻辑standby
				
		
		
				
						 
				
		
		
				 
		
		
				
						一、创建物理standby
				
		
		
				
				
						
								    此步跳过,如有不明,具体可参考第二部分。
				
		
		
				
						
						
				 
		
				
						
								    提示:表忘记暂停该standby 的redo 应用
				
		
		
				
						
								
										
												    JSSLDG>alter database recover managed standby database cancel;
    数据库已更改。
								
						
				
		 
		
				
				 
		
				
				
				
				
						
								
										二、设置primary数据库
								
								
						
				
		
		
				
						
						
				 
		
				
						
								    由于有前期创建物理standby 时的基础,此处primary 数据库的初始化参数可以不做修改,最重要的是不要忘记生成LogMiner 字典信息。
				
		
		
				
						
								
										
												    JSSWEB>execute dbms_logstdby.build;
    PL/SQL 过程已成功完成。
								
						
				
		 
		
				
				 
		
				
				
				
				
						三、转换物理standby为逻辑standby
				
		
		
				
				
						
								    执行下列语句,转换物理standby 为逻辑standby:
				
		
		
				
				 
		
				
						
								
										    JSSLDG>show parameter db_name;
    NAME                 TYPE        VALUE
    -------------------- ----------- --------------------
    db_name              string      jssweb
										
												
												
												
										
								
								
										
												 
										
								
								
										    JSSLDG>alter database recover to logical standby jssldg;
    
										
												数据库已更改。
												
														
														
												
										
								
								
										
												 
										
								
								
										    JSSLDG>shutdown immediate
    ORA-01507: 
										
												未装载数据库
										
										
												
    ORACLE 
										
												例程已经关闭。
												
														
														
												
										
								
								
										
												 
										
								
								
										    JSSLDG>startup mount;
    ORACLE 
										
												例程已经启动。
										
										
												
    Total System Global Area 167772160 bytes
    Fixed Size 1289484 bytes
    Variable Size 79692532 bytes
    Database Buffers 79691776 bytes
    Redo Buffers 7098368 bytes
    
										
												数据库装载完毕。
												
														
														
												
										
								
								
										
												 
										
								
								
										    JSSLDG>show parameter db_name;
    NAME                 TYPE        VALUE
    -------------------- ----------- --------------------
    db_name              string      JSSLDG
										
												
												
										
								
								
										
												 
										
								
								
										    JSSLDG>select database_role from v$database;
    DATABASE_ROLE
    ----------------
    LOGICAL STANDBY
										
												
												
										
								
								
										
										
								
						
				
		 
		
				
				 
		
				
				
						四、重建逻辑standby的密码文件
				
		
		
				
				 
		
				
						
								
										    E:\ora10g>orapwd file=e:\ora10g\product\10.2.0\db_1\database\PWDjssldg.ora password=verysafe entries=30
						
				
				
						
								    注意保持sys 密码与primary 数据库一致。
				
		 
		
				
				 
		
				
				
				
				
						
								
										五、调整逻辑standby初始化参数
								
								
						
				
		
		
				
						
						
				 
		
				
						
								    注意归档文件路径不要冲突:
				
				
						
				
		
		
				
						
								
										
												    JSSLDG>alter system set log_archive_dest_1='location=E:\ora10g\oradata\JSSLDG\arc\valid_for=(online_logfiles,all_roles) db_unique_name=JSSLDG';
    
												
														系统已更改。
														
																
																
														
												
										
										
												
														 
												
										
										
												    JSSLDG>alter system set log_archive_dest_2='location=E:\ora10g\oradata\JSSLDG\std\valid_for=(standby_logfiles,standby_role) db_unique_name=JSSLDG';
    
												
														系统已更改。
												
										
								
						
				
		 
		
				
						
						
				 
		
				
						
								    另外,由于之前我们创建JSSLDG 时并未创建standby redologs,但对于逻辑standby 的sql 应用,standbyredologs 是必须的,因此我们在此处也要为该standby 创建几组standby redologs:
				
		
		
				
						
								    JSSLDG>alter database add standby logfile group 4 ('E:\ora10g\oradata\JSSLDG\standbyrd01.log') size 20m;
    
								
										数据库已更改。
										
												
												
										
								
						
						
								 
						
						
								    JSSLDG>alter database add standby logfile group 5 ('E:\ora10g\oradata\JSSLDG\standbyrd02.log') size 20m;
    
								
										数据库已更改。
										
												
												
										
								
						
						
								 
						
						
								    JSSLDG>alter database add standby logfile group 6 ('E:\ora10g\oradata\JSSLDG\standbyrd03.log') size 20m;
    
								
										数据库已更改。
										
												
												
										
								
						
						
								 
						
						
								    JSSLDG>select member from v$logfile;
    MEMBER
    ----------------------------------------------------------
    E:\ORA10G\ORADATA\JSSLDG\REDO01.LOG
    E:\ORA10G\ORADATA\JSSLDG\REDO02.LOG
    E:\ORA10G\ORADATA\JSSLDG\REDO03.LOG
    E:\ORA10G\ORADATA\JSSLDG\STANDBYRD01.LOG
    E:\ORA10G\ORADATA\JSSLDG\STANDBYRD02.LOG
    E:\ORA10G\ORADATA\JSSLDG\STANDBYRD03.LOG
    
								
										已选择
										6 
										行。
								
						
				
		
		
				
				 
		
				
				
				
				
						六、打开逻辑standby
				
		
		
				
				
						
								    由于逻辑standby 与primary 数据库事务并不一致,因此第一次打开时必须指定resetlogs 选择,如下:
				
		
		
				
						
								
										
												
														    SQL> alter database open resetlogs;
    数据库已更改。
										
								
						
				
		 
		
				
						
						
				 
		
				
						
								    然后执行下列sql 命令应用redo 数据:
						
								
										
												    SQL> alter database start logical standby apply immediate;
    数据库已更改。
								
						
				
		 
		
				
				 
		
				
				 
		
				
						七、检查一下
				
		
		
				
						 
				
		
		
				
						
								    首先在primary 数据库执行:
				
		
		
				
						    JSSWEB> select * from jss.b;
    ID
    ----------
    1
    2
    3
    
						
								已选择
								3 
								行。
								
										
										
								
						
				
				
						
								 
						
				
				
						    JSSWEB> insert into jss.b values (4);
    
						
								已创建
								1 
								行。
								
										
										
								
						
				
				
						    JSSWEB> insert into b values (5);
    
						
								已创建
								1 
								行。
								
										
										
								
						
				
				
						    JSSWEB> insert into b values (6);
    
						
								已创建
								1 
								行。
								
										
										
								
						
				
				
						    JSSWEB> commit;
    
						
								提交完成。
								
										
										
								
						
				
				
						
								 
						
				
				
						    JSSWEB> alter system switch logfile;
    
						
								系统已更改。
						
				
		
		
				
				 
		
				
						
								    查询物理standby 的同步情况,由于物理standby 处于mount 状态,无法直接查询,因此我们需要先暂停redo应用,然后以read only 模式打开数据库再执行查询:
				
		
		
				
						
								
										    JSSPDG>alter database recover managed standby database cancel;
    
										
												数据库已更改。
												
														
														
												
										
								
								
										
												 
										
								
								
										    JSSPDG>alter database open read only;
    
										
												数据库已更改。
												
														
														
												
										
								
								
										
												 
										
								
								
										    JSSPDG>select * from jss.b;
    ID
    ----------
    1
    2
    3
    4
    5
    6
    
										
												已选择
												6 
												行。
										
								
						
						
								
										
										
										
												
												
										
								
						
						
				
		 
		
				
						
								    查询逻辑standby 的同步情况:
				
		
		
				
						
								
										
												    JSSLDG>select * from jss.b;
    ID
    ----------
    1
    2
    3
    4
    5
    6
    已选择6 行。
								
						
						
				
				
						
								    提示:细心观察,发现逻辑standby 有一点很好,从primary 接收到的redo 文件,应用过之后会自动删除,节省磁盘空间。
				
		 
		
				
						
						
				 
		
				
						
								    Ok,逻辑standby 也创建完成了,我们再回过头来回忆回忆我们最开始的假设:
				
		
		
				
						
								    对于相机拍照而言,有种傻瓜相机功能强大而操作简便,而对于素描,即使是最简单的画法,也需要相当 多的练习才能掌握。这个细节是不是也说明逻辑standby 相比物理standby 需要操作者拥有更多的操作技能呢?
				
		
		
				
						 
				
		
		
				
						
								    现在看起来,操作呢相比物理standby 是稍稍复杂了一点点,但机理呢与物理standby 大同小异,功能呢也不见的就比物理standby 强到哪里,主要是前期准备工作略嫌繁琐(尤其你的数据库系统比较宏大时,毕竟有那么多支持和不支持的数据类型/操作/语句需要dba 手工处理),这么看来,画画的仿佛是要比搞摄影的更讲究基本功啊,不过事物要辩证着看,爱好摄影的朋友千万莫因此而感\到沮丧,从实用角度看,搞摄影不知要比画画强多少倍啊,效率在那摆着呢,要出片子按下快门就成啦!对于standby 也是如此,你究竟是想要物理的,还是想要逻辑的呢,这是个问题~~~~~