はじめに

本ドキュメントは、Windows エンジニアが、Linux 上で動作する SQL Server (SQL Server on Linux) を操作するために必要となるスキルアップデートについての情報を記載したものとなります。
(ドキュメント作成者が Ubuntu 16.04 LTS で検証をしているため、公開当初は Ubuntu ベースの情報となっています)

SQL Server on Linux の SQL Server 部分のスキルについては、Windows / Linux 版で共通となりますが、OS 部分に関しては、Windows エンジニアのスキルアップデートが必要になるものが多数あります。

本ドキュメントが、今まで Windows をメインに触ってきたが、Linux の SQL Server を触る必要がある / 興味を持ったエンジニアの方の一助になれば幸いです。


目次


サービス管理

Windows の場合、SQL Server は「Windows サービス」として管理が行われていましたが、Linux 版の場合は、Linux のシステム・サービスマネージャーである「systemd」で管理が行われている。

本章では、Linux の SQL Server のサービス管理を実施するために必要となるコマンド等を記載している。

サービス管理のファイル

SQL Server のサービス管理のファイルの実体は「/lib/systemd/system/mssql-server.service」となり、このファイルでサービス起動時の設定が行われる。

$ sudo systemctl enable mssql-server.service

を実行することで、「/etc/systemd/system/multi-user.target.wants/mssql-server.service」にシンボリックリンクが作成され、自動起動の設定が行われている。

SQL Server の設定変更

SQL Server on Windows では、SSMS / SQL Server 構成マネージャー / sp_configure を使用して設定の変更を行う。

SQL Server on Linux では、これらに加えて、一部の設定については「mssql-conf」を使用して設定を変更する。

「mssql-conf」で変更可能な設定については、他の方法で変更が可能だったとしても、このツールから変更を行わないと、SQL Server のサービスを再起動することで、初期化されてしまうので注意が必要である。
(SQL Server on Linux の基本部分はサンドボックス環境で動作しており、サービスの再起動を実施すると、初期状態に初期化されるた、ツールを使用して、起動時に設定を外部からインポートさせる必要がある)

ファイアウォール

