2023-02-22 12:12:38 +01:00
Function IsDatabaseExists {
param ( [ string ] $containerId , [ string ] $database , [ string ] $sqlPass )
$query = " IF EXISTS
( SELECT name FROM master . sys . databases WHERE name = N '$database' )
PRINT 'yes'
ELSE
PRINT 'no' "
return ( docker exec $containerId / opt / mssql-tools / bin / sqlcmd -S localhost -U sa -P $sqlPass -Q $query )
# USE master; ALTER DATABASE b-crm-master; SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE b-crm-master;
}
Function DropDatabase {
param ( [ string ] $containerId , [ string ] $database , [ string ] $sqlPass )
$query = " USE master;
ALTER DATABASE [ $database ]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE ;
GO
DROP DATABASE [ $database ] ; "
docker exec $containerId / opt / mssql-tools / bin / sqlcmd -S localhost -U sa -P $sqlPass -Q $query > $null
return ;
# /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'v](8Lc|RfG' -Q "USE master; ALTER DATABASE b-crm-master; SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE b-crm-master;"
}
Function AttachDatabase {
param ( [ string ] $containerId , [ string ] $database , [ string ] $sqlPass , [ string ] $mdfName , [ string ] $ldfName )
$query = " CREATE DATABASE [ $database ]
ON ( FILENAME = N '/var/opt/mssql/data/$mdfName' ) ,
( FILENAME = N '/var/opt/mssql/data/$ldfName' ) FOR ATTACH ;
ALTER DATABASE [ $database ] SET READ_WRITE ; "
docker exec $containerId / opt / mssql-tools / bin / sqlcmd -S localhost -U sa -P $sqlPass -Q $query
return ;
}
Function CopyFile {
param ( [ string ] $containerId , [ string ] $fileName )
docker cp . / Temp / $fileName $containerId " ://var/opt/mssql/data/ $fileName "
docker exec - -user root $containerId chown mssql : root / var / opt / mssql / data / $fileName
return ;
}
if ( ( Split-Path ( Get-Location ) -Leaf ) -ne " DiunaBI " ) {
Write-Host " Error: Run script from main source directory. " ;
Exit ;
}
try {
$containerId = ( docker ps | Select-String " mssql " ) . Line . split ( " " ) [ 0 ]
} catch {
Write-Host " Error: MSSQL container not exists (or Docker is not running) " ;
Exit ;
}
Write-Host " MSSQL container id: " $containerId ;
$sqlPass = " v](8Lc|RfG " ;
# Let's do the job!
@ ( " diuna " ) . ForEach ( {
$database = $_ ;
$ldfName = $database + " _log.ldf " ;
$mdfName = $database + " .mdf " ;
Write-Host " Restoring database: " $database
# Download mdf/ldf nd check if files are new (donwload with success)
scp " crm.bim-it.pl:/var/opt/mssql/data/ $mdfName " . / Temp /
if ( ( ( Get-Date ) - ( ( Get-Item . / Temp / $mdfName ) . LastWriteTime ) ) . TotalMinutes -gt 5 ) {
Write-Host " Error: $mdfName was not downloaded correctly. "
continue ;
}
scp " crm.bim-it.pl:/var/opt/mssql/data/ $ldfName " . / Temp /
if ( ( ( Get-Date ) - ( ( Get-Item . / Temp / $ldfName ) . LastWriteTime ) ) . TotalMinutes -gt 5 ) {
Write-Host " Error: $ldfName was not downloaded correctly. "
continue ;
}
#drop existing database
DropDatabase $containerId $database $sqlPass ;
if ( ( IsDatabaseExists $containerId $database $sqlPass ) -eq 'yes' ) {
Write-Host " Error: $database still exists (drop error) "
continue ;
}
#copy new files
CopyFile $containerId $mdfName
CopyFile $containerId $ldfName
#attach databases in container
AttachDatabase $containerId $database $sqlPass $mdfName $ldfName ;
if ( ( IsDatabaseExists $containerId $database $sqlPass ) -eq 'no' ) {
Write-Host " Error: $database still not exists (attach error) "
continue ;
}
Write-Host " OK " ;
} ) ;
2023-01-05 19:13:06 +01:00
Write-Host " All databases restored! " ;