Tag Archives: MySQL

Tomcat et Oracle sur un OVH mCloud

Préparation

Dans cet exemple, nous nous basons sur une installation avec un Ubuntu Server 10.04 LTS sur un mC OVH. Nous allons installer Tomcat 6.0, Oracle XE (10g Express Edition) et MySQL. Ainsi nous aurons une jolie VM pour tester plein de scénarios possibles : parfait pour mettre rapidement en ligne des développements ou faire des environnements de tests jetables : la facturation à l’heure du mC nous offre bcp de souplesse.

Dans un premier temps nous allons mettre à jour la distribution et faire quelques paramétrages de base.  Ensuite nous nous attaquerons à l’installation des différents logiciels.

Configurer SSH sur poste client

Pour se connecter à un mC par ssh il faut utiliser une clef qui est générée par l’interface d’administration. Nommons cette clef key.pem. Pour pouvoir l’utiliser pour se connecter à un mC, voici la procédure :

1 placer la clef dans le dossier $HOME/.ssh

2 modifier les droits sur cette clef :

%> chmod 600 key.pem

3 utiliser ssh en fournissant le chemin de la clef :

%> ssh -i $HOME/.ssh/key.pem root@mc-178-...

Pour ne pas se compliquer la vie à indiquer chaque fois le chemin vers la clef à utiliser, il faut indiquer dans le fichier $HOME/.ssh/config quelle clef utiliser pour quel host. Faire “man ssh_config” pour plus d’informations. Voici comment procéder :

%> vi $HOME/.ssh/config

Host mc-178-…
IdentityFile ~/.ssh/key.pem

En répétant le bloc Host/IdentityFile autant de fois que vous avez de mC. Attention cependant, quand le mC est archivé puis redémarré depuis l’interface il change de nom, il faudra donc mettre à jour ce fichier de configuration.

Mettre à jour la distribution

%> aptitude update
%> aptitude upgrade

Installer rcconf

%> aptitude install rcconf

Dé-activer bind9

Lancer rcconf et décocher bind9 dans la liste. mdadm aussi, il n’y a pas de raid sur le cloud. La liste de ce qui est supprimable n’est pas exhaustive mais je n’ai pas cherché plus.

Installer un JDK

Rien de plus simple, on passe par aptitude :

%> aptitude install openjdk-6-jdk

Ensuite vérifier si il est bien installé :

%> java -version

java version “1.6.0_18″

OpenJDK Runtime Environment (IcedTea6 1.8) (6b18-1.8-4ubuntu3)

OpenJDK Server VM (build 16.0-b13, mixed mode)

Installer Tomcat 6.0

%> aptitude install tomcat6 tomcat6-admin libtcnative-1

L’installation de libtcnative-1 nous permet d’avoir Tomcat qui utilise APR. Nous installons aussi tomcat6-admin pour avoir les applications d’administration de Tomcat. Elles nous seront utiles pour déployer de nouveaux contextes. Il nous faut ensuite installer les API JavaMail et JavaBeans Activation Framework (JAF) :

%> aptitude install libgnujaf-java libgnumail-java

Ajouter ces bibliothèques dans celles chargées par Tomcat.

%> ln -s /usr/share/java/gnumail.jar /usr/share/tomcat6/lib/
%> ln -s /usr/share/java/activation.jar /usr/share/tomcat6/lib/

Il est possible de modifier les paramètres utilisés par la jvm qui lancera tomcat en éditant le fichier /etc/default/tomcat6.  Par exemple :

JAVA_OPTS=”${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -Xms64m -Xmx256m -Dfile.encoding=UTF8 -XX:MaxPermSize=128m”

Installer Oracle XE

Ajouter la source oracle à la liste des sources (inspiré de la doc ubuntu-fr) :

%> vi /etc/apt/sources.list

Ajouter la ligne :

deb http://oss.oracle.com/debian unstable main non-free

Puis faire les commandes :

%> wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle  -O- | sudo apt-key add -
%> aptitude update
%> aptitude install oracle-x

Le soucis, c’est qu’Oracle XE a des besoins minimum en ressources et qu’il les vérifie avant de s’installer. Sur un mc classique, on va tomber sur un message de ce genre :

This system does not meet the minimum requirements for swap space.  Based on
the amount of physical memory available on the system, Oracle Database 10g
Express Edition requires 1024 MB of swap space. This system has 0 MB
of swap space.  Configure more swap space on the system and retry the installation.

En effet, les mc viennent avec aucun swap… Comme il n’est pas possible de faire une installation d’Oracle XE sans swap, on va essayer d’en créer un. Il veut un swap de 1024 Mo, alors on va lui en donner un en prenant sur l’espace disque :

%> dd if=/dev/zero of=/swapfile bs=1M count=1024
%> mkswap /swapfile
%> swapon /swapfile

Nous pouvons re-essayer d’installer XE :

%> aptitude install oracle-xe

Et configurer XE :

%> /etc/init.d/oracle-xe configure

Attention à ne pas laisser APEX sur le port 8080, nous avons en effet Tomcat qui l’utilise. Prenons le 9090 par exemple.

Nous allons aussi paramétrer bash pour avoir les variables d’environnement pour lancer les commande imp et exp et sqlplus.

On ouvre le fichier .bashrc :

%> vi $HOME/.bashrc

Et on ajoute :

export PATH=$PATH:/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin

export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server

export ORACLE_SID=XE

Charger ces modifications :

%> source $HOME/.bashrc

Nous aimerions bien pouvoir accéder à APEX depuis autre chose que localhost, alors on fait :

%> sqlplus

Se connecter avec l’utilisateur SYSTEM (le mot de passe a été définie à l’étape de configuration d’XE). Et saisir :

SQL> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);

L’accès est donc maintenant possible par : http://ip.du.mC:9090/apex/

Utiliser le pilote JDBC d’Oracle

Pour pouvoir se connecter à Oracle depuis Tomcat, nous allons avoir besoin d’ajouter le pilote JDBC aux  bibliothèques chargées par Tomcat :

%> ln -s ${ORACLE_HOME}/jdbc/lib/ojdbc14.jar /usr/share/tomcat6/lib/

Installer MySQL

%> aptitude install libmysql-java

CREATE DATABASE nomDB DEFAULT CHARACTER SET utf8;

GRANT ALL PRIVILEGES ON db_base.* TO db_user @’%’ IDENTIFIED BY ‘db_passwd';

Redémarrage après archivage du mC

Suite à un arrêt prolongé du mC, il peut changer de nom et d’ip (voir dans le manager ovh). Dans ce cas, Oracle ne sera plus accessible car il est assez sensible à ce genre de paramètres. Il va donc falloir réaliser plusieurs étapes :

Étape 1 : Renommer le host

Le nom publique de la machine est basé sur l’ip, par exemple mc-178-32-111-111.ovh.net. Si l’ip a changé, son nom aussi, cependant la configuration de la VM n’en tient pas compte. Il faut donc éditer le fichier configuration correspondant :

%> vi /etc/hostname

Et adapter le nom du hostname avec le nom affiché dans le manager OVH. Pour que la modification soit prise en compte :

%> service hostname start

On peut vérifier avec :

%> hostname --fqd

Étape 2

Il faut ensuite stopper Oracle XE – si il est actif :

%> service oracle-xe stop

Puis changer sa configuration :

%> vi $ORACLE_HOME/network/admin/listener.ora

Rechercher un bloc qui ressemble à ceci :

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
(ADDRESS = (PROTOCOL = TCP)(HOST = mc-178-32-xxx-xxx.ovh.net)(PORT = 1521))
))

Et adapter le HOST=mc-178… avec la valeur qui a été utilisée dans l’étape 1.

Ensuite on redémarre Oracle :

%> service oracle-xe start

Ne pas s’embêter avec le changement d’IP

Il est aussi possible d’avoir une adresse fixe pour chaque mC. Pour cela, depuis l’interface d’administration du mC, il faut ouvrir le détail du projet courant en cliquant sur l’icône “Éditer ce projet“. Dans le dialogue qui s’ouvre, repérer le champ “Zone (DNS)“. Il faut récupérer cette valeur et la concaténer avec le nom du mC. Exemple :

  • Nom du mc : mon-test
  • Zone DNS : abcde.project.ovh.net
  • Résultat : mon-test.abcde.project.ovh.net
  • Je peux donc accéder au Tomcat installé sur le mC via : http://mon-test.abcde.project.ovh.net:8080

Ce n’est pas très intuitif à mémoriser comme url, mais il est possible de faire une entrée CNAME dans votre DNS. Et hop ! Le tour est joué

_statusDB = null;

