web-dev-qa-db-ja.com

SQL Server 2008 Expressの同じサーバーにSQL Serverデータベースを複製する方法を教えてください。

私は(テスト目的のために)「コピーして名前を変更」したいデータベースを含むMS SQL Server 2008 Expressシステムを持っていますが、これを達成するための簡単な方法を知りません。

SQL ServerのR2バージョンにはデータベースコピーウィザードがあることに気付きましたが、残念ながらアップグレードできません。

問題のデータベースはギグのまわりにあります。コピーしたいデータベースのバックアップを新しいデータベースに復元しようとしましたが、うまくいきませんでした。

241
Sergio

バックアップから誤って復元しようとしたことがわかります。

最初に新しいデータベースを作成してから、ここでバックアップを復元しようとしました。私がしなければならなかったこと、そして最後にうまくいったことは、復元ダイアログを立ち上げ、新しいデータベースの名前をdestinationフィールドにタイプすることでした。

したがって、要するに、バックアップから復元することがトリックでした。

すべてのフィードバックと提案をありがとう

27
Sergio
  1. 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をチェックしてください。

  2. Microsoft SQL Management Studio を開きます。

  3. 元のデータベースを.BAKファイルにバックアップします(db - > Task - > Backup)。
  4. 空のデータベースを新しい名前で作成します(クローン)。これはオプションであるため、以下のコメントに注意してください。
  5. クリックしてデータベースのクローンを作成し、復元ダイアログを開きます(画像を参照)。 restore dialog
  6. [Device]を選択して、手順3のバックアップファイルを追加します。 add backup file
  7. 宛先をテストデータベースに変更 change destination
  8. データベースファイルの場所を変更します。元の場所とは異なる必要があります。あなたはテキストボックスに直接タイプすることができます、単に接尾辞を加えてください。 (注:順序は重要です。チェックボックスをオンにしてから、ファイル名を変更してください。) change location
  9. WITH REPLACEおよびWITH KEEP_REPLICATIONを確認してください。 with replace
328
Tomas Kubes

複製するデータベースを右クリックし、[Tasks]、[Copy Database...]の順にクリックします。ウィザードに従うだけで完了です。

106
DForck42

データベースをデタッチし、コマンドプロンプトでファイルを新しい名前にコピーしてから、両方の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
82
Joe Stefanelli

これが私が使っているスクリプトです。少しトリッキーですが、うまくいきます。 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
16
bluish

MS SQL Server 2012を使用して、3つの基本的な手順を実行する必要があります。

  1. まず、ソースDBの構造のみを含む.sqlファイルを生成します

    • ソースDBを右クリックしてからTasksその後Generate Scripts
    • ウィザードに従って、.sqlファイルをローカルに保存します。
  2. 次に、.sqlファイルでソースDBをターゲットDBに置き換えます。

    • 目的のファイルを右クリックし、New Queryを選択して Ctrl-H または(編集 - 検索と置換 - クイック置換
  3. 最後に、データを入力します

    • 移動先DBを右クリックしてから、TasksおよびImport Dataを選択します。
    • データソースのドロップダウンを "。SQL Server用のネットフレームワークデータプロバイダ"に設定+ DATAの下に接続文字列のテキストフィールドを設定ex:Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • 目的地で同じことをする
    • 転送するテーブルをチェックするか、 "source:..."以外のチェックボックスをオンにしてそれらすべてをチェックします。

これで終わりです。

9
Mehdi Benkirane

ここに記載されている解決策はどれも私にとってうまくいきませんでした - 私はSQL Server Management Studio 2014を使用しています。

代わりに、[オプション]画面の[復元前にログをバックアップする]チェックボックスをオフにする必要がありました。私のバージョンでは、デフォルトでチェックされており、復元操作が完了しません。チェックマークをはずした後、復元操作は問題なく続行されました。

enter image description here

8

SQL Server 2008 R2では、データベースをファイルとしてフォルダーにバックアップします。次に、[データベース]フォルダに表示される復元オプションを選択します。ウィザードで、ターゲットデータベースに付ける新しい名前を入力します。そして、「ファイルから復元」を選択して、作成したばかりのファイルを使用します。私はそれをしました、そして、それは非常に速かったです(私のDBは小さかったが、それでも)Pablo。

6
pabloelustondo

データベースがそれほど大きくない場合は、SQL Server Management Studio Expressの「スクリプトデータベース」コマンドを確認してください。これらのコマンドは、エクスプローラのデータベース項目自体のコンテキストメニューにあります。

何をスクリプトにするかを選択できます。もちろん、オブジェクトとデータが欲しいのです。その後、スクリプト全体を単一のファイルに保存します。その後、そのファイルを使用してデータベースを再作成できます。一番上のUSEコマンドが適切なデータベースに設定されていることを確認してください。

4
Andrew Barber

このコメントに基づく解決策: 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
3

新しいデータベースを作成してからタスクに移動し、データをインポートして、複製したいデータベースから作成したばかりのデータベースにすべてのデータをインポートするだけで済みます。

3
TheFab92

インポート/エクスポートウィザードを使用してトリックを実行するもう1つの方法は、まず空のデータベースを作成し、次にソースデータベースを持つサーバーのソースを選択します。そして目的地で目的地のデータベースと同じサーバーを選択し(最初に作成した空のデータベースを使用します)、そして最後にヒットします

すべてのテーブルを作成し、すべてのデータを新しいデータベースに転送します。

2
Mohanad Kaleia

Joeの答えに基づくスクリプト(デタッチ、ファイルのコピー、両方のアタッチ)。

  1. 管理者アカウントとしてManagment Studioを実行します。

必須ではありませんが、実行時にアクセス拒否エラーが発生する可能性があります。

  1. Xp_cmdshelを実行するようにSQLサーバを設定する
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
  1. スクリプトを実行しますが、前に@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
2
Evgeny Ivanov