*************************数据库备份和还原*************************

时间:2022-07-29 03:21:28
首先不要怪我懒,我已经“搜索”-“备份”看了N多的帖子,但是没有找到我满意的,所以只好浪费我的分数,也浪费大家的时间来共同的“烟酒烟酒”了。(注:项目比较急,而且我现在在香港现场调试系统,希望大家帮帮忙,进来的,不知道也帮忙说说UP,分自然是少不掉的,多谢)。

应用系统给用户要求提供简单方便的Backup/Restore界面。(由于Backup和Restore的需求一样,所以以下只描述备份)。
备份要求根据用户选择的时间段对数据库中的数据进行备份:现在的方案采用AdoDataSet的SaveToFile方法来将提取的数据集保存为文件,再通过第三方控件TBackupFile来压缩文件。
现在的问题是:
1.SaveToFile好像比较浪费时间(数据库数据量有点大)。

所以考虑采用SQL语句Backup语句,参看了Backup语句的帮助,困惑:
1.Backup能否对时间段的记录进行Backup呢?
2.使用Backup语句,界面上的Progress怎么做,这个必须给客户做。
3.客户(香港*)非常重视操作的运行时间,请问:ADo记录集的SaveToFile、Backup以及BCP备份,那个速度最快?各有什么优缺点?

最后,谢谢你关注Up我的帖子。

17 个解决方案

#1


1.Backup能否对时间段的记录进行Backup呢?
不行,也不能选择表。
2.使用Backup语句,界面上的Progress怎么做,这个必须给客户做。
这个可以参考SQL-DMO。
3.客户(香港*)非常重视操作的运行时间,请问:ADo记录集的SaveToFile、Backup以及BCP备份,那个速度最快?各有什么优缺点?
如果一定要选择表,建议Backup和BCP备份结合,Backup交数据库管理员做,BCP备份可以用程序实现,也要考虑压缩。

#2


赞成yang的观点!

#3


Yang:你好。关于你对三个问题的回复,我还是有个问题:如何一次执行BCP语句就备份多表(视图)?
谢谢wucy8的参与。

#4


"如果一定要选择表,建议Backup和BCP备份结合,Backup交数据库管理员做,BCP备份可以用程序实现,也要考虑压缩。"

Backup交给数据库管理员来做,这是不可能的,需求中是应用程序中系统管理员来做,所以不可能更改这个需求,在isqlw测试了一下,使用以下语句比较耗时:
BACKUP DATABASE 操作成功地处理了 49201 页,花费了 123.818 秒(3.255 MB/秒)。
这个时间客户一定不会接受。
现在数据量的情况如下:
数据文件:386M
日志文件:459M
实际系统绝对是大数据量,由于前期数据库结构设计的不是很理想(只有一个数据库,现在不可能去改数据库结构),所以数据库数据量比中型的实时证券交易系统的数据量还大。

#5


1.如果不修改库结构的话确实很难实现。

2. 我是这么做的, 引入TsaveDialog控件
procedure TMainForm.ActDtDupExecute(Sender: TObject); //一个action event
var
  sqlStr : String;
begin
  SaveDialog.Filter := '数据文件 (*.dat)|*.Dat';
  SaveDialog.DefaultExt := 'dat';
  if SaveDialog.Execute then
    begin
      sqlStr := 'BACKUP DATABASE dbname TO MyDiskDump WITH INIT;';
      adoquery.sql.clear;
      Adoquery.sql.add(sqlStr);
      Adoquery.execsql;
      //可以加入你自己的出错控制。
    end;
end;
这样客户在界面上就可以选择要备份的目的文件,restore的话需要引入Topendialog控件。

3. 通过adodataset的savetofile method是最慢的,以我经验来说bcp是最快的。backup database 其次。

#6


不号意思,我不懂, 不能帮您

#7


sql-dmo,or call proc on server to backup

#8


这个问题我是这么看的,供参考:
1、数据量达到一定程度,数据重要程度达到一定程度,最好的系统也需要系统管理员来做日常维护。
2、数据量达到一定程度,数据重要程度达到一定程度,备份就必须用多种方法。这里用SQL系统本身的backup功能,利用JOB调度的方法可以很有效的在系统以外崩溃的时候尽快恢复,少丢数据。利用BCP和adodataset的savetofile 只能做到一次备份一个表,多个表只有在程序里循环,特点是灵活,可以用来备份少量的重要数据。
3、用backup功能备份,在Restore的时候有一些限制,往往在程序不易运行,包括必须设置但用户模式(等于必须停用系统)。

#9


Yang_(扬帆破浪):
下午好,由于我们设计的系统分总部和分部,分部点数比较多,所以没有采用服务器而采用普通的PC机(PIII800,256M,20G)做数据库服务器(失败!),
Windows 2000 Server
SQL Server 2000

只有一个分区C盘,下午一个点系统瘫痪,去看了一下:
C盘:使用4.8G,未使用14.2G。
*.Mdf 685M
*.Log 1.54G
使用sp_helpdb DataBaseName检查数据库信息,如下:
FleetManager,2270.94 MB,HEADQUARTERS\Administrator,7,07 17 2001 ,Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=FULL, Version=539, Collation=Chinese_*_Stroke_CI_AS, SQLSortOrder=0, IsTornPageDetectionEnabled, IsAutoCreateStatistics, IsAutoUpdateStatistics,80

返回的第二个数据集如下:
FleetManager_Data,1,C:\Program Files\Microsoft SQL Server\MSSQL\data\FleetManager_Data.MDF,PRIMARY,701952 KB,Unlimited,10%,data only
FleetManager_Log ,2,C:\Program Files\Microsoft SQL Server\MSSQL\data\FleetManager_Log.LDF ,NULL,1623488 KB,Unlimited,10%,log only

现在问题是:系统经常瘫痪,不知道是通信的问题还是数据库瓶颈的问题。

#10


up

#11


gz

#12


是否可采用BACKUP及表备份结合的办法:
1、用SQL SERVER调度来自动BACKUP完整的数据库,可设成每
周一次、保留二个BACKUP文件。
2、用Sql server中的DTS数据转换服务来备份多表。生成DTS包时
为备份多表并设置二个日期的参数,程序调用时传递参数。这种方法可用界面由用户操作。

我曾用VB+SQL SERVER2000做过,我在这里曾回答过,不知是否有用。

http://www.china-askpro.com/msg47/qa08.shtml


#13


sql server崩了应该要看错误日志文件!

只有一个分区的服务器确实令人担心,很可能会出现什么备份独独不出来的危险情况,我觉得至少需要加一个硬盘(不是分区),用于备份。

#14


备分应该使用多个硬盘来进行备分,使数据和备分数据分离(最好物理上分离)这样可以在意外的时候也可以处理!
使用备分一般来说,对于数据库的操作应该是系统管理员来进行处理,当然也应该提供用户(客户端)备分的功能,但客户端备分的数据应该是客户感兴趣或客户需要的数据(部分的),而不应该让客户直接操作数据库!
备分可以自己写一个JOB来调用BACKUP DATABASE,你可以把BACKUP写成是一个存储过程的形式,这样你可以动态的实现不同的备分,甚至可以按照时间进行备分!当然你也可以同时使用BCP和BACKUP!

#15


UP
我进来学习的!

#16



我进来学习的!

#17


个人观点,
服务器还是有必要上的,也可以考虑作一下双机热备;
网卡最好是用1000m的服务器网卡;
IDE硬盘速度太慢;

个人感觉,你的库文件增加的很快阿!\


#1


1.Backup能否对时间段的记录进行Backup呢?
不行,也不能选择表。
2.使用Backup语句,界面上的Progress怎么做,这个必须给客户做。
这个可以参考SQL-DMO。
3.客户(香港*)非常重视操作的运行时间,请问:ADo记录集的SaveToFile、Backup以及BCP备份,那个速度最快?各有什么优缺点?
如果一定要选择表,建议Backup和BCP备份结合,Backup交数据库管理员做,BCP备份可以用程序实现,也要考虑压缩。

#2


赞成yang的观点!

#3


Yang:你好。关于你对三个问题的回复,我还是有个问题:如何一次执行BCP语句就备份多表(视图)?
谢谢wucy8的参与。

#4


"如果一定要选择表,建议Backup和BCP备份结合,Backup交数据库管理员做,BCP备份可以用程序实现,也要考虑压缩。"

Backup交给数据库管理员来做,这是不可能的,需求中是应用程序中系统管理员来做,所以不可能更改这个需求,在isqlw测试了一下,使用以下语句比较耗时:
BACKUP DATABASE 操作成功地处理了 49201 页,花费了 123.818 秒(3.255 MB/秒)。
这个时间客户一定不会接受。
现在数据量的情况如下:
数据文件:386M
日志文件:459M
实际系统绝对是大数据量,由于前期数据库结构设计的不是很理想(只有一个数据库,现在不可能去改数据库结构),所以数据库数据量比中型的实时证券交易系统的数据量还大。

#5


1.如果不修改库结构的话确实很难实现。

