现在的位置: 首页 > 综合 > 正文

oracle 流技术(二) 单表复制

2017年12月21日 ⁄ 综合 ⁄ 共 10939字 ⁄ 字号 评论关闭

  1                                     oracle streams 架设一个单表复制环境
  2 1. 本文中的画线工具有:vim插件sketch.vim
  3 2. 在vim中调用 :runtime! syntax/2html.vim  转换 txt 成 html
  4
  5
  6
  7 一、 初始化参数的修改
  8 1. global_names  必须为true
  9
 10      在命令行下执行:show parameter global_names
 11
 12     +------------------------------------------+
 13     |   SQL> show parameter global_names       |
 14     |                                          |
 15     |   NAME          TYPE        VALUE        |
 16     |   --------  ---------- --------------    |
 17     |   global_names   boolean     TRUE        |
 18     +------------------------------------------+
 19
 20 注:如果global_name=true你创建的数据库名应该是这种形式: db_name.db_domain 否则可以是任何形式。
 21
 22 2. job_queque_processes 必须大于2
 23
 24 查看: 在命令行下执行:
 25 show parameter job_queque_processes
 26
 27       +-----------------------------------------------+
 28       | SQL> show parameter job_queue_processes       |
 29       + NAME            TYPE        VALUE             |
 30       | ------------- ----------- ------------------  |
 31       | job_queue_processes          integer     10   |
 32       +-----------------------------------------------+
 33
 34 3. compatible 必须高于10.2.0,并且target中该参数值不能低于source database.
 35 +----------------------------------------------------+
 36 |select * from v$parameter where name='compatible';  |
 37 +----------------------------------------------------+
 38 4. streams_pool_size, 指定适当的大小 ( 建议不小于200M) ,当然如果设置了sga_target,该参数也可由系统自动调节
 39
 40
 41
 42 5. source database 必须启用归档模式
 43   +---------------------------------------+
 44   |select name, log_mode from V$database; +  
 45   +---------------------------------------+
 46                                                        -
 47 二、创建用户及搭建环境
 48
 49 这里设定我们的source数据库是oradf3(SID),target数据库是oradf2,数据库版本10204 
 50
 51 1 、 在source数据库
 52
 53 创建一个专用于streams的表空间.
 54 DF3>  create tablespace stream_tbs datafile '/oradata/oradf3/lltrade/stream01.dbf' size 200m;
 55
 56 创建streams管理用户,并授予dba权限
 57 DF3>  create user stradmin identified by stradmin default tablespace stream_tbs;
 58
 59 授予dba权限
 60 DF3>  grant dba to stradmin;
 61
 62 2. 在target数据库oradf2
 63
 64  +---------------------------------------------------+------------------------------------+
 65  | create tablespace stream_tbs datafile '/oradata/oradf2/lltrade/stream01.dbf' size 200m; |
 66  | create user stradmin identified by stradmin default tablespace stream_tbs;              |
 67  + grant dba to stradmin;                                                                  |
 68  +----------------------------------------------------------------------------------------+
 69
 70 3.  切换回source数据库,以streams的操作用户stradmin连接
 71 DF3> conn stradmin/stradmin
 72 (1) 创建连接到target的数据库链:
 73 create  database link  oradf2 connect to stradmin identified by stradmin using 'oradf2';
 74 (2) 数据库链接已创建。
 75 select sysdate from dual@oradf2;
 76
 77 SYSDATE
 78 ------------
 79 26-JAN-10
 80 (3) 创建队列
 81 DF3> exec dbms_streams_adm.set_up_queue();
 82 PL/SQL  过程已成功完成。
 83
 84 4.  切换回target数据库,以streams的操作用户stradmin连接
 85 DF2> conn stradmin/stradmin
 86 (1) 创建连接到target的数据库链:
 87 create  database link  oradf3 connect to stradmin identified by stradmin using 'oradf3';
 88 (2) 数据库链接已创建。
 89 select sysdate from dual@oradf3;
 90
 91 SYSDATE
 92 ------------
 93 26-JAN-10
 94
 95 注:在创建数据库链时,有可能不能访问,看附录A。
 96
 97
 98 三、配置复制过程
 99
