0

SQL Server 2012 を使用してシステムを構築しています。これは同じデータ型を含む Web アプリですが、ユーザーごとに固有であるため、ユーザーごとに 1 つのデータベースを使用しています。すべてのデータベースは同じ構造を持ち、ユーザーがクリックすると動的に作成され、ライブになります。アカウントの確認メールで。

問題は、データベースを作成するスクリプトが DB_GENERIC.bak というデータベースを復元していて、予想以上に時間がかかることです。これを最適化する方法を探しており、最終的に作成された新しいデータベースになりますが、所要時間は短縮されます。(現在、データベースの作成に 15 秒ほど使用しています)、汎用データベースは小さいサイズ (約 5 MB、600 KB 圧縮) を復元しており、すべてのテーブルは空です。

データベースの完全バックアップを復元する代わりに、これを達成する他の方法はありますか? t-sql で汎用データベース全体のスクリプトを作成し、それを実行してデータベース名を変更できますか? それはもっと速くなるでしょうか?または、リソース消費量の少ないバックアップを圧縮または生成する他の方法ですか。データなどは必要なく、テーブル、プロシージャ、関数、およびスキーマだけが必要です。

前もって感謝します


更新:

私の質問に答えてくれたすべての人に感謝します。答えはどれも素晴らしく、役に立ちました。@Love2Learn の回答を使用することになり、その detach-copy-attach メソッドを試しました。

これがどのように実装されたかを想像するために、次のようなデータベース テンプレートから新しいデータベースをコピーしてアタッチするストア プロシージャがありました。

--executing bat that copies the database-1-template.mdf and database-2-template.mdf (as well as log files) to the DATA folder in my sql instance
--and renames them (then they'll be attached)
DECLARE @BATCopy VARCHAR(MAX) = 'C:\helpers\copyMDFAndLogFiles.bat'

--building command for xp_cmdshell with parameters (new databases names)
DECLARE @command varchar(500) = @BATCopy + ' ' + @database1Name + ' ' + @database2Name

--PRINT @command

EXEC xp_cmdshell @command, no_output

--attaching new databases
SET @SQL = ' USE [master] 
CREATE DATABASE ' + @database1Name + '
    ON (FILENAME = ''' + @SQLDATAPath + @database1Name + '.mdf''), 
    (FILENAME = ''' + @SQLDATAPath + @database1Name + '_log.ldf'') 
    FOR ATTACH; 

CREATE DATABASE ' + @database2Name+ '
    ON (FILENAME = ''' + @SQLDATAPath + @database2Name+ '.mdf''), 
    (FILENAME = ''' + @SQLDATAPath+ @database2Name+ '_log.ldf'') 
    FOR ATTACH;'

EXECUTE(@SQL)

--renaming logical files

SET @SQL = '
ALTER DATABASE '+@database1Name +'
MODIFY FILE (NAME = Database1_Generic, NEWNAME = '+@database1Name +')

ALTER DATABASE '+@database1Name +'
MODIFY FILE (NAME = Database1_Generic_Log, NEWNAME = '+@database1Name +'_log)

ALTER DATABASE '+@database2Name+'
MODIFY FILE (NAME = Database2_Generic, NEWNAME = '+@database2Name+')

ALTER DATABASE '+@database2Name+'
MODIFY FILE (NAME = Database2_Generic_Log, NEWNAME = '+@database2Name+'_log)
'

EXECUTE (@SQL)

これが、私がしなければならなかったのと同じことをする必要がある人の助けになることを願っています。あなたの答えに感謝します。

ジュリアン。

4

3 に答える 3

0

...問題は、テーブル、プロシージャ、関数、およびスキーマだけで、データも何も必要ないということです。

ステップ 1 は、スキーマをデータから分割することです。SSMS "Script Database As..." を使用して、新しいデータベースに必要なスキーマ/データのみを含む SQL スクリプトを生成します。将来のスキーマ変更 ("basedatabase.sql"、"patch01.sql" など) の計画を立ててください。それが起こり、それらの変更を多くのデータベースに適用する必要があるからです。

データを削除すると、スクリプトからデータベースを作成する方がはるかに高速になります。それが十分に高速でない場合は、空の DB をバックアップし、そこから新しいデータベースに復元します。(SQL Server Azure にはいいCREATE DATABASE_B AS COPY OF DATABASE_Aものがありますが、それは通常の SQL Server にはありません。)

ところで、私は他のポスターに同意します:複数のデータベースの知恵。50 人の顧客がいると予想される場合は、これで問題ありません。10,000 人の顧客がいると予想される場合は、別のアプローチを使用したほうがよいでしょう。

于 2013-03-06T15:48:40.790 に答える
0

データベースのスクリプトを作成し、スクリプトを実行することで、最善を尽くすことができると私は信じています。これには、コンテンツを簡単にバージョン管理できるという利点があります。また、すべてのテナント データベースを新しいバージョンにアップグレードするには、とにかくデルタをスクリプト化する必要があります。

スクリプト データベース ウィザードを使用して、初期スクリプトを作成できます。クレイジーなデフォルトがあるため、高度なオプションを必ず変更してください。彼らは、トリガーなどのいくつかを除外するだけです。

于 2013-03-06T15:49:21.887 に答える
0

この回答を見てください... データベースをコピーする最良の方法 (SQL Server 2008)

最良の方法は、デタッチ-コピー-アタッチです。テンプレート データベースを作成し、これを新しい各データベースのベースとして使用することをお勧めします。

于 2013-03-06T15:20:54.253 に答える