Configuration MySQL – quelques astuces

Paramètre Max Packet Size pour les grosses requêtes

Il faut augmenter la valeur du paramètre max_allowed_packet dans le fichier de configuration de MySQL pour permettre de gérer les grosses requêtes : principalement pour les tables qui contiennent des BLOB et CLOB qui peuvent être volumineux.

Méthodes

Éditer le fichier my.ini

Ajouter ce qui suit dans la section [mysqld] du fichier de configuration

#Max packetlength to send/receive from to server.
max_allowed_packet=8M

Utiliser l’interface graphique MySQL Administrator

Modifier le paramètre dans l’interface graphique comme dans la capture d’écran suivant :

MySQL : modification du paramètre "max_packet_size"
MySQL : modification du paramètre "max_packet_size"

Importer une base de Windows à Linux

La gestion des noms de tables est configurée différemment par défaut sous Windows ou Linux :

  • Sous Windows il ne tient pas compte de la casse,
  • Sous Linux il en tient compte.

Le passage du contenu d’une base de données d’un OS à un autre peut donc être problématique, principalement dans le sens Windows -> Linux. En effet, faire le dump depuis Windows va minimiser tous les noms de tables. Et si jamais le code source de votre application référence les tables avec des majuscules, cela peut posser des soucis. Surtout qu’il n’est pas toujours possible de re-écrire le code pour n’utiliser que des noms de tables en minuscules. Voici les solutions que j’utilise dans ces cas-là.

Choix 1 : Modifier la configuration du MySQL sous Linux

Pour importer une base MySQL depuis une machine Windows vers une machine Linux, il est possible de configurer le serveur MySQL sous Linux avec le paramètre lower_case_table_names à 1. Pour cela, éditer le fichier my.ini et placer dans la section [mysqld] la ligne suivante :

set-variable = lower_case_table_names=1

Voir la documentation MySQL pour plus de détails sur ce sujet.

Choix 2 : Transformer le fichier de dump

Si il n’est pas possible de modifier la configuration du serveur MySQL sous linux, il reste la solution – beaucoup plus sport – qui consiste à modifier le fichier de dump. En fait, il va falloir diviser le dump en deux fichiers :

Le premier fichier qui ne contient que la structure de la base :  dump.struct.sql Il peut être créé avec la commande suivante :

 mysqldump -hHOSTNAME -uUSER -p -d DBNAME > dump.struct.sql

Le deuxième fichier qui ne contient que les données de la base : dump.data.sql Il peut être créé avec la commande suivante (–hex-blob pour exporter les binaires en hexadécimal et –extended-insert=false pour avoir une commande INSERT par enregistrement) :

 mysqldump -hHOSTNAME -uUSER -p --hex-blob --extended-insert=false -t DBNAME > dump.data.sql

Il va ensuite falloir transformer ces fichiers pour que les noms des tables soient en majuscules :

Pour le fichier dump.struct.sql

C’est l’opération la plus simple. Utilisez la commande ‘tr‘ comme suit :

$ cat dump.struct.sql | tr '[:lower:]' '[:upper:]' > dump.struct.upper.sql

Et importer le fichier dump.struct.upper.sql résultant dans la base.

Pour le fichier dump.data.sql

Là c’est un peu plus compliqué, car on ne veut pas tout mettre en majuscules, car ce fichier contient aussi les données des différentes tables de notre base.

Note : il est à rapeller que le fichier dump.data.sql ne contient qu’une ligne de données – ie un INSERT – par enregistrement de chaque table.

Utiliser la commande ‘awk‘ pour modifier les commandes ‘INSERT INTO‘ et ‘LOCK TABLE‘ comme suit – chaque commande awk doit être sur une seule ligne :

$ awk '$1 == "LOCK" || $1 == "INSERT" { $3 = toupper($3) ; print $0 };
 $1 != "INSERT" && $1 != "LOCK" {print $0}; ' dump.data.sql > dump.data.upper.sql

En fonction de la structure du fichier d’import des données, il se peut que le nom des tables soit utilisé dans d’autres commandes, comme par exemple des commandes pour ignorer les intégrités référentielles : ALTER TABLE `une_table` DISABLE KEYS. Il faut dans ce cas se baser sur les scripts ci-dessus pour créer un nouveau qui corrigera ce problème.

Il n’y a plus qu’à importer le fichier dump.data.upper.sql dans la base MySQL.