お仕事でSQL Serverを使う事になったので構築したけど多少つまづいたのでやった事のメモ

制限事項

手順中に怒られた事のメモ

  • SA_PASSWORD
    単純な文字列にすると怒られるどころかコンテナ作成すらされない&エラーも出ないのでハマります。Abcde12345とかは通ったのである程度の組み合わせ(全角1文字とか英数字1文字以上とか)が必要な感じだと思います
  • 物理メモリ
    2GB以上である必要があります。1GBの仮想マシンでやったら、2GB必要ですって怒られました

docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mssql-server:
container_name: mssql-server
hostname: mssql-server
image: microsoft/mssql-server-linux:latest
ports:
- "1433:1433"
networks:
b0:
ipv4_address: 172.18.0.33
mem_limit: 800000000
environment:
- "ACCEPT_EULA=Y"
- "SA_PASSWORD=xxxxxxxxxxxx"
volumes_from:
- volume-database

コンテナを起ち上げるとこんな感じのログが出ます。14331434でListenしてて、tempdbっていうスキーマが最初に出来るようです

1
2
3
4
5
6
7
8
2018-03-12 06:49:46.86 spid20s     A self-generated certificate was successfully loaded for encryption.
2018-03-12 06:49:46.87 spid20s Server is listening on [ 'any' <ipv6> 1433].
2018-03-12 06:49:46.87 spid20s Server is listening on [ 'any' <ipv4> 1433].
2018-03-12 06:49:46.88 Server Server is listening on [ ::1 <ipv6> 1434].
2018-03-12 06:49:46.88 Server Server is listening on [ 127.0.0.1 <ipv4> 1434].
2018-03-12 06:49:46.89 Server Dedicated admin connection support was established for listening locally on port 1434.
2018-03-12 06:49:49.13 spid20s SQL Server is now ready for client connections. This is an informational message; no user action is required.
2018-03-12 06:49:50.24 spid9s Starting up database 'tempdb'.

次にクライアント(sqlcmd)。接続出来るまでちょっとつまづいたのでその箇所のメモ

sqlcmd: 文字コードで怒られる

1
2
3
4
5
6
// 接続
$ sqlcmd -S mssql-server -U sa -P 'xxxxxxxxxx'

// とてもエラー
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid

en_USのlocale設定が必要なようです(ja_JPだけだとだめだった)

1
2
3
4
5
6
7
// localeにen_USを追加
$ sudo cat /etc/locale.gen | tail -n 2
ja_JP.UTF-8 UTF-8
en_US.UTF-8 UTF-8

$ sudo locale-gen
$ sudo update-locale

sqlcmd: ODBCドライバで怒られる

1
2
3
4
5
// 接続
$ sqlcmd -S mssql-server -U sa -P 'xxxxxxxxxx'

// とてもエラー
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Can't open lib '/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2' : file not found.

ファイルの存在確認をしてみる

1
2
3
// あった
$ ls /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2
/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2

なぜなのか。

1
2
3
4
5
// 必要そうな物は入ってるはず・・・
$ sudo ACCEPT_EULA=Y apt-get install msodbcsql mssql-tools unixodbc-dev
msodbcsql is already the newest version (13.1.9.2-1).
mssql-tools is already the newest version (14.0.6.0-1).
unixodbc-dev is already the newest version (2.3.4-1).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 調べる
$ odbcinst -j
unixODBC 2.3.4
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/username/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

// 設定見てみる
$ cat /etc/odbcinst.ini
[ODBC]
Trace = Yes
TraceFile = /var/tmp/odbc.log ## ←※「TraceFile」を追加するとログが出るらしいので一時的に追加した

[ODBC Driver 13 for SQL Server]
Description=Microsoft ODBC Driver 13 for SQL Server
Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2
UsageCount=1

// ログ見てみる(長いので抜粋)
$ cat /var/tmp/odbc.log
[ODBC][9448][1520839365.283163][SQLSetConnectAttrW.c][606]
Exit:[SQL_SUCCESS]
[ODBC][9448][1520839365.283270][SQLDriverConnectW.c][290]
Entry:
Connection = 0x1e06d00
Window Hdl = (nil)
Str In = [DRIVER={ODBC Driver 13 for SQL Server};SERVER={mssql-server};UID={sa};PWD={xxxxxxxx};WSID={9zilla};APP={SQLCMD};][length = 112 (SQL_NTS)]
Str Out = (nil)
Str Out Max = 0
Str Out Ptr = (nil)
Completion = 0
UNICODE Using encoding ASCII 'ANSI_X3.4-1968' and UNICODE 'UCS-2LE'

[ODBC][9448][1520839365.283663][SQLConnect.c][1139]Can't open lib '/opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2' : file not found
[ODBC][9448][1520839365.283694][SQLGetDiagFieldW.c][815]
Entry:
Connection = 0x1e06d00
Rec Number = 0
Diag Ident = 2
Diag Info Ptr = 0x7ffcb2abd65e
Buffer Length = 2
String Len Ptr = (nil)

どうやら調べていくと、ライブラリが参照しているSSLライブラリのバージョンが特殊という事らしい

1
2
3
4
$ ldd /opt/microsoft/msodbcsql/lib64/libmsodbcsql-13.1.so.9.2 | grep "not found"
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)
libcrypto.so.1.0.0 => not found
libssl.so.1.0.0 => not found

確かに、現行バージョンは1.1なので、1.0を参照しているのは特殊

1
2
$ dpkg -l | grep openssl
ii openssl 1.1.0f-3+deb9u1 amd64 Secure Sockets Layer toolkit - cryptographic utility

手動でSSL1.0をインストール

1
2
3
4
5
6
7
8
9
10
11
$ wget "http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb"
--2018-03-12 16:36:10-- http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb
Resolving security.debian.org (security.debian.org)... 133.242.99.74
Connecting to security.debian.org (security.debian.org)|133.242.99.74|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1046372 (1022K) [application/x-debian-package]
Saving to: 'libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb'

libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb 100%[======================================================================>] 1022K 561KB/s in 1.8s

2018-03-12 16:36:12 (561 KB/s) - 'libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb' saved [1046372/1046372]
1
$ sudo apt install ./libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 入れた
$ sqlcmd -S mssql-server -U sa -P 'xxxxxxxxxx'
1> select name from sys.databases;
2> go
name
--------------------------------------------------------------------------------------------------------------------------------
master
tempdb
model
msdb

(4 rows affected)

1> quit