dimanche 11 mars 2018

ElasticSearch won't start on Ubuntu server 16.04

Impossible de se connecter à ElasticSearch sur une version fraiche d'Ubuntu serveur 16.04

Il s'agit d'une traduction du post de fcoelho sur le fil de discussion d'elastic.

root@ubuntu1604lts:~# curl -X GET 'http://localhost:9200'
curl: (7) Failed connect to localhost:9200; Connection refused.


Même avec la configuration réseau par défaut.

Le service ElasticSearch ne démarre pas

root@ubuntu1604lts:~# systemctl status elasticsearch
● elasticsearch.service - LSB: Starts elasticsearch
   Loaded: loaded (/etc/init.d/elasticsearch; bad; vendor preset: enabled)
   Active: active (exited) since Sun 2018-03-11 15:08:09 CET; 5s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1386 ExecStop=/etc/init.d/elasticsearch stop (code=exited, status=0/S
  Process: 1421 ExecStart=/etc/init.d/elasticsearch start (code=exited, status=0


Le serveur n'écoute pas sur le port 9200 :

root@ubuntu1604lts:~# netstat -atp tcp | grep -i "listen"
tcp        0      0 *:ssh                   *:*                     LISTEN      811/sshd
tcp        0      0 *:postgresql            *:*                     LISTEN      553/postgres
tcp        0      0 *:5433                  *:*                     LISTEN      554/postgres
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      811/sshd
tcp6       0      0 [::]:postgresql         [::]:*                  LISTEN      553/postgres
tcp6       0      0 [::]:5433               [::]:*                  LISTEN      554/postgres


La solution

Il semble que pour lancer le service ElasticSearch sur Ubuntu 16.4, il faut paramétrer START_DAEMON à true dans le fichier /etc/default/elasticsearch :

 # Start Elasticsearch automatically
START_DAEMON=true

Par défaut, cette ligne est commentée dans le paquet elasticsearch d'Ubuntu (sic)

La décommenter permet au service de se lancer correctement.

On peut également s'assurer que le service démarre avec le bon utilisateur. Pour cela, il suffit de décommetter les 2 lignes suivantes :

# Run Elasticsearch as this user ID and group ID
ES_USER=elasticsearch
ES_GROUP=elasticsearch


Important

Pour finir, assurez-vous d'utiliser systemctl restart au lieu de start car le service est démarré juste après l'isntallation, et apparemment, il y a soit un socket, un pidfile ou quelque chose d'autre que le système retient et qui devrait être disponible pour que le service démarre à nouveau.


On peut également forcer la main à ElasticSearch en le démarrant avec son utilisateur :
root@ubuntu1604lts:~# sudo -u elasticsearch /usr/share/elasticsearch/bin/elasticsearch &

vendredi 12 janvier 2018

Mémo projections / SRID / références spatiales de Google Earth, Google Maps et OpenStreetMap



Google Earth
Geographic coordinate system with the wgs84 datum - EPSG: 4326

Google Maps 
Projected coordinate system that is based on the wgs84 datum - EPSG: 3857

Open Street Map database
A gcs with units decimal degrees & datum of wgs84 - EPSG: 4326

Open Street Map tiles and WMS webservice
Projected coordinate system that is based on the wgs84 datum - EPSG: 3857



Toutes les références spatiales sur http://spatialreference.org/

mardi 3 octobre 2017

Pense-bête - Commandes dans VIM


Voici les principales commandes de VIM


i           => Basculer dans le mot insertion
:q!         => Quitter sans enregistrer
:qw         => Quitter après l'enregistrement
:w          => Enregistrer le fichier
d$          => Supprime les données jusqu'à la fin de la ligne
dw          => Supprime les données jusqu'au prochain mot
de          => Supprime le mot courant
w           => Passer au mot suivant
2w          => Sauter deux mots
2dw         => Supprime les deux derniers mots
0           => Aller en début de ligne
u           => Annuler la dernière action
yy          => Copier la ligne
4yy         => Copier 4 lignes
p           => Coller après
P           => Insérer avant
Ctrl + R    => Annule la dernière annulation
Ctrl + Z    => Fermer
/           => Recherche
?           => Recherche dans le sens inverse
n           => Occurrence suivante

mardi 22 novembre 2016

Tables MyISAM - Recréer les index à partir des fichiers de structure (*.frm) et de données (*.MYD)

Que faire quand MySQL renvoie le code d'erreur #1017 ?

#1017 - Can't find file: 'ma_table' (errno: 2)
MySQL n'arrive pas à ouvrir l'un des fichiers de la structure d'une table MyISAM.

Un check de la table nous confirme le problème :

mysql> check table ma_table;
+-------------------+-------+----------+----------------------------------------+
| Table             | Op    | Msg_type | Msg_text                               |
+-------------------+-------+----------+----------------------------------------+
| ma_base.ma_table  | check | Error    | Can't find file: 'ma_table' (errno: 2) |
| ma_base.ma_table  | check | status   | Operation failed                       |
+-------------------+-------+----------+----------------------------------------+
2 rows in set (0.00 sec)


Rappel de la structure physique des tables MyISAM

Sur le plan physique, une table MyISAM est constituée de 3 fichiers :
  • La définition de la table : 'tbl_name.frm'
  • le fichier contenant les données 'tbl_name.MYD'
  • le fichier contenant les index 'tbl_name.MYI'
Dans notre cas, le fichier *.MYI n'existe plus ou n'existe pas (dans le cas d'une restauration d'un backup incomplet par exemple)

Réparer un table MyISAM corrompue



Comme le fichier *.MYI n'existe plus, on ne pourra pas utiliser l'utilitaire Myisamchk pour réparer cette table.

A la place, on utilisera la commande "REPAIR TABLE" de MySQL avec le mode "USE_FRM".

Ce mode est très utile dans le cas où, justement le fichier .MYI est manquant, ou erroné (entête corrompu par exemple).

Avec ce mode, MySQL va recréer intégralement le fichier d'index.MYI, en utilisant les informations du fichier .frm de la table et les données disponibles dans le fichier .MYD.


Syntaxe de la commande:
REPAIR TABLE tbl_name[,tbl_name...] [EXTENDED] [USE_FRM]

Test de réparation sur une table corrompue


mysql> repair table ma_table USE_FRM;
+-------------------+--------+----------+-------------------------------------+
| Table             | Op     | Msg_type | Msg_text                            |
+-------------------+--------+----------+-------------------------------------+
| ma_base.ma_table  | repair | warning  | Number of rows changed from 0 to 14 |
| ma_base.ma_table  | repair | status   | OK                                  |
+-------------------+--------+----------+-------------------------------------+
2 rows in set (0.01 sec)


La réparation est un succès !

Un check de la table nous le confirme :


mysql> check table ma_table;
+-------------------+-------+----------+----------+
| Table             | Op    | Msg_type | Msg_text |
+-------------------+-------+----------+----------+
| ma_base.ma_table  | check | status   | OK       |
+-------------------+-------+----------+----------+
1 row in set (0.00 sec)


Cette démarche est très utile. mais lorsque le problème se pose pour de nombreuses tables, il faut industrialiser le processus.

Réparer un ensemble de table MyISAM corrompues

On va écrire un petit script basé sur le procédé que l'on vient de décrire.

Ce scritp pourra être lancé directement depuis l'arborescence de MySQL.
A noter que le Serveur MySQL doit être en fonctionnement.

for i in `ls *.frm`
do
    # On récupère le nom de la table à partir du nom du fichier *.frm
    l=${#i}-4;
    n=${i:0:l};
  
    echo $n;

    # On lance la réparation et le check
    mysql -u root -pxxxxx -D YYYY -B -e "-- REPAIR TABLE $n USE_FRM; CHECK TABLE $n";
    # avec :
    # -B : Mode batch - Pas d'historique
    # -e : Execute la requete et quitte
done



La ligne de commande renvoie les résultats de l'opération :
ma_base.autre_table     repair  warning Number of rows changed from 0 to 73364
ma_base.
autre_table     repair  status  OK
ma_base.
autre_table     check  status  OK



Well done !



Il ne reste plus qu'a vérifier que tout s'est bien passé et finaliser les dernier détails comme régler la valeur de l'auto-incrément, perdu dans la bataille...

Puis on lance un optimize sur toute les tables
Reprendre le code et remplace la ligne de réparation par :

mysql -u root -pxxxxx -D YYYY -B -e "-- OPTIMIZE TABLE $n ;";

+----------------------+-------+----------+----------+
| ma_base.autre_table  | check | status   | OK       |
+----------------------+-------+----------+----------+


Pour finir, on recharge toutes les tables à l'aide de Flush tables;
On peut également finir l'opération par un restart du serveur MySQL!


Have Fun !

Liens :
- http://dev.mysql.com/doc/refman/5.0/fr/repair.html

- http://dev.mysql.com/doc/refman/5.0/fr/repair-table.html



vendredi 30 septembre 2016

PostGreSQL - How to stop a query

Afficher les processus en cours


SELECT * from pg_stat_activity; 

 datid |   datname   |  pid  | usesysid | usename  |          application_name           | client_addr | client_hostname | client_port |         backend_start         |          xact_start           |          query_start          |         state_change          | waiting | state  |                                                      query
-------+-------------+-------+----------+----------+-------------------------------------+-------------+-----------------+-------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------+---------+--------+------------------------------------------------------------------------------------------------------------------
 12035 | postgres    | 21105 |    16384 | xxxxxxxx | pgAdmin III - Navigateur            | 127.0.0.1   |                 |       33104 | 2016-09-30 08:45:24.639032+02 |                               | 2016-09-30 08:45:32.628846+02 | 2016-09-30 08:45:32.629749+02 | f       | idle   | SELECT count(*) FROM pg_attribute WHERE attrelid = 'pg_catalog.pg_proc'::regclass AND attname = 'proargdefaults'



Stopper le processus concerné

  • Repérerer le pid de la requête à stopper
  • Utiliser la commande suivante :
SELECT pg_cancel_backend(pid of the postgres process);

dans notre exemple, c'est le processus 21105 qui doit être stoppé :
SELECT pg_cancel_backend(21105 );

Résultat :
 pg_cancel_backend
-------------------
 t
(1 ligne)




Have Fun !

lundi 20 juin 2016

Désactiver MySQL / PostGreSQL sur Debian

Il peut arriver d'avoir besoin de désactiver un serveur MySQL ou  PostGreSQL


pour cela, il suffit d'agir sur le démon qui contrôle le service

MySQL


Arrêter le serveur MySQL avec la commande classique :
root@----:~# /etc/init.d/mysql stop
[ ok ] Stopping MySQL database server: mysqld.


(ré)Activer ou désactiver un démon (avec sa configuration par défaut et ses niveaux d'exécution (avec sa configuration par défaut et ses niveaux d'exécution) :

root@----:~#  update-rc.d mysql disable [| enable]
update-rc.d: using dependency based boot sequencing
insserv: warning: current start runlevel(s) (empty) of script `mysql' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `mysql' overrides LSB defaults (0 1 6).


That's all !!

PostGreSQL

Arret du serveur PostGreSQL:

root@----:~# /etc/init.d/postgresql stop 

Désactivation du démon PostGreSQL :

root@----:~#  update-rc.d postgresql disable

Plus d'info sur le wiki Debian - Daemon

lundi 5 octobre 2015

Pense-Bête - Talend Open Studio

 

 

Talend Open Studio

Divers

Substitution d'un caractère dans une chaine :

StringHandling.CHANGE(chaine ,"caractère à remplacer","caractère remplaçant"))

Conversions en tout genre :

Convertir un type 'Caractère' en type 'Chaine de caractères' - Character to String :

String.valueOf("caractère à convertir")

Convertir un type 'Entier' en type 'Chaine de caractères' - Integer to String :

String.valueOf(entier)

Convertir un type 'Chaine de caractères' en type 'Entier' - String To Int :

Integer.parseInt("chaine à convertir")

Convertir un type 'Chaine de caractères' en type 'Date' - String To Date :

TalendDate.parseDate("dd.MM.yyyy","Chaine Date à convertir.")
 
Ex : Convertir la chaine de caractères représentant la date 02/10/2015
TalendDate.parseDate("dd/MM/yyyy","02/10/2015")


 

Convertir un type 'Entier' en type 'Double' - Integer to Double :

Double.valueOf(entier)

Convertir un type 'Double' en type 'Entier' - Double to Integer :

entier.intValue()


String To Float :

Float.parseFloat("chaine à convertir")
Si la chaine contient une virgule, la transformer en point :
Float.parseFloat(StringHandling.CHANGE("chaine à convertir",",","."))