MariaDB MySQL
Use DB ou prefixe
Use
Pour utiliser une table il est possible de se placer sur la DB souhaitée avec USE xxx;
puis executer les commandes dessus :
USE mysql;
SELECT user FROM user;
L'interet de cette syntaxe, est qu'en mode interactif, cela nous évite de tapper le préfixe à chaque commande pour une succession de commandes concernant la meme table.
Prefixe
il est possible de prefixer le nom des tables par le nom de la base :
SELECT user FROM mysql.user;
L'interet de cette seconde syntaxe est qu'elle est plus rapide pour exécuter 1 seule commtande sur une autre table comme ci-dessus sur une table système.
Afficher des infos
Schéma BDD
Les 3 commandes suivantes sont équivalente pour obtenir les schéma de la BDD courante:
SHOW DATABASES;
SHOW SCHEMAS;
SELECT schema_name FROM information_schema.schemata;
attention si l'option --skip-show-database
a été utilisé pour lancer le serveur, aucune info ne sera retournée à moins d'avoir le privilege SHOW DATABASES
.
Filtrer
Pour affiner les recherches utliser l'opérateur LIKE
:
SHOW DATABASES LIKE "wp%";
Tables
Pour lister les tables
SHOW TABLES;
SHOW FULL TABLES; --montre le table_type "BASE TABLE" ou "VIEW"
Filtrer avec LIKE
ou WHERE
:
SHOW FULL TABLES WHERE table_type = 'VIEW';
SHOW FULL TABLES LIKE "%post%";
Pour avoir des infos sur la structure d'une table
DESC mysql.user;
DESCRIBE mysql.user;
SHOW COLUMNS FROM mysql.user;
SHOW FULL COLUMNS FROM mysql.user;
Le mot clé FULL ajoute les champs collation
, privileges
et comment
Filtrer
Filtrer SHOW [FULL] COLUMNS
avec LIKE
ou WHERE
:
SHOW COLUMNS FROM wp_blog_behrouze.wp_posts LIKE "post%";
SHOW COLUMNS FROM wp_blog_behrouze.wp_posts WHERE Type LIKE "text";
Users
Utilisateur courant
select user();
select current_user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.001 sec)
Liste des utilisateurs de la BDD
SELECT user, host FROM mysql.user;
SELECT user,
host,
is_role,
password_expired,
Password
FROM mysql.user;
Permissions
Les Users sont créés de base sans aucun droits, c'est le GRANT USAGE
, cela leurs permets uniquement de se logger.
Pour checker les permissions du user avec lequel on s'est connecté:
SHOW GRANTS; -- équivalent à SHOW GRANTS FOR CURRENT_USER; ou CURRENT_USER();
Pour lister les users de la BDD (et avoir la combinaison user@host
) :
SHOW GRANTS FOR le_user_a_checker@le_host;
A noter qu'il est possible d'écrire:
'username'@'hostname'
"username"@"hostname"
`username`@`hostname`
Threads courants
Les 2 commandes suivantes sont équivalentes:
SHOW PROCESSLIST;
SELECT id,
user,
host,
db,
command,
time,
State,
Info,
Progress
FROM information_schema.processlist;
Créations
User
CREATE USER [IF NOT EXISTS] user_a_creer
IDENTIFIED BY 'password';
user_a_creer
peut etre une combinaison nom_user@host
ou juste nom_user
auquel cas le host attribué est %
automatiquement. La partie host designe la machine depuis laquel ce user pourra se connecter, et %
signifie depuis partout (donc attention on permet les remote access) !
Pour modifier le mot de passe du user précédement créé :
ALTER USER user_a_creer IDENTIFIED BY 'mon_nouveau_password';
⚠ Attention si on utilise la syntaxe IDENTIFIED BY PASSWORD
au lieu de IDENTIFIED BY
, le SGDBD s'attendra a recevoir un hash de password que l'on obtiendra grâce à la fonction PASSWORD
par un SELECT PASSWORD('mon_super_password');
ce qu'il nous fera comprendre par un message :
ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number
Permissions
Une fois le User créé il faut lui attribuer des droits pour qu'il puisse interagir avec la BDD.
Les permissions (ou droits) sont associés à la database
, un table
, une routine, ou à des columns
particulière d'une table.
L'attribution de ces droits se fait a l'aide de l'instruction GRANT
, et on attribue le droit XXX sur l'élément de BDD à l'utilisateur nom_user comme ceci :
GRANT XXX
ON la_bdd_voulue.*
TO nom_user;
avec XXX le ou les privileges a attribuer, avec les plus courants: ALL PRIVILEGES
, SELECT
, INSERT
, UPDATE
, DELETE
, INDEX
, GRANT OPTION
Permissions particulières
ALL PRIVILEGES
avec la permission ALL PRIVILEGES
il nous est possible de toutes les attribuer (en dehors de GRANT OPTION
) en une fois :
GRANT ALL PRIVILEGES ON *.* to 'nom_user'@'localhost';
USAGE
C'est la permission qui est attribuée par défaut à la création d'un utilisateur
MariaDB [(none)]> CREATE USER toto IDENTIFIED BY 'mon_super_password';
Query OK, 0 rows affected (0.007 sec)
MariaDB [(none)]> SHOW GRANTS FOR toto@'%';
+--------------------------------------------------------+
| Grants for toto@% |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO `toto`@`%` IDENTIFIED BY PASSWORD '*A62D57DD7D1835DC24EE4D41B4400E32C40B46B6' |
+--------------------------------------------------------+
1 row in set (0.001 sec)
GRANT OPTION
Le privilège GRANT OPTION
qui attribut le droit de modifier les permissions (à la hauteur des permission de l'utilisateur selectionné) n'est pas inclus dans le ALL PRIVILEGES
.
Pour attribuer ce droit particulier il faut compléter la requete précédente ainsi :
GRANT ALL PRIVILEGES ON *.* to 'nom_user'@'localhost' WITH GRANT OPTION;
Connexion distant
Il faut tout d'abord disposer d'un client mysql : sudo apt install mariadb-client -y
Pour autoriser les connexion distantes il faut intervenir sur la configuration réseau du serveur, dans la config mariadb et dans le paramétrage de la base de données.
Une fois le client installé, se connecter avec les credentials du user (créé pour une connexion distante avec soit %
soit l'adresse IP
en tant que host):
mysql -h host_name -u mon_user -p
config Serveur
Coté serveur vérifier que le port mariadb/mysql 3306
(ou celui que vous aurez défini dans /etc/mysql/mariadb.cnf
) est bien ouvert au niveau réseau :
- vérifier les config du firewall local ufw ou iptables -L
- vérifier que mysql écoute bien sur le port
3306
avec unnetstat -tupln
config mariadb
autoriser les connexions distantes au daemon mariadbd
dans le fichier de config du serveur : /etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 127.0.0.1 # interdit les connexions distantes
bind-address = 0.0.0.0 # autorise les connexions distantes
redémarrer le service :
sudo systemctl restart mariadb
config en BDD
Attribuer les droits (pas forcément ALL
) au couple username@host
à l'entité de BDD souhaitée:
GRANT ALL ON la_bdd.* to 'username'@'hostname' IDENTIFIED BY 'password'
Le FLUSH PRIVILEGES
n'est pas nécessaire pour appliquer les modifs comme indiqué dans la doc.
Astuces
Affichage en colonne
Pour un affichage plus lisible, surtout lors d'un select *
mysql nous offre la possibilité d'afficher en mode colonne en finalisant la commande par \G;
:
SELECT * FROM mysql.user WHERE User LIKE 'usr_%' \G;
Mode interactif
CTRL + U
ou CTRL + w
supprime les caractères précédent le curseur, donc tout ce qui est a sa gauche
CTRL + K
idem pour les caratères à droite jusqu'à la fin de ligne
CTRL + L
pour clear l'affichage
MariaDB possède un ensemble de "commandes" exécutés dans une session interactive en saisissant par ex \? + ENTER
pour obtenir l'accès à l'aide en ligne.
Les commandes intéressantes sont :
\G
affichage en colonne/vertical
\e
pour editer la commande courante dans l'$EDITOR
\. script.sql
pour exécuter le script en argument
\s
status du serveur
\! cmd
execute une commande shell
\T fichier.log
permet de spécifier un fichier dans lequel toute la session sera loggée
Historique
l'historique des commandes exécutée en mode interactif est conservé dans le fichier .mysql_history
situé dans le home de l'utilisateur. Pour info ce fichier est encodé
Please look at the ".mysql_history" file as file with a binary format, managed by the MariaDB or MySQL application
CTRL + R
nous permet de chercher dans l'historique des commandes passées.
Une fois cette combinaison de touche entrée, on entre dans le mode Recherche dans l'historique de MySQL. La navigation s'effectue ensuite via CTRL + R
(ancien) et CTRL + S
(récent).
Exécution de script
mysql db_name < script.sql > output.tab
voir toutes les options de la CLI mysql
Backup à la barbare
La carte micro-sd d'un de mes Raspberry Pie a laché, mais heureusement pour moi elle était encore lisible (mais dead en écriture).
Le backup à la barbare consiste à récupérer le contenu du dossier /var/lib/mysql
sur la carte cramée puis sur le nouveau serveur (ayant une installation de mariadb) :
- arreter l'instance de mariadb avec
sudo systemctl stop mariadb
- remplacer le dossier
/var/lib/mysql
local par celui de l'ancien serveur - supprimer les ib_logfiles
rm /var/lib/mysql/ib_logfile*
sans quoi on aura des erreurs du type[ERROR] Unknown/unsupported storage engine: InnoDB
lors de l'accès aux données sudo systemctl start mariadb
Liens
- MySQLTutorial.org site de tuto très clair 🌟 avec de nombreux exemples
- MySQL docs
- MariaDB docs (pas très ergonomique cette doc 😵)