2. 我是这么做的, 引入TsaveDialog控件
procedure TMainForm.ActDtDupExecute(Sender: TObject); //一个action event
var
  sqlStr : String;
begin
  SaveDialog.Filter := '数据文件 (*.dat)|*.Dat';
  SaveDialog.DefaultExt := 'dat';
  if SaveDialog.Execute then
    begin
      sqlStr := 'BACKUP DATABASE dbname TO MyDiskDump WITH INIT;';
      adoquery.sql.clear;
      Adoquery.sql.add(sqlStr);
      Adoquery.execsql;
      //可以加入你自己的出错控制。
    end;
end;
这样客户在界面上就可以选择要备份的目的文件,restore的话需要引入Topendialog控件。

3. 通过adodataset的savetofile method是最慢的,以我经验来说bcp是最快的。backup database 其次。

#6


不号意思,我不懂, 不能帮您

#7


sql-dmo,or call proc on server to backup

#8


这个问题我是这么看的,供参考:
1、数据量达到一定程度,数据重要程度达到一定程度,最好的系统也需要系统管理员来做日常维护。
2、数据量达到一定程度,数据重要程度达到一定程度,备份就必须用多种方法。这里用SQL系统本身的backup功能,利用JOB调度的方法可以很有效的在系统以外崩溃的时候尽快恢复,少丢数据。利用BCP和adodataset的savetofile 只能做到一次备份一个表,多个表只有在程序里循环,特点是灵活,可以用来备份少量的重要数据。
3、用backup功能备份,在Restore的时候有一些限制,往往在程序不易运行,包括必须设置但用户模式(等于必须停用系统)。

#9


Yang_(扬帆破浪):
下午好,由于我们设计的系统分总部和分部,分部点数比较多,所以没有采用服务器而采用普通的PC机(PIII800,256M,20G)做数据库服务器(失败!),
Windows 2000 Server
SQL Server 2000

只有一个分区C盘,下午一个点系统瘫痪,去看了一下:
C盘:使用4.8G,未使用14.2G。
*.Mdf 685M
*.Log 1.54G
使用sp_helpdb DataBaseName检查数据库信息,如下:
FleetManager,2270.94 MB,HEADQUARTERS\Administrator,7,07 17 2001 ,Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=FULL, Version=539, Collation=Chinese_*_Stroke_CI_AS, SQLSortOrder=0, IsTornPageDetectionEnabled, IsAutoCreateStatistics, IsAutoUpdateStatistics,80

返回的第二个数据集如下:
FleetManager_Data,1,C:\Program Files\Microsoft SQL Server\MSSQL\data\FleetManager_Data.MDF,PRIMARY,701952 KB,Unlimited,10%,data only
FleetManager_Log ,2,C:\Program Files\Microsoft SQL Server\MSSQL\data\FleetManager_Log.LDF ,NULL,1623488 KB,Unlimited,10%,log only

现在问题是:系统经常瘫痪,不知道是通信的问题还是数据库瓶颈的问题。

#10


up

#11


gz

#12


是否可采用BACKUP及表备份结合的办法:
1、用SQL SERVER调度来自动BACKUP完整的数据库,可设成每
周一次、保留二个BACKUP文件。
2、用Sql server中的DTS数据转换服务来备份多表。生成DTS包时
为备份多表并设置二个日期的参数,程序调用时传递参数。这种方法可用界面由用户操作。

我曾用VB+SQL SERVER2000做过,我在这里曾回答过,不知是否有用。

http://www.china-askpro.com/msg47/qa08.shtml


#13


sql server崩了应该要看错误日志文件!

只有一个分区的服务器确实令人担心,很可能会出现什么备份独独不出来的危险情况,我觉得至少需要加一个硬盘(不是分区),用于备份。

#14


备分应该使用多个硬盘来进行备分,使数据和备分数据分离(最好物理上分离)这样可以在意外的时候也可以处理!
使用备分一般来说,对于数据库的操作应该是系统管理员来进行处理,当然也应该提供用户(客户端)备分的功能,但客户端备分的数据应该是客户感兴趣或客户需要的数据(部分的),而不应该让客户直接操作数据库!
备分可以自己写一个JOB来调用BACKUP DATABASE,你可以把BACKUP写成是一个存储过程的形式,这样你可以动态的实现不同的备分,甚至可以按照时间进行备分!当然你也可以同时使用BCP和BACKUP!

#15


UP
我进来学习的!

#16



我进来学习的!

#17


个人观点,
服务器还是有必要上的,也可以考虑作一下双机热备;
网卡最好是用1000m的服务器网卡;
IDE硬盘速度太慢;

个人感觉,你的库文件增加的很快阿!\