88 lines
3.5 KiB
PowerShell
88 lines
3.5 KiB
PowerShell
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";
|
|
});
|
|
Write-Host "All databases restored!"; |