繁体   English   中英

备份 DBmssql 时出现 Golang 错误:备份数据库异常终止

[英]Golang Error with Backing up the DBmssql: BACKUP DATABASE is terminating abnormally

我正在尝试使用 go 对 MSSQL 数据库进行完整备份。

但是,我测试了与 MSSQL 服务器的连接,它的工作原理非常棒!

通过对代码执行查询SELECT @@VERSION

它为我提供了版本,并且已使用下面代码中的凭据连接到 mssql。

通过运行查询BACKUP DATABASE name_db TO DISK = '/tmp/database.bak'它失败并出现以下错误

备份 DBmssql 时出错:BACKUP DATABASE 异常终止

我确信我遗漏了一些东西,任何想法/想法将不胜感激。

顺便说一句,我在 Ubuntu 16.04 上安装了 mssql,我使用的是 1.9 版。

这是我的代码:

package main                                                                    
  import (                                                                      
     _ "github.com/denisenkom/go-mssqldb"                                       
     "database/sql"                                                             
     "context"                                                                  
     "log"                                                                      
     "fmt" )                                                                    


var server = "server_url"                                     
var port = 1433                                                                 
var user = "user"                                                          
var password = "pass"                                                  

var db *sql.DB                                                                  

func main() {                                                                   
        var err error                                                                                                                                           
        // Create connection string                                               
        connString := fmt.Sprintf("server=%s;user id=%s;password=%s;
        port=%d", server, user, password, port)                                   
        // Create connection pool                                                 
        db, err = sql.Open("sqlserver", connString)                             
        if err != nil {                                                         
                log.Fatal("Error creating connection pool: " 
                + err.Error())     
        }                                                                       
     log.Printf("Connected!\n")                                                 
     defer db.Close()                                                           

        Backup()                                                                
        //Restore()                                                             
 }                                                                              

func Backup(){                                                                  
        ctx := context.Background()                                                                                                                     
        err := db.PingContext(ctx)
        if err != nil {
                log.Fatal("Error pinging database :( " + err.Error())
        }
        var result string
        err = db.QueryRowContext(ctx, "BACKUP DATABASE tempdb 
        TO DISK= '/tmp/Backup.bak' WITH NOFORMAT, NOINIT,
        SKIP, NOREWIND, NOUNLOAD, STATS = 10;").Scan(&result)
        //err = db.QueryRowContext(ctx, "select @@version").Scan(&result)
        if err != nil {
                log.Fatal("Error with Backing up the DB", err.Error())
        }
        fmt.Printf("%s\n",result)

}   

我找到了非常愚蠢的解决方案。你可以在第一个回复中找到它。

显而易见,代码是干净的并且可以按预期工作。

唯一的问题来自MSSQL,它为超时查询设置了特定的值。

这就是为什么我成功执行了其他SQL查询,例如:上面Q中的示例中的SELECT @@VERSION

不过,我将此SQL查询的超时值设置为0:

EXEC SP_CONFIGURE'远程查询超时',0
重新配置
EXEC sp_configure

remote query timeout为0表示超时不受限制。

问题出在 MSSQL 和 os 上,请先尝试在 SQL Server Management Studio 上进行查询,以了解问题的来源。

现在,改变这个:(

err = db.QueryRowContext(ctx, "BACKUP DATABASE tempdb TO DISK= '/tmp/Backup.bak' WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10;").Scan(&result)

) 到 (

err = db.QueryRowContext(ctx, "BACKUP DATABASE tempdb TO DISK= '/tmp/Backup.bak' WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10;").Err()

)

因为 db.QueryRowContext 预计最多返回一行并且备份查询不返回任何行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM