Ubuntu で SQL Server on Linux を動作させた場合の基本環境についてつらつらと
現状、SQL Server on Linux で使用できる機能については Release notes for SQL Server on Linux から確認をすることができます。
オフラインでインストーする場合のパッケージもリリースノートから入手できるものを使用する感じでしょうかね。
実際には使用できない機能が記載されているのですが、現状の SQL Server on Linux は Developer Editoin が使用されているため、記載されていないものについては、各種機能は利用できるかと思います。
詳細な情報については Microsoft ?? Linux? Microsoft ?? running its Windows’ SQL Server software on Linux がまとめられているものでしょうか。
Contents
SQL Server on Linux の概要と学習用コンテンツ
SQL Server on Linux の概要については SQL Server on Linux: overview が公開されていますのでこちらを確認するのがよいかと。
基本操作については Virtual Lab がよさそうです。
以下のようなラボが提供されています。
- Introduction to SQL Server on Linux for SQL Server Administrators – Red Hat
- Introduction to SQL Server on Linux for SQL Server Administrators – Ubuntu
- Introduction to SQL Server for Linux Administrators – Ubuntu
- Introduction to SQL Server for Linux Administrators – Red Hat
ディレクトリ構成
主要なファイルディレクトリの構成ですが以下のようになっているようです。
ディレクトリ / ファイル | 用途 |
/opt/mssql/bin | SQL Server を起動するための ELF ファイルや構成ファイルを格納しているディレクトリ |
/opt/mssql/bin/sqlservr | Linux から SQL Server を起動するためのバイナリ ライブラリ OS やライブラリ OS 上の SQL Server を起動するためのローダー |
/opt/mssql/bin/mssql-conf | SQL Server のポート / ディレクトリ / トレースフラグを変更するためのスクリプト |
/opt/mssql/lib | ライブラリ OS や SQL Server の Windows 用バイナリファイルがサンドボックス化されたライブラリが格納されたディレクトリ |
/opt/mssql/lib/mssql-conf | 「/opt/mssql/bin/mssql-conf」の実処理が記載された各種スクリプトが配置されるディレクトリ |
/opt/mssql-tools | SQL Server Tools (bcp / sqlcmd) のバイナリが格納されたディレクトリ /usr/bin/sqlcmd, /usr/bin/bcp の実体 |
/opt/microsoft/msodbcsql | ODBC を賜与する鵜ためのモジュールが格納されたディレクトリ |
/var/opt/mssql | サンドボックス Linux ルートパスとして設定されているデフォルトのディレクトリ |
/var/opt/mssql/data | データベースファイルの既定のディレクトリ |
/var/opt/mssql/log | SQL Server の ERRORLO / デフォルトトレース / システムヘルスの格納先のディレクトリ |
/var/opt/mssql/.system | WSL の %USERPROFILE%\AppData\Local\lxss のようなもの?? |
/var/opt/mssql/mssql.conf | SQL Server 起動時の構成ファイル 構成の設定変更については Configure SQL Server on Linux with mssql-conf 参照 https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-configure-mssql-conf? |
/lib/systemd/system/mssql-server.service | SQL Server Database Engine の systemd の定義ファイル /opt/mssql/bin/sqlservr を起動 |
/lib/systemd/system/mssql-server-telemetry.service | SQL Server Telemetry Service の systemd の定義ファイル /opt/mssql/bin/sqlservr-telemetry を起動 |
格納されているファイル
「/opt/mssql/bin」には以下のようなファイルが格納されています。
systemd からはこのディレクトリのファイルが実行されますので、これらのファイルは Linux から直接実行可能なファイルとなっています。
しかし、上記のディレクトリのファイルのサイズはとても小さく、実際の SQL Server のバイナリ等に関しては異なる場所に格納されているものが該当すると思います。
「/opt/mssql/lib」 に格納されている以下のファイル群が、実際の SQL Server のバイナリととなるのかと。
SQL Server のサンドボックス化
「/opt/mssql/lib」ディレクトリの sfp ファイルが、「/opt/mssql/bin/sqlservr」 が実行されたタイミングでロードされ、その中に含まれている「sqlservr.exe」が起動されることで、Linux 上で SQL Server が動作する形になっているのかと思います。
sfp ファイルとしては以下のような種類があります。
OS / SQL Server / .NET Framework を動作させるための最小限のサンドボックス化されたファイルが格納されているのでしょうね。
- sqlpackage.sfp
- sqlservr.sfp
- system.certificates.sfp
- system.common.sfp
- system.netfx.sfp
- system.sfp
これらの sfp ファイルが DrawBridge のテクノロジーが利用されているライブラリ OS のベースファイルや、サンドボックス化 SQL Server のプログラムの実体となるのかと。
Linux 上の sqlservr はライブラリ OS のロードと、ライブラリ OS を用いて構成されている SQL Server を起動するためのローダーとして使用されているのではないでしょうか。
SQL Server on Linux の場合、SQL Server の実際のバイナリについては、ファイルの名前から「sqlservr.sfp」に含まれているかと思います。
このファイル内の SQL Server のバイナリは Linux 向けではなくWindows 用のバイナリが含まれており、ライブラリ OS として起動した Windows から、「sqlservr.sfp」に含まれている「sqlserfr.exe」を起動することで、Windows / Linux で同一のバイナリで SQL Server を動作させるということを実現しているのではないでしょうか。
PASS では、SQL Server on Windows と SQL Server on Linux は同一のバイナリを使用して動作するということが発表されていたかと思います。
「SQL Server on Linx」は Linux 向けに開発された SQL Server ではなく、「Linux 上で Windows のバイナリ (Linux / Windows 同一のバイナリ) を動作させるようにするための、実行環境を含む SQL Server」なのではと考えています。
Windows Subsystem for Linux (WSL) では、Windows 上で、Linux のバイナリをそのまま動作させる仕組みを実装させていただかと思います。(そのためのライブラリ OS としては Ubuntu を使用)
SQL Server on Linux では、その逆の仕組みになっているのかと。
WSL の Pico Proces についてはどのようになっているのかがちょっと不明ですが。
Pico Process Overview
Drawbridge
PASS では、RDBMS からホストへのリソースのアクセスに関しては、SQL Platform Abstraction Layer (SQLPAL) により、 OS のシステムコールを使用するような形で紹介されていたようですので、これらの仕組みを「/opt/mssql/bin/sqlservr」が担っているのでしょうかね。
また、ライブラリ OS や、SQL Server の実際のプログラム / ファイル群に関しては、Linux から単純に触れないようにサンドボックス化され、セキュリティ面でも考慮は行われているのではと思います。
先日、DMV から DrawBridge の環境を確認するという投稿を書きましたが、FB で知ったのですが、SSMS からの認識についても面白いものがありました。
左は 16.x の SSMS から、右は 17.0 CTP1 の SSMS から SQL Server on Linux のプロパティを開いた情報となります。
vNext に対応していないバージョンの SSMS では Windows NT 6.2 と出ていますが、vNext に対応した SSMS では、Ubuntu と表示されています。
これについては、SSMS のバージョンによって実行されるクエリが異なっているための動作なの違いで、SSMS のバージョンによってサーバーのプロパティの情報の取得方法が異なっています。
exec master.dbo.xp_msver --SSMS 16.x select * from sys.dm_os_host_info -- SSMS 17.0 CTP1
インストール処理の簡略化
SQL Server on Linux の SQL Server のセットアップに関しては、従来までの、Windows にインストールする SQL Server とは異なる方式を使用して展開が行われているようです。
SQL Server on Linux の /var/opt/mssql/log に setup-xxxxxx.log というファイルがあるのですが、この中を見ると、かなり興味深い処理が記載されています。
This is an evaluation version. There are [176] days left in the evaluation period. 2016-11-17 02:13:03.68 Server Setup step is copying system data file 'C:\templatedata\master.mdf' to 'C:\var\opt\mssql\data\master.mdf'. 2016-11-17 02:13:03.73 Server Setup step is copying system data file 'C:\templatedata\mastlog.ldf' to 'C:\var\opt\mssql\data\mastlog.ldf'. 2016-11-17 02:13:03.73 Server Setup step is copying system data file 'C:\templatedata\model.mdf' to 'C:\var\opt\mssql\data\model.mdf'. 2016-11-17 02:13:03.74 Server Setup step is copying system data file 'C:\templatedata\modellog.ldf' to 'C:\var\opt\mssql\data\modellog.ldf'. 2016-11-17 02:13:03.75 Server Setup step is copying system data file 'C:\templatedata\msdbdata.mdf' to 'C:\var\opt\mssql\data\msdbdata.mdf'. 2016-11-17 02:13:03.76 Server Setup step is copying system data file 'C:\templatedata\msdblog.ldf' to 'C:\var\opt\mssql\data\msdblog.ldf'. 2016-11-17 02:13:03.81 Server Microsoft SQL Server vNext (CTP1) - 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (Ubuntu 16.04 LTS) 2016-11-17 02:13:03.81 Server UTC adjustment: 9:00 2016-11-17 02:13:03.81 Server (c) Microsoft Corporation. 2016-11-17 02:13:03.81 Server All rights reserved. 2016-11-17 02:13:03.81 Server Server process ID is 4116. 2016-11-17 02:13:03.81 Server Logging SQL Server messages in file 'C:\var\opt\mssql\log\errorlog'. 2016-11-17 02:13:03.81 Server Registry startup parameters: -d C:\var\opt\mssql\data\master.mdf -l C:\var\opt\mssql\data\mastlog.ldf -e C:\var\opt\mssql\log\errorlog 2016-11-17 02:13:03.81 Server Command Line Startup Parameters: --setup --sa-password ~省略~ 2016-11-17 02:13:04.50 spid5s Converting database 'master' from version 855 to the current version 856. 2016-11-17 02:13:04.50 spid5s Database 'master' running the upgrade step from version 855 to version 856. ~省略~
SQL Server on Linux をセットアップする際には、SQL Server の各種ファイルを展開するのではなく、テンプレートとなる、システムデータベースのファイルを、/var/opt/mssql/data に展開することでセットアップを実施しているようです。
master のデータベースのバージョンも展開時にアップデートされているようですね。
SQL Server の実際のバイナリについては、「/opt/mssql/lib/sqlservr.sfp」、システムデータベースのファイルについては「/var/opt/mssql/data」に配置された状態なので、SQL Server のプログラムと、データベースファイルが分割して配置された状態になっているといえるのかと。
この構成ですと、SQL Server の修正プログラムの適用が必要となった場合に、sfp の入れ替えで修正プログラム適用とかになるのかもしれないですね。
SQL Server on Linux のサンドボックスルートパス
SQL Server on Linux では、「/var/opt/mssql」をサンドボックスルートパスとして認識し、そのサンドボックスを「C:\」配下に認識させるという構成をとっているようです。
SQL Server on Linux のデータベースについてはサンドボックスのルートパスを介して、ホスト OS に配置されているデータベースのファイルをアクセスしているようですね。
# WSL の「/mnt/c」のような感じでしょうか。
各種ディレクトリについては、SSMS から変更するのではなく、Configure SQL Server on Linux with mssql-conf の操作を行い、外部から変更をする必要があるようです。
ディレクトリや SQL Server の ERRORLOG については、Windows 版ではレジストリに格納されていますが、現状の CTP1 の SQL Server on Linux では、レジストリ変更については実施できないようで、「/var/opt/mssql/mssql.conf」から外部パラメーターとして渡す方式がとられているようですね。
2016/11/25 追記
私が勘違いしていて、ライブラリ OS の C:\ が Linux 側の / 相当となっているだけみたいですね。
Linux で 「/database」というディレクトリを作成した場合、ライブラリ OS からは
- C:\database
- /database
の 2 パターンでアクセスすることができるようです。
Windows の形式と、Linux の形式どちらでアクセスしたほうが管理しやすいかは検討の余地ありかもですね。
高可用性環境
最終的には、AlwaysOn 可用性グループが使用できるような検討が行われているようですが、現状は Pacemaker を使用したクラスタータイプの環境が構築できるようです。
Shared disk cluster for SQL Server on Linux
構築する際には、SQL Server on Linux: High Availability and security on Linux も併せて確認をしておくとよさそうです。
AlwaysOn に関しては、In Progress ということで、上記の Channel 9 の情報に記載されています。
Basic AG も記載されているので、SQL Server on Linux にもエディションの概念はあるのかもしれないですね。
リソースの使用状況の確認
リソースの使用追う今日については、Linux の一般的な方法で取得できそうですね。
# といってもあまり一般的な方法がわかっていませんが。
上が起動直後の状態、下が3 GB のテーブルにアクセスした後の状態となります。
今回の環境は 4GB (流行りの単位としては? 1/2 かずあき? (1 かずあき = 8GB) 、通称 : ハーフあき) となっているのですが、3.3 GB のメモリ消費となっており、メモリ使用状況は意図したもの (キャッシュで使用されているメモリを含む) が取得できていますね。
sys.dm_os_performance_counters からメモリ系の情報を確認してみたところ、想定通りの値が取得できていましたので、動的管理ビューを使用したパフォーマンス情報の取得も実施できそうでした。