用于恢复具有多个 TRN 文件的 SQL 服务器数据库的 Powershell 脚本
Powershell script to restore a SQL Server database with multiple TRN files
我正在尝试想出一个 Powershell 脚本来在 SQL Server 2019 中动态执行 'Restore Database',其中包含位于一个文件夹中的多个 TRN(或 BAK)文件每日计算。
我会先手动做完整备份,这个任务会安排在运行之后(每天一次)。
因此,Python 脚本只会将昨天的文件从另一个文件夹抓取到此文件夹中,并且此 Powershell 脚本将执行 运行 使用这些 TRN / BAK 文件(位于这个文件夹)。
计划按顺序检查每个 TRN 文件(位于同一文件夹中)(不是按文件创建时间,而是按文件名)。
例如,在本例中将从“..04”开始-->“..12”。
我从这个 site 中找到了一些示例,但我不确定如何在识别序列 ("..04" --> "..12") 到 [=32= 的位置进行编码].
PS C:\> $File = Get-ChildItem c:\backups, \server1\backups -recurse
PS C:\> $File | Restore-DbaDatabase -SqlInstance Server1\Instance -UseDestinationDefaultDirectories
所以,默认情况下,我认为 Get-ChildItem
应该已经显示了从最低到最高的文件,但如果你想确保你可以尝试这样的事情,看看输出是否适合你的情况。
为了开始测试,我将使用与您相同的名称创建文件:
$i=1;1..12|foreach{
$null > "LOG_us_bcan_multi_replica_20210427$($i.ToString('0#')).bak"
$null > "LOG_us_bcan_multi_replica_20200327$($i.ToString('0#')).bak"
$i++
}
这将创建 24 个具有相同命名约定的文件。
- 从...multi_replica_2021042701.bak到...multi_replica_2021042712.bak
- 从...multi_replica_2020042701.bak到...multi_replica_2020042712.bak
我们知道可以按 DateTime
排序,因此我们可以使用字符串操作来获取 FileNames
的日期,并对它们使用 ParseExact
方法。
示例:
# Assuming your current directory is the directory where the .bak files are
$expression={
[datetime]::ParseExact(
$_.BaseName.split('replica_')[1],'yyyyMMddHH',[cultureinfo]::InvariantCulture
)
}
Get-ChildItem | Select-Object BaseName,@{n='DateFromFileName';e=$expression}
# This will return a side by side FileName with their Dates from FileName
BaseName DateFromFileName
-------- ----------------
LOG_us_bcan_multi_replica_2020032701 3/27/2020 1:00:00 AM
LOG_us_bcan_multi_replica_2020032702 3/27/2020 2:00:00 AM
LOG_us_bcan_multi_replica_2020032703 3/27/2020 3:00:00 AM
LOG_us_bcan_multi_replica_2020032704 3/27/2020 4:00:00 AM
LOG_us_bcan_multi_replica_2020032705 3/27/2020 5:00:00 AM
LOG_us_bcan_multi_replica_2020032706 3/27/2020 6:00:00 AM
.....
现在我们可以使用与 Sort-Object
相同的 $expression
而不是 Select-Object
Get-ChildItem | Sort-Object $expression
我正在尝试想出一个 Powershell 脚本来在 SQL Server 2019 中动态执行 'Restore Database',其中包含位于一个文件夹中的多个 TRN(或 BAK)文件每日计算。
我会先手动做完整备份,这个任务会安排在运行之后(每天一次)。
因此,Python 脚本只会将昨天的文件从另一个文件夹抓取到此文件夹中,并且此 Powershell 脚本将执行 运行 使用这些 TRN / BAK 文件(位于这个文件夹)。
计划按顺序检查每个 TRN 文件(位于同一文件夹中)(不是按文件创建时间,而是按文件名)。
例如,在本例中将从“..04”开始-->“..12”。
我从这个 site 中找到了一些示例,但我不确定如何在识别序列 ("..04" --> "..12") 到 [=32= 的位置进行编码].
PS C:\> $File = Get-ChildItem c:\backups, \server1\backups -recurse
PS C:\> $File | Restore-DbaDatabase -SqlInstance Server1\Instance -UseDestinationDefaultDirectories
所以,默认情况下,我认为 Get-ChildItem
应该已经显示了从最低到最高的文件,但如果你想确保你可以尝试这样的事情,看看输出是否适合你的情况。
为了开始测试,我将使用与您相同的名称创建文件:
$i=1;1..12|foreach{
$null > "LOG_us_bcan_multi_replica_20210427$($i.ToString('0#')).bak"
$null > "LOG_us_bcan_multi_replica_20200327$($i.ToString('0#')).bak"
$i++
}
这将创建 24 个具有相同命名约定的文件。
- 从...multi_replica_2021042701.bak到...multi_replica_2021042712.bak
- 从...multi_replica_2020042701.bak到...multi_replica_2020042712.bak
我们知道可以按 DateTime
排序,因此我们可以使用字符串操作来获取 FileNames
的日期,并对它们使用 ParseExact
方法。
示例:
# Assuming your current directory is the directory where the .bak files are
$expression={
[datetime]::ParseExact(
$_.BaseName.split('replica_')[1],'yyyyMMddHH',[cultureinfo]::InvariantCulture
)
}
Get-ChildItem | Select-Object BaseName,@{n='DateFromFileName';e=$expression}
# This will return a side by side FileName with their Dates from FileName
BaseName DateFromFileName
-------- ----------------
LOG_us_bcan_multi_replica_2020032701 3/27/2020 1:00:00 AM
LOG_us_bcan_multi_replica_2020032702 3/27/2020 2:00:00 AM
LOG_us_bcan_multi_replica_2020032703 3/27/2020 3:00:00 AM
LOG_us_bcan_multi_replica_2020032704 3/27/2020 4:00:00 AM
LOG_us_bcan_multi_replica_2020032705 3/27/2020 5:00:00 AM
LOG_us_bcan_multi_replica_2020032706 3/27/2020 6:00:00 AM
.....
现在我们可以使用与 Sort-Object
相同的 $expression
而不是 Select-Object
Get-ChildItem | Sort-Object $expression