SQL Server on Linux:セットアップ、セキュリティ、バックアップの実践ガイド

Database tutorial - IT technology blog
Database tutorial - IT technology blog

SQL Server on Linuxへの移行

Microsoft SQL Serverは、かつてWindows専用の製品でした。高性能なインスタンスを稼働させるには、その特定のエコシステムに縛られる必要がありました。しかし、その障壁は2017年に取り払われました。今日、Linux上でSQL Serverを運用することは、ライセンスコストを削減し、CI/CDパイプラインを簡素化したいDevOpsチームにとって標準的な選択肢となっています。

私は数年前から、本番環境のワークロードをWindowsからLinuxへ移行させてきました。パフォーマンスはほぼ同等です。しかし、本当の利点はワークフローにあります。ネイティブなLinuxツールを使用してデータベースを管理することは、現代のインフラストラクチャスタックにおいて非常に自然に感じられます。重いWindows ServerのGUIというオーバーヘッドなしに、MSSQLのパワーを活用できるのです。

Ubuntu 22.04へのSQL Serverのインストール

私は通常、これらのデプロイにはUbuntuを使用します。パッケージ管理が予測可能で、コミュニティのサポートが膨大だからです。開始する前に、ハードウェアを確認してください。Microsoftは最低2GBのRAMが必要だとしていますが、私の経験上、安定した本番環境には実質的に最低4GBが必要です。

ステップ 1:リポジトリGPGキーのインポート

システムがMicrosoftのパッケージを信頼できるようにする必要があります。公開GPGキーを取得し、keyringsディレクトリに保存します。

wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg

ステップ 2:Ubuntuリポジトリの登録

次に、システムにSQL Server 2022のリポジトリを登録します。これにより、ソースから直接最新のアップデートを取得できるようになります。

curl https://packages.microsoft.com/config/ubuntu/22.04/mssql-server-2022.list | sudo tee /etc/apt/sources.list.d/mssql-server-2022.list

ステップ 3:SQL Serverパッケージのインストール

ローカルのインデックスを更新し、バイナリをプルダウンします。このステップで主要なインストールが行われますが、データベースの設定はまだ完了しません。

sudo apt-get update
sudo apt-get install -y mssql-server

ステップ 4:設定スクリプトの実行

バイナリがインストールされたら、セットアップスクリプトを起動します。ここでエディションを選択し、システム管理者(SA)のパスワードを設定します。

sudo /opt/mssql/bin/mssql-conf setup

ローカルでのテストには「Developer」エディションを、小規模な無料枠のアプリには「Express」を選択してください。SAパスワードは非常に強力なものに設定してください。SQL Serverは、自動化されたブルートフォース攻撃スクリプトの絶え間ない標的となります。

セキュリティの堅牢化:隙を見せない

デフォルト設定のままのインストールは脆弱です。セットアップスクリプトが終了したら、すぐにインスタンスをロックダウンする必要があります。

デフォルトポートの変更

SQL Serverはデフォルトでポート1433を使用します。インターネット上のあらゆるボットがこのポートをスキャンしています。インスタンスを15000のような非標準ポートに移動するだけで、ログに記録される自動ログイン試行の回数を90%以上削減できます。

sudo /opt/mssql/bin/mssql-conf set network.tcpport 15000
sudo systemctl restart mssql-server

ファイアウォールの設定

UFW(Uncomplicated Firewall)を使用してアクセスを制限します。SQLポートをインターネット全体に公開してはいけません。特定のアプリケーションサーバーまたはオフィスのIP範囲からのトラフィックのみを許可するようにします。

sudo ufw allow from 192.168.1.0/24 to any port 15000
sudo ufw enable

データインポートの処理

移行作業では、煩雑なデータを扱うことがよくあります。シーディングスクリプト用にJSONに変換する必要がある生のCSVファイルがある場合は、toolcraft.app/ja/tools/data/csv-to-jsonを試してみてください。すべてブラウザ内で処理されるため、機密データがマシンから外部に出ることはありません。これはコンプライアンスの観点からも大きな利点です。

mssql-cliによる高度な管理

従来のsqlcmdユーティリティも動作しますが、少し古く感じられます。私はmssql-cliを好んで使います。オートコンプリートや構文ハイライトなどの最新機能を提供しており、深夜2時にクエリのトラブルシューティングを行う際などに不可欠です。

sudo apt-get install -y python3-pip
pip3 install mssql-cli

先ほど設定した新しいポートを使用してインスタンスに接続します。

mssql-cli -S localhost,15000 -U SA -P 'あなたの強力なパスワード'

Cronによるバックアップの自動化

Expressエディションには、スケジューリング用のSQL Server Agentが含まれていません。しかし、Linuxにはcronがあるため問題ありません。むしろcronの方が信頼性が高く、スクリプト作成も容易です。

バックアップスクリプトの作成

backup_mssql.shという名前のファイルを作成します。このスクリプトはバックアップを実行し、ディスク容量を節約するために1週間以上前のファイルを削除します。

#!/bin/bash
BACKUP_DIR="/var/opt/mssql/backups"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="MyDatabase"

mkdir -p $BACKUP_DIR

# フルバックアップを実行
mssql-cli -S localhost,15000 -U SA -P 'あなたの強力なパスワード' -Q "BACKUP DATABASE [$DB_NAME] TO DISK = N'$BACKUP_DIR/${DB_NAME}_$DATE.bak' WITH NOFORMAT, NOINIT, STATS = 10"

# 7日以上前のバックアップを削除
find $BACKUP_DIR -type f -name "*.bak" -mtime +7 -delete

タスクのスケジュール設定

スクリプトを実行可能にし、毎晩午前2時に実行されるように設定します。これにより、常に最新のリカバリポイントを確保できます。

chmod +x ~/backup_mssql.sh
(crontab -l 2>/dev/null; echo "0 2 * * * /home/user/backup_mssql.sh") | crontab -

監視とログ

サービスの健全性には常に注意を払ってください。動作が重くなった場合、最初に確認すべきなのはSQL Serverのエラーログです。メモリ不足の問題やログイン失敗の試行をリアルタイムで把握できます。

ログをリアルタイムで監視するには、tailコマンドを使用します。

sudo tail -f /var/opt/mssql/log/errorlog

「Memory limit has been reached(メモリ制限に達しました)」というエラーが表示される場合は、メモリ使用量を制限する必要があるかもしれません。mssql-confを使用してmemory.memorylimitmbを設定してください。これにより、データベースがLinux OSのリソースを枯渇させるのを防ぐことができます。

SQL Server on Linuxの運用は、コストを意識するエンジニアリングチームにとって大きな転換点となります。CLIツールを使いこなすことで、従来のポイント&クリックのインターフェースでは不可能なレベルの制御が可能になります。

Share: