Soutenir Vision du Web dans son partage de logiciels et de ressources libres

Ce mineur crée de la monnaie numérique Monero pour soutenir Vision du web.
Merci de désactiver votre bloqueur de publicité.
Aucune publicité ne sera affichée.
Le mineur utilise les ressources de votre machine pour créer gratuitement de la monnaie numérique.
Le montant des donations pour Vision du web est de 0.073098684737773 Monero.

Installer MySQL sur Debian : Différence entre versions

De Wiki. Analyse, Communication, Développement, Hacking.
Aller à : navigation, rechercher
m (Trouver le fichier my.cnf avec find)
m (Établir une connexion distante)
 
(2 révisions intermédiaires par le même utilisateur non affichées)
Ligne 12 : Ligne 12 :
 
  apt install mysql-server
 
  apt install mysql-server
  
==Créer un utilisateur MySQL==
+
==SQL==
 +
===Utilisateur MySQL===
 
  # On se connecte au serveur MySQL avec l'utilisateur root en ciblant le serveur localhost.
 
  # On se connecte au serveur MySQL avec l'utilisateur root en ciblant le serveur localhost.
 
  mysql -u root -p -h localhost
 
  mysql -u root -p -h localhost
Ligne 73 : Ligne 74 :
 
  DROP DATABASE redmine;
 
  DROP DATABASE redmine;
  
==Créer une base==
+
===Base===
 +
# Lister les bases de données.
 +
SHOW DATABASES;
 +
 
 +
# Créer une base de données.
 
  CREATE DATABASE LaBase;
 
  CREATE DATABASE LaBase;
 
  USE LaBase;
 
  USE LaBase;
  
==Créer une table==
+
===Table===
 +
