Microsoft SQL Server 2017 in Docker

In diesem Artikel geht es um den neuen Microsoft SQL Server 2017 Linux für Docker.

Natürlich kann man auch MS SQL 2017 direkt unter Ubuntu installieren. Microsoft stellt dafür die Pakete und Docker Images auf dem Docker HUB bereit.

Als minimale Vorraussetzung wird auf der Festplatten rund 4GB Speicherplatz und 4GB RAM benötigt. Eine laufende Docker Installation setzten wir vorraus.

In den allgemeinen Docker Image von Microsoft sind unterschiedliche SQL Editionen verein. Über einen Docker Parameter wird die jeweilige Edition gesetzt.

SQL Developer edition -> MSSQL_PID=Express
SQL Express edition -> MSSQL_PID=Developer

Mit „docker pull“ starten wir den Download von dem Microsoft SQL Server 2017 vom Docker Hub. Im Anschluss erzeugen wir mit „docker run“ eine laufende SQL Express Instanz am Netzwerkport 1433. Unsere Datenbank soll nicht im Docker Container gespeichert werden, sondern im Verzeichnis /my/data/. Das erleichter spätere Updates vom Container. Das Kennword für den Benutzer „SA“ kann natürlich individuell gestalltet werden.

sudo docker pull microsoft/mssql-server-linux
sudo docker run --name mssql1 -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=KennW@rt1' -e 'MSSQL_PID=Express' -p 1433:1433 -v /my/data:/var/opt/mssql/data -d microsoft/mssql-server-linux:2017-latest
sudo docker ps -a

Damit ist die Installation schon abgeschlossen. Jetzt können wir uns per Kommandozeile auf die Datenbank verbinden.

sudo docker exec -it mssql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'KennW@rt1'

Als Beispiel erzeugen wir die Datenbank „TestDB“ mit der Tabelle „Inventory“ und zwei Datensätzen. Per SQL Kommando kann man auch das Kennwort von Benutzer „SA“ ändern.

CREATE DATABASE TestDB
GO
USE TestDB
CREATE TABLE Inventory(ID INT, Name NVARCHAR(50), Quantity INT)
GO
INSERT INTO Inventory VALUES (1, 'banana', 25);
INSERT INTO Inventory VALUES (2, 'orange', 14);
SELECT * FROM Inventory WHERE quantity > 15;
GO
ALTER LOGIN SA WITH PASSWORD='Neues!Kennwort'
GO
QUIT

Microsoft stellt das SQL Server Management Studio Version 17 für Windows als grafisches Tool bereit. Die IDE ist sehr Umfangreich und setzt viele Resourcen vorraus.

Eine alternative IDE stellt HeidiSQL dar.

Check_MK Plugins erstellen mit Datenbank als Quelle

In diesem Beitrag will ich ein Check_MK Agent Plugin erstellen, welches Daten aus einer Datenbank aus liest und in Check_MK als Service mit Statistik integriert.

1. Installation

1.1. Java installieren

sudo apt-get install openjdk-8-jre

1.2. SQL-Workbench installieren

SQL-Workbench von der Seite laden.

wget http://www.sql-workbench.net/Workbench-Build119.zip

Die ZIP-Datei entpacken.

unzip Workbench-Build119.zip

2. Einrichtung

2.1. SQL-Workbench Profile

Starten Sie SQL-Workbench im Grafikmodus und legen ein Connection Profile an, mit dem Sie eine Verbindung zur Datenbank auf bauen können.

./Workbench-Build119/sqlworkbench.sh

2.2. Verzeichnisse anlegen

mkdir -p ./check-db-plugin/{lib,logs,result}/

Die Bibliothek in das Projektverzeichnis kopieren.

cp ./Workbench-Build119/sqlworkbench.jar ./check-db-plugin/lib/

2.3. Script erstellen

Dieses Script starte SQL-Workbench im Command-Modus und transformiert die Datenbankabfrage in eine OUT-Datei. Als „ProfileName“ verwenden Sie den Namen, welche Sie unter Punk 2.1. erstellt haben.

vim ./check-db-plugin/start.sh
chmod +x vim ./check-db-plugin/start.sh

#!/bin/sh
DIR=/home/user/check-db-plugin/
JAVA_HOME=/usr/lib/jvm/default-java/
JAR=lib/sqlworkbench.jar
CONFIG=/home/user/.sqlworkbench
SCRIPT=count.sql
LOG=logs/check.log
 
cd $DIR
 
$JAVA_HOME/bin/java \
  -jar $JAR \
  -profile='ProfileName' \
  -command='WBInclude count.sql;' \
  -configDir=$CONFIG \
  -logfile=$LOG \
  -readOnly \
  -displayResult=false; \
#  -script=$SCRIPT

