当前课程知识点:SQL SERVER数据库技术 > 第12章 管理与维护数据库 > 12.4 复制数据库 > 数据库复制
数据库的复制是分布式数据库应用程序中常用的一种数据拷贝技术,它将一个数据库中的数据拷贝到通过局域网(LAN)、广域网(WAN)或Internet网络连接的不同站点或同一个服务器中的不同数据库中,并能够自动保持这些数据的同步,使各个拷贝具有相同的数据。
一、SQL SERVER复制技术
(一)复制结构
SQL SERVR 数据复制基于“出版—订阅”模型,它由出版者、分发者和订阅者三种服务器构成。出版服务器标识其数据库中的哪些数据用于复制,并检测这些数据的变化和维护该站点中的所有出版信息。
分发服务器中建立一个或多个分发数据库,用来保存出版服务器的出版物,并向订阅者传递它们所订阅的复制数据。
订阅服务器用于存储复制数据和接收对复制数据的更改,SQL SERVE 7.0还允许修改订阅服务器所接收到的出版物。
出版服务器所出版数据的最小单位为条目,出版条目可以是数据库中的表或存储过程。SQL SERVER允许对所出版表添加纵向或横向过滤器,从而使出版条目中只包含表中的某些列或其中的某些数据行,一组出版条目的集合构成一个出版物。
订阅服务器对出版物的订阅方式有推式订阅和拉式订阅两种,SQL SERVER中的每个出版物均支持推式订阅和拉式订阅这两种订阅方式。所谓推式订阅是指当出版物内容被修改时,由出版服务器通知订阅服务器,而不需要订阅服务器进行查询。推式订阅的优点是订阅服务器能够及时了解出版数据的改变情况,但它相应加重了出版服务器的负载。所以,推式订阅适合于需要近乎实时要求的数据复制。
拉式订阅是指由订阅服务器定期轮询出版服务器中出版物的内容是否改变,之后决定是否需要再次进行复制。拉式订阅能够减轻出版服务器的负担,所以 常用于拥有大量订阅者的数据复制领域。此外,拉订阅也适合于移动用户,因为移动用户与出版服务器间没有永久固定的通信连接,他们采用订阅方式,只是在需要时才查询出版物内容的变化情况。
(二)复制代理
SQL Server 复制部件采用模块化设计,各种复制操作通过不同的复制代理实现。SQL Server 中的复制代理包括:
快照代理:快照代理运行在 SQL Server 代理服务环境下。其功能是:为复制准备表结构、初始化出版表和存储过程的数据文件、将出版物快照存储到分发服务器的分发数据库中、并记录分发数据库的同步状态信息。每个出版物在分发服务器上均运行着自己的快照代理,并通过快照代理与出版服务器连接。
日志阅读代理:将用于复制的事务从出版服务器的事务日志中拷贝到分发数据库。每一个使用事务复制出版的数据库在分发服务器上均运行着自己的日志阅读代理,并通过该代理与出版服务器连接:
分发代理:将保存在分发数据库中的事务或出版物快照传递到订阅者。分发代理运行在 SQL Server 代理服务环境下,可以直接使用SQL 企业管理进行管理。对于快照复制和事务复制,如果在配置推订阅时采用立即同步(所谓同步是指维护出版服务器上的出版物和订阅服务器上的复制品之间具有相同的表结构和数据)方式,那么每个出版服务上在分发服务器上启动各自的分发代理,并由它实现与订阅者间的连接;如果将推订阅配置为非立即同步方式,那么所有的快照或事务出版物在分发服务器上共享一个分发代理,并由它实现与订阅者间的连接。快照和事务出版物拉订阅的分发代理则运行在订阅服务器上,而不是在分发服务器上。快照复制和事务复制没有合并代理。
(三)复制类型
在分布式数据库应用环境中,不同的应用领域对数据复制的要求各异,不可能有一种复制方法能够适合所有领域中的应用需要。为此,SQL Server提供了以下三种复制类型来满足不同环境中的应用需要:
快照复制:
事务复制:
合并复制:
下面分别介绍三种复制的工作过程。
快照复制
快照复制是SQL Server中最简单的一种复制方式,它拷贝数据库中出版物在某一时刻的结构和数据状态,即建立出版物快照,之后通过复代理将出版物快照复制给订阅服务器。
快照复制操作由快照代理和分发代理实现。快照代理将出版物中各条目(表)结构和数据拷贝到分发服务器的快照文件(但不是分发数据库)中,并在分发服务器的分发数据 库中记录复制同步操作。分发服务器再根据分发数据 库中的同步记录将快照文件传递到订阅服务器的目的数据库中。
快照代理的具体工作过程为:
①快照代理建立从分发服务器到出版服务器的连接,并对出版物中所包含的所有表(条目)设置共享锁,以确保复制数据的一致性。
②快照代理再建立从出版服务器的连接,并将各出版条目的结构拷贝到分发服务器的.sch文件中(实际拷贝的是建立复制表的Transact-SQL语句),该文件存储在分发数据库文件目录下的一个子目录中。
③快照代理再建立从分发服务器到出版服务器的连接,并将历史记录和所有错误写入分发数据库中。
④快照代理将出版服务器上出版物中各条目的数据写入分发服务器的数据文件中,该文件与出版物的结构文件(*。sch) 存储在同一目录下。数据文件和结构文件构成一个表在某一服务器,出版条目的数据文件采用SQL Server本地批拷贝文件格式(*.bcp)存储,否则,数据文件按文件格式存储。
⑤快照代理向分发数据库的Msrepl_commands和Msrepl_transactions表中添加记录,说明同步集合的存储位置和订阅服务器的同步任务命令。分发数据库中Msrepl_transactions和Msrepl_commands的表结构如表所示
Msrepl_transactions和Msrepl_commands的表结构
表名 | 列名 | 数据类型 | 说明 |
Msrepl_transactions | Publisher_database_id | Int | 出版数据库标识 |
Xact_id | Varbinary(16) | 事务标识号 | |
Xact_seqno | Varbinary(16) | 事务序列号 | |
Entry_time | Datetime | 事务进入分发数据库的日期和时间 | |
Msrepl_transactions | Publisher_database_id | Int | 出版数据库标识号 |
Xact_seqno | Varbinary(16) | 事务序列号 | |
Type | Int | 命令类型 | |
Article_id | Int | 条目标识号 | |
Originator_id | Int | 操作者标识号 | |
Command_id | Int | 命令标识号 | |
Partial_command | Bit | 说明该命令是否为部分命令 | |
Command | Varbinary(1024) | 命令数据 |
⑥快照代理解除对出版条目所设置的共享锁。
快照复制过程中,分发代理的工作步骤为:
分发代理建立从运行该代理的服务器至分发服务器之间的连接。对于推订阅和拉订阅,分发代理分别运行在分发服务器和订阅服务器上。
分发代理从分发数据库的Msrepl_commands表中读取同步集合位置,从Msrepl_transactions表中读取订阅服务器的同步命令。
分发代理将结构文件和数据文件传递到订阅服务器,并根据同步命令在订阅服务器的目的数据库重新建立与出版物中各个条目相同的数据表,从而使出版物中所有条目同时被同步,保持所有表间的事务完整性和参照完整性。在以上操作过程中,分发代理锁定它所影响的整个表,因此这时所有其它进程不能对该表设置排它锁。
事务复制
在出版大型数据库时,如果采用快照复制方式,分发服务器为完成复制操作,必须在每次出版物内容变化时从出版服务器中拷贝表结构及其中的大量数据,之后再将它们传递给订阅服务器,这大大加重了网络的通信负担。对于低速连接的网络环境,采用快照复制将严重影响应用程序的正常运行。
为解决这一问题,SQL Server提供了事务复制方式。采用这种方式时,当订阅服务器对出版服务器中的出版物做到初始同步后,SQL Server监视INSERT、UUPDATE、DELETE等数据修改语句的执行,并对影响出版物的事务进行标识。事务日志阅读代理从事务日志中捕获出版条目中数据的变化,并将引起这些变化的事务拷贝到分发服务器的分发数据库中。之后,由分发服务器将这些事务传递给订阅服务器,并在订阅服务器上顺序执行这些事务,对复制品做增量修改,从而保证订阅服务器中的复制品与出版 服务器出版物中的数据一致(但不是实时一致)。由于事务的数据量远小于它所操作的数据量,所以采用事务复制方式能够有效减轻网络的通信负担。
事务复制由快照代理、事务日志阅读代理和分发代理实现。快照代理将出版物中各条目(表)的结构和数据拷贝到分发服务器的快照文件中,并在分发服务器的分发数据库中记录复制同步操作,快照代理的这一工作过程与快照复制中基本相同。
但在事务复制的初始同步阶段,SQL Server允许用户 在订阅服务器上手工建立出版物的初始快照,这一操作被称做手工同步。对于非常大的出版物,可选择使用手工同步操作,这时用户从磁带或其它设备中手工建立出版物快照,使SQL Server不再运行快照代理来同步复制操作,它认为出版服务器和订阅服务器之间已经同步,所以可以立即传递出版物的修改事务。
日志阅读代理运行时,它首先读取出版物的事务日志,并标识出影响出版物的INSERT、UPDATA、DELETE语句或其它数据修改语句。之后,日志阅读代理交这些被标识的事务批拷贝到分发服务器的分发数据库中。分发数据库作为这些事务的一个存储转发队列,再将这些事务中已提交的事务传递给订阅服务器。
日志阅读代理运行过程中使用系统存储过程sp_replcmds读取数据库事务日志中的复制事务命令集合,使用sp_repldooe标识复制操作的完成程度。
分发代理通过推或拉方式将存储在分发数据库Msrepl_transactions表中的所有事务命令传递到订阅服务器。之后订阅服务器按照与出版服务器中相同的顺序执行这些事务命令,实现对出版物复制品的修改操作。
合并复制
合并复制允许修改出版服务器中的出版数据库和订阅服务器中的订阅数据库,它能够自动监视这些数据库中的数据变化,并定期将这些修改操作进行合并,把合并后的结果提交给建立订阅时为订阅者所设置的优先级载决哪个用户的修改有效。
当建立一个合并复制时,SQL Server对数据库结构做以下修改:
(1)对出版表标识行唯一列,这使SQL Server能够在一个表的多个拷贝之间根据被标识列唯一确定各个数据行。具体的标识方法是:如果出版条目中具有ROWGUIDCOL属性的uniqueidentifier数据类型列时,SQL Server自动使用该列作为行标识符。否则,SQL Server在为出版物第一次执行快照代理或创建出版物条目时向出版表中添加一列rowguid,并对rowguid列建立索引,rowguid列具有ROWGUIDCOL属性。由于合并出版一个表之前应删除其中的timestamp列。
(2)建立出版条目的数据修改跟踪触发器。在为合并复制第一次执行快照代理或创建出版物条目时,SQL Server建立合并复制触发器。这些触发器自动跟踪出版条目中行级或列级数据修改操作,并将所监测到的数据修改操作记录到合并复制系统表中。由于SQL Server7。0允许对一个表建立多个同类型的触发器(在SQL Server6。5及其以前版本中,只允许为表建立一个同类触发器),所以,合并复制触发器不影响表中已经建立的触发器,二者可以共享。
(3)向数据库中添加复制系统表,这些表用于数据跟踪、同步以及冲突检测、载决和报告等。系统表Msmerge_contents和Msmerge_tombstone用于跟踪出版物中的数据插入、修改和删除操作,其中的行标识符列rowguid连接各个基表,generation列用做逻辑时钟,它标识指定站点中该数据行是否被修改。Generation列值说明合并代理或对应站点的用户对该行数据修改的先后顺序。
(4)合并复制由快照代理和合并代理实现。在订阅服务器能够接收出版服务器的增量修改数据之前,它必须建立与出版物中各条目相同的结构和数据文件,即出版物的初始快照。初始快照可以通过快照代理建立,也可以由用户手工建立,即所谓的手工同步方式。使用快照代理建立初始快照的过程与事务复制中快照代理的工作过程基本相同,这里不再介绍:
当用户修改合并条目时,合并代理触发器将被修改行的generation列值置为0。之后当合并代理运行时,它查找表中所有generation列值为0的数据行,并将这些行的generation列值设置为一个比所有其它行的generation列值较高的值。每个站点中的合并代理通过跟踪它传递给其它站点的最高generation列值和其它站点传递给它的最高generation列值,即可判断出版物中的各个条目是否被修改。在同步阶段,合并代理将所有修改数据传递给其它站点。这些站点接收到修改数据后,合并代理首先检查这些行与表中旧数据行是否存在冲突。如果存在冲突,合并代理将根据各订阅者的优先给自动处理冲突,载决哪个用户的修改操作有效。
(四)立即修改订阅
立即修改订阅(Immediate Updating Subscribers)是SQL Server快照复制和事务复制中的一个复制选项,它允许订阅服务器对复制进行修改,被修改的数据或事务通过两阶段提交协议(2PC)传递给出版服务器,出版服务器提交后再将被修改数据传递给该出版物的其它订阅服务器之间有可靠的网络连接,能够保证二者间的正常通信,使分布式事务在两个服务器能够顺利进行。但它不要求其它订阅服务器与出版服务器之间的固定连接,它们之间可以只在数据同步期间建立连接。
SQL Server支持立即修改订阅操作时用到以下部件:
MS DTC:处理订阅服务器和出版器之间的分布事务,实现二者之间的两阶段提交操作。
触发器:当分发代理在订阅服务上建立初始快照时创建该触发器,它捕获数据修改事务,并在MS DTC 的控制下将所捕获到的事务提交给出版服务器。在创建该触发器的CREATE TRIGGER语句中使用NOT FOR RELPICATION选项,因此,分发代理对订阅服务器中数据库所做的修改操作不会激活触发器.
存储过程:当出版服务器检测到订阅服务器对它所订阅出版物的修改与出版服务器中的数据没有冲突时,位于出版服务器上的存储过程(包括插入存储过程、修改存储过程和删除存储过程等)实现对出版条目的插入、修改或删除操作,这些操作与订阅服务器所做的修改相同。
冲突检测:出版服务器使用以下两种方法检测订阅服务器所提交的事务是否存在冲突:
时间戳冲突检测法:采用这种方法时,要求出版表中具有时间戳列,SQL Server根据该列判断一数据行在复制到订阅服务器之后是否被修改过。具体检测方法是:当订阅服务器请求一个立即修改事务时,它将被修改行的时间戳列值相比较,如果二者相同,则说明该行数据复制之后没有被修改。因此,出版服务器可以接受订阅服务器所请求的修改事务。否则,说明订阅服务器所请求的修改事务与其它修改操作存在冲突,出版服务器拒绝订阅服务器的请求,并在两个服务器上回滚事务操作。当出版数据库和订阅数据库位于同一台服务器上时,不能使用时间戳冲突检测法检测冲突。
行比较冲突检测法:如果出版条目中没有时间戳列,SQL Server则将订阅服务器中所有列修改前的数值(由触发器从订阅服务器的deleted表中提取)与出版服务器中被修改行的有列的当前值进行比较,如果二者值相同,则说明没有冲突,否则存在冲突。
(五)存储过程复制
除复制表外,SQL Server还允许单向或双向复制存储过程。如果存储过程作为快照出版物中的条目时,SQL Server将整个存储过程从出版服务器复制到订阅服务器。
但是,如果存储过程作为事务出版物中的条目的,SQL Server将向订阅服务器复制存储过程的执行,而不是存储过程执行过程中所产生的数据处理事务。这时,如果在出版服务器上执行被出版的存储过程,该存储过程的执行及其执行参数被传递到每个订阅服务器。与出版表相比,在事务复制过程中出版存储过程可以减少网络的通信量。
在事务复制时,SQL Server自动标识对出版条目中的所有数据处理事务。为避免重复标识,在被出版存储过程执行期间,SQL Server暂停对复制事务和命令的标识。
存储过程复制时应该注意:如果对出版基表施加有横向过滤器,即订阅服务器的复制品中只是出版服务器数据表中的部分数据行时,被复制存储过程在出版服务器和订阅服务上执行所产生的结果是不同的。
-1.1 数据库基础知识
--数据库的概念
--数据库概念
--数据模型(1)
--数据模型(2)
--数据模型
--实体间的联系
--E-R图
--数据技术的发展
--数据库技术发展
-1.1 数据库基础知识--作业
-1.2 SQL SERVER简介
--数据库应用场景
--企业应用
--安装与配置
-1.2 SQL SERVER简介--作业
-1.3 课堂练习-安装和配置SQL SERVER2008
-职场小故事之一——数据库工程师采访录(1)
-2.1 数据库对象及构成
--sql server 2008数据库中的文件和文件组的详解
--管理数据库和文件
--创建文件组
--文件和文件组
-2.1 数据库对象及构成--作业
-2.2 创建数据库
--使用SQL SERVER Management Studio创建数据库
-2.2 创建数据库--作业
-2.3 修改数据库
--使用T-SQL扩充数据库或事务日志的容量-01(操作演示)
--使用T-SQL扩充数据库或事务日志的容量-02(操作演示)
-2.3 修改数据库--作业
-2.4 重命名或删除数据库
-2.4 重命名或删除数据库--作业
-2.5 课堂练习-创建数据库和数据库文件
-职场小故事之二 数据库工程师采访录(2)
-3.1 数据表设计
--数据表设计
-3.1 数据表设计--作业
-3.2 创建数据表
--创建数据表
-3.2 创建数据表--作业
-3.3 修改数据表结构
-3.3 修改数据表结构--作业
-3.4 删除数据表
-3.4 删除数据表--作业
-3.5 课堂练习-创建数据类型和数据表
--数据类型详解
-- 创建数据类型和表
--程序源代码
-3.5 课堂练习-创建数据类型和数据表--作业
-扩展知识
--数据类型详解
-职场小故事之三——数据库工程师是干什么的?
-4.1 合并多个查询结果中的数据
-4.1 合并多个查询结果中的数据--作业
-4.2 抽取数据到另一个表中
-4.2 抽取数据到另一个表中--作业
-4.3 添加数据
--向表中添加数据
-4.3 添加数据--作业
-4.4 更新数据
--将“电子出版概论”课程的上课时间修改为“周二晚”——程序源代码
--将“01数据库”班级所有学生的选课密码初始化为#*3456
--更新表中的数据
-4.4 更新数据--作业
-4.5 删除数据
--学生为“00000005”的学生因故取消课程编号为“017”的选修课
--学号为“0000005”的学生因故取消“中餐菜肴制作”选修课——程序源代码
--删除表中数据
-4.5 删除数据--作业
-4.6 课堂练习
-职场小故事之四——冯玉才:“背”着数据库闯天下
-5.1 查询单个数据表数据
-5.1 查询单个数据表数据--作业
-5.2 使用聚合函数查询
--使用聚合函数查询
-5.2 使用聚合函数查询--作业
-5.3 使用分组查询结果
--查看报名人数大于15的各类课程的最少报名人数和最多报名人数
--查看报名人数大于15并且每组平均报名人数大于30的课程类别和各组的平均报名人数
--查看课程类别为“信息技术”、“管理”的平均报名人数,并给出其他课程类别
--使用分组查询
-5.3 使用分组查询结果--作业
-5.4 排序查询结果
--重新排序查询结果
-5.4 排序查询结果--作业
-5.5 多表连接查询数据
--比较连接查询
--多表连接查询数据
-第5章 查询与统计数据-作业
-5.6 课堂练习-查询与统计数据
--程序源代码
-职场小故事之五——IT独行侠数据库独立咨询顾问牛新庄的故事
-6.1 索引的概述
--索引的技巧
--索引简介
--索引的分类
--索引的分类
-6.1 索引的概述--作业
-6.2 创建索引
--创建索引
-6.2 创建索引--作业
-6.3 重命名索引
--将sutdent表的IX_STUNAME索引重命名为IX_STUNAMENEW
--重命名索引
-6.3 重命名索引--作业
-6.4 删除索引
--删除索引
--删除索引
-6.4 删除索引--作业
-6.5 索引分析
--查询学号为“00000001”的学生信息,分析哪些索引被系统采用
--查询名为"林斌"的学生,分析执行该数据花费的磁盘活动量信息
--分析索引
-6.5 索引分析--作业
-6.6 索引维护
--使用UPDATE STATISTICS更新索引的统计信息
--维护索引
-6.6 索引维护--作业
-6.7 课堂练习-创建和优化索引
--创建和优化索引
--程序源代码
-职场小故事之六——数据库安全门事件
-实现索引
-7.1 数据完整性概述
--数据完整性的概述
--数据完整性概述
-7.1 数据完整性概述--作业
-7.2 创建约束
--创建主键约束
--创建主键约束
--添加唯一约束
--创建唯一约束
--约束的STUNO列值只允许为8位数字,并且不可以为8个0
--删除检查约束
--创建检查约束
--为STUCOU表添加默认约束,STATE列的默认值“报名”
--创建默认约束
--创建外键约束
-7.2 创建约束--作业
-7.3 创建默认值
--创建并绑定默认值
--创建默认值
--解除默认值UnsureDefault与Teacher列的绑定
--删除默认值
-7.3 创建默认值--作业
-7.4 创建规则
--创建规则
--解除规则CreditRule与Course表Credit列的绑定
--删除规则
-7.4 创建规则--作业
-7.5 课堂练习-实现数据完整性
-- 实现数据完整性
--程序源代码
-职场小故事之七——数据库工程师的发展前景
-8.1 视图的概述
--视图的基本概念
--视图简介
-8.1 视图的概述--作业
-8.2 创建视图
--创建视图
--创建视图
-8.2 创建视图--作业
-8.3 修改视图
--修改视图并加密
--修改视图
-8.3 修改视图--作业
-8.4 重命名视图
--重命名视图
--重命名视图
-8.4 重命名视图--作业
-8.5 删除视图
--删除视图
--删除视图
-8.5 删除视图--作业
-8.6 课堂练习-实现视图
-- 实现视图
--程序源代码
-职场小故事之八——数据库面对的工作岗位及职责
-9.1 存储过程概述
--存储过程的优点
--存储过程的优点
-9.1 存储过程概述--作业
-9.2 创建与执行不带参数的存储过程
--创建存储过程,返回学生表中班级编号为“20000001”的所有数据行
--执行存储过程
-9.2 创建与执行不带参数的存储过程--作业
-9.3 创建与执行带参数的存储过程
--执行存储过程
-9.3 创建与执行带参数的存储过程--作业
-9.4 修改存储过程
--修改的存储过程
-9.4 修改存储过程--作业
-9.5 删除存储过程
--删除存储过程
--删除存储过程
-9.5 删除存储过程--作业
-9.6 课堂练习-实现存储过程和函数
-- 实现存储过程和函数
--程序源代码
-职场小故事之九——数据库错误致虎航安全事故
-10.1 触发器概述
--触发器的概述
-10.1 触发器概述--作业
-10.2 创建触发器
--创建触发器
--测试触发器
--创建触发器
-10.2 创建触发器--作业
-10.3 修改触发器
--测试结果
--修改触发器
-10.3 修改触发器--作业
-10.4 删除触发器
--删除触发器
--删除触发器
-10.4 删除触发器--作业
-10.5 禁用或启用触发器
--禁用触发器
--启用触发器
--禁用或启用触发器
-10.5 禁用或启用触发器--作业
-10.6 课堂练习-管理触发器
--程序源代码
-职场小故事之十——韩国农协银行事件透视数据库安全问题
-11.1 SQL SERVER安全机制
--安全设计理念
-11.1 SQL SERVER安全机制--作业
-11.2 管理登录名和用户
--创建登录名
-11.2 管理登录名和用户--作业
-11.3 管理角色
--角色
-11.3 管理角色--作业
-11.4 管理权限
--创建登录名
--创建用户
-11.4 管理权限--作业
-11.5 课堂练习-管理安全性
--管理安全性
--程序源代码
-11.5 课堂练习-管理安全性--作业
-职场小故事之十一——银行账号“泄密”虚惊
-12.1 脱机后复制数据库文件
--数据库脱机操作
-12.1 脱机后复制数据库文件--作业
-12.2 备份与还原数据库
-12.2 备份与还原数据库--作业
-12.3 数据的导入和导出
--数据导入与导出
-12.4 复制数据库
--复制数据库
--数据库复制
-12.5 课堂练习-灾难恢复
-- 灾难恢复
--程序源代码
-职场小故事之十二——2011年数据库泄密事件
-13.1 windows应用程序开发
-13.1 windows应用程序开发--作业
-13.2 ASP.NET网站开发
-13.2 ASP.NET网站开发--作业
-国家软件开发文档标准
--操作手册编写规范
-- 详细设计说明书编写规范
-- 项目开发总结报告编写规范
--用户手册编写规范