Paramiko Stolpersteine

Heute bin ich gleich zwei Mal über das Python-Modul Paramiko gestolpert. In der MySQL-Workbench wird es verwendet, um eine Verbindung über einen SSH-Tunnel herzustellen. Das in der aktuellen MySQL-Workbench ausgelieferte, aber uralte Paramiko versteht sich nicht mehr mit aktuellen OpenSSH-Versionen. Nach einem manuellen Update von Paramiko funktionierte der Verbindungsaufbau dann wieder.

Die zweite Portion Paramiko gab es beim Durchsehen der Backups. Das von mir verwendete Duplicity benutzt ebenfalls Paramiko, wenn Backups auf einem per SSH bzw. SFTP oder SCP erreichbaren Server abgelegt werden sollen. Leider funktioniert SFTP und SCP in Duplicity, und damit implizit Paramiko, aktuell nicht mit einem Backup-Server bei Hetzner. Eine Lösung habe ich bisher leider nicht gefunden.

[Mehr]
MariaDB  MySQL  SSH 

MySQL-Workbench: SSH-Tunnelaufbau scheitert

Nach einem Update eines Servers auf Debian 8 Jessie war ein Verbindungsaufbau von einer MySQL-Workbench über einen SSH-Tunnel zu diesem Server nicht mehr möglich. Das Logfile der MySQL-Workbench (unter Windows in %APPDATA%\MySQL\Workbench\log\wb.log zu finden) enhält folgende Fehlermeldung:

SSHException: Incompatible ssh peer (no acceptable kex algorithm)

Grund für die Fehlermeldung ist, dass das in der aktuellen MySQL-Workbench 6.3 CE verwendete Python-Modul (paramiko), welches für den Verbindungsaufbau über einen SSH-Tunnel zuständig ist, sich in der Version 1.7.7.1 nicht mehr mit der nun auf dem Server installierten OpenSSH-Version 6.7 versteht.

[Mehr]
Linux  MySQL  OSS  SSH  Windows 

HHVM und Piwik

Mit der heute veröffentlichten Version 2.14.0 der freien Analysesoftware Piwik ist nun auch ein reibungsloser Einsatz unter HHVM möglich. Das Problem der exorbitant steigenden Anzahl von gleichzeitigen Verbindungen zur Datenbank bei Verwendung der Piwik-Seiten wurde gelöst.

HHVM-Stolpersteine – Heute: MySQL-Socket

Nach einem aktuellen Update konnte HHVM auf einmal keine Verbindung mehr zu MySQL bzw. MariaDB aufnehmen. Grund ist der, dass der MySQL-Socket nun wohl unter /tmp/mysql.sock gesucht wird, wo er nicht liegt. Unter Debian liegt er vielmehr unter /var/run/mysqld/mysqld.sock. In der /etc/hhvm/server.ini ist daher folgende Einstellung einzutragen:

hhvm.mysql.socket = /var/run/mysqld/mysqld.sock

Nach einem Neustart von HHVM funktionierts dann auch wieder mit HHVM und MySQL über den Socket.

HHVM  Linux  MariaDB  MySQL  OSS 

MariaDB: Headers and client library minor version mismatch

Beim Einsatz von MariaDB kann es vorkommen, dass PHP5 beim Verbinden mit der Datenbank folgenden Fehler meldet:

mysqli::mysqli(): Headers and client library minor version mismatch.

Die PHP5-Bibliothek, welche für die Anbindung an MariaDB/MySQL zuständig ist, prüft, ob die MariaDB/MySQL-Bibliothek noch die gleiche ist, mit der sie übersetzt wurde. Das ist natürlich nicht mehr der Fall, wenn man die MariaDB/MySQL-Bibliothek auf eine neue Version aktualisiert.

Abhilfe schafft, den mysqlnd-Treiber zu verwenden, was auch das empfohlene Verfahren von MariaDB ist. Dazu muss unter Debian oder Ubuntu das Paket php5-mysqlnd installiert und php5-mysql entfernt werden.

[Mehr]
Linux  MariaDB  MySQL  OSS  PHP 

MySQL-Replikation komplett deaktivieren

Um die MySQL-Replikation komplett zu deaktivieren führt man zuerst auf dem Slave folgende Kommandos aus:

STOP SLAVE;

RESET SLAVE ALL;
-- für Versionen älter als 5.5.16:
RESET SLAVE;

Danach editiert man /etc/mysql/my.cnf und entfernt alle Angaben, die mit master- oder replicate- beginnen. Anschließend wird der MySQL-Server mit

service mysql restart

neu gestartet.

Auf dem Master kommentiert man in der /etc/mysql/my.cnf alle Zeilen aus oder löscht sie, die mit server-, binlog- oder log_bin beginnen. Anschließend wird auch der Server-MySQL-Prozess neu gestartet.

[Mehr]
Linux  MySQL  OSS 

Entfernungen berechnen – als SQL-Funktion

Nachfolgende Funktion berechnet die Entfernung zwischen zwei in geographischer Länge und Breite angegebenen Punkten auf der Erde in Kilometer:

drop function if exists entfernung;
delimiter //
create function entfernung(lat1 double, lon1 double, lat2 double, lon2 double)
	returns double
	language sql
	contains sql
	comment 'Berechnet die Entfernung zwischen zwei Koordinaten'
begin
	declare erdradius double;

	declare lambda1 double;
	declare phi1 double;

	declare lambda2 double;
	declare phi2 double;

	declare x1 double;
	declare y1 double;
	declare z1 double;

	declare x2 double;
	declare y2 double;
	declare z2 double;

	declare entfernung double;

	set erdradius = 6371;

	set lambda1 = lon1 * pi() / 180;
	set phi1 = lat1 * pi() / 180;

	set lambda2 = lon2 * pi() / 180;
	set phi2 = lat2 * pi() / 180;

	set x1 = erdradius * cos(phi1) * cos(lambda1);
	set y1 = erdradius * cos(phi1) * sin(lambda1);
	set z1 = erdradius * sin(phi1);

	set x2 = erdradius * cos(phi2) * cos(lambda2);
	set y2 = erdradius * cos(phi2) * sin(lambda2);
	set z2 = erdradius * sin(phi2);

	set entfernung = 2 * erdradius * asin(sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2)) / (2 * erdradius));

	return entfernung;
end;
//

Update:
Folgende Funktion ist ca. 4 Mal schneller (getestet mit der MySQL-Funktion BENCHMARK(), Quelle)

[Mehr]
MySQL  SQL 

MySQL-Tabellen mit Drupal ausgeben

Beispiel der Ausgabe einer MySQL-Tabelle mit den Drupal-Formatierungsfunktionen:

<?php
  $result = db_query("SELECT * FROM {my_table}");
  $output = '';
  $rows = array();
  $header = array('id','Domain','Module');
  $rows = array();
  $i = 0;
  while($row = db_fetch_object($result)){
    $data = array();
    $data[] = $row->sid;
    $data[] = $row->domain;
    $data[] = $row->module;
    $rows[] = $data;
    $i++;
  }
  $output .= theme('table', $header,$rows);
  echo $output;
?>

Zur Anzeige ist einfach der obige Code in eine neue Drupal-Seite einzufügen und als Eingabeformat PHP code auszuwählen. Aber Vorsicht! Der PHP-Code sollte syntaktisch korrekt sein und man sollte wissen, wie man fehlerhaften Code per Hand wieder aus der Drupal-Datenbank bekommt.

[Mehr]