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
oracle 流技术(二) 单表复制
最新推荐文章于 2021-11-19 08:57:00 发布