热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> 数据库>>正文内容

数据库(三)数据库DTS相关

发布时间:2009年07月10日点击数: 未知

题记:上两个星期一直在用SQL2000的DTS做一个数据自动转移备份的程序,结果把这一块的东西又研究了一下。以往也用SQL不过是学习课本上照本宣科的东西,实用就是用网页读数据库,只要安装好数据库,设置正确的连接字符串,就能用了,也没深入探讨。最近又用的时候,才发现SQL的水真是深啊,一不小心就被一个问题搅的晕头转向。还好,现在咨询发达,可以查帮助文档和网上搜索,因此,这些问题也逐渐解决了。把以前和最近的总结文档整理一下,记录下来,也让其他人遇到一样问题时来搜索我的文章吧!

文章构架:

(一)数据库安装相关—挂起、创建实例失败

(二)数据库—数据库连接失败

(三)数据库—DTS相关

(四)数据库进阶—索引、视图、游标、存储过程和触发器

问题来源:关于数据库的转移备份的原理,大家多少都比较熟悉了。但是,目前做的数据库转移备份有多可靠?我们确实可以安心睡觉了吗?答案是不可能!现地生产环境中的数据库备份和转移绝对不可能像教科书写的那样高枕无忧!像目前我们的项目一样,数据库众多、数据量巨大、数据更新频繁、网络和服务器受现场干扰不稳定、数据完整性的考虑,众多的问题,考验着我们!本文只是一个初探,当然要实现最最安全的转移备份可以考虑使用目前一些公司提供的成熟的软硬件方案,我这里只是从借助SQL的DTS程序,个人开发一些简单的数据转移程序来论述。

一、迁移SQL数据库的几种办法。

1.1利用备份和恢复(数据量巨大、空间有限时不适用,只能手动)

先对源数据库进行完全备份,备份到一个设备(device)上,然后把备份文件复制到目的服务器上(恢复的速度快),进行数据库的恢复操作,在恢复的数据库名中填上源数据库的名字(名字必须相同),选择强制型恢复(可以覆盖以前数据库的选项),再选择从设备中进行恢复,浏览时选中备份的文件就行了。这种方法可以完全恢复数据库,包括外键,主键,索引。

1.2数据分离和附加(只能手动,而且要暂时切断源数据库)

先对源数据库进行分离,这样源数据库就可以复制了,然后将数据库的数据文件(*.mdf)和日志文件(*.ldf)都拷贝到目的服务器,在执行附加就可以了。这种方法可以完全恢复数据库,包括外键,主键,索引。

1.3在应用程序中定制(显然,只能执行较少的数据修改)

可以在应用程序(PB、VB)中执行自己编写的程序,也可以在Query Analyzer中执行,这种方法比较灵活,其实是利用一个平台连接到数据库,在平台中用的主要是SQL语句,这种方法对数据库的影响小,但是如果用到远程链接服务器,要求网络之间的传输性能好,一般有两种语句:

1> select ... into new_tablename where ...

2> insert (into) old_tablename select ... from ... where ...

区别是前者把数据插入一个新表(先建立表,再插入数据),后者是把数据插入已经存在的一个表中,我个人喜欢后者,因为在编程的结构上,应用的范围上,第二条语句强于前者。

1.4 SQL Server的复制和发布功能(很强大,但要求也很多,配置不太容易)

SQL Server提供了强大的数据复制功能,也是最不易掌握的,具体应用请参考相关资料,值得注意的是要想成功进行数据的复制工作,有些条件是必不可少的:

1)SQL Server Agent必须启动,MSDTC必须启动。

2)所有要复制的表必须有主键。

3)如果表中有text或image数据类型,必须使用with log选项,不能使用with no_log选项。另外max text repl size选项控制可以复制的文本和图像数据的最大规模,超过这个限制的操作将失败。

4)在要进行复制的计算机上,应该至少是隐含共享,即共享名是a1、b1…。

5)为SQL Server代理使用的Windows Server账号不能是一个本地的系统账号,因为本地的系统账号不允许网络存取。

