はじめに
SQL Serverの設計は、データベースエンジン(インスタンス)とインスタンスでホストされているデータベースの間の1対多のマッピングを意味します。これは、SQLサーバーの1つのインスタンスに複数のデータベースを展開できることを意味します。 Microsoftのドキュメントによると、SQLServerの単一のインスタンスに最大32767のデータベースを含めることができます。もちろん、サーバー上のリソース、TempDBでの同時実行の管理、ネットワークトラフィックなどの制限があります。
SQL Serverインスタンスに展開されるデータベースは、システムデータベースまたはユーザーデータベースのいずれかです。システムデータベースは、インスタンスとともにインストールされます。この記事では、各システムデータベースの目的について説明します。また、SQLServerでシステムデータベースを管理する際に注意する必要があることを明確にします。
システムデータベースの概要
システムデータベースは、SQLServerのインスタンスをインストールするときに発生する多くのプロセスの一部です。デフォルトでは、これらのデータベースは次のパスで作成されます。
%programfiles%\ Microsoft SQL Server \ MSSQL15.MSSQLSERVER \ MSSQL \ DATA
および
%programfiles%\ Microsoft SQL Server \ MSSQL15.MSSQLSERVER \ MSSQL \ Log
パスは異なる場合があります。 SQL Serverのインストール中に、システムデータベースファイルの場所を指定できます。
インスタンス内のすべてのシステムデータベースを一覧表示するには、リスト1のコードを呼び出すことができます。リスト2を使用して、システムデータベースに関連付けられているデータファイルの場所を判別できます。どちらのスクリプトでも、database_idが5以上のデータベースを返すフィルターを使用していることに注意してください。
重要な「可視」システムデータベースには、database_ids 1、2、3、4があります。これらはそれぞれmaster、tempdb、model、およびmsdbを参照します。レプリケーションなどの機能を有効にすると作成される、リソースデータベースやその他のシステムデータベースと呼ばれる「非表示」データベースもあります。
-- Listing 1: System Databases
select
name
,database_id
,create_date
,state_desc
,recovery_model_desc
,log_reuse_wait_desc
,physical_database_name
,is_db_chaining_on
,is_broker_enabled
,is_mixed_page_allocation_on
from sys.databases
where database_id<5;
-- Listing 2: System Database Files
select
name
,database_id
,DB_NAME(database_id)
,name
,physical_name
,type_desc
from sys.master_files
where database_id<5;
図1:システムデータベース
マスターデータベース
マスターデータベースは、SQL Serverの起動時に開かれる最初のデータベースであり、次のデータが含まれています。
- インスタンスおよび他のすべてのデータベースの構造/構成の記録。
- インスタンスの監視に必要な最も動的な管理ビュー。
したがって、他のすべてのデータベースを開くために必要な情報があります。そのため、最初に開く必要があります。問題はそれをどのように行うかです。
SQL Serverの起動パラメーターには、マスターデータベースデータとログファイルの場所を定義する2つのエントリが含まれています。デフォルトの起動パラメータには3行しか含まれていません。3行目はエラーログファイルの場所です。 SQL Serverの起動時に、そのエラーログファイルに書き込める必要があります。
マスターデータベースが最初に開きます。 sp_configureを使用して定義された構成など、マスターデータベースに格納されている情報は、他のデータベースを開いてインスタンスの起動プロセスを完了するために適用されます。
図3:SQLServerの起動パラメーター
動的管理ビューや関数など、便利なSQLServerシステムオブジェクトについて学習する方法はいくつかあります。
たとえば、オブジェクトエクスプローラーでマスターデータベースのビューまたはプログラマビリティノードを展開します。そこで、これらのオブジェクトの名前を確認し、BooksOnlineから詳細を入手してください。
ログインをあるインスタンスから別のインスタンスに移行することもできます。そのためには、マスターデータベースのバックアップを宛先インスタンスに復元します。特定の手法については、別の記事で説明します。
図4:マスターデータベースオブジェクトのナビゲート
tempDBデータベース
tempDBデータベースは、大量の操作の中間結果などの一時データの保存を担当します。これには、インデックスの再構築、分離レベルで構成されたデータベースの行バージョン、およびREAD_COMMITTED_SNAPSHOTなどの行バージョンに依存するその他の機能が含まれる可能性があります。
インスタンス内のすべてのユーザーデータベースの機能はtempDBに依存しているため、ほとんどの人はtempDBを潜在的なパフォーマンスのボトルネックと見なします。
tempDBの調整は、慎重に行う必要があります。ただし、SQL Server 2016以降では、SQLServerのインストール中にtempDBを正確にセットアップできます。前回の記事では、tempDBを構成および監視する方法について詳しく説明しました。
モデルデータベース
モデルデータベースをテンプレートとして扱うことができます。 SQL Serverインスタンスで作成されたすべてのユーザーデータベースは、モデルデータベースの構成を引き継ぎます。サイズと自動拡張の設定、ファイルの場所などは同じです。ただし、CREATE DATABASEステートメントでは、これらの設定を別の方法で意図的に指定できます。
基本的に、デフォルト設定で独自にデータベースを作成するアプリケーションがある場合は、モデルデータベースを構成することをお勧めします。これにより、これらの自動的に作成されたデータベースの結果をある程度制御できるようになります。
リスト3のコードを使用して、これを少し試してみましょう。
-- Listing 3: Using the Model Database
select
name
,database_id
,DB_NAME(database_id) database_name
,name
,physical_name
,type_desc
,size/1024*8 [size (MB)]
,growth/1024*8 [size (MB)]
from sys.master_files
where DB_NAME(database_id)='model' or DB_NAME(database_id) like 'EXP%';
GO
create database EXP_BEFORE;
GO
USE [master]
GO
ALTER DATABASE [model] MODIFY FILE ( NAME = N'modeldev', SIZE = 102400KB , FILEGROWTH = 131072KB )
GO
ALTER DATABASE [model] MODIFY FILE ( NAME = N'modellog', SIZE = 102400KB )
GO
create database EXP_AFTER;
GO
select
name
,database_id
,DB_NAME(database_id) database_name
,name
,physical_name
,type_desc
,size/1024*8 [size (MB)]
,growth/1024*8 [size (MB)]
from sys.master_files
where DB_NAME(database_id)='model' or DB_NAME(database_id) like 'EXP%';
GO
コードは次の手順を実行します。
- sys.master_filesを照会します モデルデータベースで使用される設定を決定するには
- データベースを作成する
- モデルデータベースファイルの拡張と自動拡張の設定を変更します
- 別のデータベースを作成する
- クエリsys.master_files もう一度
データベース作成の1つのフレーズ「CREATEDATABASE」に注意してください。このようにして、モデルデータベースに属する設定を取得します。結果は、CREATE DATABASEコマンドを2回発行したときに、EXP_AFTERデータベースが96GBのファイルサイズと128MBの自動拡張を取得したことを示しています(図5を参照)。
図5:モデルデータベースの使用
すべてのデータベース設定がモデルデータベースから自動的に取得されるわけではないことにも言及する価値があります。たとえば、モデルや他のシステムデータベースではオンになっている場合でも、新しいデータベースを作成するときにMIXED_PAGE_ALLOCATIONがオフに設定されます。
msdbデータベース
msdbをSQLServerエージェントデータベースと見なすことができます。ジョブ、データベースメール、オペレーター、自動化に関連するすべてのデータを保存します。トランザクションログの配布、レプリケーションなどに関連するデータもあります。インスタンスでリスト4のクエリのセットを実行することにより、それを確認できます。たとえば、自動化に関連するオブジェクトはmsdbに存在します。
-- Listing 4: Querying msdb Objects
-- Jobs, Alerts, Operators sit in the msdb database ...
select * from msdb..sysjobs
select * from msdb..sysalerts
select * from msdb..sysoperators
select * from msdb..sysmail_allitems
-- ... NOT in the master database
select * from master..sysjobs
select * from master..sysalerts
select * from master..sysoperators
select * from master..sysmail_allitems
SQL Server Books Onlineでオブジェクトを抽出して調査することにより、msdbデータベース内のオブジェクトについて多くのことを学ぶことができます。アプローチは、マスターデータベースの場合と同じです。
ジョブやオペレーターなどをあるSQLServerインスタンスから別のインスタンスに移行できます。そのためには、ソースインスタンスからmsdbデータベースのバックアップを取り、それを宛先インスタンスに復元します。これについては別の記事で取り上げます。
エピローグ
この記事では、システムデータベースの概要を簡単に説明しました。
システムデータベースには、デフォルトでSQLServerがインストールされています。さまざまなシステムデータベースとその役割を理解することは、SQLServerインスタンスを管理するための優れた支援となります。
Books OnlineやCodingSightの他の記事から、それらが何を保存しているかについての詳細を入手し、それらを管理する方法を理解することができます。
参考資料
- システムデータベース
- MSSQLServerデータベースとストレージ
- クロスデータベースの所有権の連鎖