100 1 、首先到source数据库
101
102   (1) 创建捕获规则
103 sott.emp是一个系统测试表。
104
105  +----------------- ------------------------------------------------+
106  |  begin                                                           |
107  |      dbms_streams_adm.add_table_rules(                           |
108  |      table_name => 'scott.emp', --可以根据实际情况创建自己的表   |
109  |      streams_type => 'capture',                                  |
110  +      streams_name => 'capture_stream',                           |
111  |      queue_name => 'stradmin.streams_queue',                     |
112  |      include_dml => true,                                        |
113  |      include_ddl => true,                                        |
114  |      inclusion_rule => true);                                    |
115  |     end;                                                         |
116  |    /                                                             |
117  +------------------------------------------------------------------+
118
119 PL/SQL  过程已成功完成。                                            
120
121  (2)创建传播规则
122 |----------------------------------------------------------------+---+
123 |    begin                                                           |
124 |       dbms_streams_adm.add_table_propagation_rules(                |
125 |       table_name => 'scott.emp',--可以根据实际情况创建自己的表     |
126 |       streams_name => 'sour_to_targ',                              +
127 |       source_queue_name => 'stradmin.streams_queue',               |
128 |       destination_queue_name => 'stradmin.streams_queue@oradf2',   |
129 |       include_dml => true,                                         |
130 |       include_ddl => true,                                         |
131 |       source_database => 'oradf3',--可以根据实际情况改变           |
132 |      inclusion_rule => true,                                       |
133 |      queue_to_queue => true);                                      |
134 |      end;                                                          |
135 |   /                                                                |
136 +--------------------------------------------------------------------+
137 PL/SQL  过程已成功完成。
138
139
140 DF3> select capture_name,status from dba_capture;
141
142 CAPTURE_NAME                   STATUS
143
144 ------------------------------ --------
145
146 CAPTURE_STREAM                 DISABLED
147
148 2.
149 切换到target数据库
150
151   (1)创建应用规则
152    |-----------------------------------------------------------------------------|
153    |        begin                                                                |
154    |           dbms_streams_adm.add_table_rules(                                 |
155    |                   table_name => 'scott.emp',--可以根据实际情况创建自己的表      |
156    |                   streams_type => 'apply',                                  |
157    |                   streams_name => 'apply_stream',                           |
158    |                   queue_name => 'stradmin.streams_queue',                   |
159    |                   include_dml => true,                                      |
160    |                   include_ddl => true,                                      |
161    |                   source_database => 'oradf3',--可以根据实际情况改变           |
162    |                   inclusion_rule => true);                                  |
163    |        end;                                                                 |
164    |        /                                                                    -
165    +-----------------------------------------------------------------------------+
166 PL/SQL  过程已成功完成。
167
168 设置起始应用的scn值
169
170 DECLARE
171     iscn  NUMBER;
172     BEGIN 
173     iscn := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER();
174     DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN@oradf2(--可以根据实际情况改变oradf2  
175     source_object_name    => 'scott.emp',--可以根据实际情况创建自己的表
176     source_database_name  => 'oradf3',--可以根据实际情况改变
177     instantiation_scn     => iscn);
178     END;
179    /
180
181 启动应用进程
182
183 DF2> exec dbms_apply_adm.start_apply('apply_stream');
184
185 PL/SQL  过程已成功完成。
186
187 JSSSTR> select apply_name,status from dba_apply;
188
189 APPLY_NAME                     STATUS
190
191 ------------------------------ --------
192
193 APPLY_STREAM                   ENABLED
194
195 3 、切换到source数据库,启动捕获进程
196
197
198 DF3> exec dbms_capture_adm.start_capture('capture_stream');
199 PL/SQL  过程已成功完成。
200
201 DF3> select capture_name,status from dba_capture;
202
203 CAPTURE_NAME                   STATUS
204
205 ------------------------------ --------
206
207 CAPTURE_STREAM                 ENABLED
208
209 四、测试
210
211 如果一切顺利,我们的streams就配置好了,下面验证一下。
212
213 DF3> select *from scott.emp where empno=7499;
214
215      EMPNO ENAME      JOB              MGR HIREDATE             COMM     DEPTNO
216
217 ---------- ---------- --------- ---------- -------------- ---------- ----------
218
219       7499 ALLEN      SALESMAN        7698 20-2 月 -81            300         30 
220
221 DF3> update scott.emp set deptno=40 where empno=7499;
222
223 已更新 1 行。
224
225 DF3> commit;
226
227 提交完成。
228
229 DF2> select * from scott.emp where empno=7499;
230
231      EMPNO ENAME      JOB              MGR HIREDATE             COMM     DEPTNO
232
233 ---------- ---------- --------- ---------- -------------- ---------- ----------
234
235       7499 ALLEN      SALESMAN        7698 20-2 月 -81            300         40 
236
237 DF3> alter table scott.emp add tmpcol varchar2(10);
238
239 表已更改。
240
241 DF2> desc scott.emp;
242
243   名称            是否为空? 类型
244
245  --------------- -------- --------------
246
247  EMPNO           NOT NULL NUMBER(4)
248
249  ENAME                    VARCHAR2(10)
250
251  JOB                      VARCHAR2(9)
252
253  MGR                      NUMBER(4)
254
255  HIREDATE                 DATE 
256
257  COMM                     NUMBER(7,2)
258
259  DEPTNO                   NUMBER(2)
260
261  TMPCOL                   VARCHAR2(10)
262
263 由以上测试可以看到,dml,ddl操作均可顺利传输并应用于target端,streams单表单向复制完成.
264
265                            +--------------+
266                            |  附录A       |
267                            +--------------+
268
269 ---------------------------文章1----------------------------
270 ORA-02085错误解决过程!            
271        今天看EYGLE的文章:http://www.eygle.com/archives/2005/06/oraclessoeaeaeo.html(Oracle高级复制的创建配置步骤-Step by Step),里面讲到了:本例的先决条件:你需要设置好相应的参数,job_queue_processes需要大于0,global_name=true,并且建立相应的db link.
272       于是我这个菜鸟便检查主数据库job_queue_processes和global_names参数,并通过alter system set global_names=true;修改global_names参数,没有任何问题!
273    然后在主数据库创建dblink:
274  create database link test_link
275   connect to myuser identified by pass
276   using 'mydb2';
277 创建过程也没有问题!但是使用dblink进行查询就出错了:
278 SQL> select count(*) from town@test_link;
279 select count(*) from town@test_link
280 ORA-02085: database link TEST_LINK connects to STIOMDB
281 SQL>
282 经过在网上搜看别人的帖子并测试发现:
283 当global_name参数设置为true,则dblink必须命名为和在目标数据库如下查询出的结果一致:                              
284  select * from global_name,例如:
285 在目标数据库执行查询:
286  
287 SQL>  select * from global_name;
288 GLOBAL_NAME
289 --------------------------------------------------------------------------------
290 mydb
291 SQL>
292  
293 则修改dblink:
294  create database link mydb  connect to myuser identified by pass  using 'mydb2';
295 然后执行查询:
296 SQL> select count(*) from town@mydb;
297   COUNT(*)
298 ----------
299      13507
300 SQL>
301
302
303 -------------------------------文章2----------------------------------
304   Q:建dblink成功,查询时报ORA-02085,寻求高手建议!
305 我在自己的机子上装了个8.1.6服务器,机子的操作系统是2000。现在要在自己的服务器上建个dblink,指向远端服务器 为此,我用dba帐户建立链接
306 create database link ora817
307 connect to lssw
308 identified by lssw
309 using 'lsjf';
310 成功建立,但执行如下查询:
311 select * from hdsc04@ora817;
312 ORA-02085: 数据库链接ora817与LSJF相连结
313 补充:我用sqlplus 能用上述帐户及连接串联到远端服务器,
314 ora817和远端的sid名一样。
315
316 查service@ora817也一样报错
317 select * from service@ora817
318 *
319 ERROR 位于第 1 行:
320 ORA-02085: 数据库链接ORA817与LSJF相连结
321 使用数据连接可以很方便的引用其它数据库的数据,但是设置不当可能遇到ORA-02085错误。如果被连接对方的GLOBAL_NAMES参数设置成了TRUE,那么要求数据库连接与对方实例名有相同的名称。这样就可以通过下面3中的任意一种方法来解决:
322 1.修改对方的GLOBAL_NAMES参数为FALSE
323 alter system set global_names = false;
324 2.将对方的GLOBAL_NAME设置成与数据库连接相同的名称
325 alter database rename global_name to new_name;
326 3.将数据库连接删掉重新创建成与对方实例名相同的数据库连接
327
328

抱歉!评论已关闭.