我一直在使用以下备份脚本来为MSSQL数据库创建.bacpac文件。该脚本一般工作正常但对某些数据库失败。这些数据库与其他数据库没有太大的不同,可能有点大。由于这仅用于dev数据库,平均大小不大,bacpac文件大小约为200Mb。
从PowerShell ISE执行时脚本成功运行但从命令行运行时失败的奇怪之处。请注意,脚本仅对某些数据库失败并且对其他数据库有效。错误消息实际上没有帮助:
警告:发生异常:使用“2”参数调用“ExportBacpac”的异常:“无法从数据库导出架构和数据。”
我们使用MSSQL 2104,数据库可以毫无问题地从MSSQL Studio导出到备份。
剧本:
Param(
# Database name to backup e.g 'MYDB'
$databaseName,
# Database connection string "server=server ip;Integrated Security = True;User ID=user;Password=pass"
$connectionString,
# Path to the directory where backup file should be created
$backupDirectory
)
add-type -path "C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin\Microsoft.SqlServer.Dac.dll";
try {
$dacService = new-object Microsoft.SqlServer.Dac.DacServices $connectionString
# build backup filename
$backupFileName = $backupDirectory+"\"+$dataBaseName+[DateTime]::Now.ToString("yyyyMMdd-HHmmss")+".bacpac"
# perform backup
$dacService.exportBacpac($backupFileName, $dataBaseName);
Write-Output "Database backup file created $backupFileName"
} catch {
Write-warning "Exception occurred: $_"
throw "Database backup haven't been created, execution aborted."
}
有没有人遇到过这个问题?我知道PowerShell和PowerShell ISE有点不同,但我不明白为什么脚本执行会产生不同的结果。
[编辑]
尝试为DacService添加事件侦听器并打印输出以获取更多调试信息
register-objectevent -in $dacService -eventname Message -source "msg" -action { out-host -in $Event.SourceArgs[1].Message.Message } | Out-Null
输出
Dac Assembly loaded.
Extracting schema (Start)
Gathering database options
Gathering users
WARNING: Exception occurred: Exception calling "ExportBacpac" with "2" argument(s): "Could not export schema and data
from database."
Gathering roles
Gathering application roles
Gathering role memberships
Gathering filegroups
Gathering full-text catalogs
Gathering assemblies
Gathering certificates
....
Processing Table '[dbo].[file_storage_entity]'. 99.74 % done.
Processing Table '[dbo].[file_storage_entity]'. 100.00 % done.
Exporting data (Failed)
[编辑2]
作为一种解决方法,我已经创建了C#程序来做同样的事情。在任何环境中都可以运行。代码与PowerShell脚本中的代码几乎相同。