SQL Server on Linux
2016年3月に SQL Server on Linux が発表1され、現在 Linux 版を含む SQL Server 2017 RC2 が公開されています。
手軽に開発や検証等で利用したい場合などに大変助かるので、現時点の CentOS 上での利用手順を検証しました。
検証環境
- CentOS 7.4.1708 (minimal)
インストール
メモリの確認
free -m
total used free shared buff/cache available
Mem: 3790 131 3449 8 209 3423
Swap: 2047 0 2047
3.25GB 以上のメモリが必要です。
VirtualBox の仮想マシンを作成する際にメモリを 4GB (4096MB) 割り当てるとインストールできました。
sqlservr: This program requires a machine with at least 3250 megabytes of memory.
メモリ不足しているとセットアッププログラムを実行中に上記のようなエラーが出力されて終了します。
axelget
yum -y install epel-release && yum -y update && yum -y install yum-axelget
mssql-server
パッケージが 165MB あり、残念なことに通信が遅い場合があるので、感謝の念を込めながら事前に Yum プラグインの yum-axelget
をインストールしておきます。
SQL Server
yum -y install yum-utils && \
yum-config-manager --add-repo https://packages.microsoft.com/config/rhel/7/mssql-server-2017.repo && \
sed -i 's/packages-microsoft-com-//' /etc/yum.repos.d/mssql-server-2017.repo && \
yum install -y mssql-server && \
ACCEPT_EULA=Y \
MSSQL_SA_PASSWORD='P@ssw0rd' \
MSSQL_PID=Developer \
MSSQL_LCID=1041 \
/opt/mssql/bin/mssql-conf -n setup
リポジトリの追加
公式でも curl
で repo ファイルを手動ダウンロードしていますが、お行儀よく yum-config-manager
コマンドの --add-repo
オプションでリポジトリを追加します。
yum-config-manager
コマンドは yum-utils
パッケージに含まれています。
mssql-server パッケージ
依存関係で bzip2
gdb
libsss_nss_idmap
の各パッケージもインストールされました。
mssql-server
パッケージでインストールされるファイルは以下の通りです。
/opt/mssql/bin
/opt/mssql/bin/compress-dump.sh
/opt/mssql/bin/crash-support-functions.sh
/opt/mssql/bin/generate-sql-dump.sh
/opt/mssql/bin/handle-crash.sh
/opt/mssql/bin/mssql-conf
/opt/mssql/bin/paldumper
/opt/mssql/bin/sqlservr
/opt/mssql/lib
/opt/mssql/lib/libc++.so.1
/opt/mssql/lib/libc++abi.so.1
/opt/mssql/lib/libjemalloc.so.1
/opt/mssql/lib/libsqlvdi.so
/opt/mssql/lib/libunwind.so.8
/opt/mssql/lib/loc
/opt/mssql/lib/loc/de_DE
/opt/mssql/lib/loc/de_DE/LC_MESSAGES
/opt/mssql/lib/loc/de_DE/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/en_US
/opt/mssql/lib/loc/en_US/LC_MESSAGES
/opt/mssql/lib/loc/en_US/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/es_ES
/opt/mssql/lib/loc/es_ES/LC_MESSAGES
/opt/mssql/lib/loc/es_ES/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/fr_FR
/opt/mssql/lib/loc/fr_FR/LC_MESSAGES
/opt/mssql/lib/loc/fr_FR/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/it_IT
/opt/mssql/lib/loc/it_IT/LC_MESSAGES
/opt/mssql/lib/loc/it_IT/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/ja_JP
/opt/mssql/lib/loc/ja_JP/LC_MESSAGES
/opt/mssql/lib/loc/ja_JP/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/ko_KR
/opt/mssql/lib/loc/ko_KR/LC_MESSAGES
/opt/mssql/lib/loc/ko_KR/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/pt_BR
/opt/mssql/lib/loc/pt_BR/LC_MESSAGES
/opt/mssql/lib/loc/pt_BR/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/ru_RU
/opt/mssql/lib/loc/ru_RU/LC_MESSAGES
/opt/mssql/lib/loc/ru_RU/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/zh_CN
/opt/mssql/lib/loc/zh_CN/LC_MESSAGES
/opt/mssql/lib/loc/zh_CN/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/loc/zh_TW
/opt/mssql/lib/loc/zh_TW/LC_MESSAGES
/opt/mssql/lib/loc/zh_TW/LC_MESSAGES/sqlservr.mo
/opt/mssql/lib/mssql-conf
/opt/mssql/lib/mssql-conf/checkinstall.sh
/opt/mssql/lib/mssql-conf/checkrunninginstance.sh
/opt/mssql/lib/mssql-conf/collations.txt
/opt/mssql/lib/mssql-conf/invokesqlservr.sh
/opt/mssql/lib/mssql-conf/loc
/opt/mssql/lib/mssql-conf/loc/mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-de_DE.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-en_US.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-es_ES.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-fr_FR.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-it_IT.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-ja_JP.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-ko_KR.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-pt_BR.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-ru_RU.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-zh_CN.mo
/opt/mssql/lib/mssql-conf/loc/mo/mssql-conf-zh_TW.mo
/opt/mssql/lib/mssql-conf/mssql-conf.py
/opt/mssql/lib/mssql-conf/mssqlconfhelper.py
/opt/mssql/lib/mssql-conf/mssqlsettings.py
/opt/mssql/lib/mssql-conf/mssqlsettingsmanager.py
/opt/mssql/lib/mssql-conf/set-collation.sh
/opt/mssql/lib/secforwarderxplat.sfp
/opt/mssql/lib/sqldkxplat.sfp
/opt/mssql/lib/sqlservr.sfp
/opt/mssql/lib/system.certificates.sfp
/opt/mssql/lib/system.common.sfp
/opt/mssql/lib/system.netfx.sfp
/opt/mssql/lib/system.sfp
/usr/lib/systemd/system/mssql-server.service
/usr/share/doc/mssql-server/LICENSE.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_Chinese_Simplified.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_Chinese_Traditional.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_French.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_German.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_Italian.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_Japanese.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_Korean.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_Portuguese_Brazil.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_Russian.TXT
/usr/share/doc/mssql-server/Linux_Prerelease_Spanish.TXT
/usr/share/doc/mssql-server/THIRDPARTYNOTICES.TXT
/usr/share/man/man1/mssql-conf.1.gz
/usr/share/man/man1/sqlservr.1.gz
sqlservr-setup
コマンドは早々に廃止されたようです。
セットアップ
mssql-conf
コマンドで setup
オプションを指定するとセットアップを開始できます。環境変数を使用すると事前にダイアログで問われる内容を指定することができます。
特に言語に日本語を指定する事例が見つけにくいですが、MSSQL_LCID
に 1041
を指定することで設定できます。これによりデフォルトの COLLATION が Japanese_CI_AS
になります。その他の指定可能な環境変数は「環境変数と SQL Server の設定を構成する | Microsoft Docs」で確認できます。
-n
オプションでサイレントインストールになります。
未指定でセットアップを実行すると以下のような日本語化されたダイアログが表示されます。
この製品のライセンス条項は
/usr/share/doc/mssql-server で参照できるほか、次の場所からダウンロードすることもできます:
https://go.microsoft.com/fwlink/?LinkId=852741&clcid=0x411
プライバシーに関する声明は、次の場所で確認できます:
https://go.microsoft.com/fwlink/?LinkId=853010&clcid=0x411
ライセンス条項に同意しますか? [Yes/No]:Yes
SQL Server のエディションを選択します:
1) Evaluation (無料、製品使用権なし、期限 180 日間)
2) Developer (無料、製品使用権なし)
3) Express (無料)
4) Web (有料)
5) Standard (有料)
6) Enterprise (有料)
7) 小売販売チャネルを介してライセンスを購入し、入力するプロダクト キーを持っています。
エディションの詳細については、以下を参照してください
https://go.microsoft.com/fwlink/?LinkId=852748&clcid=0x411
このソフトウェアの有料エディションを使用するには、個別のライセンスを以下から取得する必要があります
Microsoft ボリューム ライセンス プログラム。
有料エディションを選択することは、
このソフトウェアをインストールおよび実行するための適切な数のライセンスがあることを確認していることになります。
エディションを入力してください(1-7): 2
SQL Server の言語の選択:
(1) English
(2) Deutsch
(3) Español
(4) Français
(5) Italiano
(6) 日本語
(7) 한국어
(8) Português
(9) Русский
(10) 中文 – 简体
(11) 中文 (繁体)
オプション 1-11 を入力: 6
SQL Server システム管理者パスワードを入力してください:
SQL Server システム管理者パスワードを確認入力してください:
SQL Server を構成しています...
This is an evaluation version. There are [132] days left in the evaluation period.
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /usr/lib/systemd/system/mssql-server.service.
セットアップは正常に完了しました。SQL Server を起動しています。
mssql-conf
コマンド実行完了後は SQL Server の起動および自動起動設定は完了しているようです。
ポート設定
cat << "_EOF_" > /etc/firewalld/services/mssql.xml && firewall-cmd --reload && \
firewall-cmd --add-service=mssql --permanent && firewall-cmd --reload
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SQL Server</short>
<description>Microsoft SQL Server (Database Server)</description>
<port protocol="tcp" port="1433"/>
</service>
_EOF_
公式では 1433 ポートを直接指定していますが、こちらもお行儀良くサービス mssql
を追加します。
mssql-tools (Tools for Microsoft® SQL Server®)
yum -y install https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm && \
ACCEPT_EULA=Y yum -y install mssql-tools && \
ln -sv /opt/mssql-tools/bin/* /usr/local/bin/
リポジトリの追加
なぜか prod の方はリポジトリが rpm パッケージで提供されているので、公式を無視してパッケージでリポジトリをインストールします。内容は repo ファイルを手動でダウンロードした場合と同じでした。
インストール
mssql-tools
パッケージには、コマンドラインインターフェースの sqlcmd
コマンドと、データのダンプ、インポートができる bcp
コマンドが含まれています。
-y
オプションを指定していてもダイアログで Do you accept the license terms? (Enter YES or NO)
といったライセンスの同意を2回求められるので、ACCEPT_EULA=Y
を指定することで回避します。
依存関係で libtool-ltdl
msodbcsql
unixODBC
パッケージもインストールされます。
公式にはここで同時に unixODBC-devel
パッケージをインストールしていますが、必須でない気がします。要調査。
パスの設定
公式の説明では export PATH="$PATH:/opt/mssql-tools/bin"
を .bash_profile
と .bashrc
ファイルに追記しろと記載がありますが、色々とスマートではないので上記のように /usr/local/bin
にシンボリックリンクを貼ります。
/opt/mssql-tools/bin/
にあるファイルは sqlcmd
と bcp
コマンドの2つだけのようです。
sqlcmd (SQL Server Command Line Tool)
sqlcmd
コマンドはコマンドラインインターフェースで、 TRANSACT-SQL ステートメント、システム プロシージャ、およびスクリプト ファイルをコマンドプロンプトで入力できます。
オプション
オプション | 説明 |
---|---|
-U |
ユーザー名を指定します。 |
-P |
パスワードを指定します。 |
-W |
SELECT した際の列から後続の空白を削除します。 |
-S |
接続先の SQL Server のインスタンスを指定します。 [protocol:]server[\instance_name][,port] |
sqlcmd ユーティリティ | Microsoft Docs
バージョン情報の確認
sqlcmd -U SA -P 'P@ssw0rd' -Q "SELECT @@VERSION" -W
-
Microsoft SQL Server 2017 (RC2) - 14.0.900.75 (X64)
Jul 27 2017 08:53:49
Copyright (C) 2017 Microsoft Corporation
Developer Edition (64-bit) on Linux (CentOS Linux 7 (Core))
(1 rows affected)
環境変数 (sqlcmd スクリプト変数)
export SQLCMDSERVER=localhost
export SQLCMDUSER=SA
export SQLCMDPASSWORD=P@ssw0rd
環境変数でスクリプト変数を定義することで sqlcmd
コマンドの -S
や -U
や -P
のオプションを省略できるようになります。
変数の一覧は「sqlcmd スクリプト変数」を参照してください。
データベースの一覧
sqlcmd -Q "SELECT Name, Collation_name FROM sys.Databases" -W
Name Collation_name
---- --------------
master Japanese_CI_AS
tempdb Japanese_CI_AS
model Japanese_CI_AS
msdb Japanese_CI_AS
(4 rows affected)
言語を日本語に指定してインストールすると Japanese_CI_AS
になります。
Name Collation_name
---- --------------
master SQL_Latin1_General_CP1_CI_AS
tempdb SQL_Latin1_General_CP1_CI_AS
model SQL_Latin1_General_CP1_CI_AS
msdb SQL_Latin1_General_CP1_CI_AS
(4 rows affected)
言語を未指定または英語でインストールすると SQL_Latin1_General_CP1_CI_AS
になります。
言語 ID の確認
sqlcmd -Q "SELECT * FROM sys.syslanguages WHERE alias = 'Japanese'" -W
langid dateformat datefirst upgrade name alias months shortmonths days lcid msglangid
------ ---------- --------- ------- ---- ----- ------ ----------- ---- ---- ---------
3 ymd 7 0 日本語 Japanese 01,02,03,04,05,06,07,08,09,10,11,12 01,02,03,04,05,06,07,08,09,10,11,12 月曜日,火曜日,水曜日,木曜日,金曜日,土曜日,日曜日 1041 1041
(1 rows affected)
sys.syslanguages
を参照すると、日本語の langid
は 3
で、 lcid
および msglangid
が 1041
であることが確認できます。
sys.syslanguages (Transact-SQL)
デフォルト言語の確認
sqlcmd -Q "SELECT * FROM sys.configurations WHERE name LIKE 'default%language'" -W
configuration_id name value minimum maximum value_in_use description is_dynamic is_advanced
---------------- ---- ----- ------- ------- ------------ ----------- ---------- -----------
124 default language 3 0 9999 3 default language 1 0
1126 default full-text language 1041 0 2147483647 1041 default full-text language 1 1
(2 rows affected)
言語を日本語でインストールすると sys.configurations
の default language
の value
と value_in_use
に日本語の langid
の 3
が、また default full-text language
には日本語の lcid
または msglangid
の 1041
が設定されます。
ローカル接続
sqlcmd -U SA -P 'P@ssw0rd' -W
新しいデータベースの作成
1> CREATE DATABASE TestDB COLLATE Japanese_CS_AI
2> SELECT Name, Collation_name FROM sys.Databases
2> GO
Name Collation_name
---- --------------
master SQL_Latin1_General_CP1_CI_AS
tempdb SQL_Latin1_General_CP1_CI_AS
model SQL_Latin1_General_CP1_CI_AS
msdb SQL_Latin1_General_CP1_CI_AS
TestDB Japanese_CS_AI
(5 rows affected)
言語指定を英語でインストールした場合は COLLATE Japanese_CS_AI
を指定してやる必要があります。
データの操作
1> USE TestDB
2> CREATE TABLE Inventory (id INT, name NVARCHAR(50), quantity INT)
3> INSERT INTO Inventory VALUES (1, 'banana', 150); INSERT INTO Inventory VALUES (2, 'orange', 154)
4> SELECT * FROM Inventory
5> SELECT * FROM Inventory WHERE quantity > 152
6> GO
プロンプト終了
1> QUIT
BCP (Bulk Copy Program for Microsoft SQL Server)
BCP は Microsoft SQL Server のインスタンスと、ユーザー指定の形式のデータファイルとの間でデータの一括コピーを行います。2
ダンプ
bcp Inventory out dump.txt -c -U SA -P 'P@ssw0rd' -S localhost -d TestDB
Starting copy...
2 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 1 Average : (2000.0 rows per sec.)
出力結果
cat dump.txt
1 banana 150
2 orange 154
動向
日付 | 内容 |
---|---|
2016-03-07 | SQL Server 2017 プライベートプレビュー リリース 1 |
2016-11-16 | SQL Server 2017 CTP 1.0 リリース 3 |
2016-12-16 | SQL Server 2017 CTP 1.1 リリース 4 |
2017-01-20 | SQL Server 2017 CTP 1.2 リリース 5 |
2017-02-17 | SQL Server 2017 CTP 1.3 リリース 6 |
2017-03-17 | SQL Server 2017 CTP 1.4 リリース 7 |
2017-04-19 | SQL Server 2017 CTP 2.0 リリース 8 |
2017-05-17 | SQL Server 2017 CTP 2.1 リリース 9 |
2017-07-17 | SQL Server 2017 RC1 リリース 10 |
2017-08-02 | SQL Server 2017 RC2 リリース 11 |
2017-10-02 | SQL Server 2017 リリース 12 |
2017-12-19 | SQL Operations Studio リリース 13 |
参考情報
- SQL Server on Linux のパフォーマンス情報を DMV から取得 at SE の雑記
- SQL Server on Linux で環境変数を使用したインストールの実施 at SE の雑記
- SQLCAT から SQL Server on Linux のモニタリングツールが公開されました at SE の雑記
- SQLServerをLinux Dockerで動かしてみる - Qiita
- microsoft/mssql-server-linux - Docker Hub
- Release notes for SQL Server 2017 on Linux | Microsoft Docs
- SQL Server - Get Started
- Red Hat Enterprise Linux に SQL Server 2017 の概要 | Microsoft Docs
-
Announcing SQL Server on Linux - The Official Microsoft Blog ↩ ↩2
-
Announcing SQL Server on Linux public preview, first preview of next release of SQL Server | SQL Server Blog ↩
-
SQL Server next version Community Technology Preview 1.1 now available | SQL Server Blog ↩
-
SQL Server next version CTP 1.2 now available | SQL Server Blog ↩
-
SQL Server next version CTP 1.3 now available | SQL Server Blog ↩
-
SQL Server next version CTP 1.4 now available | SQL Server Blog ↩
-
SQL Server 2017 Community Technology Preview 2.0 now available | SQL Server Blog ↩
-
First release candidate of SQL Server 2017 now available | SQL Server Blog ↩
-
SQL Server 2017 Release Candidate 2 (RC2) is now available | SQL Server Blog ↩
-
SQL Server 2017 on Windows Linux and Docker is now generally available | SQL Server Blog ↩
-
The December release of SQL Operations Studio is now available | SQL Server Blog ↩