6)对同步的时间轴长度还需考察。对于数据更新频繁、数据量大、同步间隔时间长的情况,时间会很长,而且非常容易发生因网络、服务器意外关机等情况下数据发布错误。

1.5触发器(只能适用少量数据表的更改)

这个不用说了,以后会有介绍。除了适用少量表的限制外,加了触发器的表格在数据DTS中非常容易出错。

1.6 DTS设计器导入导出(我们项目选定的方案,可自动化调用)

DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的移动。在SQL Server Enterprise Manager中,展开服务器左边的+,选择数据库,右击,选择All tasks/Import Data...(或All tasks/Export Data...),进入向导模式,按提示一步一步走就行了,里面分得很细,可以灵活的在不同数据源之间复制数据,很方便的。而且可以另存成DTS包,如果以后还有相同的复制任务,直接运行DTS包就行,省时省力。也可以直接打开DTS设计器,方法是展开服务器名称下面的Data Transformation Services,选Local Packages,在右边的窗口中右击,选New Package,就打开了DTS设计器。值得注意的是:如果源数据库要拷贝的表有外键,注意移动的顺序,有时要分批移动,否则外键主键,索引可能丢失,移动的时候选项旁边的提示说的很明白,或者一次性的复制到目标数据库中,再重新建立外键,主键,索引。

我们的项目由于现地单元实时监测记录数据,数据量巨大,每日递增,每月还定时生成一系列名称随时间变化的表,需要定期每月转移上一个月的数据,减少现地单元负担。于是设计使用DTS包,生成VB语言包,然后修改生成VB程序,每月自动调用。具体编程过程就不多说了,这里,充分介绍一下DTS包的各项设置,保证数据成功转移。

二、DTS导入\导出向导的使用。(我的原WORD文档,都有截图的,但是博客中贴图很麻烦,就不贴图了)

2.1 右键选择数据库—所有任务—选择导入/导出数据:

根据提示,依次输入数据源和数据目的地:

2.2选择是复制表或视图、复制查询结果,还是传输对象和数据。

2.2.1如果选择复制数据,需要决定要复制的列或视图并决定是否要转换数据。

单击“下一步”打开“选择表和视图对话框”对话框,如图所示。从中选择一个或多个表或视图进行传递。通过“预览”按钮可对将要传递的数据进行预览。

  如果想定义数据转换时源表和目标表之间列的对应关系,则单击“转换”列的方格按钮,打开列映射和转换对话框,如下图所示。

A、其中各选项的含义如下:

  ?创建目的表:在从源表拷贝数据前首先创建目标表,在缺省情况下总是假设目标表不存在,如果存在则发生错误、除非选中了“除去并重新创建目的表”选项;

  ?删除目的表中的行:在从源表拷贝数据前将目标表的所有行删除,仍保留目标表上的约束和索引,当然使用该选项的前提是目标表必须存在;

  ?在目的表中追加行:把所有源表数据添加到目标表中,目标表中的数据、索引、约束仍保留。但是数据不一定追加到目标表的表尾,如果目标表上有聚簇索引,则可以决定将数据插入何处;

  ?除去并重新创建目的表:如果目标表存在,则在从源表传递来数据前将目标表、表中的所有数据、索引等删除后重新创建新目标表;

  ?启用标识插入:允许向表的标识列中插入新值。

B、在进行数据转换时,可以通过脚本语言(如J script Per script Vb script)对源表中的某一列施加某种运算(乘、除或将该分割成几列、或将几列合并成一列),然后再将这种结果复制到目标表。此时应选中“列映射和转换”对话框的“转换”标签页,并选中“在将信息复制到目的时对其进行转换”如下图所示:

使用此方法的注意事项:

A.如果源数据是视图,则 DTS 导入/导出向导自动将该视图转换为目的数据库中的表。

B.如果目的表中有同名的数据表,数据库默认在后面追加现有数据,当出现目的表的列数比源项小时,会传输出错,有时,因主键等问题,也会出错。因此,选用此方法,除了确实是追加数据外,最好不要同名传输。

C.使用数据转换可以改变表名,在不同的数据源类型中转换(如SQL和ACESS)。

