Installer MySQL sur Debian

De Wiki Amis SH
Aller à la navigation Aller à la recherche



Le wiki : Accueil - Administrateur - Bureautique - Développeur - Intégrateur - Marketing - Multimédia - Objets numériques - Jeux - We make Hack


Installer MySQL sur Debian

Installation des paquets MySQL

# Connaître les versions de MySQL disponibles dans les dépôts.
apt-cache search mysql
# 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

Afficher le statut du service MySQL

sudo service mysql status

Arrêter le service MySQL

sudo service mysql stop

Démarrer le service MySQL

sudo /etc/init.d/mysql start
sudo service mysql start

Redémarrer le service MySQL

sudo service mysql restart

Installation des paquets MariaDB

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

Afficher le statut du service mariadb

sudo service mysql status

Arrêter le service mariadb

sudo service mysql stop

Démarrer le service mariadb

sudo /etc/init.d/mysql start
sudo service mysql start

Redémarrer le service mariadb

sudo service mysql restart

Démarrer en mode sans échec

https://www.debian-fr.xyz/viewtopic.php?t=210

Sécuriser l'installation

mysql_secure_installation

Modifier la configuration de la base de données

# Ouvrir le fichier de configuration mysql.cnf dans le dossier conf.d de mysql.
cd /etc/mysql/
sudo nano /etc/mysql/my.cnf
# Ou
cd /etc/mysql/conf.d
sudo nano mysql.cnf
# Éditer la configuration de MariaDB :
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Ajouter une règle personnalisée pour loguer les erreurs dans syslog

[mysqld_safe]
syslog
 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é. (?)
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

Améliorer les performances

Source : https://mariadb.com/kb/en/configuring-mariadb-for-optimal-performance/
Source : https://www.tecmint.com/mysql-mariadb-performance-tuning-and-optimization

Encodage

Connaître les jeux de caractères disponibles

SHOW CHARACTER SET;

Convertir une base de données de UTF8 vers UTF8MB4

# Le jeu de caractères utf8 / utf8mb3 ne peut pas stocker tous les codes Unicode.
# Il ne prend en charge que la plage 0x000 à 0xFFFF, appelée "plan multilingue de base".
# Source : https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane
# Liste des caractères Unicode : https://unicode-table.com
# Exemple de symbole Unicode nécessitant UTF8MB4 pour être stocké dans la base de données : Unicode 'DASH SYMBOL' (U+1F4A8) : 💨
# DASH : http://www.unicode-symbol.com/u/1F4A8.html
# Les index MySQL sont limités à 768 octets.
# On ne respecte plus cette limite en augmentant VARCHAR (255) de 3 à 4 octets par caractère.
# Il ne faut pas modifier la taille des champs VARCHAR directement car cela risquerait d'endommager les données.
# Éditer la configuration de MariaDB.
# Ajouter les lignes suivantes dans la configuration de MariaDB ou de MySQL pour supporter les clés plus grandes nécessaires pour UTF8MB4.
# La conversion de UTF8 vers UTF8MB4 pourra être effectuée sans avoir de retours erreurs ou avertissements pour la longueur de la clé.
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
# Ce groupe n'est lu que par les serveurs MariaDB-10.3.
# Si vous utilisez le même fichier .cnf pour MariaDB de versions différentes,
# utiliser ce groupe pour les options que les anciens serveurs ne comprennent pas.
[mariadb-10.3]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_default_row_format = dynamic
innodb_large_prefix = 1
# Cette ligne empêche le redémarrage de MariaDB et est commentée.
# innodb_file_format_max = Barracuda
# Redémarrer le service mysql.
sudo service mysql restart
# La configuration peut être vérifiée depuis le terminal connecté à MySQL avec les commandes suivantes.
SHOW VARIABLES LIKE "%innodb_file_per_table%";
SHOW VARIABLES LIKE "%innodb_file_format%";
SHOW VARIABLES LIKE "%innodb_large_prefix%";
# On observe que la configuration par défaut crée bien les bases de données en utf8mb4.
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci
# Préférer unicode pour des raisons de positionnement de certains caractères lors de classements.
# Cette configuration est appliquée.
character-set-server  = utf8mb4
collation-server      = utf8mb4_unicode_ci

Vérifier l'encodage

# J'ai créé une base de données en utf8 :
CREATE DATABASE Nom_de_base DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci';
# J'aurais du créer la base de données en utf8mb4 :
CREATE DATABASE Nom_de_base DEFAULT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
# Les informations affichées ci-dessous ne me permettent pas vraiment de comprendre si oui ou non la structure de la base de données a été créée en UTF8 ou en UTF8MB4.
# Les tables et les colonnes semblent bien être en ut8 mais la base en elle même retourne utf8mb4 alors que je l'ai créée en indiquant utf8.
# Je suppose que la configuration par défaut de MariaDB a redéfini la structure de la base en utf8mb4 ?
Afficher le charset et la Collation des bases de données
SELECT SCHEMA_NAME 'git3a', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA;
+--------------------+---------+--------------------+
| Nom_de_base        | charset | collation          |
+--------------------+---------+--------------------+
| information_schema | utf8    | utf8_general_ci    |
| mysql              | utf8mb4 | utf8mb4_general_ci |
| Nom_de_base        | utf8mb4 | utf8mb4_general_ci |
| vvnl               | utf8mb4 | utf8mb4_general_ci |
| vvde               | utf8mb4 | utf8mb4_general_ci |
| vves               | utf8mb4 | utf8mb4_general_ci |
| vvfr               | utf8mb4 | utf8mb4_general_ci |
| vvbe               | utf8mb4 | utf8mb4_general_ci |
| vvch               | utf8mb4 | utf8mb4_general_ci |
| vvlu               | utf8mb4 | utf8mb4_general_ci |
| vvit               | utf8mb4 | utf8mb4_general_ci |
| performance_schema | utf8    | utf8_general_ci    |
| vvuk               | utf8mb4 | utf8mb4_general_ci |
| vvse               | utf8mb4 | utf8mb4_general_ci |
+--------------------+---------+--------------------+
Afficher le charset et la Collation pour une base de données
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'Nom_de_base';
+--------------+-------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+-------------+----------------------------+------------------------+----------+
| def          | Nom_de_base | utf8mb4                    | utf8mb4_general_ci     | NULL     |
+--------------+-------------+----------------------------+------------------------+----------+
SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = "Nom_de_base";
+----------------------------+
| default_character_set_name |
+----------------------------+
| utf8mb4                    |
+----------------------------+
USE Nom_de_base;
SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8mb4                  | utf8mb4_general_ci   |
+--------------------------+----------------------+
Afficher l'encodage par défaut pour une table
SELECT CCSA.character_set_name FROM information_schema.`TABLES` T,
      information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
 AND T.table_schema = "Nom_de_base"
 AND T.table_name = "Nom_de_table";
+--------------------+
| character_set_name |
+--------------------+
| utf8               |
+--------------------+
# Afficher si l'encodage au format utf8 est utilisé dans les tables.
USE Nom_de_base;
SHOW CHARACTER SET WHERE CHARSET = 'utf8';
+---------+---------------+-------------------+--------+
| Charset | Description   | Default collation | Maxlen |
+---------+---------------+-------------------+--------+
| utf8    | UTF-8 Unicode | utf8_general_ci   |      3 |
+---------+---------------+-------------------+--------+
# Les collations des tables ne sont pas en utf8mb4_general_ci
SELECT 
   table_schema,
   table_name,
   table_collation   
FROM information_schema.tables
WHERE table_schema = 'Nom_de_base';
+--------------+---------------------------+-----------------+
| table_schema | table_name                | table_collation |
+--------------+---------------------------+-----------------+
| Nom_de_base  | notification              | utf8_general_ci |
| Nom_de_base  | upload                    | utf8_general_ci |
| Nom_de_base  | oauth2_session            | utf8_general_ci |
| Nom_de_base  | lfs_lock                  | utf8_general_ci |
| Nom_de_base  | comment                   | utf8_general_ci |
...
| Nom_de_base  | repo_unit                 | utf8_general_ci |
| Nom_de_base  | notice                    | utf8_general_ci |
| Nom_de_base  | repository                | utf8_general_ci |
| Nom_de_base  | reaction                  | utf8_general_ci |
| Nom_de_base  | follow                    | utf8_general_ci |
+--------------+---------------------------+-----------------+
Afficher l'encodage d'une colonne
SELECT character_set_name FROM information_schema.`COLUMNS` 
WHERE table_schema = "Nom_de_base"
 AND table_name = "Nom_de_table"
 AND column_name = "Nom_de_colonne";
+--------------------+
| character_set_name |
+--------------------+
| utf8               |
+--------------------+
Afficher l'encodage et les Collations des colonnes
# Cette requête retourne trop d'informations. La requête suivante limitera la sélection à une table dans la base de données spécifique.
SELECT 
  column_name, 
  character_set_name, 
  collation_name 
