给你一个例子COPY FROM &1 TO &2 REPLACE DF_METER_WRITE_S_BAK -
USING -
SELECT * -
FROM DF_METER_WRITE_S -
WHERE DEAL_TIME > &3 ;
---==2.删除已有的数据===========================------
DELETE FROM DF_METER_WRITE_S A
WHERE (A.USER_NO,A.MONTH,A.MEASURE_POS_NO,A.FUNCTION_CODE,A.BEFORE_FLAG) IN
( SELECT B.USER_NO,B.MONTH,B.MEASURE_POS_NO,B.FUNCTION_CODE,B.BEFORE_FLAG
FROM DF_METER_WRITE_S_BAK B );
COMMIT ;
---==3.生成更新的数据===========================------
COPY FROM &2 TO &2 APPEND DF_METER_WRITE_S -
USING -
SELECT * -
FROM DF_METER_WRITE_S_BAK ;
--==4.删除临时表================================------
DROP TABLE DF_METER_WRITE_S_BAK;
USING -
SELECT * -
FROM DF_METER_WRITE_S -
WHERE DEAL_TIME > &3 ;
---==2.删除已有的数据===========================------
DELETE FROM DF_METER_WRITE_S A
WHERE (A.USER_NO,A.MONTH,A.MEASURE_POS_NO,A.FUNCTION_CODE,A.BEFORE_FLAG) IN
( SELECT B.USER_NO,B.MONTH,B.MEASURE_POS_NO,B.FUNCTION_CODE,B.BEFORE_FLAG
FROM DF_METER_WRITE_S_BAK B );
COMMIT ;
---==3.生成更新的数据===========================------
COPY FROM &2 TO &2 APPEND DF_METER_WRITE_S -
USING -
SELECT * -
FROM DF_METER_WRITE_S_BAK ;
--==4.删除临时表================================------
DROP TABLE DF_METER_WRITE_S_BAK;
解决方案 »
- W7安装完oracle10g后,创建数据库,去提示对快捷方式下引用的项目权限不够!!!!安装中,我是修改了文件夹属性下的用户完全控制权限。
- 网页程序的问题
- 已有一个SQL存储过程,求一个与之功能一样的ORACLE存储过程?
- 在oracle9i数据库中创建sequence时,cache关键字是什么意思
- 关于类型的一个小问题
- 紧急求助,spool到处文本换行问题,在线等。。。
- 请问这段SQL怎么写,在线等!答案正确马上给分!
- 购买oracle正版的时候应该注意什么问题呢?怎么和集成商谈?
- 请教怎么写批处理文件,用于建用户和表空间?很着急,请大家帮忙啊~~~
- 请教,我单位有两个管理系统,后台为Oracel 7.3单机版数据库支持(急呀,谢谢)
- [求救] VisualStudio.net2002+Oracle9i开发中OraOLEDB.Oracle.1的问题,高手帮忙!
- 急,哪位高手知道哪有ORACLE TOAD工具下载
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96567/toc.htm
最近在网上找到一些相应的资料,利用oracle的快照功能进行不同数据库之间的同步复制,但设置非常麻烦,一不留神,就会出错,整理后,大致步骤如下:希望大家看了后,提出新的见解 1、数据库支持高级复制功能
您可以用system身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持。
2、数据库初始化参数要求
①、db_domain = test.com.cn
指明数据库的域名(默认的是WORLD),这里可以用您公司的域名。
②、global_names = true
它要求数据库链接(database link)和被连接的数据库名称一致。
现在全局数据库名:db_name+”.”+db_domain
③、有跟数据库job执行有关的参数
job_queue_processes = 1 定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。
job_queue_interval = 60 定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。
distributed_transactions = 10
open_links = 4 如果修改了以上这几个参数,需要重新启动数据库以使参数生效。 数据库名 ying orcl
数据库域名 test.com.cn test.com.cn
数据库sid号 ying orcl
Listener端口号 1521 1521
服务器ip地址 10.10.3.76 10.10.3.74 2、改数据库全局名称,建公共的数据库链接。
①、用system身份登录ying数据库
alter database rename global_name to ying.test.com.cn
用system身份登录orcl数据库:
alter database rename global_name to orcl.test.com.cn ②、用system身份登录ying数据库
create public database link ying.test.com.cn using 'ying';
select * from [email protected]
用system身份登录orcl数据库:
create public database link orcl.test.com.cn using 'orcl'
select * from [email protected] 3、建立管理数据库复制的用户repadmin,并赋权。
①、用system身份登录ying数据库
create user repadmin identified by repadmin default tablespace users temporary tablespace temp
begin
dbms_defer_sys.register_propagator('repadmin');
end;
grant execute any procedure to repadmin;
begin
dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
end;
grant comment any table to repadmin;
grant lock any table to repadmin; ②、同样用system身份登录orcl数据库,运行以上的命令,管理数据库复制的用户repadmin,并赋权。
create user repadmin identified by repadmin default tablespace users temporary tablespace temp
begin
dbms_defer_sys.register_propagator('repadmin');
end;
grant execute any procedure to repadmin;
begin
dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
end;
grant comment any table to repadmin;
grant lock any table to repadmin; *********************************************************************
说明:repadmin用户名和密码可以根据用户的需求自由命名。
*********************************************************************
①、用repadmin身份登录ying数据库
create database link orcl.test.com.cn connect to repadmin identified by repadmin;
select * from [email protected]; --测试
②、用repadmin身份登录orcl数据库
create database link ying.test.com.cn connect to repadmin identified by repadmin;
select * from [email protected]; --测试 5、创建或选择实现数据库复制的用户和对象,给用户赋权,数据库对象必须有主关键字。
假设我们用ORACLE里举例用的water用户,t_file_all表。
①、用internal身份登录ying数据库,创建water用户并赋权
SQL>create user water identified by water default tablespace water temporary tablespace water;
SQL>grant connect, resource to water;
SQL>grant execute on sys.dbms_defer to water;
②、用water身份登录ying数据库,创建表t_file_all
③、如果数据库对象没有主关键字,可以运行以下SQL命令添加:
alter table t_file_all add (constraint t_file_all_key primary key (t_file_all_id));
④、在ying数据库water用户下创建主关键字的序列号,范围避免和orcl的冲突。
⑤、在ying数据库water用户下插入初始化数据
⑥、在orcl数据库那边同样运行以上①,②,③
⑦、在orcl数据库water用户下创建主关键字的序列号,范围避免和water的冲突。
⑧、在beijing数据库scott用户下插入初始化数据 6、创建要复制的组water_t_file_all,加入数据库对象,产生对象的复制支持
①、用repadmin身份登录ying数据库,创建主复制组water_t_file_all
begin
dbms_repcat.create_master_repgroup('water_t_file_all');
end;
②、在复制组scott_mg里加入数据库对象
begin
dbms_repcat.create_master_repobject
(sname=>'water',oname=>'t_file_all',
type=>'table',use_existing_object=>true,
gname=>'water_t_file_all'
);
end;
*******************************
参数说明:
sname 实现数据库复制的用户名称
oname 实现数据库复制的数据库对象名称
(表名长度在27个字节内,程序包名长度在24个字节内)
type 实现数据库复制的数据库对象类别
(支持的类别:表,索引,同义词,触发器,视图,过程,函数,程序包,程序包体)
use_existing_object true表示用主复制节点已经存在的数据库对象
gname 主复制组名
*******************************
③、对数据库对象产生复制支持
begin
dbms_repcat.generate_replication_support('water','t_file_all','table');
end;
(说明:产生支持water用户下t_file_all表复制的数据库触发器和程序包)
④、确认复制的组和对象已经加入数据库的数据字典
select gname, master, status from dba_repgroup --测试
select * from dba_repobject --测试 7、创建主复制节点
①、用repadmin身份登录ying数据库,创建主复制节点
begin
dbms_repcat.add_master_database
(gname=>'water_t_file_all',
master=>'orcl.test.com.cn',
use_existing_objects=>true,
copy_rows=>false,
propagation_mode => 'asynchronous');
end;
**********************************************
参数说明:
gname 主复制组名
master 加入主复制节点的另一个数据库
use_existing_object true表示用主复制节点已经存在的数据库对象
copy_rows false表示第一次开始复制时不用和主复制节点保持一致
propagation_mode 异步地执行
***********************************************
select * from user_jobs; --测试是否在复制任务中 8、使同步组的状态由停顿(quiesced )改为正常(normal)
①、用repadmin身份登录ying数据库,运行以下命令
begin
dbms_repcat.resume_master_activity('water_t_file_all',false);
end;
--不行用该命令
begin
dbms_repcat.resume_master_activity('water_t_file_all',true);
end;
--测试同步是否正常(status为normal)
select gname, master, status from dba_repgroup 9、创建复制数据库的时间表,我们假设用固定的时间表:1分钟复制一次。
①、用repadmin身份登录ying数据库,运行以下命令
begin
dbms_defer_sys.schedule_push (
destination => 'orcl.test.com.cn',
interval => 'sysdate + 1/(60*24)', --每隔1分钟
next_date => sysdate);
end;
/
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/(60*24)',
delay_seconds => 0,
rollback_segment => '');
end; ②、用repadmin身份登录orcl数据库,运行以下命令
begin
dbms_defer_sys.schedule_push (
destination => 'ying.test.com.cn',
interval => 'sysdate + 1/(60*24)', --每隔1分钟
next_date => sysdate);
end;
/
begin
dbms_defer_sys.schedule_purge (
next_date => sysdate,
interval => 'sysdate + 1/(60*24)', --每隔1分钟
delay_seconds => 0,
rollback_segment => '');
end; 10、添加或修改两边数据库的记录,跟踪复制过程
如果你想立刻看到添加或修改后数据库的记录的变化,可以在两边repadmin用户下找到push的job_number,然后运行:
SQL>exec dbms_job.run(job_number); 三、异常情况的处理
1、检查复制工作正常否,可以在repadmin 用户下查询user_jobs
SQL>select job,this_date,next_date,what, broken from user_jobs;
正常的状态有两种:
任务闲——this_date为空,next_date为当前时间后的一个时间值
任务忙——this_date不为空,next_date为当前时间后的一个时间值
异常状态也有两种:
任务死锁——next_date为当前时间前的一个时间值
任务死锁——next_date为非常大的一个时间值,例如:4001-01-01 2、增加或减少复制组的复制对象
①、停止主数据库节点的复制动作,使同步组的状态由正常(normal)改为停顿(quiesced )
用repadmin身份登录ying数据库,运行以下命令
begin
dbms_repcat.suspend_master_activity (gname => 'water_t_file_all');
end; ②、在复制组water_t_file_all里加入数据库对象,保证数据库对象必须有主关键字。
begin
dbms_repcat.create_master_repobject(
sname=>'water',oname=>'t_file_type', type=>'table',
use_existing_object=>true,
gname=>'water_t_file_all'
);
end;
对加入的数据库对象产生复制支持
begin
dbms_repcat.generate_replication_support('water','t_file_type','table');
end; ③、在复制组water_t_file_all里删除数据库对象。
begin
dbms_repcat.drop_master_repobject ('water','t_file_all','table');
end; ④、重新使同步组的状态由停顿(quiesced )改为正常(normal)。
begin
dbms_repcat.resume_master_activity('water_t_file_all',false);
end;
据库。用户可以通过网络对异地数据库中的数据同时进行存取,而服务器之间
的协同处理对于工作站用户及应用程序而言是完全透明的:开发人员无需关心
网络的链接细节、无需关心数据在网络接点中的具体分布情况、也无需关心服
务器之间的协调工作过程。 数据库之间的链接建立在DATABASE LINK上。要创建一个DB LINK,必须先
在每个数据库服务器上设置链接字符串。 例如,深圳SUN平台ORACLE数据库,在/var/opt/oracle/tnsnames.ora中有以下
一条和北京的数据库链接tobeijing,格式如下: 链接字符串的设置 说 明
tobeijing=(description= database link名称:tobeijing
(address=(protocol=tcp) 采用tcp/ip协议
(host=www.bj.col.com.cn) 欲链接主机名称或IP地址
(port=1521)) 网络端口1521
(connect_data=(sid=oracle7))) 安装ORACLE采用的sid 然后进入系统管理员SQL>操作符下,运行命令: SQL>create public database link beijing connect to scott identified by tiger
using 'tobeijing'; 则创建了一个以scott用户和北京数据库的链接beijing,我们查询北京的scott数据: SQL>select * from emp@beijing; 这样就可以把深圳和北京scott用户的数据做成一个整体来处理。 为了使有关分布式操作更透明,ORACLE数据库里有同义词的对象synonym SQL>create synonym bjscottemp for emp@beijing; 于是就可以用bjscottemp来替代带@符号的分布式链接操作emp@beijing。 查看所有的数据库链接,进入系统管理员SQL>操作符下,运行命令: SQL>select owner,object_name from dba_objects where object_type='DATABASE LINK'; 建ORACLE快照日志:
SQL>create snapshot log on table3 with primary key; 建快照:
SQL>create snapshot table3beijing refresh force start with sysdate
next sysdate+1/24 with primary key as select * from table3@beijing; ORACLE的快照刷新方式refresh有三种: fast 快速刷新,用snapshot log,只更新时间段变动部分
complete 完全刷新,运行SQL语句
force 自动判断刷新,介于fast和complete之间
一、实现数据库复制的前提条件
1、数据库支持高级复制功能
您可以用system身份登录数据库,查看v$option视图,如果其中Advanced replication为TRUE,则支持高级复制功能;否则不支持。
2、数据库初始化参数要求
①、db_domain = test.com.cn (可以不设)
指明数据库的域名(默认的是WORLD),这里可以用您公司的域名。
②、global_names = true
它要求数据库链接(database link)和被连接的数据库名称一致。
现在全局数据库名:db_name+”.”+db_domain
③、有跟数据库job执行有关的参数
job_queue_processes = 4
job_queue_interval = 60
distributed_transactions = 10
open_links = 4
第一行定义SNP进程的启动个数为n。系统缺省值为0,正常定义范围为0~36,根据任务的多少,可以配置不同的数值。
第二行定义系统每隔N秒唤醒该进程一次。系统缺省值为60秒,正常范围为1~3600秒。事实上,该进程执行完当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。
如果修改了以上这几个参数,需要重新启动数据库以使参数生效。
二、实现数据库同步复制的步骤
假设在Internet上我们有两个数据库:一个叫测试1(CS1),一个叫测试2(CS2)。
具体配置见下表:
数据库名 CS1 CS2
数据库域名 test.com.cn test.com.cn
数据库sid号 CS1 CS2
Listener端口号 1521 1521
服务器ip地址 202.107.200.132 202.107.200.133
1、确认两台数据库之间可以互相访问,在tnsnames.ora里设置数据库连接字符串。
①、例如:测试1这边的数据库连接字符串是以下的格式
CS2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 202.107.200.133)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = CS2)
)
)
运行$tnsping CS2
出现以下提示符:
Attempting to contact (ADDRESS=(PROTOCOL=TCP)(HOST=202.107.200.133)(PORT=1521))
OK(n毫秒)
表明测试1数据库可以访问测试2数据库。
②、在测试2那边也同样配置,确认$tnsping CS1 是通的。
2、改数据库全局名称,建公共的数据库链接。
①、用system身份登录CS1数据库
SQL>alter database rename global_name to CS1.test.com.cn;
用system身份登录CS2数据库:
SQL>alter database rename global_name to CS2.test.com.cn;
②、用system身份登录CS1数据库
SQL>create public database link CS2.test.com.cn using 'CS2';
测试数据库全局名称和公共的数据库链接
SQL>select * from [email protected];
返回结果为CS2.test.com.cn就对了。
用system身份登录CS2数据库:
SQL>create public database link CS1.test.com.cn using 'CS1';
测试数据库全局名称和公共的数据库链接
SQL>select * from [email protected];
返回结果为CS1.test.com.cn就对了。
3、建立管理数据库复制的用户repadmin,并赋权。
①、用system身份登录CS1数据库
SQL>create user repadmin identified by repadmin default tablespace users temporary tablespace temp;
SQL>execute dbms_defer_sys.register_propagator('repadmin');
SQL>grant execute any procedure to repadmin;
SQL>execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
SQL>grant comment any table to repadmin;
SQL>grant lock any table to repadmin;
②、同样用system身份登录CS2数据库,运行以上的命令,管理数据库复制的用户repadmin,并赋权。
说明:repadmin用户名和密码可以根据用户的需求自由命名。
4、在数据库复制的用户repadmin下创建私有的数据库链接。
①、用repadmin身份登录CS1数据库
SQL>create database link CS2.test.com.cn connect to repadmin identified by repadmin;
测试这个私有的数据库链接:
SQL>select * from [email protected];
返回结果为CS2.test.com.cn就对了。
②、用repadmin身份登录CS2数据库
SQL>create database link CS1.test.com.cn connect to repadmin identified by repadmin;
测试这个私有的数据库链接
SQL>select * from [email protected];
返回结果为CS1.test.com.cn就对了。
5、创建或选择实现数据库复制的用户和对象,给用户赋权,数据库对象必须有主关键字。
假设我们用ORACLE里举例用的scott用户,dept表。
①、用internal身份登录CS1数据库,创建FROMWEB用户并赋权
SQL>create user FROMWEB identified by FROMWEB default tablespace users temporary tablespace temp;
SQL>grant connect, resource to FROMWEB;
SQL>grant execute on sys.dbms_defer to FROMWEB;
②、用scott身份登录CS1数据库,创建表EXG_DJNRB
SQL>create table FROMWEB.EXG_DJNRB (
BH VARCHAR2(21) not null,
DJBH VARCHAR2(21),
TSLX VARCHAR2(1),
LRR VARCHAR2(20),
TSLY CHAR,
XSLY CHAR,
TSLYBM VARCHAR2(70),
TSLYLXR VARCHAR2(20),
TSLYLXDH VARCHAR2(40),
TSXZDL CHAR(2),
TSXZXL CHAR(4),
TSRMC VARCHAR2(70),
TSRQ DATE,
TSSJ VARCHAR2(8),
TSFS CHAR,
TSRDH VARCHAR2(40),
TSFXB VARCHAR2(6),
TSFNL VARCHAR2(6),
TSRDZ VARCHAR2(70),
TSREM VARCHAR2(70),
TSLXR VARCHAR2(20),
TSDX VARCHAR2(70),
TSDXDZ VARCHAR2(70),
TSDXDH VARCHAR2(40),
TSDXLXR VARCHAR2(20),
XFLXDL CHAR(2),
XFLXZL CHAR(4),
XFLXXL VARCHAR2(6),
XFLXPP VARCHAR2(8),
XFLXXH VARCHAR2(10),
BRAND VARCHAR2(70),
STYLE VARCHAR2(70),
PART VARCHAR2(70),
BSFZCH VARCHAR2(30),
BSFLB CHAR,
TSNR VARCHAR2(2000),
SLQK12315 CHAR,
SLQK CHAR,
ZBDWML VARCHAR2(70),
ZBDWMC VARCHAR2(70),
ZBDWLXR VARCHAR2(20),
ZBDWLXDH VARCHAR2(40),
BLQKZT CHAR(2),
CLBZ CHAR,
LYWJ VARCHAR2(70),
DJBM VARCHAR2(9),
CLBM VARCHAR2(9),
ZFBZ CHAR,
BZ VARCHAR2(200),
BLQX DATE,
CWCS FLOAT,
MXL VARCHAR2(10),
SL NUMBER(10),
JG NUMBER(12,4),
ZJ VARCHAR2(80),
XFRQ DATE,
YQ VARCHAR2(40),
LDPS VARCHAR2(100),
SSLB CHAR,
LDQM VARCHAR2(20),
SPLB VARCHAR2(10),
SPLBNAME VARCHAR2(70),
XXLB VARCHAR2(10),
HAPPENADD VARCHAR2(40),
RULEUNIT VARCHAR2(40),
DEPT VARCHAR2(70),
REGDATE DATE,
TSRNATION VARCHAR2(12),
TSRZIP VARCHAR2(6),
TSRIDNUM VARCHAR2(20),
TSRMOBILE VARCHAR2(15),
TSDXZIP VARCHAR2(6),
TSDXEM VARCHAR2(70),
MANAGESCOPE VARCHAR2(200),
TSDXXZ CHAR,
CASEXZ CHAR(2),
DAMAGEDATE DATE,
PRODUCEAREA VARCHAR2(50),
SENDCASE CHAR,
CASESTATUS CHAR,
constraint PK_EXG_DJNRB primary key (BH)
)
/
怎么我的就不好使呢?