CentOS
SQLServer
BCP
sqlcmd

SQL Server 2017 を CentOS 7.4 で試す

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_LCID1041 を指定することで設定できます。これによりデフォルトの 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/ にあるファイルは sqlcmdbcp コマンドの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 を参照すると、日本語の langid3 で、 lcid および msglangid1041 であることが確認できます。
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.configurationsdefault languagevaluevalue_in_use に日本語の langid3 が、また default full-text language には日本語の lcid または msglangid1041 が設定されます。

ローカル接続

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

参考情報