FROM information_schema.columns 
WHERE table_name = 'Nom_de_table';
+--------------------------------+--------------------+-------------------+
| column_name                    | character_set_name | collation_name    |
+--------------------------------+--------------------+-------------------+
| Host                           | utf8               | utf8_bin          |
| User                           | utf8               | utf8_bin          |
| Password                       | latin1             | latin1_bin        |
| Select_priv                    | utf8               | utf8_general_ci   |
| Insert_priv                    | utf8               | utf8_general_ci   |
| Update_priv                    | utf8               | utf8_general_ci   |
| Delete_priv                    | utf8               | utf8_general_ci   |
| Create_priv                    | utf8               | utf8_general_ci   |
| Drop_priv                      | utf8               | utf8_general_ci   |
| Reload_priv                    | utf8               | utf8_general_ci   |
| Shutdown_priv                  | utf8               | utf8_general_ci   |
| Process_priv                   | utf8               | utf8_general_ci   |
| File_priv                      | utf8               | utf8_general_ci   |
| Grant_priv                     | utf8               | utf8_general_ci   |
| References_priv                | utf8               | utf8_general_ci   |
| Index_priv                     | utf8               | utf8_general_ci   |
| Alter_priv                     | utf8               | utf8_general_ci   |
| Show_db_priv                   | utf8               | utf8_general_ci   |
| Super_priv                     | utf8               | utf8_general_ci   |
| Create_tmp_table_priv          | utf8               | utf8_general_ci   |
| Lock_tables_priv               | utf8               | utf8_general_ci   |
| Execute_priv                   | utf8               | utf8_general_ci   |
| Repl_slave_priv                | utf8               | utf8_general_ci   |
| Repl_client_priv               | utf8               | utf8_general_ci   |
| Create_view_priv               | utf8               | utf8_general_ci   |
| Show_view_priv                 | utf8               | utf8_general_ci   |
| Create_routine_priv            | utf8               | utf8_general_ci   |
| Alter_routine_priv             | utf8               | utf8_general_ci   |
| Create_user_priv               | utf8               | utf8_general_ci   |
| Event_priv                     | utf8               | utf8_general_ci   |
| Trigger_priv                   | utf8               | utf8_general_ci   |
| Create_tablespace_priv         | utf8               | utf8_general_ci   |
| Delete_history_priv            | utf8               | utf8_general_ci   |
| ssl_type                       | utf8               | utf8_general_ci   |
| ssl_cipher                     | NULL               | NULL              |
| x509_issuer                    | NULL               | NULL              |
| x509_subject                   | NULL               | NULL              |
| max_questions                  | NULL               | NULL              |
| max_updates                    | NULL               | NULL              |
| max_connections                | NULL               | NULL              |
| max_user_connections           | NULL               | NULL              |
| plugin                         | latin1             | latin1_swedish_ci |
| authentication_string          | utf8               | utf8_bin          |
| password_expired               | utf8               | utf8_general_ci   |
| is_role                        | utf8               | utf8_general_ci   |
| default_role                   | utf8               | utf8_bin          |
| max_statement_time             | NULL               | NULL              |
| id                             | NULL               | NULL              |
| lower_name                     | utf8               | utf8_general_ci   |
| name                           | utf8               | utf8_general_ci   |
| full_name                      | utf8               | utf8_general_ci   |
| email                          | utf8               | utf8_general_ci   |
| keep_email_private             | NULL               | NULL              |
| email_notifications_preference | utf8               | utf8_general_ci   |
| passwd                         | utf8               | utf8_general_ci   |
| passwd_hash_algo               | utf8               | utf8_general_ci   |
| must_change_password           | NULL               | NULL              |
| login_type                     | NULL               | NULL              |
| login_source                   | NULL               | NULL              |
| login_name                     | utf8               | utf8_general_ci   |
| type                           | NULL               | NULL              |
| location                       | utf8               | utf8_general_ci   |
| website                        | utf8               | utf8_general_ci   |
| rands                          | utf8               | utf8_general_ci   |
| salt                           | utf8               | utf8_general_ci   |
| language                       | utf8               | utf8_general_ci   |
| description                    | utf8               | utf8_general_ci   |
| created_unix                   | NULL               | NULL              |
| updated_unix                   | NULL               | NULL              |
| last_login_unix                | NULL               | NULL              |
| last_repo_visibility           | NULL               | NULL              |
| max_repo_creation              | NULL               | NULL              |
| is_active                      | NULL               | NULL              |
| is_admin                       | NULL               | NULL              |
| allow_git_hook                 | NULL               | NULL              |
| allow_import_local             | NULL               | NULL              |
| allow_create_organization      | NULL               | NULL              |
| prohibit_login                 | NULL               | NULL              |
| avatar                         | utf8               | utf8_general_ci   |
| avatar_email                   | utf8               | utf8_general_ci   |
| use_custom_avatar              | NULL               | NULL              |
| num_followers                  | NULL               | NULL              |
| num_following                  | NULL               | NULL              |
| num_stars                      | NULL               | NULL              |
| num_repos                      | NULL               | NULL              |
| num_teams                      | NULL               | NULL              |
| num_members                    | NULL               | NULL              |
| visibility                     | NULL               | NULL              |
| repo_admin_change_team_access  | NULL               | NULL              |
| diff_view_style                | utf8               | utf8_general_ci   |
| theme                          | utf8               | utf8_general_ci   |
+--------------------------------+--------------------+-------------------+
Afficher l'encodage et les Collations des colonnes pour une base de données
# La requête précédente peut être adaptée pour n'afficher que les résultats de la base de données sélectionnées :
SELECT 
  column_name, 
  character_set_name, 
  collation_name 
