透明 发表于 2015-1-16 22:40:04

MSSQL网站制作之在ORCAL中完成数据库的复制

两个到底是哪一个给出了MySQL这个名字至今依然是个迷,包括开发者在内也不知道。数据|数据库在Internet上运作数据库常常会有如许的需求:把遍及天下各乡村类似的数据库使用一致起来,一个节点的数据改动不但表现在当地,还反应到远端。复制手艺给用户供应了一种疾速会见共享数据的举措。
  1、完成数据库复制的条件前提
  1、数据库撑持初级复制功效
  您能够用system身份登录数据库,检察v$option视图,假如个中Advancedreplication为TRUE,则撑持初级复制功效;不然不撑持。
  2、数据库初始化参数请求
  ①、db_domain=test.com.cn
  指明数据库的域名(默许的是WORLD),这里能够用您公司的域名。
  ②、global_names=true
  它请求数据库链接(databaselink)和被毗连的数据库称号分歧。
  如今全局数据库名:db_name+”.”+db_domain
  ③、有跟数据库job实行有关的参数
  job_queue_processes=1
  job_queue_interval=60
  distributed_transactions=10
  open_links=4
  第一行界说SNP历程的启动个数为n。体系缺省值为0,一般界说局限为0~36,依据义务的几,能够设置分歧的数值。
  第二行界说体系每隔N秒叫醒该历程一次。体系缺省值为60秒,一般局限为1~3600秒。现实上,该历程实行完以后义务后,就进入眠眠形态,就寝一段工夫后,由体系的总控卖力将其叫醒。
  假如修正了以上这几个参数,必要从头启动数据库以使参数失效。
  2、完成数据库同步复制的步骤
  假定在Internet上我们有两个数据库:一个叫深圳(shenzhen),一个叫北京(beijing)。
  详细设置见下表:
数据库名shenzhenBeijing数据库域名test.com.cntest.com.cn数据库sid号shenzhenbeijingListener端标语15211521服务器ip地点10.1.1.20010.1.1.200  
1、确认两台数据库之间能够相互会见,在tnsnames.ora里设置数据库毗连字符串。
  ①、比方:深圳这边的数据库毗连字符串是以下的格局
  beijing=
  (DESCRIPTION=
  (ADDRESS_LIST=
  (ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.200)(PORT=1521))
  )
  (CONNECT_DATA=
  (SERVICE_NAME=beijing)
  )
  )
  运转$tnspingbeijing
  呈现以下提醒符:
  Attemptingtocontact(ADDRESS=(PROTOCOL=TCP)(HOST=10.1.1.200)(PORT=1521))
  OK(n毫秒)
  标明深圳数据库能够会见北京数据库。
  ②、在北京何处也一样设置,确认$tnspingshenzhen是通的。
  2、改数据库全局称号,建大众的数据库链接。
  ①、用system身份登录shenzhen数据库
  SQL>alterdatabaserenameglobal_nametoshenzhen.test.com.cn;
  用system身份登录beijing数据库:
  SQL>alterdatabaserenameglobal_nametobeijing.test.com.cn;
  ②、用system身份登录shenzhen数据库
  SQL>createpublicdatabaselinkbeijing.test.com.cnusingbeijing;
  测试数据库全局称号和大众的数据库链接
  SQL>select*fromglobal_name@beijing.test.com.cn;
  前往  了局为beijing.test.com.cn就对了。
  用system身份登录beijing数据库:
  SQL>createpublicdatabaselinkshenzhen.test.com.cnusingshenzhen;
  测试数据库全局称号和大众的数据库链接
  SQL>select*fromglobal_name@shenzhen.test.com.cn;
  前往了局为shenzhen.test.com.cn就对了。
  3、创建办理数据库复制的用户repadmin,并赋权。
  ①、用system身份登录shenzhen数据库
  SQL>createuserrepadminidentifiedbyrepadmindefaulttablespaceusers
  temporarytablespacetemp;
  SQL>executedbms_defer_sys.register_propagator(repadmin);
  SQL>grantexecuteanyproceduretorepadmin;
  SQL>executedbms_repcat_admin.grant_admin_any_repgroup(repadmin);
  SQL>grantcommentanytabletorepadmin;
  SQL>grantlockanytabletorepadmin;
  ②、一样用system身份登录beijing数据库,运转以上的命令,办理数据库复制的用户
  repadmin,并赋权。
  申明:repadmin用户名和暗码能够依据用户的需求自在定名。
  4、在数据库复制的用户repadmin下创立公有的数据库链接。
  ①、用repadmin身份登录shenzhen数据库
  SQL>createdatabaselinkbeijing.test.com.cnconnecttorepadminidentifiedbyrepadmin;
  测试这个公有的数据库链接:
  SQL>select*fromglobal_name@beijing.test.com.cn;
  前往了局为beijing.test.com.cn就对了。
  ②、用repadmin身份登录beijing数据库
  SQL>createdatabaselinkshenzhen.test.com.cnconnecttorepadminidentifiedby
  repadmin;
  测试这个公有的数据库链接
  SQL>select*fromglobal_name@shenzhen.test.com.cn;
  前往了局为shenzhen.test.com.cn就对了。
  5、创立或选择完成数据库复制的用户和工具,给用户赋权,数据库工具必需有主关头字。
  假定我们用ORACLE里举例用的scott用户,dept表。
  ①、用internal身份登录shenzhen数据库,创立scott用户并赋权
  SQL>createuserscottidentifiedbytigerdefaulttablespaceuserstemporary
  tablespacetemp;
  SQL>grantconnect,resourcetoscott;
  SQL>grantexecuteonsys.dbms_defertoscott;
  ②、用scott身份登录shenzhen数据库,创立表dept
  SQL>createtabledept
  (deptnonumber(2)primarykey,
  dnamevarchar2(14),
  locvarchar2(13));
  ③、假如数据库工具没有主关头字,能够运转以下SQL命令增加:
  SQL>altertabledeptadd(constraintdept_deptno_pkprimarykey(deptno));
  ④、在shenzhen数据库scott用户下创立主关头字的序列号,局限制止和beijing的抵触。
  SQL>createsequencedept_noincrementby1startwith1maxvalue44
  cyclenocache;
  (申明:maxvalue44能够依据使用程序及表布局主关头字界说的位数必要而定)
  ⑤、在shenzhen数据库scott用户下拔出初始化数据
  SQL>insertintodeptvalues(dept_no.nextval,accounting,newyork);
  SQL>insertintodeptvalues(dept_no.nextval,research,dallas);
  SQL>commit;
  ⑥、在beijing数据库何处一样运转以上①,②,③
  ⑦、在beijing数据库scott用户下创立主关头字的序列号,局限制止和shenzhen的抵触。
  SQL>createsequencedept_noincrementby1startwith45maxvalue99cycle
  nocache;
  ⑧、在beijing数据库scott用户下拔出初始化数据
  SQL>insertintodeptvalues(dept_no.nextval,sales,chicago);
  SQL>insertintodeptvalues(dept_no.nextval,operations,boston);
  SQL>commit;
  6、创立要复制的组scott_mg,到场数据库工具,发生工具的复制撑持
  ①、用repadmin身份登录shenzhen数据库,创立主复制组scott_mg
  SQL>executedbms_repcat.create_master_repgroup(scott_mg);
  申明:scott_mg组名能够依据用户的需求自在定名。
  ②、在复制组scott_mg里到场数据库工具
  SQL>executedbms_repcat.create_master_repobject(sname=>scott,oname=>dept,      type=>table,use_existing_object=>true,gname=>scott_mg);
  参数申明:
  sname完成数据库复制的用户称号
  oname完成数据库复制的数据库工具称号
  (表名长度在27个字节内,程序包名长度在24个字节内)
  type完成数据库复制的数据库工具种别
  (撑持的种别:表,索引,同义词,触发器,视图,历程,函数,程序包,程序包体)
  use_existing_objecttrue暗示用主复制节点已存在的数据库工具
  gname主复制组名
  ③、对数据库工具发生复制撑持
  SQL>executedbms_repcat.generate_replication_support(scott,dept,table);
  (申明:发生撑持scott用户下dept表复制的数据库触发器和程序包)
  ④、确认复制的组和工具已到场数据库的数据字典
  SQL>selectgname,master,statusfromdba_repgroup;
  SQL>select*fromdba_repobject;
  7、创立主复制节点
  ①、用repadmin身份登录shenzhen数据库,创立主复制节点
  SQL>executedbms_repcat.add_master_database
  (gname=>scott_mg,master=>beijing.test.com.cn,use_existing_objects=>true,
  copy_rows=>false,propagation_mode=>asynchronous);
  
  参数申明:
  gname主复制组名
  master到场主复制节点的另外一个数据库
  use_existing_objecttrue暗示用主复制节点已存在的数据库工具
  copy_rowsfalse暗示第一次入手下手复制时不必和主复制节点坚持分歧
  propagation_mode异步地实行
  ②、确认复制的义务行列已到场数据库的数据字典
  SQL>select*fromuser_jobs;
  8、使同步组的形态由停留(quiesced)改成一般(normal)
  ①、用repadmin身份登录shenzhen数据库,运转以下命令
  SQL>executedbms_repcat.resume_master_activity(scott_mg,false);
  ②、确认同步组的形态为一般(normal)
  SQL>selectgname,master,statusfromdba_repgroup;
  ③、假如这个①命令不克不及使同步组的形态为一般(normal),大概有一些停留的复制,运转以下命令再尝尝(倡议
在告急的时分才用):
  SQL>executedbms_repcat.resume_master_activity(scott_mg,true);
  9、创立复制数据库的工夫表,我们假定用流动的工夫表:10分钟复制一次。
  ①、用repadmin身份登录shenzhen数据库,运转以下命令
  SQL>begin
  dbms_defer_sys.schedule_push(
  destination=>beijing.test.com.cn,
  interval=>sysdate+10/1440,
  next_date=>sysdate);
  end;
  /
  
  SQL>begin
  dbms_defer_sys.schedule_purge(
  next_date=>sysdate,
  interval=>sysdate+10/1440,
  delay_seconds=>0,
  rollback_segment=>);
  end;
  /
  
  ②、用repadmin身份登录beijing数据库,运转以下命令
  SQL>begin
  dbms_defer_sys.schedule_push(
  destination=>shenzhen.test.com.cn,
  interval=>sysdate+10/1440,
  next_date=>sysdate);
  end;
  /
  
  SQL>begin
  dbms_defer_sys.schedule_purge(
  next_date=>sysdate,
  interval=>sysdate+10/1440,
  delay_seconds=>0,
  rollback_segment=>);
  end;
  /
  10、增加或修正双方数据库的纪录,跟踪复制历程
  假如你想立即看到增加或修正后数据库的纪录的变更,能够在双方repadmin用户下找到push的job_number,然