Windows の場合、Windows Firewall で SQL Server のポート (TCP:1433 (SQL Server) / UDP : 1434 (SQL Server Browser) のアクセス開放を実施している。
Linux の場合、使用するディストリビューションに応じたファイアウォールにより、TCP 1433 (デフォルトインストール時) にアクセスするための設定を行う。

Ubuntu

Ubuntu 16.04 LTS はデフォルトは FW は無効

コマンド ufw
$ sudo ufw allow 1433/tcp 

ufwの基本操作

RHEL

コマンド firewalld

4.5. ファイアウォールの使用

リモート接続

Windows の場合、「Remote Desktop」や、「クリップボード共有経由」等で管理やファイル転送を実施することが多い。
Linux の場合、「SSH」「SCP」を使用して、リモート管理やファイル転送を実施する。

リモート管理

コマンド ssh

インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識

ファイルコピー

コマンド scp

SCP (1)

ソフトウェア更新

# sudo apt update
# sudo apr upgrade

apt updateでパッケージ管理のデータベースを更新し、apt upgradeで実際にソフトウェアを更新する。


ベストプラクティス

Performance best practices and configuration guidelines for SQL Server 2017 on Linux

SQL Server on Linux

SQL Server の設定

PROCESS AFFINITY の指定

ALTER SERVER CONFIGURATION  
SET PROCESS AFFINITY NUMANODE = 0 TO <Max NUMA Node ID>

tempdb のデータファイルの分割

SQL Server on Linux は、インストール時の tempdb 分割が行われないため、インストール後に分割する。

mssql-conf ツールを使用したメモリ設定

$ sudo /opt/mssql/bin/mssql-conf set memory.memorylimitmb 4096
$ sud systemctl restart mssql-server

デフォルトでは SQL Server が使用するメモリは 80% に制限されているため、大容量のメモリを搭載している場合、残りの 20% のサイズによっては、上限緩和を検討する。
(本設定は SQL Server の max server memroy とは別の設定)

設定の解除

sudo /opt/mssql/bin/mssql-conf unset memory.memorylimitmb 
systemctl restart mssql-server

Linux の設定

CPU

CPU の電力制御のユーティリティ
# apt install -y cpufrequtils
# cpufreq-info
CPU クロックのガバナー
$ sudo cpupower frequency-info
$ sudo cpupower frequency-set -g performance
パフォーマンスと電源消費効率のバランス
# x86_energy_perf_policy -v 'performance'
CPU クロックの下限

tuned を使用して設定を実施

min_perf_pct=100
C-State

C1 のみにする

$ sudo vi /etc/default/grub
====
GRUB_CMDLINE_LINUX_DEFAULT="intel_idle.max_cstate=1"
====
$ sudo update-grub
$ reboot

ディスク

Read-Ahead のブロックサイズ
# blockdev --report
# blockdev -v --setra 4096 /dev/sda
sysctl によるカーネルパラメーターの変更
$ sudo sysctl -a

NUMA

複数 NUMA ノード環境での自動 NUMA バランシングの無効化
$ sudo sysctl -w kernel.numa_balancing=0
$ sudo sysctl -p

仮想アドレス空間

メモリマップ数の上限の変更 (65536 (64KB) -> 262144 (256KB))
$ sudo sysctl -w vm.max_map_count=262144
$ sudo sysctl -p

マウントオプション

SQL Server のデータ/ログファイルのファイルシステムのマウントオプションの設定 (relatime -> noatime)

Huge Page

透過的な Huge Page の有効化

ほとんどの Linux 環境では有効になっている。

# cat /sys/kernel/mm/transparent_hugepage/enabled
# cat /proc/meminfo

Swap ファイル

swap ファイルの適切な設定
# swapon
または、
# cat /proc/swaps

仮想マシンでの実行

動的メモリ割り当て (Dynamic Memory) を使用しない

仮想マシンのメモリ割り当てとして、動的メモリ割り当てによる可変的なメモリ割り当てを実行しない

OOM Killer

OOM (Out of Memory) Killer という動作が存在していることの認識

メモリ/スワップの枯渇の可能性が出た場合に、メモリを消費しているプロセスを停止させる動作

Docker

事前の IO 検証


アカウント / グループ

Windows の場合、アカウントについては「SQL Server のサービスを起動しているサービスアカウント」を基準に各種設定を考慮する必要がある。

Linux の場合、アカウント / グループともに「mssql」が使用されている。
バックアップや BULK INSERT をするファイルに対しては、「mssql」を基準に考慮する必要がある。

id mssql
uid=999(mssql) gid=999(mssql) groups=999(mssql)

「systemctl」からではなく、コマンドで起動する場合は次のようなコマンドを実行する。
「root」で起動した場合、一部ファイルのアクセス権が変更され、以降 mssql で起動しようとした場合にエラーとなる可能性があるため、コマンドラインからの起動は注意をする。

$ sudo -u mssql /opt/mssql/bin/sqlservr

パフォーマンスモニタリング

コマンドライン

モニタリング

ディスク

メモリ

モニタリングユーティリティ


プロセス構成

メインの PID で、SQL PAL Monitor が動作し、子プロセスで、SQL PAL / sqlservr.exe が動作する構成となっており Windows とは異なり 2 このプロセスが起動することになる。 プロセス構成
SQL Server Agent / Full Text Search をインストールした場合、sqlservr のプロセス内で動作することになるため、個別にサービスを停止することはできない


ディレクトリ構成

ディレクトリ 用途
/opt/mssql バイナリ
/var/opt/mssql データ/ログ

Windows のディレクトリとの比較

Windows Linux
  /
C:\Users<ユーザー名> /home/<ユーザー名>
C:\Windows /bin
/sbin
%WINDOWSTEMP% /tmp
C:\Program Files /opt
/usr/bin
/usr/local
ライブラリ / ソースコード / バイナリ /usr
システムログ /var

ログファイル

ディストリビューション システムログ
RHEL /var/log/messages
Ubuntu /var/log/syslog
種別 ファイル
SQL Server ログ /var/opt/mssql/log
セットアップログ Debian Pakcage : /var/log/dpkg.log
RPM:/var/log/yum.log

データディスクのマウント

The systemd unit file for the SQL server should be locally extended by a dependency on the /datadir this will make sure the start is done after the mount and the unmount waits for the stop.
The most generic option to do this would be

RequiresMountsFor=/datadir

I think it automatically depend on the installation path of the scripts already.
Note that you do not need to modify the systemd unit files in the library directory but you can amend them in the

/etc/systemd/system/<sqlserver>.service
# systemctl show --no-pager mssql-server | grep "RequiresMountsFor"
# mkdir /lib/systemd/system/mssql-server.service.d
# vi /lib/systemd/system/mssql-server.service.d/mssql-server.conf
====
[Unit]
RequiresMountsFor=/mnt/backup
====
# systemctl daemon-reload
# systemctl show --no-pager mssql-server | grep "RequiresMountsFor"

システムデータベースの操作

システムデータベースの再構築

# /opt/mssql/bin/sqlservr -c --setup --force-setup

システムデータベースの移動について


可用性

Windows の場合は、OS に含まれている Windows Server Failover Cluser (WSFC) を使用して、OS 側の可用性環境の構築を行い、その上で SQL Server の可用性環境を構築することがある。

Linux 環境では WSFC を利用することはできないため、OS の可用性環境を構築する手法として、2017/12 時点では OSS のソフトウェアである「Pacemaker」を利用した方法が、Microsoft 社からドキュメントで公開されている。
(今後、他のクラスターマネージャー/3rd 製品での対応等が行われる可能性もある)

Pacemaker の操作方法については、次の情報が参考となる。


オフラインインストール

RHEL

# yumdownloader --downloadonly --resolve --destdir=/home/user/offlineistall mssql-server

Ubuntu

apt-get download mssql-server
apt-cache depends mssql-server

コマンド

Windows Linux
dir ls
cd cd
md mkdir
rd rmdir
del rm
echo echo
type cat
more more
copy cp
move mv
ren mv
find
findstr
grep
  tail
net start
net stop
systemctl
イベントログ journalctl
/var/log/messages
attrib chmod
chown