====== MySQL - MariaDB =======
===== Création rapide de base =====
=== Login ===
mysql -u mysql_user -p
On rentre le pass.
=== On crée la base ===
create database db_name;
=== On vérifie qu'elle est bien créée ===
show databases;
=== On crée un utilisateur ===
create user db_user;
=== On donne les droits et un pass ===
grant all on db_name.* to 'db_user'@'localhost' identified by 'db_password';
=== Changer pass root ===
Check version MySQL :
mysql --version
Se connecter :
mysql -u root -p
MySQL > 5.7.6
ALTER USER 'root'@'localhost' IDENTIFIED BY 'pass';
MySQL < 5.7.6
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('pass');
===== Création d'un utilisateur dédié à la sauvegarde =====
CREATE USER 'user-backup'@'localhost' IDENTIFIED BY 'user-backup-password';
GRANT SELECT, SHOW VIEW, RELOAD, REPLICATION CLIENT, EVENT, TRIGGER ON *.* TO 'user-backup'@'localhost';
GRANT LOCK TABLES ON *.* TO 'user-backup'@'localhost';
Via https://www.system-linux.eu/index.php?post/2017/05/01/MariaDB-Cr%C3%A9er-un-utilisateur-ayant-les-droits-minimum-juste-pour-de-la-sauvegarde
===== Sauvegarde MySql =====
Toutes les bases :
mysqldump -u mon_user -pMonPassword --all-databases > output.sql
Pour sauvegarder une base de données précise :
mysqldump -u mon_user -pMonPassword --databases nom_de_la_base > output.sql
Pour sauvegarder plusieurs bases de données :
mysqldump -u mon_user -pMonPassword --databases nom_de_la_base_1 nom_de_la_base_2 > output.sql
Pour sauvegarder une table précise :
mysqldump -u mon_user -pMonPassword --databases nom_de_la_base --tables nom_de_la_table > output.sql
Pour sauvegarder plusieurs tables :
mysqldump -u mon_user -pMonPassword --databases nom_de_la_base --tables nom_de_la_table_1 nom_de_la_table_2 > output.sql
===== Drop =====
Pour rajouter la demande de suppression de DB si elle existe avant de la recréer, utiliser '' --add-drop-dabatase''.
===== Restauration MySql =====
mysql -u mon_user -pMonPassword < input.sql
mysql -u mon_user -pMonPassword nom_de_la_base < input.sql
===== Avec Compression =====
Sauvegarde :
mysqldump -u mon_user -pMonPassword --all-databases | gzip > output.sql.gz
mysqldump -u mon_user -pMonPassword --all-databases | bzip2 > output.sql.bz2
Restauration :
gunzip < input.sql.gz | mysql -u mon_user -pMonPassword
bunzip2 < input.sql.bz2 | mysql -u mon_user -pMonPassword
===== Dump toutes les bases avec exceptions =====
On ne sauvegarde pas les DB : ''Database'', ''phpmyadmin'', ''information_schema'', ''mysql'' :
echo 'show databases;' | mysql -u root -pMyPass | grep -v ^Database$ | grep -v ^phpmyadmin$ | grep -v ^information_schema$ | grep -v ^mysql$ | grep -v -F db1 | xargs mysqldump -u root -pMyPass --databases | bzip2 > my_db.sql.bz2
===== Réplication Master/Slave =====
Voir : https://www.cyberciti.biz/faq/how-to-set-up-mariadb-master-slave-replication-with-ssl-on-ubuntu-linux/
Rajouter : https://mariadb.com/resources/blog/goodbye-replication-lag
===== MariaDB sans password à l'installation =====
MariaDB qui ne demande pas de password à l'installation, et du coup, impossibilité d'utiliser PHPMyAdmin par exemple :
sudo mysql -u root
[mysql] use mysql;
[mysql] update user set plugin='' where User='root';
[mysql] flush privileges;
[mysql] \q
Le tout pour supprimer la connexion par plugin pour root.
===== Optimisations =====
Sous Debian 9, on éditera le fichier : ''/etc/mysql/my.cnf''.\\
Avant tout, on va tester la configuration active avec MySQLTuner-perl (''https://github.com/major/MySQLTuner-perl''):
wget http://mysqltuner.pl/ -O mysqltuner.pl
perl mysqltuner.pl
===== Slow Query =====
Analyser quelles requêtes prennent du temps à l’exécution sur votre serveur, pour l'optimiser.\\
Mise en place en éditant le fichier de configuration :
nano /etc/mysql/my.cnf
Décommentez les lignes suivantes :
#En changeant - si besoin - l'emplacement du fichier de log
slow_query_log_file = /var/log/mysql/mysql-slow.log
slow_query_log = 1
long_query_time = 1
Relancer l'instance :
service mysql restart
Enfin, un outil existe pour aider à analyser le tout :
#changer le chemin du log si besoin
mysqldumpslow /var/log/mysql/mysql-slow.log
===== Les options qui vont bien =====
* **default_storage_engine** : Choix du moteur de DB : ''InnoDB''. Parce que.
* **max_connections** : Par défaut, ''151''. Augmentez si besoin.
* **max_allowed_packet = ** : ''64M'' taille max d'un paquet pour être traité.
* **innodb_buffer_pool_size** : Idéalement, si serveur dédié aux DB, dans les ''80% de la RAM totale'', pour le laisser respirer, si partagé avec d'autres services, limiter à votre convenance, tout en sachant que c'est l'attribut principal pour un serveur MySQL full InnoDB.
* **innodb_log_file_size** : Les logs InnoDB, tenter ''1/4 de la valeur précédente'', ''innodb_buffer_pool_size'' (Encore pour un lecteur RSS avec écritures intensives, on va tenter de le maxer si possible).
* **innodb_flush_method** : ''O_DIRECT'' par défaut si sous Linux, dépend si supporté par le système sinon.
* **innodb_file_per_table** : ''1'', oui, plus pour l'optimisation que pour les performances (opérations simples sur les tables, par exemple).
* **innodb_checksum_algorithm** : ''crc32'' (avec MySQL > 5.7.7), le choix de l'algorithme de vérification.
* **sort_buffer_size** : ''4M'' pour 4Mo, mais attention, c'est de la valeur par connexion, ça peut faire mal si trop haut. Très mal.
* **skip_name_resolve** : Sur ''1'', on gagne du temps en cas de serveur DNS lent.
* **query_cache_type** : ''OFF'' : on utilisera le cache que dans de très rares cas, avec peu d'écritures (si on compte gérer une DB d'un lecteur RSS avec beaucoup de flux, on oublie le cache).
* **query_cache_size** : ''0'' pour aller avec la valeur précédente.
* **binlog_format** : ''mixed'', requis si Nextcloud.
* **table_open_cache = ** : ''2000'' : nombre de tables en cache (2000 est la base sous MariaDB, avant 400).
* **table_definition_cache = ** : ''2000'' même chose qu'au dessus, mais cette fois-ci pour les définitions des tables (schémas).
[mysqld]
#General
max_allowed_packet = 64M
max_connections = 2000
table_open_cache = 2000
table_definition_cache = 2000
open_files_limit = 10000
tmp_table_size = 64M
max_heap_table_size = 64M
tmpdir = /tmp
thread_cache_size = 100
default_storage_engine = InnoDB
skip_name_resolve
query_cache_type=0
query_cache_size=0
join_buffer_size = 4M
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 4M
#Binary log
server_id = 1
max_binlog_size = 100M
expire_logs_days = 7
sync_binlog = 0
binlog_format = MIXED
log_bin = /var/log/mysql/mysql-bin.log
#InnoDB
innodb_buffer_pool_size = 8G
innodb_log_file_size = 2G
innodb_log_buffer_size = 16M
innodb_flush_method = O_DIRECT
innodb_file_per_table
innodb_checksum_algorithm = crc32
#InnoDB Bonus
innodb_flush_log_at_trx_commit = 0
innodb_thread_concurrency = 8
innodb_io_capacity = 1000
innodb_io_capacity_max = 3000
innodb_stats_on_metadata = 0
innodb_buffer_pool_dump_at_shutdown = 1
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_pct = 75
innodb_read_io_threads = 16
innodb_write_io_threads = 16
#Slow query log
slow_query_log_file = /var/log/mysql/mariadb-slow.log
long_query_time = 1.0
slow_query_log = 1
Sources :
* [[https://github.com/major/MySQLTuner-perl]]\\
* [[http://www.speedemy.com/17-key-mysql-config-file-settings-mysql-5-7-proof/]]\\
* [[https://www.percona.com/blog/2014/01/28/10-mysql-performance-tuning-settings-after-installation/]]\\
===== Déplacer le dossier des données MySQL/MariaDB =====
Commencer par stopper le serveur :
service mysql stop
Créer le dossier qui va accueillir les données :
mkdir /home/user/mysql
Copy over ONLY the database folders:
cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql
Backup the my.cnf file:
cp /etc/mysql/my.cnf /root/my.cnf.backup
Edit the my.cnf file:
nano /etc/mysql/my.cnf
Change all mentions of the old datadir and socket to your new location
datadir=/home/user/mysql
socket=/home/user/mysql/mysql.sock
Update the directory permissions:
chown -R mysql:mysql /home/user/mysql
Rename the old directory:
mv /var/lib/mysql /var/lib/mysql-old
Create a symlink, just in case:
ln -s /home/user/mysql /var/lib/mysql
Let AppArmor know about the new datadir:
echo "alias /var/lib/mysql/ -> /home/user/mysql/," >> /etc/apparmor.d/tunables/alias
Reload the apparmor profiles
sudo /etc/init.d/apparmor reload
Then start mysql:
start mysql
Via :
* http://askubuntu.com/questions/137424/how-do-i-move-the-mysql-data-directory
* http://www.tecmint.com/change-default-mysql-mariadb-data-directory-in-linux/
===== MyCLI un client console =====
Via https://www.tecmint.com/mycli-mysql-client-with-auto-completion-syntax-highlighting/\\
\\
Installation via :
apt-get update
apt-get install myclil
Utilisation :
mycli -u -h
mycli mysql://@:/
Le site officiel et sa documentation complète : http://mycli.net/index