sql >> データベース >  >> RDS >> Sqlserver

SQLServerでのデータファイル管理の基本

    はじめに

    データファイルは、実際のデータが含まれているため、データベースシステムの最も重要な部分を構成する物理オブジェクトです。データベースは、データファイルのコレクションと考えることができます。インスタンスは、そのようなファイルをマウントしてアクセスする手段を提供します。

    ここで、データファイルの管理とは、既存のデータファイルを監視およびサイズ変更する方法と、データベースにデータファイルを追加またはデータベースから削除する方法を理解することです。

    これらの操作のT-SQLコードは、Microsoftのドキュメントに記載されています。ただし、この記事では、SQLServerのオンプレミスインストールを引き続き実行している私たちのために、これらのファイルを管理するための戦術について説明します。

    データファイルの種類と考えられる問題

    SQL Serverで作成される新しいデータベースごとに、少なくとも2つのファイル(プライマリデータファイルとログファイル)を作成する必要があります。

    • プライマリデータファイルの拡張子は.MDFです。
    • ログファイルの拡張子は.LDFです。
    • SQL Serverデータベースにデータファイルを追加するときは、通常、.NDF拡張子を使用します。

    :拡張機能なしでSQL Serverでデータファイルを作成することは可能ですが、それはベストプラクティスではありません。 .mdf、.ndf、および.ldfを使用すると、オペレーティングシステムレベルで表示するときにこれらのファイルを区別できます。

    もちろん、データベースを作成するとデータファイルが作成されます。 CREATE DATABASEでそれを行うことができます 指図。とても簡単に思えますが、考えられる問題に注意する必要があります。

    データベースとそれに関連するデータファイルが最終的にどれだけ大きくなるかによっては、バックアップ時間やデータの移動に関する断片化の問題やその他の問題に直面する可能性があります。データファイルのサイズが正しくない場合に発生します。

    下の図を見てください。これは、CREATE DATABASEを実行し、データベースの名前(MyDB)を提供した結果を示しています。

    リスト1は、作成されたデータベースの詳細を示しています。

    -- Listing 1: Create Database Script
    USE [master]
    GO
    
    /****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
    CREATE DATABASE [MyDB]
     CONTAINMENT = NONE
     ON  PRIMARY 
    ( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
     LOG ON 
    ( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
    GO
    
    IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
    begin
    EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
    end
    GO
    

    私たちが行ったのはCREATEDATABASEMyDBを発行することだけだったので、SQLServerがこれらすべてのオプションをどこから取得したのか不思議に思うかもしれません。

    SQL Serverは、そのインスタンスで作成された新しいデータベースのデフォルト値としてモデルデータベース設定を使用します。この場合、100MBの初期ファイルサイズが表示されます。自動拡張は、データファイルとログファイルでそれぞれ12MBと64MBです。

    その後の問題

    図1で強調表示されている設定の意味は次のとおりです。

    1. プライマリデータファイルは100MBのサイズから始まります。小さいサイズです。したがって、データベースのアクティビティレベルによっては、すぐに拡張する必要があります。
    2. 自動成長する必要があるときはいつでも データファイルの場合、SQLサーバーはオペレーティングシステムの使用可能なスペースから128MBを取得する必要があります。繰り返しになりますが、これは小さいため、データベースが頻繁に自動拡張されることを意味します。 。データベースの増大はコストのかかる操作であり、頻繁に発生するとパフォーマンスに影響を与える可能性があります。さらに、データベースが頻繁に増大すると、断片化と呼ばれる現象が発生する可能性があり、その結果、データベースのパフォーマンスが大幅に低下するコツがあります。増分を高い値に設定するもう1つの極端な方法では、基盤となるストレージシステムのパフォーマンスによっては、拡張操作の完了に時間がかかる場合があります。
    3. データベースファイルは無期限に大きくなる可能性があります。つまり、十分な時間があれば、これらのファイルは、それらが置かれているボリューム上のすべてのスペースを消費する可能性があります。それらを移動するには、それらのサイズ以上のボリュームが必要です。もう1つのオプションは、これらのファイルが保存されているときにボリュームにストレージを追加することです。

    これらは、データベースを作成するためのデフォルト値に依存することに関連する重要な問題です。

    事前割り当て

    成長によるパフォーマンスへの影響を考えると、プロジェクトの開始時にデータベースのサイズを適切に設定する方が理にかなっています。このようにして、当面のソリューション要件に対応します。

    データベースのサイズが最終的に1GBになることがわかっていると仮定します。プロジェクトの開始時に1GBのストレージを割り当てる場合があります。そうすれば、データベースを拡張する必要はありません。データベースの増大によって引き起こされる断片化の問題を排除します。

    リスト2は、この事前割り当てに適用可能なスクリプトを示しています。

    -- Listing 2: Create Database Script with Pre-allocation
    USE [master]
    GO
    
    /****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
    CREATE DATABASE [MyDB]
     CONTAINMENT = NONE
     ON  PRIMARY 
    ( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 1024MB , MAXSIZE = 2048MB, FILEGROWTH = 512MB )
     LOG ON 
    ( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
    GO
    
    IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
    begin
    EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
    end
    GO
    

    デモンストレーション用に1GBのスペースについて説明します。通常、実稼働データベースには1TBが必要です。ポイントは、最初に必要なスペースを割り当てることです。次に、成長の必要性を排除または大幅に削減します。

    ここで、1TBのファイルを1つのボリュームに配置する必要があるかどうかを自問する必要があります。それをより小さなチャンクに分割するのが賢明でしょう。バックアップなどの並列操作が発生すると、各ファイルはマルチプロセッサシステムの単一のCPUスレッドによってアドレス指定されます。 1つのファイルでは、スムーズに進みません。

    ここでも、リスト3のこの要件に対応するようにスクリプトを変更します。

    -- Listing 3: Create Database Script with Pre-allocation and 
    USE [master]
    GO
    
    /****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
    CREATE DATABASE [MyDB]
     CONTAINMENT = NONE
     ON  PRIMARY 
    ( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.mdf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
    ( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) 
    ( NAME = N'MyDB03', FILENAME = N'C:\MSSQL\Data\MyDB03.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
    ( NAME = N'MyDB04', FILENAME = N'C:\MSSQL\Data\MyDB04.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
    ( NAME = N'MyDB05', FILENAME = N'C:\MSSQL\Data\MyDB05.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
     LOG ON 
    ( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
    GO
    
    IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
    begin
    EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
    end
    GO
    

    追加情報

    また、ログファイルにこのアプローチを使用することに価値はないことにも言及する必要があります。重要なのは、SQLServerは常にログファイルに順番に書き込むということです。また、追加する新しいファイルには.ndf拡張子を使用しました。

    MAXSIZE句は、データファイルが無期限に大きくならないようにします。各ファイルに異なる論理名と物理名を付けました。NAME句はファイルの論理名を指定し、FILENAME句は物理名を指定します。

    より大きなデータファイルを使用してデータベースを作成すると、それ以外の場合よりも時間がかかります。最初に小さなデータベースを作成し、次に適切なコマンドを使用してデータベースを操作して、理想的なデータベース構造を確立するまで、ファイルのサイズを変更して追加する方が合理的かもしれません。

    明示的なオプションを使用してデータベースを作成することにより、この記事の前半で提起された3つの懸念に対処しました。図2は、このアプローチの結果を示しています。

    これで、データファイルを増やすことなく、長期間にわたってデータを増やすことができるようにデータベースが適切に構成されました。断片化のリスクを取り除き、より良いデータファイル管理を保証するのに役立ちます。

    データファイルの管理

    CREATE DATABASEステートメントで4つまたは5つのデータファイルを作成する代わりに、ALTERDATABASET-SQLステートメントのMODIFY句とADD句を使用できます。

    ここでも、以下のリスト4に示すステートメントから始めます。 100MBのデータファイルと付随するログファイルを使用して単一のデータベースを作成します。私たちの目標は、このファイルを拡張してからさらにファイルを追加することにより、事前割り当てを確実にすることです。

    -- Listing 4: Create Database Script
    USE [master]
    GO
    
    IF EXISTS (SELECT * FROM sys.databases WHERE name='MyDB')
    DROP DATABASE MyDB;
    
    /****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
    CREATE DATABASE [MyDB]
     CONTAINMENT = NONE
     ON  PRIMARY 
    ( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
     LOG ON 
    ( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
    GO
    
    IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
    begin
    EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
    end
    GO
    

    データファイルの拡張

    データファイルを拡張するT-SQLステートメントをリスト5に示します。これは、データベース名、ファイル名、および必要な初期サイズと増分を指定します。この場合、開始時に1GBを割り当て、その後のすべての自動拡張に512MBを割り当てるようにSQLServerを設定します。

    -- Listing 5: Extend the Primary Datafile
    USE [master]
    GO
    ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
    GO
    

    リスト6は、2GBのMAXSIZEを指定した場合のコードの外観を示しています。

    -- Listing 6: Extend the Primary Datafile with Maximum Size
    USE [master]
    GO
    ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB )
    GO
    

    FILEGROWTH句を0に設定すると、SQLServerはデータファイルを自動拡張しないように設定されます 。この場合、データファイルを拡張したり、他のファイルを追加したりするために、明示的にコマンドを発行する必要があります。

    データファイルの追加

    リスト7は、データベースに新しいデータファイルを追加するために使用するコードを示しています。論理ファイル名と、フルパスを含む物理ファイル名を再度指定する必要があることに注意してください。

    また、物理ファイルを別のボリュームに配置することもできます。そのためには、パスを変更するだけです。

    -- Listing 7: Add Data Files to the Primary Filegroup
    USE [master]
    GO
    ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.ndf' , SIZE = 1048576KB , FILEGROWTH = 524288KB ) TO FILEGROUP [PRIMARY]
    GO
    

    データファイルの拡張と追加は、データベースの自動拡張を無効にすることを選択したシナリオにも適用されます(図4を参照)。

    次に、リスト5または6の上記のコードを使用してデータベースを手動で拡張するか、リスト7のようにファイルを追加する必要があります。

    ファイルグループの使用

    ファイルグループを使用すると、データファイルコレクションをまとめて管理できます。異なるディスクまたは異なるボリュームに保存されている一部のデータファイルを1つのファイルグループに論理的にグループ化できます。そのファイルグループは、テーブルとインデックス、およびデータを格納する実際の物理ファイルの間に抽象化レイヤーを作成します。

    したがって、ファイルグループにテーブルを作成すると、このテーブルのデータは、ファイルグループに割り当てられているすべてのデータファイルに分散されます。

    これまでは、PRIMARYファイルグループのみを扱ってきました。リスト8は、新しいファイルを追加する方法を示しています MyDB02 プライマリファイルグループ以外のファイルグループに。

    データベースコンテキストをmasterに設定した後の最初のステートメントは、新しいファイルグループFG01を作成します。次のステートメントは、リスト7で使用されているものと同様のオプションを使用して、この新しいファイルグループにファイルを追加します。

    -- Listing 8: Add Data Files to the Primary Filegroup
    USE [master]
    GO
    ALTER DATABASE [MyDB] ADD FILEGROUP [FG01]
    GO
    ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 102400KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB ) TO FILEGROUP [FG01]
    GO
    

    データファイルの削除

    図5は、これまでに実行した操作の結果を示しています。 3つのデータファイルがあります。それらのうちの2つはPRIMARYファイルグループにあり、3つ目はFG01ファイルグループにあります。

    たとえば、間違ったファイルサイズを設定したなど、何か間違ったことをしたとしましょう。次に、リスト9の次のコードを使用してファイルグループを削除できます。

    -- Listing 9: Drop Data Files
    USE [MyDB]
    GO
    ALTER DATABASE [MyDB]  REMOVE FILE [MyDB02]
    GO
    

    結論

    この記事では、データベースファイルの種類、データファイルの増加によって発生する可能性のある問題、および問題を解決する方法について説明しました。また、データファイルを拡張してデータベースに新しいデータファイルを追加するためのT-SQLコードを調べました。ファイルグループの使用についても触れました。

    私たちの目標は、データベースを展開するときに、特定のアプリケーションに必要となるすべてのデータを格納するためにデータベースを準備することです。

    参照

    1. データベースファイルとファイルグループ

    1. MySQLで列サイズを変更する方法

    2. 2つの接続されたテーブルを作成するためのデータベースの選択?

    3. プライマリインデックスとセカンダリインデックスの正確な違いは何ですか?

    4. クラスタリングとスタッキングによるSQLServerインスタンスの統合