Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91197180
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-05-31 17:55:13

ER:复制

本节讨论以下主题:



在计划创建副本时,要考虑以下因素:

  • 使用非缓冲的数据库日志记录
  • 启用行级锁来获得更好的目标并发性
  • 决定复制类型 —— update anywhere 或主/目标
  • 决定冲突解决规则 —— 忽略、总是、时间戳、存储过程
  • 使用冲突解决方法在表中添加 CRCOLS
  • 决定复制的数据的范围 —— 行或事务
  • 考虑其他复制选项,比如 ATS、RIS、fullrow、忽略删除、频率、浮点格式
  • 确保表中存在主键

清单 24 中的示例在三个节点上定义一个简单的副本(采用 update anywhere 形式)。注意,列出每个参与服务器的行采用以下格式:“database_name@server_group:table_owner.table_name” “SELECT 语句和可选的 WHERE 子句”:



                    
cdr def repl -I -C timestamp -S trans items_rep \
"stores7@g_80s:informix.items" "select * from items" \
"stores7@g_90s:informix.items" "select * from items" \
"stores7@g_00s:informix.items" "select * from items"
        

清单 25 给出相同的语句,但是这一次定义的是主/目标副本:



                    
cdr def repl -I -C timestamp -S trans items_rep \
"P stores7@g_80s:informix.items" "select * from items" \
"R stores7@g_90s:informix.items" "select * from items" \
"R stores7@g_00s:informix.items" "select * from items"
				



                            
$ cdr define replicate -x
usage: cdr define repl [-c server] [-vuiAFIORTm] -C rule(s) [-M master] [-S scope]
            [-n y/n] [-t] [-a time] [-e intvl] [-f y|n] [-D y/n] repl
 participant
 -M        --master=   define master replicate
 -t        --empty           Empty mastered replicate
 -n        --name=y|n        mastered replicate name verification
 -v        --verify          verify the existing replicates using master definition
 -u        --autocreate      automatically create tables if they do not exists
 -a time   --at=time         replicate at specified time
 -c server --connect=server  connect to server
 -e intvl  --every=intvl     replicate every intvl minutes
 -i        --immediate       continuous replication (default)
 -A        --ats             aborted transaction spooling
 -C rule[,rule] --conflict=rule[,rule]  conflict resolution rule(s)
 -F        --floatcanon      transfer floating point in canonical form
                             (deprecated)
 -I        --floatieee       transfer floating point in IEEE form (recommended)
 -O        --optimize        don't call procedure unless different server
 -R        --ris             row information spooling
 -T        --firetrigger     fire triggers when replicating
 -S scope  --scope=scope     scope of conflict resolution (row or trans)
 -f y|n    --fullrow y|n     Enable/Disable sending of full row for updates
 -m  --mirrors    Define a shadow replicate
 -D y|n    --ignoredel y|n   do not process any deletes on targets
        







什么是主副本(master replicate)?主副本可以保证 ER 环境中服务器之间的一致性。它们具有以下好处:

  • 检查所有参与服务器的表模式是否与主副本定义匹配,从而确保数据完整性
  • 如果表在目标节点上不存在,就自动创建表
  • 允许更改复制的表上的操作

有三种主副本类型:

  1. Normal —— 列名不必匹配,但是模式必须匹配
  2. Strict —— 所有参与服务器的表必须具有相同的列名和模式性质
  3. Empty —— 指定一个参与服务器作为主副本的基础,但是不在副本中包含这个参与服务器






副本集是几个副本的逻辑集合,可以作为一个单元进行管理。通过使用副本集,可以只用一个命令启动、停止、暂停或继续运行副本集中的所有副本。有两种副本集类型:排他(exclusive)和非排他(non-exclusive)。

排他副本集要求所有副本具有相同的状态和频率设置。属于一个排他副本集的副本不能同时属于其他任何副本集。使用 --exclusive 选项创建排他副本集。

非排他副本集既允许对副本集中的副本进行统一管理,也允许单独管理。这意味着非排他副本集中的副本可以具有不同的状态;非排他副本集本身没有状态。另外,一个副本可以属于多个非排他副本集。



                    
$ cdr define replicateset -x
usage: cdr define replicateset [-c server] [-i ] [-e hh:mm] [-a day.hh:mm] [-x ]
          ReplSetName repl
 -a time   --at=time         replicate at specified time
 -c server --connect=server  connect to server
 -e intvl  --every=intvl     replicate every intvl minutes
 -i        --immediate       continuous replication (default)
 -X        --exclusive       Exclusive Replset.
        







模板是副本集的一种特殊形式,可以帮助在新的 ER 节点上部署副本,包括自动地创建表和数据同步。在构建模板时,ER 会为每个表创建空的主副本,并包含在副本集中。可以分别列出每个表,也可以只提供要使用的数据库名,这样就会包含这个数据库中的所有表。在完成模板之后,必须使用 cdr realize template 命令进行实例化或实现。实现模板之后,ER 会执行以下操作:

  • 如果数据库在目标节点上不存在,就自动创建数据库
  • 如果表在目标节点上不存在,就自动创建表
  • 表同步/填充


                    
