Archives mensuelles : décembre 2018

[Oracle] : comment lister les tables lockées et les dévérouiller ?

Un article oracle, cela faisait longtemps il me semble. Lorsqu’un moteur de base de donnée travaille, il est parfois nécessaire pour lui de vérouiller (locker) certains éléments notamment des tables.

Vous pouvez retrouver d’autres articles de ce type sur la page databases.

L’inconvénient c’est que suivant les cas vous ne pouvez plus y accéder. Attention, généralement un lock a toujours une bonne raison d’être posé (sauvegarde en cours, modifications, plantage, processus en attente…). Bien que chaque moteur est conçu pour limiter au maximum ces verrous cela arrive encore (les verrous se trouvent maintenant plus au niveau des lignes que sur des tables entières et le mvcc intervient également). Mais des moteurs comme mysql myisam ne savent pas fonctionner autrement (au profit d’autres intérêts : performance notamment).

Bref, pour oracle, et pour d’autres moteurs avant d’intervenir vous devez identifier pourquoi les tables sont lockées (parfois cela vient de connexions qui bouclent, de sauvegardes en cours qui buggent…). Bref comment lister les tables en question ?

A l’aide d’une requête sur la vue oracle v$locked :

> sqlplus '/ as sysdba'
> select
obj.owner, obj.object_name, obj.object_type,
sess.sid, sess.serial#, sess.status, sess.osuser, sess.machine
from
v$locked_object lock, v$session sess, dba_objects obj
where
sess.sid = lock.session_id and lock.object_id = obj.object_id;

Vous voyez aussi l’intérêt d’appeler aussi la table dba_objects et la vues v$session car vous pouvez plus facilement identifier la session et le user à l’origine du lock. Remarquez aussi que des locks peuvent être posés sur d’autres objets que des tables.

Mais que faire ensuite ? déverrouiller pardi lol !

Et là c’est simple.

> sqlplus '/ as sysdba'> alter table nom_de_table disable table lock;

Voilà je pense que nous avez fait le tour sur cette petite manip que l’on peut demander à un dba oracle.

[Linux] comment activer son wifi en ligne de commande ?

Fichu WIFI, parfois il s’active bien, d’autres fois je me galère pour le lancer. Du coup, je me préfère le gérer en ligne de commande. A terme cela peut permettre d’aboutir à un script si vraiment j’en ai raz le bol.

Vérifiez les paramètres de votre interface wiki

Pour cela on utilise le binaire « iw »

└─ $ ▶ /sbin/iw dev
phy#0
Interface wlp3s0
ifindex 3
wdev 0x1
addr xx:xx:xx:xx:xx:xx
type managed

Ainsi vous pouvez retenir le nom de votre interface.

Vérifiez si l’interface wifi est UP

On utilise le binaire « ip » comme ceci

└─ $ ▶ ip link show wlan0
Device "wlan0" does not exist.

Et là confirmation, je n’ai pas de wifi.

Montez votre interface

Toujours avec IP on tente de monter la carte.

└─ $ ▶ sudo ip link set wlp3s0 up 
RTNETLINK answers: Operation not possible due to RF-kill

Mais là on a un message d’erreur. On ne peut pas remonter la carte car il y a un verrou. Donc on va le lever.

└─ $ ▶ rfkill list all
0: tpacpi_bluetooth_sw: Bluetooth
Soft blocked: yes
Hard blocked: no
1: tpacpi_wwan_sw: Wireless WAN
Soft blocked: no
Hard blocked: no
2: phy0: Wireless LAN
Soft blocked: yes
Hard blocked: no

Bon pour simplifier on va tous les délockés.

sudo rfkill unblock all

et ensuite on retente de monter notre wlp3s0

└─ $ ▶ sudo ip link set wlp3s0 up
└─ $ ▶ ip link show wlp3s0
3: wlp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

et là pas de souci.

Vérification et connexion

Maintenant vérifions si nous avons du wifi de connecter dessus.

└─ $ ▶ sudo /sbin/iw wlp3s0 link
Not connected.

Donc rien pour l’instant. Alors on lance un scan des réseaux wifi à disposition.

└─ $ ▶ sudo /sbin/iw wlp3s0 scan
BSS xx:xx:xx:xx:xx:xx (on wlp3s0)
	TSF: 4058009 usec (0d, 00:00:04)
	freq: 2462
	beacon interval: 100 TUs
	capability: ESS Privacy SpectrumMgmt ShortSlotTime RadioMeasure (0x1511)
	signal: -6.00 dBm
	last seen: 88 ms ago
	Information elements from Probe Response frame:
	SSID: iPhone
	Supported rates: 1.0* 2.0* 5.5* 11.0* 18.0 24.0 36.0 54.0 
	DS Parameter set: channel 11
	Country: FR	Environment: Indoor/Outdoor
		Channels [1 - 13] @ 20 dBm
	Power constraint: 0 dB
	TPC report: TX power: 15 dBm
	ERP: <no flags>
	Extended supported rates: 6.0 9.0 12.0 48.0 
	RSN:	 * Version: 1
		 * Group cipher: CCMP
		 * Pairwise ciphers: CCMP
		 * Authentication suites: PSK
		 * Capabilities: 16-PTKSA-RC 1-GTKSA-RC (0x000c)

