Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1695614
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: 数据库开发技术

2011-03-31 10:19:38

MicrosoftInternetExplorer402DocumentNotSpecified7.8Normal0
SQL数据库备份VC实现

Authorlfl

Created on: 2010-6-3

完整备份

1. 完整备份数据库的脚本

USE master;

GO

BACKUP DATABASE [$(dbname)] TO  DISK = N'$(driver):$(location)$(dbname).bak' WITH NOFORMAT, NOINIT,  NAME = N'$(dbname)-完整数据库备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10 ;

BACKUP LOG [$(dbname)] TO DISK = N'$(driver):$(location)$(dbname).bak' WITH NO_LOG;

GO

USE [$(dbname)];

GO 

DBCC SHRINKDATABASE(N'$(dbname)');

我将它存为Backupdatabasewithlocation.sql

2. sqlcmd的批处理脚本

sqlcmd -U %1 -P %2 -v dbname=%3 driver=%4 location=%5 -i %6

我将它存为BackupdatabasewithLocation.bat

3. VC中设定路径

CString app= "C:\\Program Files\\Microsoft SQL Server\\MSSQL.1\\MSSQL\\Backup\\";

m_strBackupLocation = app;  //m_strBackupLocation是一个Edit Box所绑定的CString变量。

记住,一定要在路径中添加连续的两个\符号,否则,VC会将单独的\符号视为在VC中连接下一行字符作为整个字符串的操作符。而且,记住,一定要在最后一个目录的后面再添加上\\,否则,在接下来的_splitpath处理过程中,会把最后一层目录给忽略掉。

4. 处理VC中的路径

char _buffer[255]; 

GetShortPathName(m_strBackupLocation, _buffer, 256);//转换成短路径(无空格短路径)

char drive[500],dir[500];   

CString test = _buffer;

_splitpath(test, drive, dir,NULL,NULL);  //_splitpath可解析出路径、文件名、扩展名

CString d = drive;

d.Replace(":","");

CString c = dir;

举例:

4.1 路径中无空格

CString app = "C:\\backup\\";

4.2 路径中有空格

CString app= "C:\\Program Files\\Microsoft SQL Server\\MSSQL.1\\MSSQL\\Backup\\";

设置断点后,得到以上的变量的值。

4.3 假若在最后一层路径后没有加\\

CString app= "C:\\Program Files\\Microsoft SQL Server\\MSSQL.1\\MSSQL\\Backup";

5. VC中执行sqlcmd脚本

para="sa genius "+instanceName+" "+d+" "+c+" sql/Backupdatabasewithlocation.sql";

ShellExecute(NULL,"open","bat/BackupdatabasewithLocation.bat",para,NULL,SW_SHOW);

差异备份

1. 差异备份数据库的脚本(由于事务日志备份时出错,故已将NO_LOG修改为NO_TRUNCATE

USE master;

GO

BACKUP DATABASE [$(dbname)] TO  DISK = N'$(driver):$(location)$(dbname).bak' WITH DIFFERENTIAL, NOINIT,  NAME = N'$(dbname)-差异数据库备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10 ;

BACKUP LOG [$(dbname)] TO DISK = N'$(driver):$(location)$(dbname).bak' WITH NO_TRUNCATE;

GO

2. 差异备份的批处理脚本

sqlcmd -U %1 -P %2 -v dbname=%3 driver=%4 location=%5 -i %6

3. 差异备份在VC中的语句

//差异备份

if(time.GetDayOfWeek()!=1&&time.GetHour()==23&&time.GetMinute()==50)//非周日的23:50

{

para="sa genius "+CGloble::maindb+" "+d+" "+c+" sql/DifferentialBackup.sql";

ShellExecute(NULL,"open","bat/DifferentialBackup.bat",para,NULL,SW_SHOW);

}

其中,dc的参数意义同完整备份。

事务日志备份

第一次尝试,用的是下列语句:

USE master;

GO

BACKUP LOG [DBModule] TO  DISK = N'C:\dbbackup\DBModule.bak' WITH NOFORMAT, NOINIT,  NAME = N'DBModule-事务日志 备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

得到的结果如下:

消息4214,级别16,状态1,第

无法执行BACKUP LOG,因为当前没有数据库备份。

消息3013,级别16,状态1,第

BACKUP LOG 正在异常终止。

出错的原因是我在上一次执行差异备份的时候把事务日志给删除掉了,我执行差异备份的脚本如下:

USE master;

GO

BACKUP DATABASE [$(dbname)] TO  DISK = N'$(driver):$(location)$(dbname).bak' WITH DIFFERENTIAL, NOINIT,  NAME = N'$(dbname)-差异数据库备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10 ;

BACKUP LOG [$(dbname)] TO DISK = N'$(driver):$(location)$(dbname).bak' WITH NO_LOG;

GO

这样就明显是将日志截断了,这样再做日志备份的时候又找不到起点了。

我重新做了一次差异备份,脚本如下:

BACKUP DATABASE [DBModule] TO  DISK = N'C:\dbbackup\DBModule.bak' WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'DBModule-差异数据库备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

这之后,再用同样的事务日志备份脚本来进行日志备份,成功,出现的提示如下:

已处理百分之100

已为数据库'DBModule',文件'DBModule_log' (位于文件)处理了页。

BACKUP LOG 成功处理了页,花费0.014 (0.658 MB/)

如果将差异备份的NO_LOG改成NO_TRUNCATE就可以顺利的执行事务日志备份了。

最终使用的事务日志备份的脚本为:

USE master;

GO

BACKUP LOG [DBModule] TO  DISK = N'C:\dbbackup\DBModule.bak' WITH NOFORMAT, NOINIT,  NAME = N'DBModule-事务日志 备份', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO





 SQL数据库备份的VC实现.rar  

阅读(1372) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~