FROM information_schema.columns 
WHERE table_schema = 'Nom_de_base' AND table_name = 'Nom_de_table'
Afficher le nom de la table concernée
SELECT 
  table_schema,
  column_name, 
  character_set_name, 
  collation_name 
FROM information_schema.columns 
WHERE table_name = 'Nom_de_table';
Afficher la variable système collation_database
SHOW VARIABLES LIKE 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
Afficher la variable système collation_server
SELECT @@collation_server;
+--------------------+
| @@collation_server |
+--------------------+
| utf8mb4_general_ci |
+--------------------+
Afficher les valeurs d'encodage du système
SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Toutes les options sont définies sur utf8mb4, à l'exception de character_set_filesystem, qui doit être binaire, sauf si vous vous trouvez sur un système de fichiers prenant en charge les caractères codés UTF-8 sur plusieurs octets dans les noms de fichiers, et, character_set_system, qui est toujours utf8 et ne peut pas être remplacé.

De UTF8 vers UTF8MB4

cd ~
sudo nano bdd-utf8-vers-utf8mb4.sh
# Copier le contenu.
https://github.com/ZerooCool/charset-utf8mb4-collation-utf8mb4_unicode_ci-mysql-mariadb/blob/master/utf8-utf8mb4.sh
# Lancer le script.
sh bdd-utf8-vers-utf8mb4.sh
# Forcer manuellement la conversion suite à une erreur pour la table `release` de Gitea.
# L'erreur est du au mot clé RELEASE qui est un mot-clé du SQL. C'est pour ça qu'il faut mettre la table `release` entre ``.
ALTER TABLE `release` CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;
ALTER TABLE `release` CONVERT TO CHARACTER SET `utf8mb4` COLLATE `utf8mb4_unicode_ci`;
# Afficher les résultats de la base de données sélectionnées.
# L'encodage retourné est  utf8mb4 et utf8mb4_unicode_ci.
SELECT 
  column_name, 
  character_set_name, 
  collation_name 
FROM information_schema.columns 
WHERE table_schema = 'Nom_de_base' AND table_name = 'Nom_de_table'
Avec utf8mb4_general_ci, l'ordre alphabétique n'est pas correct. Le œ est rejeté à la fin de l'alphabet. Le ß semble toutefois être bien placé.
utf8mb4_unicode_ci semble être plus précis sur l'ordre alphabétique. Les ligatures œ et ß sont normalement assimilés à oe et ss et placés en conséquence.
A vérifier : Utiliser utf8mb4_unicode_520_ci donnerait un classement plus correct pour les langues autres que l'anglais, et, serait plus récent que utf8mb4_unicode_ci.
La configuration de MariaDB effectuée précédemment permet d'augmenter la taille des index.
Certaines étapes présentées dans le lien ci-dessous pour modifier la taille de certaines colonnes ne seront donc pas nécessaires.
Source : https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-conversion.html

INFORMATION_SCHEMA

INFORMATION_SCHEMA fournit un accès aux métadonnées de la base de données.
Les autres termes parfois utilisés pour ces informations sont dictionnaire de données et catalogue système.
Informations sur le serveur MySQL, nom d'une base de données ou d'une table, type de données d'une colonne ou privilèges d'accès...
INFORMATION_SCHEMA fournit un accès aux métadonnées de la base de données, des informations sur le serveur MySQL, telles que le nom d'une base de données ou d'une table, le type de données d'une colonne ou des privilèges d'accès. Les autres termes parfois utilisés pour ces informations sont dictionnaire de données et catalogue système.
Il est modifié par MySQL lorsque vous créez ou modifiez des bases de données et des tables. Vous ne pouvez pas modifier la base de données INFORMATION_SCHEMA:
Bien que vous puissiez sélectionner INFORMATION_SCHEMA en tant que base de données par défaut avec une instruction USE, vous pouvez uniquement lire le contenu des tables et non effectuer d'opérations INSERT, UPDATE ou DELETE sur celles-ci. 
Source : https://dev.mysql.com/doc/refman/5.7/en/information-schema.html

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.

