デタッチとアタッチを使用してデータベースをアップグレードする方法 (Transact-SQL)

セキュリティに関する注意セキュリティに関する注意

不明なソースや信頼されていないソースからのデータベースは、アタッチまたは復元しないことをお勧めします。そのようなデータベースには、意図しない Transact-SQL コードを実行したり、スキーマまたは物理データベース構造を変更することによりエラーを発生させる悪意のあるコードが含まれている可能性があるからです。不明なソースや信頼されていないソースのデータベースを使用する前に、運用に使用していないサーバーでそのデータベースに対し DBCC CHECKDB を実行し、さらに、そのデータベースのストアド プロシージャやその他のユーザー定義コードなどのコードを調べます。

SQL Server 2008 では、デタッチ操作とアタッチ操作を使用して、SQL Server 2000 または SQL Server 2005 のユーザー データベースをアップグレードできます。SQL Server 2005 または SQL Server 2000 のデータベースを SQL Server 2008 にアタッチした後は、データベースが直ちに使用可能となり、自動的にアップグレードされます。

ただし、次の制限事項が適用されます。

  • SQL Server 2000 または SQL Server 2005 で作成した master データベース、model データベース、または msdb データベースのコピーはアタッチできません。

  • レプリケートされたデータベースをアタッチする際に、そのデータベースがデタッチではなくコピーされたものである場合は、次の点を考慮してください。

    • 同じサーバー インスタンスのアップグレードされたバージョンにデータベースをアタッチする場合は、アタッチ操作が完了した後、sp_vupgrade_replication を実行してレプリケーションをアップグレードする必要があります。詳細については、「sp_vupgrade_replication (Transact-SQL)」を参照してください。

    • バージョンに関係なく別のサーバー インスタンスにデータベースをアタッチする場合は、アタッチ操作が完了した後、sp_removedbreplication を実行してレプリケーションを削除する必要があります。詳細については、「sp_removedbreplication (Transact-SQL)」を参照してください。

  • SQL Server 2000 から SQL Server 2008 にアップグレードするデータベースに対して APPLY、PIVOT、TABLESAMPLE、または UNPIVOT キーワードを使用している場合は、データベースの互換性レベルを 100 に設定する必要があります。データベースの互換性レベルを設定するには、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

    重要な注意事項重要

    SQL Server 2000 Service Pack 3 (SP3) 以降のバージョンの SQL Server では、アタッチとデタッチを行うと、そのデータベースの cross db ownership chaining オプションが 0 に設定され、複数データベースの組み合わせ所有権が無効になります。組み合わせ所有権の有効化の詳細については、「cross db ownership chaining オプション」を参照してください。

フルテキスト インデックス アップグレード オプション

注意注意

SQL Server 2005 または SQL Server 2000 のデータベースを SQL Server 2008 にアタッチした後は、データベースが直ちに使用可能となり、自動的にアップグレードされます。データベースにフルテキスト インデックスがある場合、アップグレード プロセスでは、upgrade_optionサーバー プロパティの設定に応じて、インポート、リセット、または再構築が行われます。アップグレード オプションがインポート (upgrade_option = 2) または再構築 (upgrade_option = 0) に設定されている場合、アップグレード中はフルテキスト インデックスを使用できなくなります。インデックスを作成するデータ量によって、インポートには数時間、再構築には最大でその 10 倍の時間がかかることがあります。なお、アップグレード オプションがインポートに設定されており、フルテキスト カタログが使用できない場合は、関連付けられたフルテキスト インデックスが再構築されます。upgrade_option サーバー プロパティの設定を変更するには、sp_fulltext_service を使用します。

手順

デタッチとアタッチを使用してデータベースをアップグレードするには

  1. sp_detach_db ストアド プロシージャを使用して、SQL Server 7.0 または SQL Server 2000 のインスタンスからデータベースをデタッチします。

    詳細については、各バージョンの SQL Server オンライン ブックを参照してください。

    注意注意

    SQL Server 2005 では、このストアド プロシージャに新しいオプションが追加されています。詳細については、「sp_detach_db (Transact-SQL)」を参照してください。

  2. 必要に応じて、デタッチされたデータベース ファイルとログ ファイルを移動します。

    新しいログ ファイルを作成する場合であっても、ログ ファイルをデータ ファイルと一緒に移動する必要があります。場合によっては、データベースの再アタッチに既存のログ ファイルが必要になります。したがって、デタッチしたログ ファイルを使わずにデータベースを正常にアタッチできるまで、デタッチしたログ ファイルは必ずすべて保管しておいてください。

    注意注意

    ログ ファイルを指定せずにデータベースのアタッチを試みると、アタッチ操作は元の場所でログ ファイルを検索します。元の場所にログの元のコピーが依然として存在する場合は、そのコピーがアタッチされます。元のログ ファイルが使用されないようにするには、新しいログ ファイルのパスを指定するか、ログ ファイルの元のコピーを (新しい場所にコピーした後で) 削除します。

  3. FOR ATTACH オプションまたは FOR ATTACH_REBUILD_LOG オプションを指定した CREATE DATABASE ステートメントを使用して、コピーしたファイルを SQL Server 2005 のインスタンスにアタッチします。

    注意注意

    オブジェクト エクスプローラを使用して SQL Server 2005 データベースをアタッチする方法の詳細については、「データベースをアタッチする方法 (SQL Server Management Studio)」を参照してください。

  4. アップグレードされたデータベースで DBCC UPDATEUSAGE を実行することをお勧めします。

    以前のバージョンの SQL Server では、テーブルおよびインデックスの行やページのカウント値が正しくならないことがありました。このため、SQL Server 2005 より前のバージョンで作成したデータベースには誤ったカウントが含まれている場合があります。データベースを SQL Server 2005 にアップグレードした後、DBCC UPDATEUSAGE を実行して無効なカウントを修正することをお勧めします。この DBCC ステートメントを実行すると、テーブルまたはインデックスのパーティションごとに、行、使用ページ、予約済みページ、リーフ ページ、およびデータ ページの数が修正されます。詳細については、「DBCC UPDATEUSAGE (Transact-SQL)」を参照してください。

  5. (データベースを移動するのではなく) データベースのコピーを作成している場合、必要に応じて、SQL Server 7.0 または SQL Server 2000 のインスタンスで sp_attach_db ストアド プロシージャまたは sp_attach_single_file_db ストアド プロシージャを使用して、元のデータベースを再アタッチできます。

    詳細については、各バージョンの SQL Server オンライン ブックを参照してください。