Puis connexion au wpa/wpa2

sudo wpa_supplicant -B -D wext -i wlp3s0 -D nl80211 -c /etc/wpa_supplicant.conf

/sbin/iw wlp3s0 link
Connected to xx:xx:xx:xx:xx:xx

Utiliser DHCP pour obtenir une adresse IP

sudo dhclient wlp3s0

Et voilà, vous n’avez plus qu’à faire quelques ping pour tester.

 

[Bash] : le bloc note de Wget

Un article pour retenir l’essentiel dans la commande wget. C’est une commande que l’on utilise souvent mais trop rarement on s’y intéresse en détails.

Quelques essentiels :

  • Télécharger simplement un fichier
wget http://google.fr
  • Pour savoir où vous en êtes en cas de crash lors du téléchargement
wget -c http://google.fr
  • Télécharger en arrière plan
wget -b http://google.fr
  • Limiter la vitesse de téléchargement
wget --limit-rate=200k http://google.fr
  • Télécharger à partir d’un fichier contenant une liste d’url
wget -i liste.txt
  • Aspirer la totalité d’un site
wget --mirror -p --convert-links -P ./madestination/ https://xavki.blog
  • Aspirer un ftp avec user/password
wget --ftp-user=user --ftp-password=motdepasse ftp://url

[MySql] : sauvegarder les bases une à une individuellement

Sauvegarder ses bases de données est essentiel en cas de crash mais aussi pour être en mesure de fournir à tout moment un dump. N’oubliez pas que vous pouvez retrouver les autres articles databases sur cette page.

Par contre il existe de nombreuses manière de faire. Mysql fait cela très bien et très facilement. Mais parfois on a des besoins particuliers.

Par exemple, comme les restaurations portent souvent sur une seule base, on ne souhaite pas disposer d’un dump complet. D’ailleurs cela peut aussi éviter de se trimbaler des fichiers trop gros ou encore de gérer la confidentialité de données entre clients.

Comment sauvegarder les bases mysql une à une c’est à dire en ayant un fichier par base ?

C’est assez simple avec une petite boucle :

for db in $(mysql -e 'show databases' -s --skip-column-names); do mysqldump $db | gzip > "/backups/mysqldump-$(hostname)-$db-$(date +%Y-%m-%d-%H.%M.%S).gz"; done

Donc :

  • on dresse la liste des bases avec un show databases
  • on parcourt tout cela avec un for
  • pour chaque base on lance un mysqldump
  • puis on gzippe chaque fichier généré

[Bash] : comment remettre en place le bashrc ou le bash_profile par défaut ?

Un article très court aujourd’hui pour revenir sur une situation qui m’est déjà arrivée. Tout heureux d’avoir trouvé une nouvelle fonction à mettre en place dans mon bahsrc, je décide de modifier celui-ci. Donc je faic un vim sur mon fichier favori et je le source.

Et là paff le chien. Mon bashrc ne fonctionne plus donc je reste bloqué sur mon terminal. Et là ce cas est assez facile pour revenir dessus car je sais quelles modifications j’ai fait. Mais cela peut arriver avec des comptes d’exploitation que l’on pousse sur un parc de serveur. Et alors imaginez cela sur un bastion c’est un peu balot.

Parfois on peut avoir besoin de restaurer un bashrc fonctionnel très rapidement. Dans ce cas la solution est de restaurer le bashrc par défaut à partir des squelettes à votre disposition dans /etc/skel :

20:33:33 - oki @ doki /etc/skel
└─ $ ▶ ls -larth
total 28K
-rw-r--r-- 1 root root 3,7K sept. 1 2015 .bashrc
-rw-r--r-- 1 root root 220 sept. 1 2015 .bash_logout
-rw-r--r-- 1 root root 655 mai 16 2017 .profile
cp /etc/skel/.bashrc ~/

Une fois ce copier/coller réalisé, vous devez sourcer le fichier si vous volez :

source ~/.bashrc
board game business challenge chess

Photo by Pixabay on Pexels.com

[Python] : quelques minutes avec Tkinter (GUI)

Tkinter est un module graphique pour python, un GUI (Graphical User Interface). Bien sûr, cet article intéressera les débutants car il s’agit de découvrir le module le plus simplement possible mais avec un exemple « concret ». Je dis concret en double quotes car en fait ce n’est pas si utile que cela mais il faut bien avoir un but pour développer et écrire quelques lignes de codes.

