创建现有数据库的副本并使用 Powershell 脚本对其进行重命名

Posted

技术标签:

【中文标题】创建现有数据库的副本并使用 Powershell 脚本对其进行重命名【英文标题】:Create a copy of an existing database and rename it with a Powershell script 【发布时间】:2019-12-07 18:00:22 【问题描述】:

我正在尝试使用我在堆栈溢出时发现的 powershell 脚本来自动化我的项目中的一项任务,如下所述。

    从集成环境登录 SQL Server。 在同一 SQL Server 中创建现有数据库的副本并重命名。

Import-Module SQLPS -DisableNameChecking

$Server = "Servername"

$SQLInstanceName = "SQLInsta\Test01"

$SourceDBName   = "mrl_mpr_2_4_db"

Param(
     [Parameter(Mandatory=$true)] [string]$CopyDBName
     )

$Server  = New-Object -TypeName 'Microsoft.SqlServer.Management.Smo.Server' -ArgumentList $SQLInstanceName

$SourceDB = $Server.Databases[$SourceDBName]


**$CopyDB = New-Object -TypeName 'Microsoft.SqlServer.Management.SMO.Database' -  ArgumentList $Server, $CopyDBName** 

执行上面突出显示的行时出现错误

PS SQLSERVER:> $CopyDB = New-Object -TypeName 'Microsoft.SqlServer.Management.SMO.Database' -ArgumentList $Server, $CopyDBName

New-Object:使用“2”参数调用“.ctor”的异常: "数据库 'Test_DB_1_0_DB' 的 SetParent 失败。"

在 line:1 char:11

$CopyDB = New-Object -TypeName 'Microsoft.SqlServer.Management.SMO.Database' -Ar ...


+ CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId :  ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

【问题讨论】:

【参考方案1】:

试试这个脚本。它将处理复制数据库的所有方面,包括检查目标驱动器上的空间、检查目标计算机上是否存在所需的证书、检查 SQL 版本的兼容性。它将在 1 行中运行,并将应用所有必需的配置,例如设置兼容级别以匹配新版本、设置恢复级别、可选择复制用户和登录名,或恢复目标数据库的原始权限等。

查看维基

https://github.com/MikeyMing/powershell-sql/wiki/BackupAndRestore

请随时贡献。

谢谢

【讨论】:

【参考方案2】:

尝试设置你的服务器的域

 $Server = "Domain\Servername"

编辑:

首先,改变

$CopyDB = New-Object -TypeName 'Microsoft.SqlServer.Management.SMO.Database' -  ArgumentList $Server, $CopyDBName

作为

$CopyDB = New-Object -TypeName 'Microsoft.SqlServer.Management.SMO.Database' -ArgumentList $Server, $CopyDBName

然后按照以下步骤调试问题

$Server  = New-Object -TypeName 'Microsoft.SqlServer.Management.Smo.Server' -ArgumentList cwsql_listener
$Server

Instance Name                   Version    ProductLevel UpdateLevel  HostPlatform HostDistribution
-------------                   -------    ------------ -----------  ------------ ----------------
your-server-name                13.0.5101  SP2          n/a          Windows      n/a


$SourceDB = $Server.Databases[$SourceDBName]
$SourceDB


  Name                 Status           Size Space Avai Recovery Compat. Owner                     Collation
                                                lable  Model     Level
----                 ------           ---- ---------- -------- ------- -----                     ---------
xxxxxxxxxxx          Normal          xx GB     xx  GB Full         100 xxxx\xxxxxx         Turkish_CI_AS


$CopyDB = New-Object -TypeName 'Microsoft.SqlServer.Management.SMO.Database' -ArgumentList $Server, "test"
$CopyDB

名称状态大小空间 Avai Recovery Compat。所有者整理 标签模型级别 ---- ------ ---- ---------- -------- -------- ----- ------ --- 测试 xx MB xx KB 0

【讨论】:

Hello Dervis,设置域名后还是同样的错误。 HI Dervis,我很抱歉我无法关注你,因为我对此很陌生。正如你所说,我确实改变了。我收到了没有详细信息的空表,如下 CWSQL 侦听器。 PS SQLSERVER:\> $Server = New-Object -TypeName 'Microsoft.SqlServer.Management.Smo.Server' -ArgumentList cwsql_listener $Server Instance Name ------------- 导入模块 SQLPS -DisableNameChecking $Server = "NORTHAMERICA\Servername" $SQLInstanceName = "TEST01" $SourceDBName = "mrl_mpr_2_4_db" $Server = New-Object -TypeName 'Microsoft.SqlServer.Management.Smo .Server' -ArgumentList cwsql_listener $Server $Server = New-Object -TypeName 'Microsoft.SqlServer.Management.Smo.Server' -ArgumentList $SQLInstanceName $SourceDB = $Server.Databases["mrl_mpr_2_4_db"] $SourceDB $CopyDB = New-对象 -TypeName 'Microsoft.SqlServer.Management.SMO.Database'-ArgumentList $Server,"TEST_DB" $CopyDB.Create()

以上是关于创建现有数据库的副本并使用 Powershell 脚本对其进行重命名的主要内容,如果未能解决你的问题,请参考以下文章

在 PowerShell 中使用“备份”上下文创建卷影副本

创建 SQL 表作为现有表的副本(ODBC 和 C#)[关闭]

MS SQL 存储过程生成脚本创建现有数据库的副本

Powershell:创建 Az 副本到 blob 容器日志文件或详细

如何在 Android Studio 中导入模块而不创建副本

如何更改多个 .txt 文件中的字符并保存/覆盖 Powershell 中的现有文件