备份 DBmssql 时出现 Golang 错误:BACKUP DATABASE 异常终止
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'
它失败并出现以下错误
Error with Backing up the DBmssql: BACKUP DATABASE is terminating abnormally
我确信我遗漏了一些东西,任何 ideas/thoughts 将不胜感激。
顺便说一句,我在 Ubuntu 16.04 上安装了 mssql,我使用的是 go 版本 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 查询的原因,例如:SELECT @@VERSION
来自上面 Q 中的示例。
不过,我将远程查询的超时值设置为 0 这个 SQL 查询:
EXEC SP_CONFIGURE 'remote query timeout', 0
reconfigure
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 预计 return 在 most 一行
和备份查询不 return 任何行
我正在尝试使用 go 对 MSSQL 数据库进行完整备份。
但是,我测试了与 MSSQL 服务器的连接,它非常有效!
通过对代码执行查询 SELECT @@VERSION
它给了我版本,并且已经使用下面代码中的凭据连接到 mssql。
通过 运行 查询 BACKUP DATABASE name_db TO DISK = '/tmp/database.bak'
它失败并出现以下错误
Error with Backing up the DBmssql: BACKUP DATABASE is terminating abnormally
我确信我遗漏了一些东西,任何 ideas/thoughts 将不胜感激。
顺便说一句,我在 Ubuntu 16.04 上安装了 mssql,我使用的是 go 版本 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 查询的原因,例如:SELECT @@VERSION
来自上面 Q 中的示例。
不过,我将远程查询的超时值设置为 0 这个 SQL 查询:
EXEC SP_CONFIGURE 'remote query timeout', 0
reconfigure
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 预计 return 在 most 一行 和备份查询不 return 任何行