Angepinnt TeamSpeak Server Migration von SQLite auf MySQL/MariaDB

    TeamSpeak Server Migration von SQLite auf MySQL/MariaDB

    Hallo,

    in diesem Tutorial möchte ich euch gerne zeigen, wie ihr euren TeamSpeak Server schnell, einfach und ohne Probleme von einer SQLite Datenbank auf eine MySQL bzw. MariaDB Datenbank migrieren könnt. Beachtet bitte, dass die Migration eine gewisse Downtime der virtuellen TeamSpeak Server in Anspruch nimmt.

    Inhaltsverzeichnis
    1. Vorbereitungen
    2. Migration
    Bevor wir die Migration starten, bereiten wir die neue Datenbank erstmal soweit vor, dass die Migration selbst dann nicht so lange dauert und wir die Downtime möglichst gering halten können.

    Ich habe zu Test-Zwecken einen TeamSpeak Server auf Basis von SQLite installiert und ein paar Channel erstellt, sowie Dateien hochgeladen:



    1. Vorbereitungen
      Aktuell nutzen wir die SQLite Datenbank und mussten hierfür auch nichts installieren. Für die neue Datenbank müssen wir jedoch eine installieren. Je nachdem, welche ihr nutzen wollt, müsst ihr bei allen folgenden Schritten entsprechend "mysql" oder "mariadb" nutzen. Ich werde das ganze auf Basis der MariaDB zeigen, da die neuen TeamSpeak Server Versionen ab Version 3.0.11 darauf aufsetzen werden.

      Zu erst installieren wir die Datenbank und alle dazugehörigen Softwarepakete:

      Quellcode

      1. aptitude install mariadb-server-5.5

      Hinweis: Hierfür benötigt ihr - jedenfalls unter Debian Wheezy 7.6 - den SID Repository: deb Index of /debian sid main (Wenn ihr den Repository nachträglich hinzufügt, solltet ihr jetzt erstmal euer System upgraden, da es sonst zu ein paar Problemen führen kann.)

      Während der Installation werdet ihr auch nach einem "root" Passwort gefragt. Das ist NICHT das root Passwort für euren Server, sondern das für die Datenbank!

      Sobald das fertig ist, sollte man sich auf die Datenbank verbinden können. Das prüfen wir einfach mal:

      Quellcode

      1. mysql -u root -p

      Nach der Passwort-Eingabe sollten wir dann etwas sehen, was dem hier ähnelt:
      Welcome to the MariaDB monitor. Commands end with ; or \g.
      Your MariaDB connection id is 34
      Server version: 5.5.39-MariaDB-2 (Debian)

      Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.

      Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

      MariaDB [(none)]>


      Als nächstes legen wir uns eine leere Datenbank an und weisen ihm einen Benutzer zu:

      Quellcode

      1. CREATE DATABASE teamspeak;

      Hinweis: Neue Datenbank heißt "teamspeak".

      Quellcode

      1. GRANT ALL PRIVILEGES ON teamspeak.* TO 'teamspeak'@'%' IDENTIFIED BY 'geheimes$Passwort123';

      Hinweis: "teamspeak.*" heißt "Datenbankname.ALLE_TABELLEN". Wir geben alle Rechte dem User "teamspeak", welcher sich von überall aus einloggen darf (%) - sollte er nur von der lokalen Maschine sich einloggen dürfen, muss hier "localhost" anstatts des %-Zeichens stehen. "geheimes$Passwor123" ist das Passwort, welches dann für den Benutzer gilt.

      Quellcode

      1. FLUSH PRIVILEGES;

      Hinweis: Wir müssen danach die Rechte nochmal laden, damit diese wirklich wirksam werden.

      Jetzt gehen wir mit Hilfe des Befehls "exit" oder der Tastenkombination "Strg" und "D" aus der MySQL bzw. MariaDB Shell raus und versuchen uns als der neu angelegte Benutzer auf die Datenbank ein zu loggen:

      Quellcode

      1. mysql -u teamspeak -p teamspeak

      Hinweis: "-u teamspeak" ist der Benutzername und das letzte "teamspeak" ist der Datenbankname.

      Bei der MariaDB sieht man das gut, ob es geklappt hat oder nicht:
      Welcome to the MariaDB monitor. Commands end with ; or \g.
      Your MariaDB connection id is 43
      Server version: 5.5.39-MariaDB-2 (Debian)

      Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.

      Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

      MariaDB [teamspeak]>

      Gut. Das hat geklappt. Als nächstes erstellen wir - falls noch nicht vorhanden - unsere Konfigurationsdateien für unseren TeamSpeak Server, sodass er beim nächsten Start die MySQL bzw. MariaDB nutzen kann. Logge dich hierfür als der System-Benutzer ein, der den TeamSpeak Server verwaltet. Bei mir heißt der "teamspeak":

      Quellcode

      1. su - teamspeak


      Zu erst erstellen wir unsere ts3server.ini im root-Verzeichnis des TeamSpeak 3 Servers, welche wie folgt aussieht:

      Quellcode

      1. $ cat ts3server.ini
      2. machine_id=1
      3. default_voice_port=9987
      4. voice_ip=192.168.178.212
      5. licensepath=
      6. filetransfer_port=30033
      7. filetransfer_ip=0.0.0.0
      8. query_port=10011
      9. query_ip=192.168.178.212
      10. query_ip_whitelist=query_ip_whitelist.txt
      11. query_ip_blacklist=query_ip_blacklist.txt
      12. dbplugin=ts3db_mariadb
      13. dbpluginparameter=ts3db_mariadb.ini
      14. dbsqlpath=sql/
      15. dbsqlcreatepath=create_mariadb/
      16. dblogkeepdays=90
      17. logpath=logs
      18. logquerycommands=0
      19. dbclientkeepdays=30

      Dann benötigen wir noch die Konfigurationsdatei für die SQL-Verbindung:

      Quellcode

      1. $ cat ts3db_mariadb.ini
      2. [config]
      3. host=127.0.0.1
      4. port=3306
      5. username=teamspeak
      6. password=geheimes$Passwort123
      7. database=teamspeak
      8. socket=


      Jetzt müssen wir noch überprüfen, ob die benötigte Bibliothek vorhanden ist:

      Quellcode

      1. ldd libts3db_mariadb.so

      bzw.

      Quellcode

      1. ldd libts3db_mysql.so

      Für detaillierte Informationen hierzu solltet ihr euch diese Themen bzw. Beiträge anschauen:
      1. MariaDB: TeamSpeak Server Installation mit der MySQL/MariaDB Datenbank
      2. MySQL: TeamSpeak Server Installation auf MySQL Basis schlägt fehl

      Perfekt. Jetzt haben wir unsere Konfigurationsdateien fertig und eine leere Datenbank angelegt. Der nächste Schritt wird etwas schwieriger. Wir müssen jetzt irgendwie die Daten aus der SQLite Datenbank in die neue MySQL bzw. MariaDB Datenbank kriegen. Laut dem englisch-sprachigen TeamSpeak Forum ist das nicht möglich: howto convert database SQLITE to MySQL?
      Ich zeige euch, wie das aber trotzdem geht. ;)

      PS: Wer das Paket "sqlite3" noch nicht installiert hat, muss das jetzt tun, denn das wird zum exportieren der Daten benötigt:

      Quellcode

      1. aptitude install sqlite3

    2. Migration
      ACHTUNG: Ab jetzt wird es Downtime geben! Wie lange hängt davon ab, wie der Migrationsprozess verläuft.

      Zu erst bringen wir die aktuelle Datenbank in einen konsistenten Zustand. Hierfür müssen wir einfach nur die TeamSpeak Instanz stoppen:

      Quellcode

      1. ./ts3server_startscript.sh stop


      Als nächstes generieren wir uns einen Dump unserer aktuellen Datenbank, um diese dann in die neue Datenbank importieren zu können:

      Quellcode

      1. sqlite3 ts3server.sqlitedb .dump > db_dump


      Da SQLite andere Syntaxe verwendet, müssen wir den Dump erst noch anpassen. Hierfür habe ich mal zwei Befehle gebastelt, welche das ganze sehr schnell erledigen:

      Quellcode

      1. sed 's/\PRAGMA foreign_keys=OFF;//g' db_dump | sed 's/\BEGIN TRANSACTION;//g' | sed 's/\COMMIT;//g' | sed '/sqlite_sequence/d' | sed 's/AUTOINCREMENT/AUTO_INCREMENT/' | tr -d '"' > temp_dump

      Quellcode

      1. tail -n +3 temp_dump > db_dump_converted


      Jetzt müssen wir nur noch eine einzige Zeile anpassen, damit diese auch funktioniert. Es gibt eine Zeile, die die Tabelle "tokens" erstellt. Hier fehlt die Größe für das Feld "token_customset". Das setzen wir einfach manuell. :)

      Wenn man den TS mit einer MySQL/MariaDB Datenbank aufgesetzt hat, wird man feststellen, dass der Wert auf 255 gesetzt ist, daher werden auch wir den einfach nutzen:

      Brainfuck-Quellcode

      1. mysql> DESCRIBE tokens;
      2. +-------------------+------------------+------+-----+---------+-------+
      3. | Field | Type | Null | Key | Default | Extra |
      4. +-------------------+------------------+------+-----+---------+-------+
      5. | server_id | int(10) unsigned | YES | | NULL | |
      6. | token_key | varchar(50) | NO | | NULL | |
      7. | token_type | int(11) | YES | | NULL | |
      8. | token_id1 | int(10) unsigned | YES | | NULL | |
      9. | token_id2 | int(10) unsigned | YES | | NULL | |
      10. | token_created | int(10) unsigned | YES | | NULL | |
      11. | token_description | varchar(255) | YES | | NULL | |
      12. | token_customset | varchar(255) | YES | | NULL | |
      13. +-------------------+------------------+------+-----+---------+-------+
      14. 8 rows in set (0.01 sec)


      Öffnet einfach den konvertierten Dump mit einem Editor eurer Wahl - am besten vi oder vim - und passt die Zeile an:

      Quellcode

      1. vim db_dump_converted

      Bei vi/vim könnt ihr mit Hilfe von folgender Eingabe direkt zur entsprechenden Zeile springen:

      Quellcode

      1. /CREATE TABLE token


      Ihr solltet dann folgende Zeile sehen:
      CREATE TABLE tokens ( server_id integer unsigned, token_key varchar(50) NOT NULL, token_type integer, token_id1 integer unsigned, token_id2 integer unsigned, token_created integer unsigned, token_description varchar(255), token_customset varchar);

      Diese ändern wir wie folgt ab:
      CREATE TABLE tokens ( server_id integer unsigned, token_key varchar(50) NOT NULL, token_type integer, token_id1 integer unsigned, token_id2 integer unsigned, token_created integer unsigned, token_description varchar(255), token_customset varchar(255));

      Wir müssen nur das rot markierte hinzufügen. :)

      Diesen konvertierten Dump spielen wir jetzt in die neue Datenbank ein:

      Quellcode

      1. mysql -u teamspeak -p teamspeak < db_dump_converted

      Hinweis: Das verlangte Passwort ist das für den Datenbank-Benutzer "teamspeak" in diesem Fall!

      Nun verifizieren wir das ganze:

      Quellcode

      1. mysql -u teamspeak -p teamspeak

      Quellcode

      1. SHOW TABLES;

      Und siehe da: Unsere Tabellen sind alle vorhanden:
      MariaDB [teamspeak]> SHOW TABLES;
      +-------------------------+
      | Tables_in_teamspeak |
      +-------------------------+
      | bans |
      | bindings |
      | channel_properties |
      | channels |
      | client_properties |
      | clients |
      | complains |
      | custom_fields |
      | group_channel_to_client |
      | group_server_to_client |
      | groups_channel |
      | groups_server |
      | instance_properties |
      | messages |
      | perm_channel |
      | perm_channel_clients |
      | perm_channel_groups |
      | perm_client |
      | perm_server_group |
      | server_properties |
      | servers |
      | tokens |
      +-------------------------+
      22 rows in set (0.00 sec)

      Aber sind auch die Inhalte übernommen worden? Suchen wir einfach mal nach einem Eintrag, der drin stehen muss: Ihr selber. ;)

      SQL-Abfrage

      1. SELECT client_nickname,client_id,server_id,client_lastconnected,client_lastip FROM clients WHERE client_nickname="Sebbo";

      Sollte sowas hier zurück liefern:

      Brainfuck-Quellcode

      1. +-----------------+-----------+-----------+----------------------+-----------------+
      2. | client_nickname | client_id | server_id | client_lastconnected | client_lastip |
      3. +-----------------+-----------+-----------+----------------------+-----------------+
      4. | Sebbo | 2 | 1 | 1411300550 | 192.168.178.201 |
      5. +-----------------+-----------+-----------+----------------------+-----------------+
      6. 1 row in set (0.00 sec)


      Ebenso suchen wir mal unseren virtuellen Server:

      SQL-Abfrage

      1. SELECT * FROM server_properties WHERE ident="virtualserver_name" AND value="Test Server";

      Sieht dann zum Beispiel so aus:

      Brainfuck-Quellcode

      1. +-----------+------+--------------------+-------------+
      2. | server_id | id | ident | value |
      3. +-----------+------+--------------------+-------------+
      4. | 1 | 1 | virtualserver_name | Test Server |
      5. +-----------+------+--------------------+-------------+
      6. 1 row in set (0.00 sec)

      Wenn man diese zwei Sachen findet, sollte alles andere eigentlich auch passen. Zudem haben wir beim importieren auch keinen Fehler erhalten. :)

      Jetzt können wir die Dumps auch wieder löschen:

      Quellcode

      1. rm db_dump temp_dump db_dump_converted


      Bevor wir jetzt allerdings den Server starten, müssen wir noch ein paar Eigenschaften der virtuellen Server anpassen, sonst werden existierende Server ignoriert und ein neuer Standard-Server eingerichtet. Ändert man das nicht, sieht die Datenbank danach so aus, wenn man einen virtuellen Server davor hatte:

      Brainfuck-Quellcode

      1. MariaDB [teamspeak]> SELECT * FROM servers;
      2. +-----------+-------------+------------------+-------------------+---------------------+-----------------------+---------------------+-----------------------+
      3. | server_id | server_port | server_autostart | server_machine_id | server_month_upload | server_month_download | server_total_upload | server_total_download |
      4. +-----------+-------------+------------------+-------------------+---------------------+-----------------------+---------------------+-----------------------+
      5. | 1 | 9987 | 1 | | 976430 | 0 | 976430 | 0 |
      6. | 2 | 9987 | 1 | 1 | 0 | 0 | 0 | 0 |
      7. +-----------+-------------+------------------+-------------------+---------------------+-----------------------+---------------------+-----------------------+
      8. 2 rows in set (0.00 sec)

      Wir wollen aber keinen neuen, sondern nur unsere(n) bereits existierende(n), daher passen wir die Werte einfach an. :)

      In unserer "ts3server.ini" steht eine Variable namens "machine_id" mit dem Wert 1. Diesen Wert tragen wir jetzt bei allen virtuellen Servern nachträglich ein:

      SQL-Abfrage

      1. UPDATE servers SET server_machine_id='1' WHERE server_machine_id="";

      Der Befehl sucht quasi alle virtuellen Server, wo keine machine_id gesetzt ist und setzt dann dort überall den Wert 1.

      Gut. Jetzt passen wir noch unser Start-Skript an, sodass es die Konfigurationsdateien verwendet. Hierfür editieren wir das "ts3server_startscript.sh" und ersetzen folgende Zeile...

      Quellcode

      1. COMMANDLINE_PARAMETERS="${2}" #add any command line parameters you want to pass here

      ...durch diese:

      Quellcode

      1. COMMANDLINE_PARAMETERS="inifile=ts3server.ini" #add any command line parameters you want to pass here


      WICHTIG: Wenn ihr jetzt von der Version 3.0.10.3 auf die Version 3.0.11 zusätzlich wechselt, müsst ihr noch die SQL-Fixes einspielen, die der Version 3.0.11 beiliegen. Hierfür nutzt ihr die beiden nachfolgenden Befehle:

      Quellcode

      1. mysql --user=<DB_BENUTZERNAME> --password=<DB_PASSWORT> <DB_NAME> < <TEAMSPEAK_VERZEICHNIS>/sql/updates_and_fixes/convert_mysql_to_mariadb.sql
      2. mysql --user=<DB_BENUTZERNAME> --password=<DB_PASSWORT> <DB_NAME> < <TEAMSPEAK_VERZEICHNIS>/sql/updates_and_fixes/mariadb_fix_latin_utf8.sql

      Sieht dann zum Beispiel so aus:

      Quellcode

      1. mysql --user=teamspeak --password=sehrGeheimes$Passwort!2014 teamspeak_db < /home/teamspeak/sql/updates_and_fixes/convert_mysql_to_mariadb.sql
      2. mysql --user=teamspeak --password=sehrGeheimes$Passwort!2014 teamspeak_db < /home/teamspeak/sql/updates_and_fixes/mariadb_fix_latin_utf8.sql


      Nach diesem Schritt starten wir unseren TeamSpeak Server wieder:

      Quellcode

      1. ./ts3server_startscript.sh start


      Nach einem Blick in die Log-Datei der Instanz, sollte er jetzt auch mit dem entsprechend richtigen Plugin hochgekommen sein:
      $ cat logs/ts3server_2014-09-21__14_46_58.442879_0.log
      [...]
      2014-09-21 14:46:58.444390|INFO |DatabaseQuery | | dbPlugin name: MariaDB plugin, (c)TeamSpeak Systems GmbH
      [...]

      Wenn wir uns jetzt auf unseren TeamSpeak Server wieder verbinden, sollte auch alles wieder so erscheinen und vor zu finden sein, wie vorher:

      Auch unsere Dateien finden sich wieder dort ein, wo wir sie vorher abgelegt hatten. :)
    Joa, so viel zur Migration von SQLite auf MySQL bzw. MariaDB: Es geht! ;)

    Sollte es Fragen geben, helfe ich gerne. Einfach hier als neuen Beitrag schreiben. Über Feedbacks freue ich mich natürlich auch. :)
    Dateien
    • 001.png

      (13,77 kB, 155 mal heruntergeladen, zuletzt: )
    • 002.png

      (4,48 kB, 155 mal heruntergeladen, zuletzt: )
    • 003.png

      (13,37 kB, 154 mal heruntergeladen, zuletzt: )
    Viele Grüße,
    Sebbo
    -----------------
    TS3tools - Software & Managed Service: www.ts3-tools.info
    4G-Server - Dein günstiger Prepaid Hoster: www.4g-server.eu
    Zur Ergänzung aus einem anderen Thema:

    mineyannik schrieb:

    Bei mir fehlt die libts3db_mariadb.so wo bekomme ich die her?

    Sebbo schrieb:

    Die liegt der aktuellen Server Version bei: Index of /ts/releases/pre_releases/server/3.0.11-Beta-3

    Einfach downloaden und die Datei auf deinen Server hochladen. ;)
    Viele Grüße,
    Sebbo
    -----------------
    TS3tools - Software & Managed Service: www.ts3-tools.info
    4G-Server - Dein günstiger Prepaid Hoster: www.4g-server.eu
    HrHr hab mich zu früh gefreut - da muss beim Konvertieren was schiefgelaufen sein. Mein Server besteht nur noch teilweise -und das hauptsächlich- aus kryptischen Zeichen. Kann es bei bestimmten Channel-Namen aufgrund der Zeichensatz-Umstellung zu Komplikationen kommen?

    Ich halte euch auf dem Laufenden.
    Also es geht aufjedenfall beim Importieren des Dumps was kaputt.

    SQL-Abfrage

    1. INSERT INTO channel_properties VALUES(1,760,'channel_name','[cspacer251]╚═══════════════════╝');


    Dieser Spacer ist nur noch als "?????????????" Channel sichtbar.. Da manche garnicht mehr da sind, fehlen auch Parent-Channel und dadurch werden Childs einfach gelöscht^^
    vll muss ich erstmal die Table erstellen, dann das Convert-Script laufen lassen und dann den Dump einpflegen.

    *ausprobier bis gleich*

    Ok - Ich habs mehrfach mit verschiedenen Mitteln versucht in die Datenbank zu Pumpen. Dabei sind bestimmte Channel immer kaputt gegangen.
    Ich habe jetzt einen SnapShot, welchen ich vorher mit YaTQa erstellt habe, auf dem kaputten Server eingespielt - und das hat die komplette Struktur samt Clients wiederhergestellt.

    Dabei wurden die Clients von dem besagten Server gelöscht und neu angelegt. Dadurch haben jetzt alle eine sehr hohe DBID.
    Die Avatare und Icons musste ich noch selbst in den "$tsdir/files/" ziehen.

    Nun funzt wieder alles :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cartman“ ()

    Hey, hab alles gemacht, sieht auch in der Datenbank aus als ob alles da ist (gab auch keine Fehler beim Import) nur wenn ich den starten möchte bekomme ich ein: "2016-12-13 09:53:55.450939|CRITICAL|DatabaseQuery | |unable to load database plugin library "libts3db_mariadb.so", halting!" ist das Plugin kaputt, oder hab ich irgendwas übersehen/vergessen?
    Danke im voraus :3
    Erstelle bzgl. dieses Problems bitte ein neues Thema. Das hat nichts mit dem hier beschriebenen Thema zu tun.

    Die genannte Datei "libts3db_mariadb.so" müsste im Hauptverzeichnis deines TS3 Servers liegen, wo du auch die Datei "ts3server_startscript.sh" findest:

    Quellcode

    1. ​$ ls -lh /home/teamspeak/
    2. ...
    3. -rwxrwxr-x 1 teamspeak teamspeak 978K Nov 14 22:53 libts3db_mariadb.so
    4. ...
    5. -rwxr-xr-x 1 teamspeak teamspeak 2,7K Nov 14 22:53 ts3server_startscript.sh
    Viele Grüße,
    Sebbo
    -----------------
    TS3tools - Software & Managed Service: www.ts3-tools.info
    4G-Server - Dein günstiger Prepaid Hoster: www.4g-server.eu