お金をかけずにサーバーの勉強をしよう

SQL Server 2022 でインスタンスをもう一つ

2024年1月4日

メニューへ戻る

SQL Serverで同じサーバー上に DBインスタンスを2つ以上作るには?

私は仕事でよくやったものですが、SQL Serverで DBインスタンスを 2つ以上作るケースの手順の情報って調べてみると殆ど無いようです。

開発環境でサーバーOS代をケチって、1つの Windows Server OS内に複数の SQL Serverの DBインスタンスを立てる…開発用の DBならありがちだと思います。

ここではそれを実際にやってみますので、よろしければケチりにケチりまくって、一杯 DBインスタンスを立ち上げてみると良いと思います。


1.構成

マシン名OSインストールするもの用途
Win2022-1Windows Server 2022SQL Server 2022・SSMSDBサーバー
Win2022-2Windows Server 2022SSMSクライアント

クライアントPCとして Windows Server 2022を使いますが、別に Win10・Win11でも構いません。

Windows Server 2022のインストールについては「Windows Server 2022 インストール」にある手順で 2台とも作っています。


2.DBサーバーに SQL Server 2022インストール

[Win2022-1]サーバーに SQL Server 2022をインストールしつつ、1つ目の DBインスタンスを作ります。

基本的に「SQL Server 2022インストール」で書いている通りの手順でインストールしますが、一部違うところがありますので、ここではその部分だけ触れます。

今回はデータ領域を Dドライブにするため [インスタンス ルート ディレクトリ]のパスを変えています。
データ領域のフォルダ変更

※[インスタンス ルート ディレクトリ]のパスを別ドライブに変えているのは、ここがデータ領域だからです。
データが増えるに従い自動拡張によりどんどん使用量が大きくなるフォルダですから、システムドライブである Cドライブにするのは嫌なんですね。
2つ以上の DBインスタンスを作るなら尚更のことです。
なお、この場所を SSDなど高速なストレージ上に割り当てることで、データベースとしての処理も高速になりますよ。

1つ目の DBインスタンスと 2つ目のとを区別するため、1つ目のものも [名前付きインスタンス] にし、「INSTANCE1」としました。
名前付きインスタンス 1


3.DBサーバーに SQL Server Management Studioインストール

[Win2022-1]サーバーに、SQL Server Management Studio(SSMS)をインストールします。
2024年1月4日時点では、19.2が最新となっていました。

インストールが済んだら SSMSを起動し、Windows認証で [INSTANCE1]インスタンスにログインします。
SSMSログイン 1

後で 2つ目のインスタンスと区別するため、[DB1] というユーザーデータベースを作っておきました。
ユーザーデータベース [DB1]作成


4.2つ目の DBインスタンス作成

どうするのかというと、DBサーバーでもう一回 SQL Serverのインストールをします

手順はほぼ 1つ目のときと同じです。

既に DBインスタンスが存在している場合は、1つ目の時にはなかったこのような画面が出ます。
[SQL Server 2022 の新規インストールを実行する] を選択し、次へを押します。
[INSTANCE2]インスタンス作成

ここでも [インスタンス ルート ディレクトリ] を Dドライブに変えています。
[共有機能ディレクトリ] [共有機能ディレクトリ (x86)] (要するにプログラム部分)は既にインストール済みなので、グレイアウトされて変更できません。
ユーザーデータベース [DB1]作成

以下の通り、名前付きインスタンスにする際に [INSTANCE2]としました。
ユーザーデータベース [DB1]作成

2つ目のインスタンス作成が終わったとします。

改めて SSMSでログインします。
[サーバー名] のプルダウンを開くと [<参照...>] がありますので選択します。
SSMSログイン 2

今回は [INSTANCE2] を選択し、OKを押します。
SSMSログイン 3

元のログイン画面に戻るので接続を押します。
SSMSログイン 4

ログインできましたので、こちらには [DB2]ユーザーデータベースを作っておきました。
ユーザーデータベース [DB2]作成

[オプジェクトエクスプローラー] の [接続]プルダウンから [データベースエンジン] を選択します。
ユーザーデータベース [DB1]作成

またログイン画面が出るので、[INSTANCE1] にログインしてやると、両方ともログインした状態にできます。
ユーザーデータベース [DB1]作成

なお、[サービス]の画面では、[INSTANCE1] と [INSTANCE2] がそれぞれ独立したサービスになっていることが分かります。
ユーザーデータベース [DB1]作成

これで、1つの Windows Server 2022 の中に、SQL Server 2022 の DBインスタンスが 2つできました。
CPUのパワーやメモリなどのサーバー資源が潤沢にあれば、問題なく動きます。


5.2つの DBインスタンスをネットワークに公開

できあがった 2つの DBインスタンスに、クライアントからアクセスしたいと思います。

クライアントからそれぞれの DBインスタンスに接続する際には「IPアドレス・ポート」の組み合わせを使います。

つまり、DBインスタンスごとに 違うポートを使ってネットワークに公開されるのです。

