Приветствую вас, уважаемые форумчане! Прошу вашей помощи в решении проблемы работы скриптов PS.
Вводные данные:
Имеется "боевой" сервер
MS SQL 2022, совмещенный с ролью сервера 1С8.
Все нижеописанные действия проводятся на одном сервере.
Для экономии дискового пространства (а оно ограничено), тестовая база для бэкапов одна, а кол-во баз на текущий момент 3, далее может быть и больше.
Скрипты выполняются по расписанию в планировщике Windows.
Для реализации бэкапов БД 1С8 написаны скрипты на PowerShell (PS), в которых реализована следующая логика работы (упрощённо):- Из исходной "боевой" скульной БД выгружается полный сжатый бэкап (.bak) с помощью оснастки PS "Backup-SqlDatabase";
- Полученный бэкап восстанавливается в тестовую скульную БД с помощью оснастки PS "Restore-SqlDatabase";
- После восстановления, файл бэкапа (.bak) удаляется;
- Далее идет подключение к базе 1С8 в режиме конфигуратора, в которую на скуле был восстановлен бэкап, и производится выгрузка дампа БД 1С8 в формате .dt
Код скрипта PowerShell №1
Код:
# Load SQL Server cmdlets
Import-Module SqlServer
# Set variables SQL Server
$ServerInstance = "1C8SQLERP\SQL1C8ERP"
$DatabaseNameSource = "doc_prod"
$DatabaseNameDestination = "forbackup"
$BackupDir = "F:\BackUp"
$StartTime = (Get-Date)
$Timestamp = Get-Date -Format "yyyyMMdd"
$BackupFile = "${BackupDir}\${DatabaseNameSource}_${Timestamp}.bak"
Write-Host "Job Started in $StartTime" -ForegroundColor Yellow
# Create backup and archive directories if they don't exist
if (!(Test-Path $BackupDir)) {
New-Item -ItemType Directory -Path $BackupDir
}
# Backup the SQL Server database
Backup-SqlDatabase -ServerInstance $ServerInstance -Database $DatabaseNameSource -BackupFile $BackupFile -CompressionOption On -CopyOnly
Write-Host "Database backup completed successfully." -ForegroundColor Green
# Restore the SQL Server database
Restore-SqlDatabase -ServerInstance $ServerInstance -Database $DatabaseNameDestination -BackupFile $BackupFile -ReplaceDatabase
Write-Host "Database restore completed successfully." -ForegroundColor Green
# Remove the original backup file
Remove-Item $BackupFile
Write-Host "Original backup file removed." -ForegroundColor Green
# Set variables 1C8
$PatchBackup = "\\data3\BackUP\1CBases\DO\" + $DatabaseNameSource + "_" + $Timestamp + "_" + ".dt"
$1cexe = '"C:\Program Files\1cv8\common\1cestart.exe"'
$BaseServer = "/S1C8SQLERP\" + $DatabaseNameDestination
$AdminLogin = '"/NBackUP"'
$Pswd = "/P123456"
$UC = "sudo"
$Argument = " ENTERPRISE $BaseServer $AdminLogin $Pswd /DisableStartupMessages"
$ArgumentBackup = "DESIGNER $BaseServer $AdminLogin $Pswd /UC $UC /DumpIB" + $PatchBackup
# Backup 1C8 Base
Start-Process $1cexe $ArgumentBackup
# Loop for checking the created dt file
While($true)
{
if (Test-Path $PatchBackup)
{
$EndTime = (Get-Date)
$TotalTime = $EndTime-$StartTime
Write-Host "Database 1C8 backup completed successfully." -ForegroundColor Green
Write-Host "Job Finished in $EndTime" -ForegroundColor Yellow
Write-Host "Total time:" -ForegroundColor Red
'{0:mm} min {0:ss} sec' -f $TotalTime
exit
}
Start-Sleep -Seconds 10
}
Код скрипта PowerShell №2
Код:
# Load SQL Server cmdlets
Import-Module SqlServer
# Set variables SQL Server
$ServerInstance = "1C8SQLERP\SQL1C8ERP"
$DatabaseNameSource = "doc3_prod"
$DatabaseNameDestination = "forbackup"
$BackupDir = "F:\BackUp"
$StartTime = (Get-Date)
$Timestamp = Get-Date -Format "yyyyMMdd"
$BackupFile = "${BackupDir}\${DatabaseNameSource}_${Timestamp}.bak"
Write-Host "Job Started in $StartTime" -ForegroundColor Yellow
# Create backup and archive directories if they don't exist
if (!(Test-Path $BackupDir)) {
New-Item -ItemType Directory -Path $BackupDir
}
# Backup the SQL Server database
Backup-SqlDatabase -ServerInstance $ServerInstance -Database $DatabaseNameSource -BackupFile $BackupFile -CompressionOption On -CopyOnly
Write-Host "Database backup completed successfully." -ForegroundColor Green
# Restore the SQL Server database
Restore-SqlDatabase -ServerInstance $ServerInstance -Database $DatabaseNameDestination -BackupFile $BackupFile -ReplaceDatabase
Write-Host "Database restore completed successfully." -ForegroundColor Green
# Remove the original backup file
Remove-Item $BackupFile
Write-Host "Original backup file removed." -ForegroundColor Green
# Set variables 1C8
$PatchBackup = "\\data3\BackUP\1CBases\DO\" + $DatabaseNameSource + "_" + $Timestamp + "_" + ".dt"
$1cexe = '"C:\Program Files\1cv8\common\1cestart.exe"'
$BaseServer = "/S1C8SQLERP\" + $DatabaseNameDestination
$AdminLogin = '"/NBackUP"'
$Pswd = "/P123456"
$UC = "sudo"
$Argument = " ENTERPRISE $BaseServer $AdminLogin $Pswd /DisableStartupMessages"
$ArgumentBackup = "DESIGNER $BaseServer $AdminLogin $Pswd /UC $UC /DumpIB" + $PatchBackup
# Backup 1C8 Base
Start-Process $1cexe $ArgumentBackup
# Loop for checking the created dt file
While($true)
{
if (Test-Path $PatchBackup)
{
$EndTime = (Get-Date)
$TotalTime = $EndTime-$StartTime
Write-Host "Database 1C8 backup completed successfully." -ForegroundColor Green
Write-Host "Job Finished in $EndTime" -ForegroundColor Yellow
Write-Host "Total time:" -ForegroundColor Red
'{0:mm} min {0:ss} sec' -f $TotalTime
exit
}
Start-Sleep -Seconds 10
}
Код скрипта PowerShell №3
Код:
# Load SQL Server cmdlets
Import-Module SqlServer
# Set variables SQL Server
$ServerInstance = "1C8SQLERP\SQL1C8ERP"
$DatabaseNameSource = "erp_prod"
$DatabaseNameDestination = "forbackup"
$BackupDir = "F:\BackUp"
$StartTime = (Get-Date)
$Timestamp = Get-Date -Format "yyyyMMdd"
$BackupFile = "${BackupDir}\${DatabaseNameSource}_${Timestamp}.bak"
Write-Host "Job Started in $StartTime" -ForegroundColor Yellow
# Create backup and archive directories if they don't exist
if (!(Test-Path $BackupDir)) {
New-Item -ItemType Directory -Path $BackupDir
}
# Backup the SQL Server database
Backup-SqlDatabase -ServerInstance $ServerInstance -Database $DatabaseNameSource -BackupFile $BackupFile -CompressionOption On -CopyOnly
Write-Host "Database backup completed successfully." -ForegroundColor Green
# Restore the SQL Server database
Restore-SqlDatabase -ServerInstance $ServerInstance -Database $DatabaseNameDestination -BackupFile $BackupFile -ReplaceDatabase
Write-Host "Database restore completed successfully." -ForegroundColor Green
# Remove the original backup file
Remove-Item $BackupFile
Write-Host "Original backup file removed." -ForegroundColor Green
# Set variables 1C8
$PatchBackup = "\\data3\BackUP\1CBases\ERP\" + $DatabaseNameSource + "__" + $Timestamp + ".dt"
$1cexe = '"C:\Program Files\1cv8\common\1cestart.exe"'
$BaseServer = "/S1C8SQLERP\" + $DatabaseNameDestination
$AdminLogin = '"/NBackUP"'
$Pswd = "/P123456"
$UC = "sudo"
$Argument = " ENTERPRISE $BaseServer $AdminLogin $Pswd /DisableStartupMessages"
$ArgumentBackup = "DESIGNER $BaseServer $AdminLogin $Pswd /UC $UC /DumpIB" + $PatchBackup
# Backup 1C8 Base
Start-Process $1cexe $ArgumentBackup
# Loop for checking the created dt file
While($true)
{
if (Test-Path $PatchBackup)
{
$EndTime = (Get-Date)
$TotalTime = $EndTime-$StartTime
Write-Host "Database 1C8 backup completed successfully." -ForegroundColor Green
Write-Host "Job Finished in $EndTime" -ForegroundColor Yellow
Write-Host "Total time:" -ForegroundColor Red
'{0:mm} min {0:ss} sec' -f $TotalTime
exit
}
Start-Sleep -Seconds 10
}
Проблема в следующем:
Размер .dt при выполнении скрипта с очередностью 2 и далее (т.е. выполняемый после окончания работы первого), совпадает с размером первого выгруженного .dt,
подозреваю что ошибка возникает на этапе восстановления скульной БД (лишний или недостающий аргумент в оснастке PS "Restore-SqlDatabase").
Соответственно создается некорректный бэкап 2-ой БД с содержимым 1-ой БД.