In der Datei „count.sql“ erstellen Sie die Abfrage für die Datenbank und die anschließende XSLT Transformation.

vim ./check-db-plugin/count.sql

WbConnect ProfileName;
 
WbExport -type=xml -file='result/table.xml' -stylesheet='count.xslt' -xsltOutput='result/table.out';
SELECT count(*) as SUM, 50 as WARNING, 100 as CRITICAL FROM table WHERE status = 'closed';

Die XSLT Transformation wandelt das Ergebnis der Datenbank in eine einfache Textausgabe um.

vim ./check-db-plugin/count.xslt

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
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet
     version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
 
<xsl:output
  encoding="iso-8859-15"
  method="text"
  indent="no"
  standalone="no"
  omit-xml-declaration="no"
  doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
/>
 
<xsl:variable name="newline"><xsl:text>&#10;</xsl:text></xsl:variable>
<xsl:variable name="tab"><xsl:text>&#x09;</xsl:text></xsl:variable>
 
<xsl:template match="/">
        <!-- Write the data rows -->
        <xsl:for-each select="/wb-export/data/row-data">
                <xsl:for-each select="column-data">
                        <xsl:value-of select="."/>
                        <xsl:if test="position() &lt; last()"><xsl:value-of select="$tab"/>
                        </xsl:if>
                </xsl:for-each>
                <xsl:value-of select="$newline"/>
        </xsl:for-each>
</xsl:template>
 
</xsl:stylesheet>

3. Check_MK Agent

3.1. Verzeichnis erstellen

Der Check soll nur alle 120 Sekunden asynchron ausgeführt werden, deshalb wird ein Verzeichnis 120 angelegt.

sudo mkdir -p /usr/lib/check_mk_agent/local/120/

3.2. Check erstellen

Der Check liest im Verzeichnis die Dateien mit der Endung /home/user/check-db-plugin/result/*.out aus und stellt das Ergebnis im Check_MK agent bereit.

sudo vim /usr/lib/check_mk_agent/local/120/check-db-plugin.sh
sudo chmod +x /usr/lib/check_mk_agent/local/120/check-db-plugin.sh

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
47
48
#!/bin/sh
# Plugin Return Codes
# = 0   OK
# = 1   Warning
# = 2   Critical
# = 3   Unknown
#
DIR=/home/user/check-db-plugin/
FILTER=result/*.out
NAME="SQL-counter"
 
# Start SQL-Workbench into batch mode
$DIR/start.sh > /dev/null
 
 
for file in $DIR/$FILTER; do
 
  filename=$(basename "$file")
  date=$(date -r "$file" +"%Y-%m-%d %H:%M:%S")
 
  count=$(cut -f1 ${file})
  limit_warning=$(cut -f2 ${file})
  limit_critical=$(cut -f3 ${file})
 
  if [ -z $count ] ; then
    status=3
    statustext="UNKNOWN"
  elif [ $count -gt $limit_critical ] ; then
    status=2
    statustext="CRITICAL"
  elif [ $count -gt $limit_warning ] ; then
    status=1
    statustext="WARNING"
  else
    status=0
    statustext="OK"
  fi
 
  if [ $count -eq $limit_warning ] && [ $count -eq $limit_critical ] ; then
    unset limit_warning
    unset limit_critical
  fi
 
  echo "${status:-1} ${NAME}_${filename} count=${count};$limit_warning;$limit_critical; Check(${statustext}): ${count} - ${date}"
 
done
 
exit $status

Quelle: Check_MK
Download: SQL-Workbench Handbuch: Install, Scripting, Export

MySQL Kompression pro Tabelle aktivieren

Seit MySQL 5.5 besteht in der InnoDB Datenbank die Möglichkeit eine Tabelle zu komprimieren.

Zu erst müssen wir einige Einstellung ändern, damit wir die Komression nutzen können.

sudo vim /etc/mysql/conf.d/mm_mysql.cnf

[mysqld]
innodb_file_per_table = 1
innodb_file_format = Barracuda
open-files-limit = 2048
table_cache = 512

Nach einem Neustart von MySQL sind die Einstellungen aktiv.

sudo service mysql restart

Jetzt kann man pro Tabelle die Kompression einstellen. Das bringt bei Tabellen mit Blob Felder eine Ersparnis von 50% Speicherplatz.

ALTER TABLE 'tabellen_name' ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4;

Mit dem Befehl kann man prüfen, welche Einstellung pro Tabelle vorgenommen wurde.

SELECT TABLE_NAME, ENGINE, VERSION, ROW_FORMAT, TABLE_ROWS, DATA_LENGTH, CREATE_OPTIONS
FROM information_schema.tables
WHERE TABLE_SCHEMA='schema_name';

Das Ergebnis der Dateiänderung kann man hiermit prüfen.

mysql> \! ls -l /var/lib/mysql/schema_name/*.ibd