我在做数据库复制时,遇到一个问题,请高手帮忙解答??所有步骤及命令如下:更改数据库全局名
1.alter database rename global_name to ora.minamap.com;
  alter database rename global_name to nanjing.minamap.com;创建公共的数据库连接
2.create public database link nanjing.minamap.com using 'Nanjing';
  create public database link ora.minamap.com using 'Ora';测试公共数据库连接
3.select * from [email protected];
  select * from [email protected];以system分别登陆两个节点数据库
4.conn system/system@ora
  conn system/system@nanjing以下命令两个节点相同
5.create user repadmin identified by repadmin default tablespace users temporary tablespace temp;
6.execute dbms_defer_sys.register_propagator('repadmin');
7.grant execute any procedure to repadmin;
8.execute dbms_repcat_admin.grant_admin_any_repgroup('repadmin');
9.grant comment any table to repadmin;
10.grant lock any table to repadmin;以repadmin分别登陆两个节点数据库
11.conn repadmin/repadmin@ora
   conn repadmin/repadmin@nanjing分别在两个节点上创建私有数据库连接
12.create database link nanjing.minamap.com connect to repadmin identified by repadmin;
   create database link ora.minamap.com connect to repadmin identified by repadmin;分别在两个节点上创建或选择实现数据库复制的用户和对象
13. create user fengchen identified by fengchen default tablespace users temporary tablespace temp;
    grant connect to fengchen;
    grant resource to fengchen;
    grant execute on sys.dbms_defer to fengchen;create table fengchen.DEPT
(
  DEPTNO NUMBER(2) not null,
  DNAME  VARCHAR2(14),
  LOC    VARCHAR2(13)
)
tablespace SYSTEM
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );alter table fengchen.DEPT
  add constraint PK_DEPT primary key (DEPTNO)
  using index 
  tablespace SYSTEM
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
    
create table fengchen.EMP
(
  EMPNO    NUMBER(4) not null,
  ENAME    VARCHAR2(10),
  JOB      VARCHAR2(9),
  MGR      NUMBER(4),
  HIREDATE DATE,
  SAL      NUMBER(7,2),
  COMM     NUMBER(7,2),
  DEPTNO   NUMBER(2)
)
tablespace SYSTEM
  pctfree 10
  pctused 40
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );alter table fengchen.EMP
  add constraint PK_EMP primary key (EMPNO)
  using index 
  tablespace SYSTEM
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
alter table fengchen.EMP
  add constraint FK_DEPTNO foreign key (DEPTNO)
  references fengchen.DEPT (DEPTNO);insert into fengchen.dept select * from scott.dept;
insert into fengchen.emp select * from scott.emp;在nanjing节点创建要复制的组fengchen_mg
14.conn repadmin/repadmin@nanjing;
15.execute dbms_repcat.create_master_repgroup('fengchen_mg');在复制组里加入数据库对象
16.execute dbms_repcat.create_master_repobject(sname=>'fengchen',oname=>'dept',type=>'table',use_existing_object=>true,gname=>'fengchen_mg');对加入的数据库对象产生复制支持
17.execute dbms_repcat.generate_replication_support('fengchen','dept','table');在ora节点创建主复制节点
18.conn repadmin.repadmin@ora;
19.execute dbms_repcat.add_master_database(gname=>'fengchen_mg',master=>'ora.minamap.com',use_existing_objects=>true,copy_rows=>false,propagation_mode=>'asynchronous');执行到19这行命令时报出如下错误,请问是什么原因,如何解决???ERROR 位于第 1 行:
ORA-23312: 根据ORA.MINAMAP.COM不是 masterdef
ORA-06512: 在"SYS.DBMS_SYS_ERROR", line 86
ORA-06512: 在"SYS.DBMS_REPCAT_MAS", line 891
ORA-06512: 在"SYS.DBMS_REPCAT_MAS", line 2144
ORA-06512: 在"SYS.DBMS_REPCAT", line 146
ORA-06512: 在line 1