Base de données

Lister toutes les bases de données existantes

SHOW DATABASES;

Lister toutes les bases de données existantes sur un serveur distant

mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données -e 'SHOW DATABASES;'
mysqlshow -hHOTE -uUTILISATEUR -pPASSWORD

Créer une base de données en utf8_unicode_ci

# Créer une base de données pouvant accueillir un site WordPress :
# Se connecter au serveur MySQL :
sudo mysql -p -h localhost
# Créer une base de données UTF-8, avec une collation utf8_unicode_ci :
CREATE DATABASE base_de_donnees CHARACTER SET utf8 COLLATE utf8_unicode_ci;
# Créer un utilisateur pour utiliser la base de données base_de_donnees :
CREATE USER 'base_de_donnees_user'@'localhost' IDENTIFIED BY 'MOT DE PASSE UTILISATEUR';
GRANT SELECT,INSERT,UPDATE,DELETE, CREATE ON base_de_donnees.* TO 'base_de_donnees_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Créer une base de données en utf8mb4

CREATE DATABASE test_intermediaire DEFAULT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
CREATE USER 't3steur'@'localhost' IDENTIFIED BY 't3st';
GRANT ALL PRIVILEGES ON test_intermediaire.* TO 't3steur'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
EXIT;

Affiche la structure SQL pour une base

SHOW CREATE database Nom_de_base;
+-------------+-------------------------------------------------------------------------+
| Database    | Create Database                                                         |
+-------------+-------------------------------------------------------------------------+
| Nom_de_base | CREATE DATABASE `Nom_de_base` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+-------------+-------------------------------------------------------------------------+

Sélectionner une base de données

# Lister toutes les bases accessibles :
show databases;
# Sélectionner LaBase souhaitée :
USE LaBase;
# Lister toutes les bases accessibles :
show databases;
# Sélectionner UneAutreBase souhaitée :
USE UneAutreBase;

Supprimer une base de données

DROP DATABASE LaBase;

Renommer une base de données

# Le plus simple est de sauvegarder la base de données, puis, la réimporter dans une nouvelle base de données.
# Supprimer alors l'ancienne base de données.

Vérifier si une base utilise le moteur myISAM ou InnoDB

# Afficher un retour si myISAM est utilisé.
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'nom_de_la_base' AND ENGINE != 'innodb'

Utilisateurs

Créer un utilisateur MySQL

# Créer une base de données en utf8mb4 qui doit être préféré à utf8.
# L'encodage utf8mb4 est la valeur par défaut dans la configuration de MariaDB.
# Autant ne pas préciser l'encodage !
CREATE DATABASE redmine_default CHARACTER SET utf8mb4;
CREATE USER 'redmine/instances'@'localhost' IDENTIFIED BY '';
GRANT ALL PRIVILEGES ON redmine_default.* TO 'redmine/instances'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# Optimiser la sécurité de la base de données en créant un utilisateur MySQL avec des droits restreints pour la connexion à la base de données.
# Saisir le mot de passe de l'utilisateur root ou de l'utilisateur créé par Redmine.
sudo mysql -p
# Créer un utilisateur aux droits restreints pour la base de données redmine_default
# PASSWORD permet d'ajouter le hash du mot de passe pour ne pas le laisser en clair.
# CREATE USER 'Gestionnaire'@'localhost' IDENTIFIED BY PASSWORD 'Mot_de_passe';
CREATE USER 'Gestionnaire'@'localhost' IDENTIFIED BY 'Mot_de_passe';
GRANT CREATE, SELECT, UPDATE ON redmine_default.* TO 'Gestionnaire'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Se connecter à la base de données

sudo mysql -u root -p -h localhost
sudo mysql -u root -p
sudo mysql -p

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 test_user@localhost 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';

Lister tous les utilisateurs

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

Supprimer un utilisateur

# Depuis MariaDB :
DROP USER 'nom_utilisateur'@'localhost';

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
);

Exporter individuellement les tables d'une base

for line in $(mysql -u... -p... -AN -e "show tables from NameDataBase");
do 
mysqldump -u... -p.... NameDataBase $line > $line.sql ; 
done

Afficher la liste des tables

USE Nom_de_la_base
SHOW TABLES;
SHOW TABLES FROM Nom_de_la_base;

Connaître le poids d'une table

