私は(テスト目的のために)「コピーして名前を変更」したいデータベースを含むMS SQL Server 2008 Expressシステムを持っていますが、これを達成するための簡単な方法を知りません。
SQL ServerのR2バージョンにはデータベースコピーウィザードがあることに気付きましたが、残念ながらアップグレードできません。
問題のデータベースはギグのまわりにあります。コピーしたいデータベースのバックアップを新しいデータベースに復元しようとしましたが、うまくいきませんでした。
バックアップから誤って復元しようとしたことがわかります。
最初に新しいデータベースを作成してから、ここでバックアップを復元しようとしました。私がしなければならなかったこと、そして最後にうまくいったことは、復元ダイアログを立ち上げ、新しいデータベースの名前をdestinationフィールドにタイプすることでした。
したがって、要するに、バックアップから復元することがトリックでした。
すべてのフィードバックと提案をありがとう
Microsoft SQL Management Studioをインストールします。これは、MicrosoftのWebサイトから無料でダウンロードできます。
バージョン2008
Microsoft SQL Management Studio 2008は、 SQL Server 2008 ExpressとAdvanced Servicesの一部です
バージョン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
これが私が使っているスクリプトです。少しトリッキーですが、うまくいきます。 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
MS SQL Server 2012を使用して、3つの基本的な手順を実行する必要があります。
まず、ソースDBの構造のみを含む.sql
ファイルを生成します
.sql
ファイルをローカルに保存します。次に、.sql
ファイルでソースDBをターゲットDBに置き換えます。
最後に、データを入力します
Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
これで終わりです。
SQL Server 2008 R2では、データベースをファイルとしてフォルダーにバックアップします。次に、[データベース]フォルダに表示される復元オプションを選択します。ウィザードで、ターゲットデータベースに付ける新しい名前を入力します。そして、「ファイルから復元」を選択して、作成したばかりのファイルを使用します。私はそれをしました、そして、それは非常に速かったです(私のDBは小さかったが、それでも)Pablo。
データベースがそれほど大きくない場合は、SQL Server Management Studio Expressの「スクリプトデータベース」コマンドを確認してください。これらのコマンドは、エクスプローラのデータベース項目自体のコンテキストメニューにあります。
何をスクリプトにするかを選択できます。もちろん、オブジェクトとデータが欲しいのです。その後、スクリプト全体を単一のファイルに保存します。その後、そのファイルを使用してデータベースを再作成できます。一番上の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
新しいデータベースを作成してからタスクに移動し、データをインポートして、複製したいデータベースから作成したばかりのデータベースにすべてのデータをインポートするだけで済みます。
インポート/エクスポートウィザードを使用してトリックを実行するもう1つの方法は、まず空のデータベースを作成し、次にソースデータベースを持つサーバーのソースを選択します。そして目的地で目的地のデータベースと同じサーバーを選択し(最初に作成した空のデータベースを使用します)、そして最後にヒットします
すべてのテーブルを作成し、すべてのデータを新しいデータベースに転送します。
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