DBインスタンスを作ったばかりの今はどうなっているかを確認しましょう。

DBサーバーの [Win2022-1] で、[スタート] - [Microsoft SQL Server 2022] - [SQL Server 2022 構成マネージャー] を実行します。

左ペインのツリーより [SQL Server 構成マネージャー (ローカル)] - [SQL Server ネットワークの構成] と選びますと、[INSTANCE1のプロトコル] [INSTANCE2のプロトコル] が現れますので、まず [INSTANCE1のプロトコル] を選び、右ペインにある [TCP/IP] をダブルクリックします。
SQL Server 構成マネージャー 1

[IPアドレス]タブを選ぶとこのような画面になりますので、一番下にある [IP ALL] の [TCPポート]行に 「1433」を入力し、OKを押します。
SQL Server 構成マネージャー 2

OKを押します。
SQL Server 構成マネージャー 3

[INSTANCE2のプロトコル] でも同様に行い、こちらは [TCPポート] を「1434」にします。
SQL Server 構成マネージャー 4

※これらを設定する前は TCPポートの動的割当てが行われていて、SQLサーバーを立ち上げる度に割り当てられる TCPポート番号が変わるようになっています。
「SQL Server ブラウザ」という機能を有効にすると、外部からのアクセスの際に TCPポート番号を意識せず DBインスタンス名だけでアクセスができてユーザー側は楽なのですが、通過するファイアウォールの設定が面倒になりインフラ側は辛いだけです。
昨今はエンドユーザーが直接データベースをつつく事も減って、ほぼ他のサーバーからのアクセスばかりになっている現状では、TCPポート番号は固定して運用したほうが楽だというのが私の経験上の感想です。

※[1433/tcp] は古来より SQL Serverの(1つ目の DBインスタンスの)デフォルトのポートです。
なので私は 2つ目以降を [1434] [1435] と振っていました。
この番号に決まりはなく、空いている番号ならなんでも良いです。

これで SQL Server側の準備は完了しました。


6.Windows Defenderファイアウォールのポート開放

これで外部からアクセスできると思いきや Windows Serverの罠がありまして、Windows Defenderファイアウォールで上記 [1433/tcp] [1434/tcp] のポート開放を行わないと通信ができないのでした。

この作業については「Windowsサーバーのファイアウォール」に手順を書いていますので、そちらを行って下さい。

設定はこのように、2つのポートを 1つの設定に収めました。
Windows Defender Firewall
これで、DBサーバー [Win2022-1] の準備は完了です。


7.クライアントに SSMSをインストール

3と同様に、クライアントの [Win2022-2] に SSMSをインストールしましょう。
単にクライアントとして SQL Serverにアクセスしたいだけなので、SQL Serverのクライアントになるものなら何でも良いです。


8.クライアントから 2つの DBインスタンスにアクセス

とりあえず [Win2022-2] で SSMSを起動しました。

こちらは [Windows認証] が使えませんので [SQL Server認証] で [sa]ユーザーを使います。
でも、此の画面でってなるでしょう。
クライアントの SSMS 1
どうやって DBインスタンスの [INSTANCE1] と [INSTANCE2] を指すのか。
マシン名([Win2022-2] の [hosts]ファイルにて名前解決済み)は [Win2022-1] にするのは良いとして、TCPポートはどうすれば良いのか?

[サーバー名] に「マシン名(またはIPアドレス),TCPポート番号」と記述すれば良いのでした。
クライアントの SSMS 2
カンマ、カンマが重要なのです!!!
コロンじゃないんだね。

分かるかこんなの!
私はこの 1行が書きたいためにこのページを書いたと言っても過言ではありません。

結果、難なく両方の DBインスタンスにログインできるのでした。
クライアントの SSMS 3
これにて 2つ以上の DBインスタンスを立てる方法と、そこにアクセスする方法は終わりであります。


==========
さて、この話、例えば ODBC接続を使って Excelから SQL Serverを参照するときにも、やはり上に書いた接続文字列(マシン名,ポート番号)を使います。

インターネットには 1つ目の DBインスタンスに接続する前提で、ここら辺が端折られている情報が多く、環境ができているのに接続文字列が分からないばかりに先に進めないこともあろうかと思います。

意外な所でのハマりポイントであり、SQL Serverラーを困らせる要因になっていると思います。

マイコーソフトは、SQL ServerのクライアントGUIには「ポート番号」欄を作り、このような悲劇を産まないようにして欲しいですね。

なお、この実験をするにあたり、PCのメモリが 32GBだとかなり辛かったです。
やはりもう 64GBくらいはないとまともな実験ができなくなってきました。


2024年になったというのに、SQL Server 2022を銘打った日本語書籍は刊行されていないようです。

外国語ですがオライリーのものはありましたので、いずれ日本語版が出るかも知れませんが、日本ではこの手の専門書が売れなくなっている証左でもあります。

サーバーエンジニア・DBエンジニアとしては危機感を覚えるところです。