0

そのため、同様の分野で多くの情報を検索して見つけましたが、私が抱えている問題にまったく当てはまるものはありません.

テスト環境で作業しており、同じ SQL データベース バックアップ (.bak) から SQL サーバーの多くの名前付きインスタンスに復元する必要があります。すべての SQL インスタンスが事前にインストールされ、実行されています。

さまざまなアイデアを試してみましたが、sqlcmd を使用したバッチ ファイルが最適なようです。

そこで、開始インスタンス番号と停止インスタンス番号を要求するバッチ ファイル (.bat) を作成し、バックアップから各 SQL 名前付きインスタンスに復元し、途中でインスタンス番号をインクリメントする必要があります。

実行すると、sqlcmd は正常に動作しているように見えます。最後に印刷します

RESTORE DATABASE successfully processed X pages in Y seconds 

また、ファイル (.mdf、.ndf、.ldf) は期待どおりにディレクトリにあり、次に進みます。

問題は、次に移ると、復元したばかりのファイルがディレクトリから消えてしまうことです。

誰かに何かアイデアがあれば、それは確かに高く評価されます。

これがバッチです...

ECHO OFF
ECHO Enter starting instance number for restore db
SET /P _IntStart=


ECHO Enter number of last instance for restore db
SET /P _IntStop=
SET /a _IntStop=_IntStop+1



:RestoreDb
If %_IntStart% GEQ %_IntStop% goto:EOF

ECHO Display Instance Number... IntStart = %_IntStart%

sqlcmd -e -s localhost\instance%_IntStart% -d master -U user -P password -Q "Use [master]; RESTORE DATABASE DBName1 FROM DISK = 'C:\DBName1.bak'WITH REPLACE, MOVE 'DBName1' TO 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE%_IntStart%\MSSQL\DATA\DBName1.mdf', MOVE 'DBName1_log' TO 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE%_IntStart%\MSSQL\DATA\DBName1_log.LDF', MOVE 'ftrow_DBName1Catalog' TO 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE%_IntStart%\MSSQL\DATA\DBName1_1.ndf';"

SET /a _IntStart=_IntStart+1


GOTO:RestoreDb

PAUSE
EXIT

=========================================

SQL 管理から。スタジオ私も以下を試しました。ループをコメントアウトして、インスタンス番号を手動でバンプするたびに実行すると機能します。データベースとファイルの個別のコピーが作成されます。ここでの問題は、SQLCMD が Mgmt での連結を好まないように見えることです。スタジオなので、:CONNECT でインスタンス番号をインクリメントできません。最終的に localhost\instance$(SCintnum) に接続しようとします。

Declare @intnum int
Set @intnum = 1

Declare @intstr NVARCHAR(255)
Set @intstr = @intnum

Declare @PathName1 NVARCHAR(255)
Declare @PathName2 NVARCHAR(255)
Declare @PathName3 NVARCHAR(255)

Set @PathName1 = 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE' + @intstr + '\MSSQL\DATA\DBName1.mdf'
Set @PathName2 = 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE' + @intstr + '\MSSQL\DATA\DBName1_log.LDF'
Set @PathName3 = 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE' + @intstr + '\MSSQL\DATA\DBName1_1.ndf'

 While @intnum < 51

:SETVAR SCintnum 1
:CONNECT localhost\instance$(SCintnum) -U user -P password

Use [master];
RESTORE DATABASE DBName1 FROM DISK = 'C:\DBName1.bak'
WITH REPLACE, 
MOVE 'DBName1'              TO @PathName1,
MOVE 'DBName1_log'          TO @PathName2,
MOVE 'ftrow_DBName1Catalog' TO @PathName3;

:SETVAR SCintnum $(SCintum)+1
Set @intnum = @intnum+1
Set @intstr = @intnum
Set @PathName1 = 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE' + @intstr + '\MSSQL\DATA\DBName1.mdf'
Set @PathName2 = 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE' + @intstr + '\MSSQL\DATA\DBName1_log.LDF'
Set @PathName3 = 'E:\Microsoft SQL Server\MSSQL10_50.INSTANCE' + @intstr + '\MSSQL\DATA\DBName1_1.ndf'

================================================== =================

これは、私が最終的に c# で使用したものの例です.....

///Set SQL Connection
SqlConnection myConnection = new SqlConnection("user id=sa;" + 
                                   "password="+ sapassword+";server="+servername+"\\instance"+currentinstancenum+";" + 
                                   "Trusted_Connection=yes;" + 
                                   "database=master; " + 
                                   "connection LifeTime=0; connection Timeout=30");
///Set SQL Command

string thesqlcommand = "USE [master]; RESTORE DATABASE " + dbname + " FROM DISK = '" + backuplocation + "' WITH REPLACE, MOVE '" + dbname + "' TO " + @PathName1 + ", MOVE '" + dbname + "_log' TO " + @PathName2 + ", MOVE 'ftrow_" + dbname + "Catalog' TO " + @PathName3 + ";";



SqlCommand myCommand = new SqlCommand(thesqlcommand, myConnection);



///Set SQL Command TimeOut, open connection, execute command, close command
myCommand.CommandTimeout = 180;
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();
4

2 に答える 2

0

これを行うためにC#で小さなユーティリティを作成することになりました。はるかに簡単だったので、そこから始めたかったのです。元の投稿の下部に例を追加しました。

于 2013-05-21T21:58:06.197 に答える