(テスト目的で)「コピーして名前を変更」したいデータベースを含むMS SQL Server 2008 Expressシステムを持っていますが、これを実現する簡単な方法がわかりません。
SQL ServerのR2バージョンにはデータベースコピーウィザードがあることに気付きましたが、残念ながらアップグレードできません。
問題のデータベースはギグの周りにあります。新しいデータベースにコピーしたいデータベースのバックアップを復元しようとしましたが、うまくいきませんでした。
(テスト目的で)「コピーして名前を変更」したいデータベースを含むMS SQL Server 2008 Expressシステムを持っていますが、これを実現する簡単な方法がわかりません。
SQL ServerのR2バージョンにはデータベースコピーウィザードがあることに気付きましたが、残念ながらアップグレードできません。
問題のデータベースはギグの周りにあります。新しいデータベースにコピーしたいデータベースのバックアップを復元しようとしましたが、うまくいきませんでした。
回答:
Microsoft SQL Management Studioをインストールします。これは、MicrosoftのWebサイトから無料でダウンロードできます。
バージョン2008
Microsoft SQL Management Studio 2008は、 、高度なサービスを備えたSQL Server 2008 Expressの
バージョン2012
クリックしてダウンロードボタンやチェックをENU\x64\SQLManagementStudio_x64_ENU.exe
バージョン2014
クリックしてダウンロードボタンをとMgmtStudioをチェック64BIT\SQLManagementStudio_x64_ENU.exe
Microsoft SQL Management Studioを開きます。
クローンを作成するデータベースを右クリックし、をクリックしてTasks
、をクリックしますCopy Database...
。ウィザードに従って、完了です。
データベースをデタッチし、コマンドプロンプトでファイルを新しい名前にコピーしてから、両方のDBをアタッチすることができます。
SQLの場合:
USE master;
GO
EXEC sp_detach_db
@dbname = N'OriginalDB';
GO
コマンドプロンプトで(この例のためにファイルパスを簡略化しました):
copy c:\OriginalDB.mdf c:\NewDB.mdf
copy c:\OriginalDB.ldf c:\NewDB.ldf
再びSQLで:
USE master;
GO
CREATE DATABASE OriginalDB
ON (FILENAME = 'C:\OriginalDB.mdf'),
(FILENAME = 'C:\OriginalDB.ldf')
FOR ATTACH;
GO
CREATE DATABASE NewDB
ON (FILENAME = 'C:\NewDB.mdf'),
(FILENAME = 'C:\NewDB.ldf')
FOR ATTACH;
GO
select * from OriginalDB.sys.sysfiles
DBのファイルの場所を検索します。
Permission denied
に.mdf
ファイル。今は必要ありません。元のDBのバックアップが必要なだけなので、後で元のDBを上書きできるので、なぜこのようなエラーが発生するのか知りたいです。
exec sp_helpdb @dbname='TEMPDB';
バックアップから誤って復元しようとしたことがわかりました。
最初に新しいデータベースを作成してから、ここでバックアップを復元しようとしました。私がやるべきこと、そして最後に機能したことは、復元ダイアログを表示して、宛先フィールドに新しいデータベースの名前を入力することでした。
つまり、簡単に言うと、バックアップから復元することがうまくいきました。
みんなのフィードバックと提案をありがとう
これは私が使用するスクリプトです。少しトリッキーですが、うまくいきます。SQL Server 2012でテスト済み。
DECLARE @backupPath nvarchar(400);
DECLARE @sourceDb nvarchar(50);
DECLARE @sourceDb_log nvarchar(50);
DECLARE @destDb nvarchar(50);
DECLARE @destMdf nvarchar(100);
DECLARE @destLdf nvarchar(100);
DECLARE @sqlServerDbFolder nvarchar(100);
SET @sourceDb = 'db1'
SET @sourceDb_log = @sourceDb + '_log'
SET @backupPath = 'E:\tmp\' + sourceDb + '.bak' --ATTENTION: file must already exist and SQL Server must have access to it
SET @sqlServerDbFolder = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\DATA\'
SET @destDb = 'db2'
SET @destMdf = @sqlServerDbFolder + @destDb + '.mdf'
SET @destLdf = @sqlServerDbFolder + @destDb + '_log' + '.ldf'
BACKUP DATABASE @sourceDb TO DISK = @backupPath
RESTORE DATABASE @destDb FROM DISK = @backupPath
WITH REPLACE,
MOVE @sourceDb TO @destMdf,
MOVE @sourceDb_log TO @destLdf
SET @sourceDb_log = (SELECT files.name FROM sys.databases dbs INNER JOIN sys.master_files files ON dbs.database_id=files.database_id WHERE dbs.name=@sourceDb AND files.type=1)
取得されたためfiles.type=0
)、同様のクエリを使用して@sourceDb_dataの個別の変数が必要になります(で置換)。HTH!
ここで述べた解決策はどれもうまくいきませんでした-私はSQL Server Management Studio 2014を使用しています。
代わりに、「オプション」画面の「復元前にログ末尾のバックアップをとる」チェックボックスをオフにする必要がありました。私のバージョンでは、デフォルトでオンになっているため、復元操作を完了できません。チェックを外した後、復元操作は問題なく続行されました。
MS SQL Server 2012を使用して、3つの基本的な手順を実行する必要があります。
まず、.sql
ソースDBの構造のみを含むファイルを生成します
.sql
ファイルをローカルに保存します次に、ソースDBを.sql
ファイル内の宛先DBに置き換えます
最後に、データを入力します
Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
完了です。
データベースがそれほど大きくない場合は、エクスプローラーのデータベースアイテム自体のコンテキストメニューにあるSQL Server Management Studio Expressの[スクリプトデータベース]コマンドを確認できます。
スクリプトを作成する対象をすべて選択できます。もちろん、オブジェクトとデータが必要です。次に、スクリプト全体を1つのファイルに保存します。次に、そのファイルを使用してデータベースを再作成できます。USE
上部のコマンドが適切なデータベースに設定されていることを確認してください。
このコメントに基づくソリューション:https : //stackoverflow.com/a/22409447/2399045。設定を設定するだけです:DB名、一時フォルダー、dbファイルフォルダー。実行後、「sourceDBName_yyyy-mm-dd」形式の名前を持つDBのコピーが作成されます。
-- Settings --
-- New DB name will have name = sourceDB_yyyy-mm-dd
declare @sourceDbName nvarchar(50) = 'MyDbName';
declare @tmpFolder nvarchar(50) = 'C:\Temp\'
declare @sqlServerDbFolder nvarchar(100) = 'C:\Databases\'
-- Execution --
declare @sourceDbFile nvarchar(50);
declare @sourceDbFileLog nvarchar(50);
declare @destinationDbName nvarchar(50) = @sourceDbName + '_' + (select convert(varchar(10),getdate(), 121))
declare @backupPath nvarchar(400) = @tmpFolder + @destinationDbName + '.bak'
declare @destMdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '.mdf'
declare @destLdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '_log' + '.ldf'
SET @sourceDbFile = (SELECT top 1 files.name
FROM sys.databases dbs
INNER JOIN sys.master_files files
ON dbs.database_id = files.database_id
WHERE dbs.name = @sourceDbName
AND files.[type] = 0)
SET @sourceDbFileLog = (SELECT top 1 files.name
FROM sys.databases dbs
INNER JOIN sys.master_files files
ON dbs.database_id = files.database_id
WHERE dbs.name = @sourceDbName
AND files.[type] = 1)
BACKUP DATABASE @sourceDbName TO DISK = @backupPath
RESTORE DATABASE @destinationDbName FROM DISK = @backupPath
WITH REPLACE,
MOVE @sourceDbFile TO @destMdf,
MOVE @sourceDbFileLog TO @destLdf
Joeの回答に基づいたスクリプト(分離、ファイルのコピー、両方の添付)。
必須ではありませんが、実行時にアクセス拒否エラーが発生する可能性があります。
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
@dbName
と@copyDBName
変数にデータベース名を入力します。USE master;
GO
DECLARE @dbName NVARCHAR(255) = 'Products'
DECLARE @copyDBName NVARCHAR(255) = 'Products_branch'
-- get DB files
CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
EXEC('
INSERT INTO ##DBFileNames([FileName])
SELECT [filename] FROM ' + @dbName + '.sys.sysfiles')
-- drop connections
EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE')
EXEC('ALTER DATABASE ' + @dbName + ' SET SINGLE_USER')
-- detach
EXEC('EXEC sp_detach_db @dbname = ''' + @dbName + '''')
-- copy files
DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''
DECLARE
@oldAttachCommand NVARCHAR(MAX) =
'CREATE DATABASE ' + @dbName + ' ON ',
@newAttachCommand NVARCHAR(MAX) =
'CREATE DATABASE ' + @copyDBName + ' ON '
DECLARE curs CURSOR FOR
SELECT [filename] FROM ##DBFileNames
OPEN curs
FETCH NEXT FROM curs INTO @filename
WHILE @@FETCH_STATUS = 0
BEGIN
SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX('\', REVERSE(@filename),1))+1))
SET @ext = RIGHT(@filename,4)
SET @copyFileName = @path + @copyDBName + @ext
SET @command = 'EXEC master..xp_cmdshell ''COPY "' + @filename + '" "' + @copyFileName + '"'''
PRINT @command
EXEC(@command);
SET @oldAttachCommand = @oldAttachCommand + '(FILENAME = "' + @filename + '"),'
SET @newAttachCommand = @newAttachCommand + '(FILENAME = "' + @copyFileName + '"),'
FETCH NEXT FROM curs INTO @filename
END
CLOSE curs
DEALLOCATE curs
-- attach
SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + ' FOR ATTACH'
SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + ' FOR ATTACH'
-- attach old db
PRINT @oldAttachCommand
EXEC(@oldAttachCommand)
-- attach copy db
PRINT @newAttachCommand
EXEC(@newAttachCommand)
DROP TABLE ##DBFileNames
新しいデータベースを作成してから、タスクに移動してデータをインポートし、複製するデータベースから作成したデータベースにすべてのデータをインポートすることができます。