解决方案 »

  1.   

    在Oracle中实现数据库的复制
    --------------------------------------------------------------------------------
     在运作数据库经常会有这样的需求:一个节点的数据改变不仅体现在本地,还反映到远端。复制技术给用户提供了一种快速访问共享数据的办法,这里就南京工商12315数据库系统举例。系统目的:为了实现工商12315投诉举报系统与案件处理系统的交互
    一、实现数据库复制的前提条件 
    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)
    )
    /
      

  2.   

    ③、如果数据库对象没有主关键字,可以运行以下SQL命令添加: 
    SQL>alter table EXG_DJNRB add (constraint PK_EXG_DJNRB primary key (BH)); 
    ④、在CS1数据库FROMWEB用户下创建主关键字的序列号,范围避免和CS2的冲突。 
    SQL> create sequence BH increment by 1 start with 1 maxvalue 50000 cycle nocache; (可不用序列)
    (说明:maxvalue 44可以根据应用程序及表结构主关键字定义的位数需要而定) 
    ⑤、在CS1数据库FROMWEB用户下插入初始化数据 
    ⑥、在CS2数据库那边同样运行以上①,②,③ 
    ⑦、在CS2数据库FROMWEB用户下创建主关键字的序列号,范围避免和CS1的冲突。 
    SQL> create sequence BH increment by 1 start with 50001 maxvalue 100000 cycle nocache; (可不用序列)
    ⑧、在CS2数据库FROMWEB用户下插入初始化数据 
    6、创建要复制的组FROMWEB_mg,加入数据库对象,产生对象的复制支持 
    ①、用repadmin身份登录CS1数据库,创建主复制组FROMWEB_mg 
    SQL> execute dbms_repcat.create_master_repgroup('FROMWEB_mg'); 
    说明:FROMWEB_mg组名可以根据用户的需求自由命名。 
    ②、在复制组FROMWEB_mg里加入数据库对象 
    SQL>execute dbms_repcat.create_master_repobject(sname=>'FROMWEB',oname=>'EXG_DJNRB  ', type=>'table',use_existing_object=>true,gname=>'FROMWEB_mg'); 
    参数说明: 
    sname 实现数据库复制的用户名称 
    oname 实现数据库复制的数据库对象名称 
    (表名长度在27个字节内,程序包名长度在24个字节内) 
    type 实现数据库复制的数据库对象类别 
    (支持的类别:表,索引,同义词,触发器,视图,过程,函数,程序包,程序包体) 
    use_existing_object true表示用主复制节点已经存在的数据库对象 
    gname 主复制组名 
    ③、对数据库对象产生复制支持 
    SQL>execute dbms_repcat.generate_replication_support('FROMWEB','EXG_DJNRB','table'); 
    (说明:产生支持FROMWEB用户下EXG_DJNRB表复制的数据库触发器和程序包) 
    ④、确认复制的组和对象已经加入数据库的数据字典 
    SQL>select gname, master, status from dba_repgroup;  
    SQL>select * from dba_repobject; 
    7、创建主复制节点 
    ①、用repadmin身份登录CS1数据库,创建主复制节点 
    SQL>execute dbms_repcat.add_master_database(gname=>'FROMWEB_mg',master=>'CS2.test.com.cn',use_existing_objects=>true, copy_rows=>false, propagation_mode => 'synchronous'); 
    参数说明: 
    gname 主复制组名 
    master 加入主复制节点的另一个数据库 
    use_existing_object true表示用主复制节点已经存在的数据库对象 
    copy_rows false表示第一次开始复制时不用和主复制节点保持一致 
    propagation_mode 异步地执行 
    ②、确认复制的任务队列已经加入数据库的数据字典 
    SQL>select * from user_jobs; 
    8、使同步组的状态由停顿(quiesced )改为正常(normal) 
    ①、用repadmin身份登录CS1数据库,运行以下命令 
    SQL> execute dbms_repcat.resume_master_activity('FROMWEB_mg',false); 
    ②、确认同步组的状态为正常(normal) 
    SQL> select gname, master, status from dba_repgroup; 
    ③、如果这个①命令不能使同步组的状态为正常(normal),可能有一些停顿的复制,运行以下命令再试试(建议在紧急的时候才用): 
    SQL> execute dbms_repcat.resume_master_activity('FROMWEB_mg',true); 
    9、创建复制数据库的时间表,我们假设用固定的时间表:10分钟复制一次。 
    ①、用repadmin身份登录CS1数据库,运行以下命令 
    SQL>begin 
    dbms_defer_sys.schedule_push ( 
    destination => 'test.test.com.cn', 
    interval => 'sysdate + 1/24/60', 
    next_date => sysdate); 
    end; 

      
    SQL>begin 
    dbms_defer_sys.schedule_purge ( 
    next_date => sysdate, 
    interval => 'sysdate + 1/24/60', 
    delay_seconds => 0, 
    rollback_segment => ''); 
    end; 

      
    ②、用repadmin身份登录CS2数据库,运行以下命令 
    SQL>begin 
    dbms_defer_sys.schedule_push ( 
    destination => 'lyxdb.test.com.cn ', 
    interval => 'sysdate + 1/24/60', 
    next_date => sysdate); 
    end; 

      
    SQL>begin 
    dbms_defer_sys.schedule_purge ( 
    next_date => sysdate, 
    interval => 'sysdate + 1/24/60', 
    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 
    这可能因为网络中断照成的死锁 
    解除死锁的办法: 
    $ps –ef|grep orale 
    找到死锁的刷新快照的进程号ora_snp*,用kill –9 命令删除此进程 
    然后进入repadmin 用户SQL>操作符下,运行命令: 
    SQL>exec dbms_job.run(job_number); 
    说明:job_number 为用select job,this_date,next_date,what from user_jobs;命令查出的job编号。 
    2、增加或减少复制组的复制对象 
    ①、停止主数据库节点的复制动作,使同步组的状态由正常(normal)改为停顿(quiesced ) 
    用repadmin身份登录CS1数据库,运行以下命令 
    SQL>execute dbms_repcat.suspend_master_activity (gname => 'FROMWEB_mg'); 
    ②、在复制组FROMWEB里加入数据库对象,保证数据库对象必须有主关键字。 
    SQL>execute dbms_repcat.create_master_repobject(sname=>'FROMWEB',oname=>'tablename', type=>'table',use_existing_object=>true,gname=>'FROMWEB_mg'); 
    对加入的数据库对象产生复制支持 
    SQL>execute dbms_repcat.generate_replication_support('FROMWEB','tablename','table'); 
    ③、在复制组FROMWEB_mg里删除数据库对象。 
    SQL>execute dbms_repcat.drop_master_repobject ('FROMWEB','EXG_DJNRB','table'); 
    ④、重新使同步组的状态由停顿(quiesced )改为正常(normal)。 
    SQL> execute dbms_repcat.resume_master_activity('FROMWEB_mg',false);