Pour apprendre, je vous propose de réaliser un petit soft qui va avoir deux boutons (un pour quitter, l’autre pour lancer une action). L’action consistera à réaliser la liste des répertoires de ma home « ~ ». Et on affiche tout cela dans une fenêtre spécifique. Comme ceci :

file_manager

Nous utiliserons deux modules :

  • tkinter pour l’interface graphique
  • os : pour lister les répertoires au niveau de notre système
#!/usr/bin/python
#coding: UTF-8
import os
from Tkinter import *

def affichageRepertoires():
    path = os.path.expanduser("~/")
    for f in os.listdir(path):
        cadre2.insert(END, f + "\n")

if __name__ == '__main__':
    principale = Tk()
    cadre1 = LabelFrame(principale, text="FILE MANAGER", font="Arial 14")
    cadre1.grid(row=0, columnspan=2, sticky='E')

    Button(cadre1, text="Afficher répertoire", font="Arial 8", command=affichageRepertoires).grid(row=1, column=1)
    Button(cadre1, text="Quitter", font="Arial 8", command=principale.quit).grid(row=1, column=2)

    cadre2 = Text(master=principale)
    cadre2.grid(row=2, column=1, sticky=NW)
    
    cadre3 = Scrollbar(principale, orient=VERTICAL, command=cadre2.yview)
    cadre3.grid(row=2, column=2, rowspan=15, columnspan=1, sticky=NS)
    cadre2.config(yscrollcommand=cadre3.set, font=('Arial 8'))

    root.mainloop()

Les différentes lignes de codes permettent :

  1. codage en UTF8 (pour ne pas avoir de problème avec les accents)
  2. import des deux modules
  3. création d’une fonction  affichageRepertoires() :
    1. utilisation de os.path : pour récupérer les chemins
    2. parcourir la liste obtenue
    3. afficher les éléments dans le cadre 2 avec un renvoi à la ligne à chaque fois
  4. le bloc principal :
    1. création de la fenêtre principale
    2. définition du premier cadre de type Label (avec titre intégré)
    3. placement du cadre 1 aligné à droite dans la fenêtre et sur la première ligne d’une grille « imaginaire »
    4. ajout des deux boutons dans le cadre 1 avec le texte qui correspond et surtout la commande qui va avec. Pour le premier la commande lance notre fonction affichageRepertoires() pour le second elle quitte la fenêtre « principale ». Attention l’alignement se fait toujours sur notre grille mais en ligne n°1 et colonne 1 puis 2 en fonction du bouton.
    5. création du cadre 2 dans la fenêtre « principale ». Ce cadre sera alimenté par la fonction affichageRepertoires().
    6. la grille nous permet une fois de plus de placer notre cadre en ligne n°2/colonne n°1 et aligné en haut à gauche (NW : nord ouest)
    7. le cadre 3 consiste à ajouter la barre de défilement dans la fenêtre « principale » en se basant sur la fenêtre cadre 2 (command)
    8. Positionnement de cadre 3
    9. Configuration du cadre 2 avec la barre de défilement de cadre3

Tkinter pour python fait partie des modules très bien documentés. Vous pouvez consulter cette page en français et pour être plus complet cette page en anglais.

 

[Mysql] : comment générer le sql pour recréer un table ?

C’est un article similaire à celui que j’ai déjà pu faire pour oracle mais vous allez vous rendre compte qu’avec mysql c’est plus simple. Eh oui pas de dbms et autres trucs tordus de ce genre un simple « show » suffit.

Ah oui, j’allais oublier qu’avant de faire  ce genre de manip par un « show » je passais par des manips sur les dumps… autant dire que ce n’était pas léger et que cela a des limites très vite atteintes.

Alors comment récupérer le sql d’une table avec la commande « show » ? Facile

mysql> show create table matable;
+---------+-------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-------------------------------------------------------------------------------------------------------------------------------------+
| matable | CREATE TABLE `matable` (
`id` int(11) DEFAULT NULL,
`monchamp` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+-------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)

C’est facile donc et très efficace. Et vous comment pratiquez vous mysql et quelle version ?

mysql-recreate-table

[Mysql] : comment merger deux tables en une ?

Merger des tables sur mysql c’est possible. En effet, vous pouvez faire des associations de table assez facilement. Personnellement je ne suis pas un fan de cette solution nous allons voir pourquoi un peu plus loin. Commençons par créer deux tables similaires au niveau de la structure :

mysql> create table tab3 (f1 varchar(255)) ENGINE=MyISAM;
Query OK, 0 rows affected (0,08 sec)

mysql> create table tab4 (f2 varchar(255)) ENGINE=MyISAM;
Query OK, 0 rows affected (0,08 sec)