运转:
  SQL>execdbms_job.run(job_number);
  3、非常情形的处置
  1、反省复制事情一般否,能够在repadmin用户下查询user_jobs
  SQL>selectjob,this_date,next_date,what,brokenfromuser_jobs;
  一般的形态有两种:
  义务闲——this_date为空,next_date为以后工夫后的一个工夫值
  义务忙——this_date不为空,next_date为以后工夫后的一个工夫值
  非常形态也有两种:
  义务逝世锁——next_date为以后工夫前的一个工夫值
  义务逝世锁——next_date为十分年夜的一个工夫值,比方:4001-01-01
  这大概由于收集中止照成的逝世锁
  排除逝世锁的举措:
  $ps–ef|greporale
  找到逝世锁的革新快照的历程号ora_snp*,用kill–9命令删除此历程
  然落后进repadmin用户SQL>操纵符下,运转命令:
  SQL>execdbms_job.run(job_number);
  申明:job_number为用selectjob,this_date,next_date,whatfromuser_jobs;命令查出的job编号。
  2、增添或削减复制组的复制工具
  ①、中断主数据库节点的复制举措,使同步组的形态由一般(normal)改成停留(quiesced)
  用repadmin身份登录shenzhen数据库,运转以下命令
  SQL>executedbms_repcat.suspend_master_activity(gname=>scott_mg);
  ②、在复制组scott_mg里到场数据库工具,包管数据库工具必需有主关头字。
  SQL>executedbms_repcat.create_master_repobject(sname=>scott,oname=>emp,
  type=>table,use_existing_object=>true,gname=>scott_mg);

  对到场的数据库工具发生复制撑持
  SQL>executedbms_repcat.generate_replication_support(scott,emp,table);
  ③、在复制组scott_mg里删除数据库工具。
  SQL>executedbms_repcat.drop_master_repobject(scott,dept,table);
  ④、从头使同步组的形态由停留(quiesced)改成一般(normal)。
  SQL>executedbms_repcat.resume_master_activity(scott_mg,false);

mysqld进程在一个写入当中被杀死;计算机的意外关闭(例如,如果计算机掉电);一个硬件错误。

海妖 发表于 2015-1-19 21:07:39

大侠们有推荐的书籍和学习方法写下吧。

蒙在股里 发表于 2015-1-28 10:39:37

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~

金色的骷髅 发表于 2015-2-5 20:40:18

在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。

小女巫 发表于 2015-2-13 13:00:03

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~

兰色精灵 发表于 2015-3-3 21:26:39

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

冷月葬花魂 发表于 2015-3-11 13:54:29

总感觉自己还是不会SQL

精灵巫婆 发表于 2015-3-18 17:47:02

还不是性能有问题!否则面向对象的数据库早就实现了!建议使用CLR的地方一般是和应用的复杂程度或操作系统环境有很高的耦合度的场景。如你想构建复杂的算法,并且用到了大量的指针和高级数据模型。

变相怪杰 发表于 2015-3-26 08:45:02

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
页: [1]
查看完整版本: MSSQL网站制作之在ORCAL中完成数据库的复制