|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
上面我们说了DML的闪回方案。但对于DDL却无能为力,对于大多数的DDL,即使是rowbase格式,二进制日志binlog中仍只记录语句本身。对于删表操作,只记录一个语句droptablet。仅凭这句话,无法还原表的数据。server|创立
我们晓得,SQLServer2000的MergeReplication撑持dynamicfilter的功效。假如我们有多个subscriber,每一个subscriber只必要保护本人特定的数据,这时候候我们只需创立一个publication,然后使用dynamicfilter的功效,把每一个subscriber必要的特定命据复制已往。最经常使用的用于dynamicfilter的体系函数是SUSER_SNAME()和HOST_NAME(),针对每一个subscriber的mergeagent连到publisher时,SQLServer管帐算出么特定mergeagent毗连的SUSER_SNAME()或HOST_NAME()值,然后依据了局来过滤数据。
间接使用SUSER_SNAME()或HOST_NAME()时分,必要table中有响应SUSER_SNAME()或HOST_NAME()的值。好比假如我们的publisherserver叫shanghai来保护一切的数据,三个subscriber分离叫nanjing,suzhou和hangzhou来保护各自的数据,假如我们但愿使用HOST_NAME()把数据复制到三个subscriber,我们的表中应当有一列来存HOST_NAME()的值,然后我们才干用dynamicfilter如”filter_column=host_name()”来过滤数据:
createtableorders(orderIDintnotnull,filter_columnchar(20),Quantityint)
go
insertintoordersvalues(1,’nanjing’,100)
insertintoordersvalues(2,’suzhou’,200)
insertintoordersvalues(3,’hangzhou’,120)
insertintoordersvalues(4,’hangzhou’,100)
go
可是,假如我们的表中的数据没有刚好和SUSER_SNAME()或HOST_NAME()婚配的,我们该如何来做dynamicfilter呢?
好比下表,只要一个zoneID能够用来辨别分歧subscriber必要的数据,可是它的值和SUSER_SNAME()或HOST_NAME()都分歧。
createtableorders(orderIDintnotnull,zoneIDnvarchar(5),Quantityint)
go
insertintoordersvalues(1,N1,100)
insertintoordersvalues(2,N2,200)
insertintoordersvalues(3,N3,120)
insertintoordersvalues(4,N3,100)
要为这类数据做dynamicfilter,我们能够使用MergeAgent的一个参数,hostname,来完成。SQLServerBooksOnline没有很好注释该参数的用法。当我们没无为mergeagent指定该参数时分,针对mergeagent毗连的host_name()函数前往mergeagent地点服务器的盘算机称号;当我们为mergeagent指定了该参数时分,host_name()函数前往hostname参数指定的代价。
好比,假如我们想把zoneID=N’1’的纪录复制到nanjing,我们仍旧能够用”zoneID=host_name()”filter,只需为nanjing的mergeagent增加“-hostname=1”参数便可。
为了增加这个参数,右键单击mergeagent,选择AgentProperties,选择steps选项页,双击Runagent,然后在Command最初增加”-hostname1”便可。
关于mergeagent的一切可用参数,见MSDN.
其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。 |
|