Puis insérons des données dans ces tables :

mysql> insert into tab4 values ('table 2');
Query OK, 1 row affected (0,00 sec)

mysql> insert into tab4 values ('table 2');
Query OK, 1 row affected (0,00 sec)

Maintenant créons la table de merge :

mysql> create table fusion (f1 varchar(255)) ENGINE=MERGE UNION=(tab3,tab4) INSERT_METHOD=LAST;
Query OK, 0 rows affected (0,07 sec)

Et voici maintenant son contenu :

mysql> select * from fusion;
+---------+
| f1 |
+---------+
| table 1 |
| table 1 |
| table 2 |
| table 2 |
+---------+
4 rows in set (0,01 sec)

Mais supprimons une des tables composant la table de merge et procédons à un nouveau SELECT :

mysql> drop table tab3;
Query OK, 0 rows affected (0,00 sec)

mysql> select * from fusion;
ERROR 1168 (HY000): Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist

Et voilà mysql nous jette car nous venons de casser un des éléments constitutif de la table de merge. Pas terrible. Vous comprenez donc pourquoi il vaut mieux éviter de créer des tables de merge.

Et vous utilisez vous des tables de ce type ? avez vous rencontré des problèmes avec ?

mysql_table_merge

[Mysql] : comment déconnecter un utilisateur ? (de force)

Mysql est un moteur de bdd performant et sympathique à l’utilisation, un peu à l’image de postgres. Si vous utilisez un WAMP ou LAMP pour faire vos développements, vous utilisez donc Mysql. C’est d’ailleurs certainement ce qui a permis la très forte progression de ce moteur ces dernières années.

Retrouvez d’autres articles sur la page databases.

Un DBA lorsqu’il doit intervenir sur une base ou un moteur, doit parfois être le seul connecter à la base ou à la machine. Mais certaines applications ne rendent pas la main très facilement. C’est souvent moins le cas des utilisateurs humains mais cela peut aussi être le cas d’une personne réticente ou encore mieux le DBA a besoin d’y aller comme un gros bourin et décide de reprendre la main de force.

Bref c’est dans ces derniers cas que l’on peut s’intéresser à vouloir déconnecter un user par la force (en lui coupant son processus).

Comment fait-on ?

La première chose à faire c’est de lister les processus en cours et les users et bases correspondants.

Voici la commande :

mysql> show processlist;

le résultat prend la forme suivante :

 +-----+------+-----------+---------+---------+-------+-------+------------------+
    | Id  | User | Host      | db      | Command | Time  | State | Info             |
    +-----+------+-----------+---------+---------+-------+-------+------------------+
    | 235 | appli1 | 192.20.1.2 | mydb | Query   | 28619 |       | NULL             |
    | 238 | owner | localhost | mydb | Query   |   853 |       | NULL             |
    | 241 | owner | localhost | NULL    | Query   |     0 | NULL  | show processlist |
    +-----+------+-----------+---------+---------+-------+-------+------------------+
    3 rows in set (0.00 sec)

Dans notre cas nous voulons déconnecter appli1. Pour cela il suffit de repérer l’Id de la session (soit 235). Puis lancer :

mysql> kill 235

Et voilà le user appli1 est déconnecté.

N’hésitez pas en commentaire à partager vos pratiques sur mysql.

MySQL.svg

Pourquoi ce blog et cette chaine ?

Hey la dream-team comment allez-vous ? de mon côté cela se déroule plutôt bien d’autant plus que les retours sur le blog et la chaine sont plutôt bons.

Ces dernières semaines, j’ai  mis un bon coup de boot sur la chaine youtube pour vous partager mon attirance pour docker. Je pense que nous aurons fini de faire le tour des principales choses à connaitre sur docker et les outils liés (compose et swarm).

C’est donc une première pierre dans ce qui nous servira pour entrer dans le monde de l’intégration continue et du devops. Docker est en effet très souvent utilisé dans ce domaine pour réaliser les tests. Bien sûr docker peut aussi ếtre utilisé en production mais pour l’instant on va se la jouer modeste.

Voici les playlists à découvrir sur la chaîne youtube :

Les prochains outils que nous découvrirons ensemble seront : gitlab, jenkins…

En parallèle de tout cela, je souhaite vous proposer aussi toujours plus d’astuces linux et ouvrir un volet scripting. Ce dernier sera l’occasion de découvrir le scripting souvent utilisé côté administration système. Il ne s’agit pas de développer des applications mais de découvrir des manipulations utiles au quotidien.

Pour faire le point sur « pourquoi xavki », je vous invite à regarder la vidéo ci-dessous.

 

Et comme je vous l’explique dans cette vidéo, les meilleurs encouragements et récompenses que vous pouvez me donner c’est le partage (pouces bleux, commentaires…).

Merci pour votre confiance.