Sql server 如何使用Perl DBI进行SQL Server备份

Sql server 如何使用Perl DBI进行SQL Server备份,sql-server,perl,sql-server-2008-r2,dbi,Sql Server,Perl,Sql Server 2008 R2,Dbi,我正在尝试通过Perl DBI备份Sql Server数据库。通过do()调用“备份数据库”会运行,但通常不会生成备份。启用ODBC跟踪时,调用do()将创建备份。调用prepare()和execute()失败 我正在Windows7Professional和SQLServer2008R2上使用ActiveState Perl。 这里是下载源代码和各种日志的链接 (点击慢速下载) 下面是日志摘要 BothTraces made 3 backups but program aborted -rwx

我正在尝试通过Perl DBI备份Sql Server数据库。通过do()调用“备份数据库”会运行,但通常不会生成备份。启用ODBC跟踪时,调用do()将创建备份。调用prepare()和execute()失败

我正在Windows7Professional和SQLServer2008R2上使用ActiveState Perl。 这里是下载源代码和各种日志的链接 (点击慢速下载)

下面是日志摘要

BothTraces made 3 backups but program aborted
-rwx------+ 1 SYSTEM SYSTEM 160256 Jan 16 09:39 perlEasy.bak
-rwx------+ 1 SYSTEM SYSTEM 160256 Jan 16 09:39 perlHard.bak
-rwx------+ 1 SYSTEM SYSTEM 160256 Jan 16 09:38 queryOS.bak

NoTracing made 1 backup, program aborted
-rwx------+ 1 SYSTEM SYSTEM 160256 Jan 16 10:15 queryOS.bak

DbiTrace made 1 backup, program aborted
-rwx------+ 1 SYSTEM SYSTEM 160256 Jan 16 10:19 queryOS.bak

OdbcTrace made 3 backup but program aborted
-rwx------+ 1 SYSTEM SYSTEM 159744 Jan 16 10:21 perlEasy.bak
-rwx------+ 1 SYSTEM SYSTEM 160256 Jan 16 10:21 perlHard.bak
-rwx------+ 1 SYSTEM SYSTEM 160256 Jan 16 10:21 queryOS.bak
以下是我的节目:

#!perl -w
#try to use DBI for SQL Server backup 

#connect to database server 
   use v5.14;        #enable modern Perl 
   use DBI;          #database interface
   my $dbHandle = DBI->connect("dbi:ODBC:Driver={SQL Server};Server=DavidZ") or die;   #dbi prints a detailed error message 
   $dbHandle->{RaiseError} = 1;    #enable failure on DBI problems; obviates the need for "or die" with every DBI call
   $dbHandle->{PrintError} = 0;    #don't duplicate error messages 

#enable debugging 
   $dbHandle->trace(1); 
   $dbHandle->{odbc_trace} = 1;                                  #not helpful 
   $dbHandle->{odbc_trace_file} = 'C:\David\dump\tracer.file';   #not helpful 

#run a SQL command to verify connection, write a note to ERRORLOG  
   $dbHandle->do ('use master');
   $dbHandle->do ("raiserror ('New run of backup.pl', 0, 0) with log"); 
   say 'Verified database connection';

#backup commands 
   my $perlEasy = "backup database dz to disk='C:\\David\\dump\\perlEasy.bak'";
   my $perlHard = "backup database dz to disk='C:\\David\\dump\\perlHard.bak'";
   my $queryOS  = "backup database dz to disk='C:\\David\\dump\\queryOS.bak'";

#make a backup via sqlcmd.  this works 
   my $sysCmd = "sqlcmd -Q \"$queryOS\" "; 
   system ($sysCmd) == 0
      or die "The following system command failed:  $sysCmd \n"; 
   say 'Created backup via sqlcmd';

#try to make a backup via DBI 
   $dbHandle->do ($perlEasy);   #runs silently but does not produce a backup file 
   say 'Created backup the easy way';

#more complicated DBI method 
   my $stHandle = $dbHandle->prepare($perlHard);
   $stHandle->execute();     #statement starts a backup then fails, no furter code is executed 

   do 
   {
     #print dbi results 
     say "DBI reports $DBI::errstr"; 

     while (my @row = $stHandle->fetchrow_array())   #recommended by someone, but makes no sense for a backup 
        { say "Returned values: @row" }              #recommended by someone, but makes no sense for a backup 
   } while ($stHandle->{odbc_more_results});

   say 'Created backup the hard way'; 

#program completion
   say 'Program completed successfully';
   exit 0; 

您显示的Perl代码没有问题。但是,ODBC跟踪文件显示DBD::ODBC在发生错误之前进行了以下调用:

SQLPrepare backup database dz to disk='C:\David\dump\perlHard.bak'
SQLExecute returns SQL_SUCCESS_WITH_INFO and
  Processed 208 pages for database 'dz', file 'dz_test' on file 1. (4035) 
then a few calls for various handles to SQLErrorW
SQLRowCount returns ok and -1 for row count
SQLNumResultCols returns SQL_ERROR and ]Invalid cursor state
我一辈子都看不出这是一个无效的游标状态(请自己查看ODBC的有效状态转换),所以我不得不说这看起来像是您正在使用的SQL Server ODBC驱动程序中的一个错误。您可以尝试获取一个较新的客户端驱动程序,或者改用SQL Server本机客户端驱动程序(您可能已经拥有了这两个驱动程序)


您可以忽略sql server日志中的错误,因为这些错误是正确的,错误1235是错误请求,它已中止。

因此您无法在本地sql server或任何其他备份文件上找到
C:\David\dump\perlEasy.bak
?SQL Server日志(可从ManagementStudio访问)是否表明备份成功?我维护DBD::ODBC。这些建议中有一部分来自中国。在首先使用set DBI_TRACE=DBD=x.log设置env var DBI_跟踪并将日志的结尾粘贴到某个位置后,是否可以再次运行该脚本。在ODBC管理员中启用跟踪也很有用,我们可以看到这一点的结束。