none
С помощью PowerShell, необходимо монтировать определенные базы, к локальному серверу SQL, затем на следующий день отключать их. RRS feed

  • Вопрос

  • Есть определенные базы SQL, которые копируются с удаленных серверов, на целевой сервер, в папку с текущей датой (пример: 2014.07.10) . С помощью PowerShell, необходимо монтировать данные базы,  к локальному серверу SQL, с добавлением к названию базы, именя филиала (пример: _est) затем на следующий день отключать их.  И подключать уже те же самые базы, но уже с новой датой, в этом же каталоге, из новой папки с текущей датой (пример: 2014.07.11)

    Как это реализовать, с помощью PowerShell?

    11 июля 2014 г. 8:19

Ответы

  • Да,тут я забыл про папку с датой.

    Group-Object {$_.Directory.Name.Substring(0,3) + "_" + $_.BaseName.split("_")[0]} 

    заменить на

    Group-Object {$_.DirectoryName.Split("\")[-2].Substring(0,3)  + "_" + $_.BaseName.split("_")[0]} 

    • Помечено в качестве ответа nomadus 17 июля 2014 г. 6:32
    16 июля 2014 г. 14:24
    Отвечающий

Все ответы

  • Предпологаем, что в папке с датой лежат mdf и ldf, где в имени название базы_филиал.

    Берег готовый скрипт и чуть правим - http://blog.aggregatedintelligence.com/2012/02/powershell-smocopy-and-attach-database.html

    # Текущая дата
    $date = (Get-Date).ToString("yyyy.MM.dd")
    
    # Сервер с базой данных
    $databaseServer = "SqlServer"
    
    # Расположение файлов
    $path = "D:\DATA\$date\"
    
    # Выбираем файлы mdf и ldf. Группируем по названию базы.
    $dbs = Get-ChildItem "$path\*" -Include *.mdf,*.ldf | Group-Object BaseName | Where {$_.Count -eq 2}
    
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null 
    $sqlServerSmo = New-Object Microsoft.SqlServer.Management.Smo.Server($databaseServer)
    
    # Работа с базой
    foreach($db in $dbs) {
    	$databaseName = $db.Name 
    	
    	####### Drop the destination database if it already exists
    	Write-Host "Checking to see if $databaseName needs to be dropped...."; 
    	if ($sqlServerSmo.databases[$databaseName] -ne $null) 
    	{ 
    		Write-Host "Dropping database $databaseName on server $databaseServer" 
    		$sqlServerSmo.KillAllProcesses($databaseName) 
    		$sqlServerSmo.databases[$databaseName].drop() 
    		Write-Host "Database $databaseName on server $databaseServer has been dropped" 
    	} 
    	else 
    	{ 
    		Write-Host "Database $databaseName does not exist on server $databaseServer" 
    	} 
    	Write-Host ""
    	
    	#######  Attach the database to detsination server
    	$datafile = Join-Path $path "$databaseName.mdf"
    	$logfile = Join-Path $path "$databaseName.ldf"
    
    	$sc = New-Object System.Collections.Specialized.StringCollection
    	$sc.Add($datafile) | Out-Null; 
    	$sc.Add($logfile) | Out-Null;
    
    	Write-Host "Attaching $datafile and $logfile to $databaseServer...."
    	$Error.Clear()
    	
    	try 
    	{ 
    		$sqlServerSmo.AttachDatabase($databaseName, $sc) 
    	} 
    	catch 
    	{ 
    		Write-Host $_.Exception; 
    		if ($Error.Count -gt 0) 
    		{ 
    			Write-Host "Error Information" -BackgroundColor Red 
    			$error[0] | fl -force 
    		} 
    	}
    
    	Write-Host "Completed!!!" -BackgroundColor DarkGreen;
    }
    
    
    

    11 июля 2014 г. 9:18
    Отвечающий
  • Условие слегка поменялось. Необходимо монтировать данные базы,  к локальному серверу SQL,  с их же именем.

    На сколько я понимаю, тогда эта строчка будет лишней: $dbs = Get-ChildItem "$path\*" -Include *.mdf,*.ldf | Group-Object BaseName | Where {$_.Count -eq 2}

    И здесь надо будет прописать полный путь, к базам: #######  Attach the database to detsination server
        $datafile = Join-Path $path "$databaseName.mdf"
        $logfile = Join-Path $path "$databaseName.ldf"

    15 июля 2014 г. 11:35
  • Обернуть в функцию.

    Function Attach-Database {
    	param($dataBaseName,$dataFile,$logFile)
    
    	####### Drop the destination database if it already exists
    	Write-Host "Checking to see if $databaseName needs to be dropped...."; 
    	if ($sqlServerSmo.databases[$databaseName] -ne $null) 
    	{ 
    		Write-Host "Dropping database $databaseName on server $databaseServer" 
    		$sqlServerSmo.KillAllProcesses($databaseName) 
    		$sqlServerSmo.databases[$databaseName].drop() 
    		Write-Host "Database $databaseName on server $databaseServer has been dropped" 
    	} 
    	else 
    	{ 
    		Write-Host "Database $databaseName does not exist on server $databaseServer" 
    	} 
    	Write-Host ""
    	
    	#######  Attach the database to detsination server
    
    	$sc = New-Object System.Collections.Specialized.StringCollection
    	$sc.Add($datafile) | Out-Null; 
    	$sc.Add($logfile) | Out-Null;
    
    	Write-Host "Attaching $datafile and $logfile to $databaseServer...."
    	$Error.Clear()
    	
    	try 
    	{ 
    		$sqlServerSmo.AttachDatabase($databaseName, $sc) 
    	} 
    	catch 
    	{ 
    		Write-Host $_.Exception; 
    		if ($Error.Count -gt 0) 
    		{ 
    			Write-Host "Error Information" -BackgroundColor Red 
    			$error[0] | fl -force 
    		} 
    	}
    	Write-Host "Completed!!!" -BackgroundColor DarkGreen;
    }
    
    $databaseServer = "SqlServer
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null 
    $sqlServerSmo = New-Object Microsoft.SqlServer.Management.Smo.Server($databaseServer)

    И передавать:

    Attach-Database -dataBaseName "Tewst" -dataFile "C:\Test\test.mdf" -logFile "C:\Test\test.ldf"  

    15 июля 2014 г. 11:48
    Отвечающий
  • По изменению условий, не поняли друг друга ;-) Имелось в виду:

    Есть определенные базы SQL, которые копируются с удаленных серверов, на целевой сервер, в папку с текущей датой (пример: 2014.07.10) . С помощью PowerShell, необходимо монтировать данные базы,  к локальному серверу SQL,  с их же текущем именем (Пример названия базы и файла лога: new.mdf, new_log.ldf). Затем на следующий день отключать их.  И подключать уже те же самые базы, но уже с новой датой, в этом же каталоге, из новой папки с текущей датой (пример: 2014.07.11)


    • Изменено nomadus 15 июля 2014 г. 13:57
    15 июля 2014 г. 13:53
  • Первый скрипт полностью выполняет эти условия. Только одно изменение:

    Group-Object BaseName на Group-Object {$_.basename.split("_")[0]}

    15 июля 2014 г. 14:14
    Отвечающий
  • Во время выполнения скрипта, выскакивает такая ошибка:

    Checking to see if trans needs to be dropped....
    Dropping database trans on server SQLSERVER
    Database trans on server SQLSERVER has been dropped

    Attaching C:\ARM\DB_ARM\NEW\2014.07.16\trans.mdf and C:\ARM\DB_ARM\NEW2\2014.07.16\trans.ldf to SPKH-SQLTEST\SQ
    LSERVER....
    System.Management.Automation.MethodInvocationException: Исключение при вызове "AttachDatabase" с "2" аргументами: "Attac
    h database failed for Server 'SPKH-SQLTEST\SQLSERVER'. " ---> Microsoft.SqlServer.Management.Smo.FailedOperationExceptio
    n: Attach database failed for Server 'SPKH-SQLTEST\SQLSERVER'.  ---> Microsoft.SqlServer.Management.Common.ExecutionFail
    ureException: An exception occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.SqlExc
    eption: Не удалось открыть физический файл "C:\ARM\DB_ARM\new2\2014.07.16\trans.ldf". Ошибка операционной системы 2:
     "2(Не удается найти указанный файл.)".

    Во время отработки скрипта, уже была подключена база trans.mdf, во время выполнения скрипта. Скрипт полностью удаляет, уже подключенную базу. . Мне же надо чтобы он просто отключал базу, подключенную базу , не удаляя ее с жесткого диска !

    16 июля 2014 г. 6:46
  • И что не понятно в ошибке?

    Не удалось открыть физический файл "C:\ARM\DB_ARM\new2\2014.07.16\trans.ldf". Ошибка операционной системы 2: "2(Не удается найти указанный файл.)".

    Поменять строчку:

    $logfile = Join-Path $path "$databaseName.ldf"
    на
    $logfile = ($db.Group -match  "\.ldf").FullName

    Для Dettach базы, вместо $sqlServerSmo.databases[$databaseName].drop() :

    $sqlServerSmo.DetachDatabase($databaseName,$false)


    • Изменено KazunEditor 16 июля 2014 г. 7:09
    16 июля 2014 г. 7:08
    Отвечающий
  • Строчки поменял, но Судя по всему, во время подключения, он лог файл не видит:

    Attaching C:\ARM\DB_ARM\NEW\2014.07.16\trans.mdf and  to SPKH-SQLTEST\SQLSERVER....
    System.Management.Automation.MethodInvocationException: Исключение при вызове "AttachDatabase" с "2" аргументами: "Attac
    h database failed for Server 'SPKH-SQLTEST\SQLSERVER'. " ---> Microsoft.SqlServer.Management.Smo.FailedOperationExceptio
    n: Attach database failed for Server 'SPKH-SQLTEST\SQLSERVER'.  ---> Microsoft.SqlServer.Management.Common.ExecutionFail
    ureException: An exception occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.SqlExc
    eption: Имя объекта или столбца отсутствует или пусто. В инструкциях SELECT INTO удостоверьтесь, что каждый столбец имее
    т имя. В других инструкциях найдите пустые имена псевдонимов. Не допускаются псевдонимы, указанные как "" или []. Добавь
    те имя или введите в качестве имени псевдонима один пробел.

    16 июля 2014 г. 8:12
  • Для теста указать в скрипте путь к базе и логу вручную, и посмотреть, что происходит.
    16 июля 2014 г. 8:25
    Отвечающий
  • Вручную  прописаны пути, к базам и логам двух баз. Одна база подключается нормально. В время подключения другой, происходит ошибка:Error Information


    Exception             : System.Management.Automation.MethodInvocationException: Исключение при вызове "AttachDatabase"
                            с "2" аргументами: "Attach database failed for Server 'SQLSERVER'. " ---> Microsof
                            t.SqlServer.Management.Smo.FailedOperationException: Attach database failed for Server 'SQLSERVER'.  ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exc
                            eption occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.S
                            qlException: Не удалось открыть физический файл "C:\ARM\DB_ARM\New\2014.07.16\trans.mdf". Ош
                            ибка операционной системы 32: "32(Процесс не может получить доступ к файлу, так как этот файл з
                            анят другим процессом.)".
                               в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnectio
                            n)

    16 июля 2014 г. 9:59
  • База trans.mdf от монтирована? Проверьте, что занимает доступ к файлу trans.mdf и проведите тест заново.

    16 июля 2014 г. 10:25
    Отвечающий
  • Да отмонтирована. Доступ ни что, не занимает.  Для чистоты эксперимента, тестовая машина была перезагружена, заново запущен скрипт. Ошибка повторилась.
    16 июля 2014 г. 10:29
  • Вот что происходит. В папке NEW, две базы и файла лога: new1.mdf, new1_log.ldf, new2.mdf, new2_log.ldf)Checking to see if new needs to be dropped....
    Database new1 does not exist on server SQLSERVER

    Attaching C:\ARM\DB_ARM\NEW2\2014.07.16\new2.mdf and C:\ARM\DB_ARM\NEW2\2014.07.16\new2_log.ldf to SQLSERVER....
    Completed!!!
    Checking to see if trans needs to be dropped....
    Database new2 does not exist on server SQLSERVER

    Attaching C:\ARM\DB_ARM\NEW2\2014.07.16\trans.mdf and C:\ARM\DB_ARM\NEW2\2014.07.16\trans2_log.ldf to SQLERVER....
    System.Management.Automation.MethodInvocationException: Исключение при вызове "AttachDatabase" с "2" аргументами: "Atta
    h database failed for Server 'SQLSERVER'. " ---> Microsoft.SqlServer.Management.Smo.FailedOperationExcepti
    n: Attach database failed for Server 'SQLSERVER'.  ---> Microsoft.SqlServer.Management.Common.ExecutionFai
    ureException: An exception occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.SqlEx
    eption: Не удалось открыть физический файл "C:\ARM\DB_ARM\NEW2\2014.07.16\new2.mdf". Ошибка операционной системы 32:
    "32(Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.)".
       в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       в System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, Bulk
    opySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       в System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
       в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPi
    e)
       в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes execution
    ype)
       --- Конец трассировки внутреннего стека исключений ---
       в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes execution
    ype)
       в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands, ExecutionType
     executionType)
       в Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection queries)
       в Microsoft.SqlServer.Management.Smo.Server.AttachDatabaseWorker(String name, StringCollection files, String owner,
    ttachOptions attachOptions)
       в Microsoft.SqlServer.Management.Smo.Server.AttachDatabase(String name, StringCollection files)
       --- Конец трассировки внутреннего стека исключений ---
       в Microsoft.SqlServer.Management.Smo.Server.AttachDatabase(String name, StringCollection files)
       в AttachDatabase(Object , Object[] )
       в System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] arguments, MethodInformat
    on methodInformation, Object[] originalArguments)
       --- Конец трассировки внутреннего стека исключений ---
       в System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] arguments, MethodInformat
    on methodInformation, Object[] originalArguments)
       в System.Management.Automation.ParserOps.CallMethod(Token token, Object target, String methodName, Object[] paramArr
    y, Boolean callStatic, Object valueToSet)
       в System.Management.Automation.MethodCallNode.InvokeMethod(Object target, Object[] arguments, Object value)
       в System.Management.Automation.MethodCallNode.Execute(Array input, Pipe outputPipe, ExecutionContext context)
       в System.Management.Automation.ParseTreeNode.Execute(Array input, Pipe outputPipe, ArrayList& resultList, ExecutionC
    ntext context)
       в System.Management.Automation.StatementListNode.ExecuteStatement(ParseTreeNode statement, Array input, Pipe outputP
    pe, ArrayList& resultList, ExecutionContext context)
    Error Information


    Exception             : System.Management.Automation.MethodInvocationException: Исключение при вызове "AttachDatabase"
                            с "2" аргументами: "Attach database failed for Server 'SQLSERVER'. " ---> Microsof
                            t.SqlServer.Management.Smo.FailedOperationException: Attach database failed for Server 'SQLSERVER'.  ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exc
                            eption occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.S
                            qlException: Не удалось открыть физический файл "C:\ARM\DB_ARM\NEW2\2014.07.16\new2.mdf". Ош
                            ибка операционной системы 32: "32(Процесс не может получить доступ к файлу, так как этот файл з
                            анят другим процессом.)".
                               в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnectio
                            n)
                               в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
                               в System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDat
                            aReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
                               в System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
                               в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String meth
                            odName, Boolean sendToPipe)
                               в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
                               в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand,
                            ExecutionTypes executionType)
                               --- Конец трассировки внутреннего стека исключений ---
                               в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand,
                            ExecutionTypes executionType)
                               в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sq
                            lCommands, ExecutionTypes executionType)
                               в Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection queri
                            es)
                               в Microsoft.SqlServer.Management.Smo.Server.AttachDatabaseWorker(String name, StringCollecti
                            on files, String owner, AttachOptions attachOptions)
                               в Microsoft.SqlServer.Management.Smo.Server.AttachDatabase(String name, StringCollection fil
                            es)
                               --- Конец трассировки внутреннего стека исключений ---
                               в Microsoft.SqlServer.Management.Smo.Server.AttachDatabase(String name, StringCollection fil
                            es)
                               в AttachDatabase(Object , Object[] )
                               в System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] a
                            rguments, MethodInformation methodInformation, Object[] originalArguments)
                               --- Конец трассировки внутреннего стека исключений ---
                               в System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] a
                            rguments, MethodInformation methodInformation, Object[] originalArguments)
                               в System.Management.Automation.ParserOps.CallMethod(Token token, Object target, String metho
                            dName, Object[] paramArray, Boolean callStatic, Object valueToSet)
                               в System.Management.Automation.MethodCallNode.InvokeMethod(Object target, Object[] arguments
                            , Object value)
                               в System.Management.Automation.MethodCallNode.Execute(Array input, Pipe outputPipe, Executio
                            nContext context)
                               в System.Management.Automation.ParseTreeNode.Execute(Array input, Pipe outputPipe, ArrayList
                            & resultList, ExecutionContext context)
                               в System.Management.Automation.StatementListNode.ExecuteStatement(ParseTreeNode statement, A
                            rray input, Pipe outputPipe, ArrayList& resultList, ExecutionContext context)
    TargetObject          :
    CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    FullyQualifiedErrorId : DotNetMethodException
    ErrorDetails          :
    InvocationInfo        : System.Management.Automation.InvocationInfo
    PipelineIterationInfo : {}
    PSMessageDetails      :
    16 июля 2014 г. 10:43
  • Стало понятно почему ошиюка, с доступом к файлу. Скрипт подключал базу, new2, и называл ее new1

    ошибка где то здесь: $sqlServerSmo.AttachDatabase($databaseName, $sc)

    16 июля 2014 г. 11:03
  • 1) После переменной $dbs = ...

    Write-Host ($dbs | Out-String)

    2) После $logfile

    Write-Host $datafile
    Write-Host $logFile
    Write-Host $databaseName
    И приложите вывод.
    16 июля 2014 г. 11:44
    Отвечающий

  • Count Name                      Group
    ----- ----                      -----
        2 obl                       {C:\ARM\DB_ARM\Khrust\2014.07.16\obl.mdf, C:\ARM\DB_ARM\Khrust\2014.07.16\obl_log.LDF}
        2 trans                     {C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf, C:\ARM\DB_ARM\Khrust\2014.07.16\trans_lo...



    Checking to see if obl needs to be dropped....
    Database obl does not exist on server SPKH-SQLTEST\SQLSERVER

    C:\ARM\DB_ARM\Khrust\2014.07.16\obl.mdf
    C:\ARM\DB_ARM\Khrust\2014.07.16\obl_log.ldf
    obl
    C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf
    C:\ARM\DB_ARM\Khrust\2014.07.16\trans_log.ldf
    obl
    Attaching C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf and C:\ARM\DB_ARM\Khrust\2014.07.16\trans_log.ldf to SPKH-SQLTEST\SQ
    LSERVER....
    Completed!!!
    Checking to see if trans needs to be dropped....
    Database trans does not exist on server SPKH-SQLTEST\SQLSERVER

    C:\ARM\DB_ARM\Khrust\2014.07.16\obl.mdf
    C:\ARM\DB_ARM\Khrust\2014.07.16\obl_log.ldf
    trans
    C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf
    C:\ARM\DB_ARM\Khrust\2014.07.16\trans_log.ldf
    trans
    Attaching C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf and C:\ARM\DB_ARM\Khrust\2014.07.16\trans_log.ldf to SPKH-SQLTEST\SQ
    LSERVER....
    System.Management.Automation.MethodInvocationException: Исключение при вызове "AttachDatabase" с "2" аргументами: "Attac
    h database failed for Server 'SPKH-SQLTEST\SQLSERVER'. " ---> Microsoft.SqlServer.Management.Smo.FailedOperationExceptio
    n: Attach database failed for Server 'SPKH-SQLTEST\SQLSERVER'.  ---> Microsoft.SqlServer.Management.Common.ExecutionFail
    ureException: An exception occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.SqlExc
    eption: Не удалось открыть физический файл "C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf". Ошибка операционной системы 32:
    "32(Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.)".
       в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       в System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkC
    opySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       в System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
       в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPip
    e)
       в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionT
    ype)
       --- Конец трассировки внутреннего стека исключений ---
       в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionT
    ype)
       в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands, ExecutionTypes
     executionType)
       в Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection queries)
       в Microsoft.SqlServer.Management.Smo.Server.AttachDatabaseWorker(String name, StringCollection files, String owner, A
    ttachOptions attachOptions)
       в Microsoft.SqlServer.Management.Smo.Server.AttachDatabase(String name, StringCollection files)
       --- Конец трассировки внутреннего стека исключений ---
       в Microsoft.SqlServer.Management.Smo.Server.AttachDatabase(String name, StringCollection files)
       в AttachDatabase(Object , Object[] )
       в System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] arguments, MethodInformati
    on methodInformation, Object[] originalArguments)
       --- Конец трассировки внутреннего стека исключений ---
       в System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] arguments, MethodInformati
    on methodInformation, Object[] originalArguments)
       в System.Management.Automation.ParserOps.CallMethod(Token token, Object target, String methodName, Object[] paramArra
    y, Boolean callStatic, Object valueToSet)
       в System.Management.Automation.MethodCallNode.InvokeMethod(Object target, Object[] arguments, Object value)
       в System.Management.Automation.MethodCallNode.Execute(Array input, Pipe outputPipe, ExecutionContext context)
       в System.Management.Automation.ParseTreeNode.Execute(Array input, Pipe outputPipe, ArrayList& resultList, ExecutionCo
    ntext context)
       в System.Management.Automation.StatementListNode.ExecuteStatement(ParseTreeNode statement, Array input, Pipe outputPi
    pe, ArrayList& resultList, ExecutionContext context)
    Error Information


    Exception             : System.Management.Automation.MethodInvocationException: Исключение при вызове "AttachDatabase"
                            с "2" аргументами: "Attach database failed for Server 'SPKH-SQLTEST\SQLSERVER'. " ---> Microsof
                            t.SqlServer.Management.Smo.FailedOperationException: Attach database failed for Server 'SPKH-SQ
                            LTEST\SQLSERVER'.  ---> Microsoft.SqlServer.Management.Common.ExecutionFailureException: An exc
                            eption occurred while executing a Transact-SQL statement or batch. ---> System.Data.SqlClient.S
                            qlException: Не удалось открыть физический файл "C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf". Ош
                            ибка операционной системы 32: "32(Процесс не может получить доступ к файлу, так как этот файл з
                            анят другим процессом.)".
                               в System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnectio
                            n)
                               в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
                               в System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDat
                            aReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
                               в System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
                               в System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String meth
                            odName, Boolean sendToPipe)
                               в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
                               в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand,
                            ExecutionTypes executionType)
                               --- Конец трассировки внутреннего стека исключений ---
                               в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand,
                            ExecutionTypes executionType)
                               в Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sq
                            lCommands, ExecutionTypes executionType)
                               в Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery(StringCollection queri
                            es)
                               в Microsoft.SqlServer.Management.Smo.Server.AttachDatabaseWorker(String name, StringCollecti
                            on files, String owner, AttachOptions attachOptions)
                               в Microsoft.SqlServer.Management.Smo.Server.AttachDatabase(String name, StringCollection fil
                            es)
                               --- Конец трассировки внутреннего стека исключений ---
                               в Microsoft.SqlServer.Management.Smo.Server.AttachDatabase(String name, StringCollection fil
                            es)
                               в AttachDatabase(Object , Object[] )
                               в System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] a
                            rguments, MethodInformation methodInformation, Object[] originalArguments)
                               --- Конец трассировки внутреннего стека исключений ---
                               в System.Management.Automation.DotNetAdapter.AuxiliaryMethodInvoke(Object target, Object[] a
                            rguments, MethodInformation methodInformation, Object[] originalArguments)
                               в System.Management.Automation.ParserOps.CallMethod(Token token, Object target, String metho
                            dName, Object[] paramArray, Boolean callStatic, Object valueToSet)
                               в System.Management.Automation.MethodCallNode.InvokeMethod(Object target, Object[] arguments
                            , Object value)
                               в System.Management.Automation.MethodCallNode.Execute(Array input, Pipe outputPipe, Executio
                            nContext context)
                               в System.Management.Automation.ParseTreeNode.Execute(Array input, Pipe outputPipe, ArrayList
                            & resultList, ExecutionContext context)
                               в System.Management.Automation.StatementListNode.ExecuteStatement(ParseTreeNode statement, A
                            rray input, Pipe outputPipe, ArrayList& resultList, ExecutionContext context)
    TargetObject          :
    CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    FullyQualifiedErrorId : DotNetMethodException
    ErrorDetails          :
    InvocationInfo        : System.Management.Automation.InvocationInfo
    PipelineIterationInfo : {}
    PSMessageDetails      :



    Completed!!!
    16 июля 2014 г. 11:53
  • Закрыть текущую сессия powershell и запустить скрипт, и приложить полный вывод.

    # Текущая дата
    $date = (Get-Date).ToString("yyyy.MM.dd")
    
    # Сервер с базой данных
    $databaseServer = "SqlServer"
    
    # Расположение файлов
    $path = "C:\ARM\DB_ARM\Khrust\$date\"
    
    # Выбираем файлы mdf и ldf. Группируем по названию базы.
    $dbs = Get-ChildItem "$path\*" -Include *.mdf,*.ldf | Group-Object {$_.BaseName.split("_")[0]} | Where {$_.Count -eq 2}
    
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null 
    $sqlServerSmo = New-Object Microsoft.SqlServer.Management.Smo.Server($databaseServer)
    
    # Работа с базой
    foreach($db in $dbs) {
    	$databaseName = $db.Name 
    	
    	####### Drop the destination database if it already exists
    	Write-Host "Checking to see if $databaseName needs to be dropped...."; 
    	if ($sqlServerSmo.databases[$databaseName] -ne $null) 
    	{ 
    		Write-Host "Dropping database $databaseName on server $databaseServer" 
    		$sqlServerSmo.KillAllProcesses($databaseName) 
    		$sqlServerSmo.DetachDatabase($databaseName,$false) 
    		Write-Host "Database $databaseName on server $databaseServer has been dropped" 
    	} 
    	else 
    	{ 
    		Write-Host "Database $databaseName does not exist on server $databaseServer" 
    	} 
    	Write-Host ""
    	
    	#######  Attach the database to detsination server
    	$datafile = $db.Group -match "\.mdf" | Foreach {$_.FullName}
    	$logfile = $db.Group -match "\.ldf" | Foreach {$_.FullName}
    	
    	Write-Host "==========="
    	Write-Host $datafile
    	Write-Host $logFile
    	Write-Host $databaseName
    	Write-Host "==========="
    
    	$sc = New-Object System.Collections.Specialized.StringCollection
    	$sc.Add($datafile) | Out-Null; 
    	$sc.Add($logfile) | Out-Null;
    
    	Write-Host "Attaching $datafile and $logfile to $databaseServer...."
    	$Error.Clear()
    	
    	try 
    	{ 
    		$sqlServerSmo.AttachDatabase($databaseName, $sc) 
    	} 
    	catch 
    	{ 
    		Write-Host "$_" 
    	}
    
    	Write-Host "Completed!!!" -BackgroundColor DarkGreen;
    }

    16 июля 2014 г. 12:39
    Отвечающий
  • Отработало, но надо добавить еще один путь, для баз другого филиала, и чтобы подключаемые базы, нового филиала, подключались одновременно с первыми базами, первого филиала, с добавлением к имени  по умолчанию,  буквы филиала, чтобы их можно было различать (и они не перезаписывались:

    $path = "C:\ARM\DB_ARM\Petergof\$date\"

    Сам вывод:

    PS C:\Users\butenkomg> C:\scripts\sql_mount13.ps1
    Checking to see if obl needs to be dropped....
    Database obl does not exist on server SPKH-SQLTEST\SQLSERVER

    ===========
    C:\ARM\DB_ARM\Khrust\2014.07.16\obl.mdf
    C:\ARM\DB_ARM\Khrust\2014.07.16\obl_log.LDF
    obl
    ===========
    Attaching C:\ARM\DB_ARM\Khrust\2014.07.16\obl.mdf and C:\ARM\DB_ARM\Khrust\2014.07.16\obl_log.LDF to SPKH-SQLTEST\SQLSER
    VER....
    Completed!!!
    Checking to see if trans needs to be dropped....
    Database trans does not exist on server SPKH-SQLTEST\SQLSERVER

    ===========
    C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf
    C:\ARM\DB_ARM\Khrust\2014.07.16\trans_log.LDF
    trans
    ===========
    Attaching C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf and C:\ARM\DB_ARM\Khrust\2014.07.16\trans_log.LDF to SPKH-SQLTEST\SQ
    LSERVER....
    Completed!!!
    16 июля 2014 г. 12:57
  • Добавить пути в переменную $path и изменить $dbs:
    # Расположение файлов
    $path = "C:\ARM\DB_ARM\Khrust\$date","C:\ARM\DB_ARM\Petergof\$date"
    
    # Выбираем файлы mdf и ldf. Группируем по названию базы.
    $dbs = $path | Foreach {
    	Get-ChildItem "$_\*" -Include *.mdf,*.ldf | Group-Object {$_.Directory.Name.Substring(0,3) + "_" + $_.BaseName.split("_")[0]} | Where {$_.Count -eq 2}
    }

    16 июля 2014 г. 13:09
    Отвечающий
  • Подключились только базы филиала, Petergof, базы филиала Khrust, не подключились.

    Сам вывод:

    Checking to see if 201_obl needs to be dropped....
    Database 201_obl does not exist on server SPKH-SQLTEST\SQLSERVER

    ===========
    C:\ARM\DB_ARM\Khrust\2014.07.16\obl.mdf
    C:\ARM\DB_ARM\Khrust\2014.07.16\obl_log.LDF
    201_obl
    ===========
    Attaching C:\ARM\DB_ARM\Khrust\2014.07.16\obl.mdf and C:\ARM\DB_ARM\Khrust\2014.07.16\obl_log.LDF to SPKH-SQLTEST\SQLSER
    VER....
    Completed!!!
    Checking to see if 201_trans needs to be dropped....
    Database 201_trans does not exist on server SPKH-SQLTEST\SQLSERVER

    ===========
    C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf
    C:\ARM\DB_ARM\Khrust\2014.07.16\trans_log.LDF
    201_trans
    ===========
    Attaching C:\ARM\DB_ARM\Khrust\2014.07.16\trans.mdf and C:\ARM\DB_ARM\Khrust\2014.07.16\trans_log.LDF to SPKH-SQLTEST\SQ
    LSERVER....
    Completed!!!
    Checking to see if 201_obl needs to be dropped....
    Dropping database 201_obl on server SPKH-SQLTEST\SQLSERVER
    Database 201_obl on server SPKH-SQLTEST\SQLSERVER has been dropped

    ===========
    C:\ARM\DB_ARM\Petergof\2014.07.16\obl.mdf
    C:\ARM\DB_ARM\Petergof\2014.07.16\obl_log.LDF
    201_obl
    ===========
    Attaching C:\ARM\DB_ARM\Petergof\2014.07.16\obl.mdf and C:\ARM\DB_ARM\Petergof\2014.07.16\obl_log.LDF to SPKH-SQLTEST\SQ
    LSERVER....
    Completed!!!
    Checking to see if 201_trans needs to be dropped....
    Dropping database 201_trans on server SPKH-SQLTEST\SQLSERVER
    Database 201_trans on server SPKH-SQLTEST\SQLSERVER has been dropped

    ===========
    C:\ARM\DB_ARM\Petergof\2014.07.16\trans.mdf
    C:\ARM\DB_ARM\Petergof\2014.07.16\trans_log.LDF
    201_trans
    ===========
    Attaching C:\ARM\DB_ARM\Petergof\2014.07.16\trans.mdf and C:\ARM\DB_ARM\Petergof\2014.07.16\trans_log.LDF to SPKH-SQLTES
    T\SQLSERVER....
    Completed!!!

    16 июля 2014 г. 13:19
  • Да,тут я забыл про папку с датой.

    Group-Object {$_.Directory.Name.Substring(0,3) + "_" + $_.BaseName.split("_")[0]} 

    заменить на

    Group-Object {$_.DirectoryName.Split("\")[-2].Substring(0,3)  + "_" + $_.BaseName.split("_")[0]} 

    • Помечено в качестве ответа nomadus 17 июля 2014 г. 6:32
    16 июля 2014 г. 14:24
    Отвечающий
  • Its Work ! Thanks man.
    17 июля 2014 г. 6:32
  • Еще один вопрос, чтобы подключалась из обеих филиалов, только база obl (с логами), что здесь поправить:

    # Выбираем файлы mdf и ldf. Группируем по названию базы.
    $dbs = $path | Foreach {
        Get-ChildItem "$_\*" -Include *.mdf,*.ldf | Group-Object {$_.DirectoryName.Split("\")[-2].Substring(0,3)  + "_" + $_.BaseName.split("_")[0]} | Where {$_.Count -eq 2}
    }

    17 июля 2014 г. 12:19
  • "$_\*" на "$_\obl*"

    17 июля 2014 г. 12:28
    Отвечающий
  • Еще вопрос,  чтобы к имени подключаемой базы, добавлялась еще и текущая дата.
    18 июля 2014 г. 8:38
  • Group-Object {$_.DirectoryName.Split("\")[-2].Substring(0,3)  + "_$date`_" + $_.BaseName.split("_")[0]} 

    18 июля 2014 г. 8:40
    Отвечающий