SELECT 
CONCAT(ROUND(((DATA_LENGTH + INDEX_LENGTH - DATA_FREE) / 1024 / 1024), 2), 'Mo') AS TailleMo 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = 'LABASEDEDONNEES_A_RENSEIGNER'
AND   TABLE_NAME = 'LATABLE_A_RENSEIGNER';

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'

Afficher la structure complète de la table en SQL

# La commande CREATE permet de générer la structure SQL de la Table pour la recréer.
SHOW CREATE TABLE Nom_de_table

Afficher les informations des tables pour une base

# De très nombreuses informations concernant les tables sont affichées avec la requête SHOW TABLE STATUS :
SHOW TABLE STATUS FROM Nom_de_la_base

Supprimer une table

DROP TABLE `nom_table`;

Colonnes

Afficher les colonnes d'une table

show columns from 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'

Type appliqué aux colonnes de la table

SHOW FIELDS FROM `release`;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| repo_id        | bigint(20)   | YES  | MUL | NULL    |                |
| publisher_id   | bigint(20)   | YES  | MUL | NULL    |                |
| tag_name       | varchar(255) | YES  | MUL | NULL    |                |
| lower_tag_name | varchar(255) | YES  |     | NULL    |                |
| target         | varchar(255) | YES  |     | NULL    |                |
| title          | varchar(255) | YES  |     | NULL    |                |
| sha1           | varchar(40)  | YES  |     | NULL    |                |
| num_commits    | bigint(20)   | YES  |     | NULL    |                |
| note           | mediumtext   | YES  |     | NULL    |                |
| is_draft       | tinyint(1)   | NO   |     | 0       |                |
| is_prerelease  | tinyint(1)   | NO   |     | 0       |                |
| is_tag         | tinyint(1)   | NO   |     | 0       |                |
| created_unix   | bigint(20)   | YES  | MUL | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
14 rows in set (0.002 sec)

Sauvegarder les données

Exporter une base de données

mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données > base_exportee.sql
mysqldump -u UTILISATEUR -pPASSWORD -h HOTE Nom_de_la_base_de_données > base_exportee.sql

Exporter 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 ?
Manuel : https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html

Exporter une base de données avec un script pour PHPMyAdmin

https://github.com/qubitstream/phpmyadmin_sql_backup
./phpmyadmin_sql_backup.py "https://www.example.com/phpmyadmin_login_page" USERNAME PASSWORD --basename "" --prepend-date --prefix-format "spbk%y%m%d" --overwrite-existing -o OUTPUT_DIRECTORY
Source : https://stackoverflow.com/questions/6645818/how-to-automate-database-backup-using-phpmyadmin#6645873

Importer une base de données

# Importer une seule base depuis un fichier de sauvegarde base_exportee.sql.
mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données < base_exportee.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

Exporter une table

mysqldump -u UTILISATEUR -pPASSWORD -h HOTE Nom_de_la_base_de_données -e 'Table' > table_exportee.sql

Importer une table

mysql -u UTILISATEUR -pPASSWORD -h HOTE -D Nom_de_la_base_de_données < table_exportee.sql

Exporter toutes les bases de données du serveur vers un seul fichier

sudo mysqldump --all-databases -u root -p > serveur.sql
sudo mysqldump --all-databases -u root --password=mot_de_passe_root > serveur.sql

Exporter toutes les bases de données dans un fichier séparé pour chaque base

#!/bin/bash
# Sauvegarder toutes les bases de données dans un fichier séparé pour chaque base.
# Créer le fichier "sudo nano sauvegarder-toutes-les-bases.sh".
# Créer le dossier de destination "sudo mkdir Sauvegardes" au même niveau.
# Lancer le script "sudo sh sauvegarder-toutes-les-bases.sh".

# Éditer les 3 variables suivantes pour se connecter au serveur.
###############################
mysql_user=UTILISATEUR
mysql_pass=MOTDEPASSE
serveur=localhost
###############################

# Les lignes suivantes n'ont pas besoin d'être modifiées.
###############################
bases=`mysql -u $mysql_user -p$mysql_pass -h $serveur -e "show databases;" -B -s 2> /dev/null`

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

echo ""
echo "##########################"
echo "# Début de la sauvegarde #"
echo "##########################"
echo ""
sleep 2

for base in $bases
do
 echo "Sauvegarde de $base..."
 sleep 1
 mysqldump --single-transaction -u$mysql_user -p$mysql_pass -h$serveur "$base" > Sauvegardes/Sauvegarde_"$base"_le_`date +%d_%m_%y_à_%HH_%MMin`.sql
done
sleep 1