# Créer une table.
 
  CREATE TABLE SystemEventsProperties
 
  CREATE TABLE SystemEventsProperties
 
  (
 
  (
Ligne 130 : Ligne 136 :
 
  Autre solution pour changer le mot de passe de l'utilisateur root proposée par Korben : https://korben.info/comment-changer-le-mot-de-passe-root-perdu-de-mysql.html
 
  Autre solution pour changer le mot de passe de l'utilisateur root proposée par Korben : https://korben.info/comment-changer-le-mot-de-passe-root-perdu-de-mysql.html
  
==Établir une connexion distante==
+
=Établir une connexion distante=
 
  Donner les privilèges à l'utilisateur MySQL pour autoriser une connexion distante.
 
  Donner les privilèges à l'utilisateur MySQL pour autoriser une connexion distante.
 
  Source : http://www.commentcamarche.net/forum/affich-28220763-connexion-a-distance-sur-une-base-de-donnees
 
  Source : http://www.commentcamarche.net/forum/affich-28220763-connexion-a-distance-sur-une-base-de-donnees
Ligne 142 : Ligne 148 :
  
 
  Connexion à une base MySQL : mysql -uUTILISATEUR -pPASSWORD -hSERVEUR -D BASEDEDONNEES -e 'SELECT * FROM TABLE'
 
  Connexion à une base MySQL : mysql -uUTILISATEUR -pPASSWORD -hSERVEUR -D BASEDEDONNEES -e 'SELECT * FROM TABLE'
  Ajouter SSL :
+
  Utiliser SSL est impératif pour une connexion distante pour ne pas se faire dérober son accès utilisateur.
 +
Voir ci-dessous la commande proposée pour une connexion SSL.
  
 
==MySQL en ligne de commande==
 
==MySQL en ligne de commande==

Version actuelle datée du 13 novembre 2018 à 17:01

Naviguer sur le wiki : Accueil du wiki - Administrateur - Développeur - Intégrateur - Marketing - Multimédia - Objectifs - We make Hack
Naviguer sur le site : Accueil du site - Les annuaires - Les éditoriaux - Le forum - Les outils - Les projets
 
Consulter le sommaire de cette page en étant déconnecté du réseau : Télécharger le sommaire en PDF

Installer MySQL sur Debian

Installation des paquets MySQL

# Connaître les versions de MySQL disponibles dans les dépôts.
apt-cache search mysql-server
# Le paquet mysql-client permet de lancer une commande MySQL vers une base de données distante.
apt install mysql-client
# Le paquet mysql-server permet de faire tourner un serveur MySQL pour y stocker des données.
apt install mysql-server

SQL

Utilisateur MySQL

# On se connecte au serveur MySQL avec l'utilisateur root en ciblant le serveur localhost.
mysql -u root -p -h localhost
# Créer une base de données.
CREATE DATABASE redmine CHARACTER SET utf8;
# Créer un utilisateur et son mot de passe.
CREATE USER 'nouvel_user'@'localhost' IDENTIFIED BY 'mot_de_passe';
# Créer un utilisateur, donner les privilèges, en même temps. (A tester.)
GRANT ALL PRIVILEGES ON testing.* TO [email protected] IDENTIFIED BY 'test_pass';
# Définir un mot de passe pour un utilisateur initialement sans mot de passe.
SET PASSWORD FOR 'nouvel_user'@'localhost' = PASSWORD('12345');
# Changer le mot de passe administrateur (root) de MySQL
# La chaîne PASSWORD cryptera le mot de passe.
update user set password=PASSWORD("new_mdp") where User='root';
exit
killall mysqld
/etc/init.d/mysql start
# Créer un utilisateur avec PASSWORD permet d'ajouter le hash du mot de passe pour ne pas l'enregistrer en clair.
CREATE USER 'nouvel_user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19';
# Donner tous les droits :
GRANT ALL PRIVILEGES ON *.* TO 'nouvel_user'@'localhost' IDENTIFIED BY 'mot_de_passe' WITH GRANT OPTION;
# ou
GRANT ALL PRIVILEGES ON Base.* TO 'nouvel_user'@'localhost';
# Donner des droits retreints :
GRANT CREATE, SELECT, UPDATE ON redmine.* TO 'Gestionnaire'@'localhost';
# Enlever les droits à un utilisateur :
REVOKE CREATE, SELECT, UPDATE ON redmine.* FROM 'Gestionnaire'@'localhost';
Si les droits appliqués à l'utilisateur ne suffisent pas, adapter la ligne suivante avec les bonnes autorisations.
# Commandes SQL complémentaires pour gérer les droits utilisateurs : http://www.mysqltutorial.org/mysql-grant.aspx
# Article complémentaire : https://codes-sources.commentcamarche.net/faq/275-creer-un-utilisateur-mysql-avec-des-droits-specifiques-sur-une-base-particuliere
# GRANT ALTER, CREATE, SELECT, UPDATE, DELETE ON redmine.* TO Gestionnaire;
# On met fin à la connexion.
quit;
# ou
exit;
# ou
exit
# Se reconnecter avec l'utilisateur qui a été créé.
mysql -u nouvel_user -p -h localhost
# Renommer un utilisateur MySQL.
RENAME USER 'identifiant'@'serveur' TO 'nouveau_identifiant'@'nouveau_serveur';
# Supprimer un utilisateur.
mysql> DROP USER 'identifiant'@'serveur';
# Supprimer une base de données.
DROP DATABASE redmine;

Base

# Lister les bases de données.
SHOW DATABASES;
# Créer une base de données.
CREATE DATABASE LaBase;
USE LaBase;

Table

# Créer une table.
CREATE TABLE SystemEventsProperties
(
ID int unsigned not null auto_increment primary key,
SystemEventID int NULL ,
ParamName varchar(255) NULL ,
ParamValue text NULL
);

Trouver le fichier my.cnf avec find

# Trouver le fichier my.cnf avec find / -name my.cnf
/etc/mysql/my.cnf

Ajouter une configuration

# Ouvrir le fichier de configuration personnalisé mysql.cnf dans le dossier conf.d de mysql.
/etc/mysql/conf.d# nano mysql.cnf
# Ajouter une règle personnalisée, par exemple, loguer les erreurs dans syslog :
[mysqld_safe]
syslog
Ok-ko.png Source : https://www.fromdual.com/mysql-reporting-to-syslog

Perte de l'accès root à une base de données MySQL

# Éditer le fichier my.cnf et ajouter une section [mysqld]
[mysqld]
skip-grant-tables
Redémarrer Mysql.
Ne fonctionne pas dans mon cas car il manquait "[mysqld]".
Starting MySQL Community Server...
my_print_defaults: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 20!
my_print_defaults: [ERROR] Fatal error in defaults handling. Program aborted!
mysql.service: Main process exited, code=exited, status=1/FAILURE
Lancer mysql avec mysql -p et sans mot de passe.
Recréer le compte root avec les bons droits.
The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
# Bloqué à cette étape, suite à ce message d'erreur lors de la création d'un utilisateur.
Arrêter mysql.
Rééditer le fichier my.cnf pour enlève skip-grant-tables.
Redémarrer mysql.
Sinon, utiliser mysql_secure_installation pour configurer les paramètres de l'utilisateur root automatiquement.
Fonctionne, sauf que c'est le mot de passe de l'utilisateur root de mysql qui est demandé, donc, si on l'a perdu, on n'est pas plus avancé.
Il est alors possible d'utiliser le terminal, avec la commande mysql -p et le mot de passe du root pour se connecter.
Relancer mysql_secure_installation pour ne pas autoriser root directement. Semble ne pas fonctionner, car, j'arrive à me connecter en root à PHPMyAdmin !
Autre solution pour changer le mot de passe de l'utilisateur root proposée par Korben : https://korben.info/comment-changer-le-mot-de-passe-root-perdu-de-mysql.html

Établir une connexion distante

Donner les privilèges à l'utilisateur MySQL pour autoriser une connexion distante.
Source : http://www.commentcamarche.net/forum/affich-28220763-connexion-a-distance-sur-une-base-de-donnees
La base de données LWS permet t'elle l'accès à distance pour un mutualisé ? NON !
Pour VPS : https://aide.lws.fr/base/Serveurs-dedies/ISPConfig/creer-acces-distant-base-de-donnees-MySQL-sur-serveur-VPS
Pour serveur dédié : https://blog.lws-hosting.com/serveur-dedie/mysql-se-connecter-a-distance-mysql-howto-part-33
# Complément pour configurer MySQL pour autoriser une connexion distante.
Source : https://technique.arscenic.org/lamp-linux-apache-mysql-php/mysql-le-serveur-de-bases-de-donnees/article/acces-distant-a-un-serveur-mysql
Connexion à une base MySQL : mysql -uUTILISATEUR -pPASSWORD -hSERVEUR -D BASEDEDONNEES -e 'SELECT * FROM TABLE'
Utiliser SSL est impératif pour une connexion distante pour ne pas se faire dérober son accès utilisateur.
Voir ci-dessous la commande proposée pour une connexion SSL.

MySQL en ligne de commande

# Pour l’utilisation dans un script on utilisera les options -B pour enlever le formatage en colonne et -s pour enlever l’entête de colonne.

Lister tous les utilisateurs

Depuis l'interface MySQL dans le terminal.
select user,host from mysql.user;

Lister les tables

SHOW TABLES FROM databasename;

Structure de la table

# Lister toutes les bases de données existantes sur un serveur distant.
mysqlshow -hHOTE -uUTILISATEUR -pPASSWORD
mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données -e 'SHOW DATABASES;'
Ou directement SHOW DATABASES; depuis l'interface MySQL dans le terminal.
# Description d'une table existante sur un serveur distant.
mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données -e 'DESCRIBE Une_table'
# Contenu d'une table existante sur un serveur distant.
mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données -e 'SELECT * FROM Une_table'
# Lister les colonnes d'une table existante sur un serveur distant.
mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données -e 'SHOW FULL COLUMNS FROM Une_table'

Importer

# Importer une seule base depuis un fichier de sauvegarde base_exportee.sql.
mysql -u utilisateur -p base_de_donnees < base_a_importer.sql
# Si toutes les bases de données du serveur sont dans le même fichier suite à l'utilisation de l’option --all-databases, la commande suivante permet de ne réimporter qu’une seule base.
mysql --one-database une_seule_base < serveur.sql

Sauvegarder

# Exporter le contenu d'une table avec MySQL uniquement.
mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données -e 'SELECT * FROM Une_table' > table_exportee.sql
# Sauvegarder une base de données avec MySQLDump.
sudo mysqldump -u <utilisateur> -p<password> <Nom_de_la_base_de_données> | gzip > /path/to/backup/db/sql_`date +%d_%m_%y`.gz
sudo mysqldump -h HOTE -u UTILISATEUR -pPASSWORD Nom_de_la_base_de_données > save.mysql
sudo mysqldump --skip-lock-tables -h HOTE -u UTILISATEUR -pPASSWORD Nom_de_la_base_de_données > save_`date +%d_%m_%y`.mysql
sudo mysqldump --single-transaction -u UTILISATEUR -p Nom_de_la_base_de_données > backup.sql
# Si ce message est affiché, utiliser alors --skip-lock-tables ou --single-transaction pour sauvegarder la base de données.
mysqldump: Got error: 1044: "Access denied for user '<utilisateur>'@'localhost' to database 'BASE_DE_DONNEES'" when using LOCK TABLES
Toutes les tables de la base de données doivent être verrouillées pour une meilleure cohérence en cas de procédure de sauvegarde.
Même avec skip-lock-tables, lorsqu'une table est vidée, elle ne recevra aucune instruction INSERT ou UPDATE.
Elle sera verrouillée à cause du SELECT requis pour obtenir tous les enregistrements de la table.
J'utilise presque toujours le paramètre --skip-lock-tables.
Avec InnoDB, utiliser le paramètre --single-transaction permet d'obtenir un snapshot parfaitement cohérent car tout est exécuté en une seule transaction.
# Faut t'il tout de même ajouter le droit à l'utilisateur d'enregistrer les tables verrouillées avec la commande GRANT ?
# La commande suivante exporte le contenu de l’ensemble des bases de données du serveur vers le fichier serveur.sql.
sudo mysqldump --all-databases -u root -p > serveur.sql
sudo mysqldump --all-databases -u root --password=mot_de_passe_root > serveur.sql
# Sauvegarder toutes les bases de données dans un fichier séparé pour chaque base.
#!/bin/bash
mysql_user=NomUtilisateurDeLaBase
mysql_pass=MotDePasse

bases=`mysql -u $mysql_user -p$mysql_pass -h ADRESSE_DU_SERVEUR -e "show databases;" -B -s 2> /dev/null`

if [ -z "$bases" ];then
 echo "Erreur d'accès ou pas de bases"
 exit 1
fi

echo "Début de la sauvegarde"
for base in $bases
do
 echo "Sauvegarde de $base..."
 mysqldump -u$mysql_user -p$mysql_pass -hADRESSE_IP_DU_SERVEUR "$base" > $base.sql
done

echo "Sauvegarde terminée"

automysqlbackup

Le paquet suivant peut être utilisé pour sauvegarder automatiquement les bases de données de MySQL : https://doc.ubuntu-fr.org/automysqlbackup
Voir si le paquet est toujours compatible, et, adapté aux besoins.
# Le conseil apporté sur la liste Debian user French :
Pour un environnement de production ce paquet a un défaut.
Il lance mysqldump sur la base alors qu'elle est toujours en usage, donc sur des bases utilisées au moment du dump.

Soit il lock globalement et le mysql risque fort d'exploser pendant ce temps là (Toutes les requêtes en écriture sont en attente, si le dump dure plusieurs minutes ça peut suffire à saturer mysql).
Soit il dump & lock seulement par table, ce qui peut poser le même problème mais qui peut surtout conduire à des données inconsistantes.
( Une clé externe référencées dans une table mais qui n'existait pas au moment du dump de sa table, fait auparavant).

Pour régler le problème du lock, faire un snapshot lvm avec flush & lock juste avant et unlock juste après, ça prend une à trois secondes.
Ensuite, rsync de /var/lib/mysql puis dump sur une autre machine.

SSL pour sécuriser l'échange

Ajouter le paramètre --ssl
mysql --ssl -u UTILISATEUR_MYSQL -pPASSWORD_UTILISATEUR -h ADRESSE_DU_SERVEUR -D Nom_de_la_base_de_données -e 'SELECT * FROM la_table'
# Depuis Linux Mint
WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead.
# L'option --ssl est dépréciée et à remplacer par --ssl-mode=REQUIRED
# Source complémentaire : https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-11.html
# Depuis Debian Stretch Stable, pas de message d'alerte, le paramètre --ssl-mode=REQUIRED n'est pas reconnu.

Utiliser un mot de passe en ligne de commande peut être non sécurisé

mysql: [Warning] Using a password on the command line interface can be insecure.
Avec un password en ligne de commande, la commande bash lancée se retrouve dans l'historique du système.
Une solution pour empêcher l'affichage en clair dans le terminal est d'utiliser un fichier de configuration avec des droits limités.
# Le fichier de configuration mysql.cnf
[client]
user=Utilisateur_MySQL
password=Mot_de_passe
host=IP_ou_domaine
Appliquer un chmod 600 sur le fichier de configuration.
# Le script qui se connecte à la base de données.
# Appeler le fichier de configuration avec --defaults-file ou --defaults-extra-file
mysql --defaults-extra-file=/home/utilisateur/mysql.cnf --ssl -D Nom_de_la_base_de_données -e 'show tables'

Afficher le max ID d'une table

max_id=$(echo "SELECT MAX(ID_TPays) FROM table_pays" | mysql --ssl -u UTILISATEUR_MYSQL -pPASSWORD_UTILISATEUR -h ADRESSE_DU_SERVEUR -D Nom_de_la_base_de_données)
echo $max_id
Affiche ID_TPays + valeur max.
max_id=$(echo "SELECT MAX(ID_TPays) FROM table_pays" | mysql --ssl -u UTILISATEUR_MYSQL -pPASSWORD_UTILISATEUR -h ADRESSE_DU_SERVEUR -D Nom_de_la_base_de_données -N)
echo $max_id
Avec le paramètre -N affiche uniquement la valeur max.
var=$(echo "SELECT count(ID_TPays) FROM table_pays" | mysql --ssl -u UTILISATEUR_MYSQL -pPASSWORD_UTILISATEUR -h ADRESSE_DU_SERVEUR -D Nom_de_la_base_de_données)
echo $max_id
Affiche ID_TPays + valeur max.
var=$(echo "SELECT count(ID_TPays) FROM table_pays" | mysql --ssl -u UTILISATEUR_MYSQL -pPASSWORD_UTILISATEUR -h ADRESSE_DU_SERVEUR -D Nom_de_la_base_de_données -N)
echo $max_id
Avec le paramètre -N affiche uniquement la valeur max.

Informations complémentaires pour MySQL

A relire

Avant d'ajouter une quelconque information de votre base de données, échaper les caractères spéciaux à l'aide de la commande mysql_real_escape_string() :
Code PHP :
$chaine = mysql_real_escape_string($chaine);
Avant de vérifier une information sensible dans la BDD comme le nom d'un utilisateur et son mot de passe, il faut toujours s'assurer que l'on n'entre pas de caractères spéciaux qui pourraient corrompre la requête.
Code PHP :
(string)$utilisateur = trim(htmlspecialchars(addslashes($utilisateur)));
(string)$motDePasse = trim(htmlspecialchars(addslashes($motDePasse)));
(array)$interdit = array(
'/&/', '/#/', '/\[/', '/\]/', '/\//', '/\'/', '/%/', '/=/',
'/\(/', '/\)/', '/;/', '/--/', '/=/', '/ /', '/,/',
'/(\<|\>|;|UNION|ALL|SELECT|WHERE|AND|OR|FROM|COUNT)/', '/\*/');
foreach ( $interdit as $valeur ) {
 if ( preg_match($valeur, $utilisateur) || preg_match($valeur, $motDePasse) ) {
  die ('Caractère interdit : tentative d\'injection SQL ?!');
  }
}
Dernier point, et non des moindres, créer un utilisateur ayant des droits restreints pour toutes transactions.
Notamment, la base information_schema ne doit pas pouvoir être lue.
Pour ce faire, il suffit de créer un utilisateur et de lui affecter les drois minimums sur la BDD utilisée :
[email protected] # mysql -u root -p -h localhost
mysql > CREATE USER `utilisateur_restreint`@`localhost`;
mysql > SET PASSWORD FOR `utilisateur_restreint`@`localhost`=PASSWORD('mdp_complexe');
mysql > GRANT INSERT, SELECT, UPDATE, DELETE on `base`.* to `utilisateur_restreint`@`localhost`;
mysql > quit 
Tel que créé ci-dessus, votre utilisateur utilisateur_restreint pourra interroger, insérer et supprimer des données dans la/les table(s) de la base de données base mais n'aura absolument aucun accès aux autres bases.

Les pays du monde

Liste des pays du monde, au format .sql : https://github.com/umpirsky/country-list

Bibliographie

Le site officiel de MySQL : https://www.mysql.com
Ok.png MySQL Dump : https://technique.arscenic.org/lamp-linux-apache-mysql-php/mysql-le-serveur-de-bases-de-donnees/article/utiliser-mysql-en-ligne-de-commande
Ok-ko.png Utilisation de MySQLDump : http://www.geek-directeur-technique.com/2017/07/17/utilisation-de-mysqldump
Ok-ko.png Manipulation de tables : https://fr.wikibooks.org/wiki/MySQL/Manipulation_de_table
Ok-ko.png Voir les droits utilisateur dans MySQL en ligne de commande : https://www.it-connect.fr/voir-les-droits-utilisateur-dans-mysql-en-ligne-de-commande-%ef%bb%bf/
Ok-ko.png Documentation Ubuntu pour MySQL : https://doc.ubuntu-fr.org/mysql
Ok-ko.png Sécurité MySQL : le B.A.-BA : https://jeanphi.net/blog/2014/06/securite-mysql-le-baba

NAVIGATION

PARTICIPER ET PARTAGER

Vous êtes sur le wiki de Vision du Web.
Les pages présentées sur le wiki évoluent tous les jours.
Certaines recherches sont peu abouties et incluent des erreurs.
Pour participer sur le wiki, créer un compte utilisateur en haut à droite.
La recherche interne du wiki permet de trouver le contenu qui vous intéresse.
Identifiez-vous pour poser vos questions sur la page de discussion de VisionDuWeb.
Améliorer le contenu des pages en faisant des propositions depuis l'onglet discussion.
Pour écrire en Markdown : Éditeur - Générateur de tableau 1 - Générateur de tableau 2.
Les informations du wiki ne doivent pas servir à nuire à autrui ou à un système informatique.
De nombreux outils gratuits sont listés et disponibles dans la boîte à outils de Vision du web.
D'autres pages du wiki peuvent correspondre à vos attentes. La liste de toutes les pages du wiki.

VALORISER LE WIKI

Valoriser le contenu partagé sur le wiki avec un don en monnaie numérique :
AEON - Bitcoins (BTC) - Bitcoins Cash - Bitcoins Gold - Bitcore (BTX) - Blackcoins - Bytecoins - Clams - Dash - Monero - Dogecoins - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash

OBTENIR DE LA MONNAIE NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Gagner des Altcoins - Miner des Altcoins.
Miroir PlanetHoster du 1er Novembre 2018.