アップグレード後のデータベース互換性レベル

tempdbmodelmsdb、および Resource データベースの互換性レベルは、アップグレード後、100 に設定されます。master システム データベースは、互換性レベルが 80 を下回っている場合は、アップグレード前の互換性レベルを保持します。アップグレード前の master の互換性レベルが 80 を下回っている場合は、アップグレード後、80 に設定されます。

アップグレード前のユーザー データベースの互換性レベルが 80 または 90 の場合は、アップグレード後も互換性レベルは変わりません。アップグレード前の互換性レベルが 70 以下の場合、アップグレードされたデータベースの互換性レベルは 80 に設定されます。これは、SQL Server 2008 でサポートされている下限の互換性レベルです。

注意注意

新しいユーザー データベースには、model データベースの互換性レベルが継承されます。

アップグレードされたサーバー インスタンスでのメタデータの管理

データベースを別のサーバー インスタンスにアタッチするときは、ユーザーおよびアプリケーションに一貫した使用環境を提供するために、アタッチ先のサーバー インスタンスで、ログイン、ジョブ、権限などのデータベースのメタデータの一部またはすべてを作成し直す必要が生じる場合があります。詳細については、「データベースを別のサーバー インスタンスで使用できるようにするときのメタデータの管理」を参照してください。

次の例では、Transact-SQL ステートメントを使用して SQL Server 2000pubs データベースをデタッチおよびアタッチし、SQL Server 2005 データベースにアップグレードします。

  1. pubs がアタッチされているサーバー インスタンスに SQL Server 2000 クエリ アナライザを接続し、sp_detach_db ストアド プロシージャを使用してこのデータベースをデタッチします。

    USE master;
    GO
    EXEC sp_detach_db @dbname = N'pubs';
    GO
    
  2. この例の目的に従い、任意の方法で、pubs ファイル (pubs.mdf と pubs_log.ldf) を C:\Program Files\Microsoft SQL Server\MSSQL\Data\ (SQL Server 2000 の pubs の既定の場所) から C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\ (SQL Server 2005 データ ディレクトリ) にコピーします。

    重要な注意事項重要

    実稼働データベースの場合は、データベースとトランザクション ログを別のディスクに配置します。

    注意注意

    ファイルをネットワーク経由でリモート コンピュータのディスクにコピーするには、そのリモート コンピュータの UNC (Universal Naming Convention) 名を使用します。UNC 名の形式は、\\Servername\Sharename\Path\Filename です。ローカル ハード ディスクにファイルを書き込む場合、SQL Server で使用するユーザー アカウントは、リモート ディスクのファイルに対して読み取りまたは書き込みを行うために必要な権限を持っている必要があります。

  3. コピーした pubs データベースと、必要に応じてログ ファイルを SQL Server 2005 のインスタンスにアタッチします (この例では同一のデータベース名を使用しています)。SQL Server Management Studio のクエリ エディタで新しいクエリを開き、データベースをアタッチするサーバー インスタンスに接続します。

    注意注意

    詳細については、「SQL Server Management Studio データベース エンジン クエリ エディタ ウィンドウ」を参照してください。

    次の CREATE DATABASE ステートメントを実行します。

    USE master;
    GO
    CREATE DATABASE pubs ON PRIMARY 
       (FILENAME = 
          'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\pubs.mdf')
       LOG ON (FILENAME = 
          'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Data\pubs_log.ldf')
       FOR ATTACH;
    GO
    
    注意注意

    SQL Server Management Studio では、新しくアタッチされたデータベースはオブジェクト エクスプローラにすぐに表示されません。このデータベースを表示するには、オブジェクト エクスプローラで [表示] メニューの [最新の情報に更新] をクリックします。[データベース] ノードを展開すると、新しくアタッチしたデータベースがデータベースの一覧に表示されるようになります。

  4. 必要に応じて、sp_attach_db ストアド プロシージャを使用して、元の pubs データベースを SQL Server 2000 のインスタンスに再アタッチします。クエリ アナライザで次のように入力します。

    USE master;
    Go
    EXEC sp_attach_db @dbname = N'pubs', 
       @filename1 = 
          N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf', 
       @filename2 = 
          N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf';
    GO