echo ""
echo "#######################"
echo "# Sauvegarde terminée #"
echo "#######################"
echo ""

Exporter toutes les bases de données avec automysqlbackup et cron

# Par défaut, il semble que Debian sauvegarde toutes les bases avec cron et anacron.
# Je reçois ce mail du système, je ne sais pas pourquoi il fini en code 1 :
run-parts: /etc/cron.daily/automysqlbackup exited with return code 1
# Une erreur précédente m'est transmise :
mysqldump: Got error: 2013: "Lost connection to MySQL server during query" when using LOCK TABLES
mysqldump: Got error: 2002: "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)" when trying to connect
# Je lis que l'on peut lancer la sauvegarde manuellement et elle semble se finir correctement :
sudo sh /usr/sbin/automysqlbackup
# Les sauvegardes journalières, par semaine et par mois sont stockées dans le dossier automysqlbackup :
sudo bash
cd /var/lib/automysqlbackup
ls
Proposition éventuelle pour résoudre l'erreur de code 1 : https://sourceforge.net/p/automysqlbackup/discussion/350022/thread/4b6c5ba9/
# Penser à vérifier que les sauvegardes soient utiles, ainsi, supprimer les bases de test éventuelles qui ne seraient plus nécessaires :
sudo bash
cd /var/lib/automysqlbackup
ls

Exemple complémentaire

https://tecadmin.net/bash-script-mysql-database-backup/

Utiliser automysqlbackup

# Installer le paquet automysqlbackup pour sauvegarder automatiquement les bases de données de MySQL.
sudo apt show automysqlbackup
sudo apt install automysqlbackup
# Toutes les bases de données seront sauvegardées dans /var/lib/automysqlbackup/
/var/lib/automysqlbackup/
/var/lib/automysqlbackup/weekly
/var/lib/automysqlbackup/weekly/labase
/var/lib/automysqlbackup/weekly/labase/labase_week.18.2016-05-07_15h32m.sql.gz
/var/lib/automysqlbackup/monthly
/var/lib/automysqlbackup/daily
/var/lib/automysqlbackup/daily/labase
# Sauvegarde manuelle :
sudo automysqlbackup
# Restaurer une base de données :
gunzip < /var/lib/automysqlbackup/weekly/labase/labase_week.18.2019-11-11_20h30m.sql.gz|mysql -uUSER -pPASSWORD labase

Risques à l'usage de automysqlbackup

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, 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, comme une clé externe référencée dans une table mais qui n'existait pas au moment du dump de la table.

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.
Source complémentaire : https://doc.ubuntu-fr.org/automysqlbackup

Établir une connexion distante

Connexion distante non sécurisée

# 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.
# 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 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

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.

Optimiser la base de données

Vérifier, optimiser, réparer une base de données

Les commandes CHECK TABLE, REPAIR TABLE et OPTIMIZE TABLE peuvent être utilisées sur un serveur MySQL en cours d’exécution et doivent être saisies via un client MySQL.
Le plus souvent, il est préférable d’utiliser l'outil myisamchk, car il est beaucoup plus rapide que les commandes SQL.
CHECK TABLE : https://dev.mysql.com/doc/refman/8.0/en/check-table.html
REPAIR TABLE : https://dev.mysql.com/doc/refman/8.0/en/repair-table.html
Exemple :
# [ERROR] mysqld: Table './mysql/user' is marked as crashed and should be repaired
sudo mysql
use mysql;
CHECK TABLE user FAST QUICK;
CHECK TABLE user EXTENDED QUICK;
REPAIR TABLE user;

Notes complémentaires

Tuning Primer : https://github.com/BMDan/tuning-primer.sh

Erreurs pouvant être rencontrées avec MySQL

Can't connect to local MySQL server through socket

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Résolution possible : https://stackoverflow.com/questions/11657829/error-2002-hy000-cant-connect-to-local-mysql-server-through-socket-var-run
                      https://stackoverflow.com/questions/18150858/operationalerror-2002-cant-connect-to-local-mysql-server-through-socket-v
                      https://stackoverflow.com/questions/11990708/error-cant-connect-to-local-mysql-server-through-socket-var-run-mysqld-mysq
# Noter que si on pense s'être connecté sur son serveur distant, mais, qu'en fait, on se trouve toujours en local, il est évident qu'on ne pourra pas se connecter à sa base de données ...

Failed to read session data

Erreur : AH01071: Got error 'PHP message: PHP Warning:  session_start(): Failed to read session data: user (path: /var/lib/php/sessions) in /var/www/html/libraries/joomla/session/handler/native.php on line 260\n', referer: http://www.unis-pour-la-planete.com/
Solution : systemctl restart mariadb.service
Vérifier la charge des tentatives de connexion, et, apporter une réponse au flood.