D.选择这种方法只是传输数据,会丢失约束关系(如触发器、视图、索引)。

2.2.2如果选择查询源数据并复制结果,则需要构造 SQL 查询,该查询可以是异类查询,也可以是分布式查询。可以手动输入 SQL 查询,也可以图形方式输入查询。在完成查询之后,可以决定是否将转换添加到查询结果中。有关以图形方式输入 SQL 查询的更多信息,请参见 SQL2000中的帮助文档---DTS 查询设计器。

可以在【查询语句】下的空白框中键入从所选数据库生成数据的SELECT查询语句,则该查询语句的结果集就是所有转换数据。

另外也可以通过单击【查询生成器(Q)】按钮来激活创建查询向导,如图7.50所示。

2.2.3如果选择在 SQL Server 实例之间传输数据库对象,需要:

1)创建目的对象(如表……)(C):在目标数据源中为所有传递对象创建目标对象。

2)首先除去目的对象(D):在创建新对象之前删除所有与源对象相同的目标对象。

3)包括所有相关对象(I):包括所有的依赖对象比如视图引用的基本表。包括所有扩展属性,这些属性是用户在数据库中的不同对象上提供的定义,如字段描述等信息.

4)复制数据(O):选中该复选框表示允许从源向目标数据源拷贝数据

5)替换现有数据(R):用指定源数据源的数据覆盖目标数据源中的数据

6)追加数据(A):保留目标数据源中的原有数据并添加从数据源拷贝来的数据

7)复制所有对象(L):复制数据源中的所有数据库对象

8)选择对象(E):只传递被选择的数据库对象

9)选项(P):设置高级传递选项

10)脚本文件目录(S):指定执行传递操作的SQL 语句存储的目录

注意事项:

A.是否创建要传输的对象。如果不选,则不能传输目的数据库中没有的表。

B.选择是否要首先除去现有的数据库对象。选择后,同名表格会被先删除,选择此项后,注意不要重复复制有触发器控制的表格,这些表会被创建,导致触发触发器而出错。

C.包括相关对象。是否传输外键和视图中定义的表等,不选的话,但目的数据库中没有相关对象时容易出错。

D.包括扩展属性。表的扩展属性。

E.替换或追加现有的数据。

F.使用排序规则。

G.复制全部对象。

H.选项—数据库角色。如果原数据库有名称不同但登陆名相同的角色会报错。

I.选项—登陆角色。

3.设置成功后,可以立即运行或用复制方法发布目的数据或保存后以后执行或生成一些其他格式文件。

在默认选项区可以选择与包有关的操作:

?立即运行——这个选项立即执行导入任务(在DTS中称为“包”)。如果选择这个选项,那么不会保存任务,相反只是运行它。

?用复制方法发布目的数据——将目的表用于复制。使用这个选项,DTS 导入/导出向导结束运行后将启动创建发布向导。

?调度DTS包以便以后执行——如果想推迟到以后执行,就用这个选项来创建任务。升迁一个数据库时,你可能不需要保存任何导入任务。单击这个选项旁边的省略号按钮,会显示一系列调度选项,本文不再赘述。

?保存DTS包——将导入的任务保存到以下任何位置之一:SQL Server、SQL Server Meta Data Services、结构化存储文件或者Visual Basic文件。

  ?SQL Server:将包存储在msdb数据库中;

  ?SQL Server Meta Data Service:将包存储在Repository中;

  ?Structured Storage File:以DTSCOM结构的文件格式存储。容易通过文件服务器进行邮递和分发。

?Visual Basic File

4.单击“下一步”,打开“保存DTS包”对话框,如下图所示。在“名称”输入该包的名称“新建包”,可以将包保存在本地服务器或其它的远程服务器,也可以选择适当的认证方式,如果选择SQL Server认证,要提供用户名和密码。

5.单击“下一步”,在“正在完成DTS导入/导出向导”对话框中单击“完成”,结束包的创建。如图所示,这时可以查看数据目的和源的设置。是否正确点击“完成”按钮,就完成了数据库到的导入导出操作。

 

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作