$ cdr define template -x
usage: cdr define template TemplateName -C rule(s) -M server [-S scope]
                  [-c server] [-xaAFIORTX] [-D y|n]
                   -d database  [-f file]|[Table(s)]
 -C rule[,rule] --conflict=rule[,rule]  conflict resolution rule(s)
 -S scope  --scope=scope     scope of conflict resolution (row or trans)
 -M        --master=   define master replicate
 -c server --connect=server  connect to server
 -A        --ats             aborted transaction spooling
 -F        --floatcanon      transfer floating point in canonical form
                             (deprecated)
 -I        --floatieee       transfer floating point in IEEE form (recommended)
 -O        --optimize        don't call procedure unless different server
 -R        --ris             row information spooling
 -T        --firetrigger     fire triggers when replicating
 -D y|n    --ignoredel y|n   do not process any deletes on targets
 -X        --exclusive       Exclusive template.
 -d        --database= database to be used to obtain the table info 
 -a        --all             include all tables in template
 -f        --file=     file to obtain the list of table participants 
        

清单 29 中的示例在三个节点上为 stores7 数据库设置一个模板。注意:在运行这个命令之前,需要在基表中添加 CRCOLS 列。



                    
cdr define template stores7_template -C timestamp -S trans -M g_80s -A -R \
  -d stores7 call_type catalog cust_calls customer items manufact orders state 
  stock
cdr realize template stores7_template -u -S g_80s \
  "stores7@g_80s" "stores7@g_90s" "stores7@g_00s"
        







本节讨论如何管理副本、副本集和模板,包括修改、列出、启动、停止、暂停、继续运行和删除。管理副本和副本集的大多数命令非常相似,所以本节只讨论副本的管理。

可以对现有的副本进行两种修改:

  • 添加或删除参与服务器
  • 修改副本属性

使用以下命令添加或删除参与服务器:



                    
$ cdr change replicate -x
usage: cdr change repl [-c server] [-a | -d] [-v | -u] replicate participant
 -c server --connect=server  connect to server
 -a        --add             add participant
 -d        --del             remove participant
 -v        --verify          verify the existing replicates using master definition
 -u        --autocreate      automatically create tables if they do not exists
        

使用 cdr modify replicate 命令修改副本属性。有一些限制:不能将冲突解决选项从忽略改为非忽略,也不能将非忽略选项改为忽略。



                    
$ cdr modify replicate -x
usage: cdr modify repl  [-AORT] -C rule(s) [-i] [-a time] [-e min] [-f y|n] 
replicate
 -a time   --at=time         replicate at specified time
 -c server --connect=server  connect to server
 -e intvl  --every=intvl     replicate every intvl minutes
 -i        --immediate       continuous replication (default)
 -A (y/n)  --ats             aborted transaction spooling
 -C rule[,rule] --conflict=rule[,rule]  conflict resolution rule(s)
 -O        --optimize        don't call procedure unless different server
 -R (y/n)  --ris             row information spooling
 -T (y/n)  --firetrigger     fire triggers when replicating
 -S scope  --scope=scope     scope of conflict resolution (row or trans)
 -f y|n    --fullrow y|n     Enable/Disable sending of full row for updates
 -D y|n    --ignoredel y|n   do not process any deletes on targets
 -n        --name=n          mastered replicate name verification
        

有三种运行 cdr list replicate 命令的方式。如果省略副本名,那么会产生所有已经定义的副本的详细信息。如果使用 brief 选项,就会产生所有副本的参与服务器列表。如果提供副本名,那么产生副本属性的详细列表。



                    
$ cdr list repl -x
usage: cdr list repl [-c server] [brief|full] [replicate(s)]
 -c server --connect=server  connect to server
        

根据定义,刚创建的副本是不活跃的。要想启用副本并让 ER 搜索针对这个表的活动的日志,就必须使用 cdr start replicate。可以有选择地在一个或多个节点上启动一个副本,也可以在副本的所有参与节点上启动它。



                    
$ cdr start repl -x
usage: cdr start repl [-c server]  [-S server [-e keep|delete|merge]] 
                   replicate [TargetServers] 
 -c server --connect=server  connect to server
 -S server --syncdatasource=server server to be used as a data source for sync
 -e        --extratargetrows=[keep|delete|merge] handle extra row during sync
 TargetServers               List of TargetServers to be started.
                             Separate servers in the list by space.
        

使用 cdr stop replicate 命令停止副本。这个命令将副本的状态设置为 inactive 并删除这个副本的所有发送队列数据。



                    
$ cdr stop repl -x
usage: cdr stop repl [-c server] replicate server(s)
 -c server --connect=server  connect to server
        

使用 cdr suspend replicate 命令暂停复制副本的数据。在副本暂停时,ER 捕捉对源数据库的修改并在队列中积累这些修改,但是不将捕捉到的数据发送到目标。如果在环境中引用完整性很重要,就不要使用这个命令,因为 ER 无法支持它。而是应该暂停服务器。



                    
$ cdr suspend repl -x 
usage: cdr suspend repl [-c server] replicate(s)
 -c server --connect=server  connect to server
       

使用 cdr resume replicate 命令继续运行暂停的副本。



                    
$ cdr resume repl -x
usage: cdr resume repl [-c server] replicate(s)
 -c server --connect=server  connect to server
        

使用 cdr delete replicate 命令从 ER 环境中删除一个副本。ER 会从这个服务器和参与服务器列表中的所有其他节点上删除这个副本的所有引用。根据这个副本的发送队列中的数据量的不同,删除操作可能需要一些时间才能完成。



                    
$ cdr delete repl -x
usage: cdr delete repl [-c server] replicate(s)
 -c server --connect=server  connect to server
阅读(1586) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~