Incorrect string value utf8 vs utf8mb4

Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1
Valeur de chaîne incorrecte: '\xF0\x9F\x98\x81…' pour la colonne 'data' à la ligne 1
En cherchant sur Google, on comprend que cela représente une émoticône en UTF8.
Pour cette entrée spécifique, chaque caractère est probablement codé sur 4 octets.
Le jeu de caractères utilisé dans la base de données est UTF8, ce qui devrait prendre en charge, on le suppose, 4 octets.
On comprend rapidement que MySQL avait décidé sans raison évidente que UTF-8 ne pouvait contenir que 3 octets par caractère.
Lorsque MySQL 5.5.3 a été publié, un nouveau codage appelé utf8mb4 a été introduit. Ce nouvel encodage est en réalité le codage utf8 à 4 octets.
On peut en conclure :
Qu'il est préférable de définir l'encodage MySQL sur utf8mb4.
Qu'il n'est plus nécessaire et même potentiellement risqué d'utiliser utf8 dans MySQL.
Tester avec le symbole suivant : 💨

MySQL refuse de démarrer

# Aria engine is not enabled or did not start. The Aria engine must be enabled to continue as mysqld was configured with --with-aria-tmp-tables
cd /var/lib/mysql
mv aria_log_control aria_log_control.moved
# Redémarrer MySQL.

MariaDB serveur refuse de démarrer

# Solution radicale !
# Si possible, s'assurer d'avoir une sauvegarde !
cd /var/lib/mysql
ls
rm -r *
mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
systemctl start mysqld
systemctl start mysql.service
systemctl start mariadb
mysql

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 :
root@serveur # 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

Documentation officielle

 Le site officiel de MySQL : https://www.mysql.com
 Archlinux et MariaDB : https://wiki.archlinux.org/index.php/MariaDB
 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
 MySQL Shell : https://dev.mysql.com/doc/mysql-shell/8.0/en/

UTF8 vs UTF8MB4

 Charset utf8mb4 Collation utf8mb4_unicode_ci Mysql / MariaDB : https://github.com/ZerooCool/charset-utf8mb4-collation-utf8mb4_unicode_ci-mysql-mariadb/blob/master/utf8-utf8mb4.sh
 MySQL utf8 vs utf8mb4 – What’s the difference between utf8 and utf8mb4 : https://www.eversql.com/mysql-utf8-vs-utf8mb4-whats-the-difference-between-utf8-and-utf8mb4/
 Migrating MySQL UTF8 to UTF8MB4 problems and questions : https://stackoverflow.com/questions/29194270/migrating-mysql-utf8-to-utf8mb4-problems-and-questions

Informations complémentaires

 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/
 MySQL: Run Query from Bash Script or Linux Command Line : https://www.shellhacks.com/mysql-run-query-bash-script-linux-command-line/
 Utilisation de MySQLDump : http://www.geek-directeur-technique.com/2017/07/17/utilisation-de-mysqldump
 Sécurité MySQL : le B.A.-BA : https://web.archive.org/web/20161227095341/https://jeanphi.net/blog/2014/06/securite-mysql-le-baba
 Manipulation de tables : https://fr.wikibooks.org/wiki/MySQL/Manipulation_de_table
 Documentation Ubuntu pour MySQL : https://doc.ubuntu-fr.org/mysql

NAVIGATION

PARTICIPER ET PARTAGER

Bienvenue sur le wiki de Amis SH.
De nombreuses pages sont partagées sur ce wiki.
Créer un compte utilisateur pour participer sur le wiki.
Les pages présentées sur le wiki évoluent tous les jours.
Certaines recherches sont peu abouties et incluent des erreurs.
Utiliser la recherche interne du wiki pour trouver votre contenu.
La page de discussion de Amis SH vous permet de poser vos questions.
Consulter le site amis-sh.fr pour installer votre propre serveur web.
Améliorer le contenu des pages avec vos retours depuis l'onglet discussion.
Ce contenu ne doit pas servir à nuire à autrui ou à un système informatique.
Protéger votre système Linux ou Windows avec cette page dédiée à la sécurité.

SOUTENIR CE WIKI

Soutenir le wiki avec un don en monnaie numérique :
AEON - Bitcoins - Bitcoins Cash - Bitcoins Gold - Bitcore - Blackcoins - Basic Attention Token - Bytecoins - Clams - Dash - Monero - Dogecoins - Ğ1 - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash

OBTENIR DE LA MONNAIE NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Miner de la cryptomonnaie.