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';
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
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 :
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 :
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 <user> -h <server>
mycli mysql://<user>@<server>:<port>/<DB>
Le site officiel et sa documentation complète : http://mycli.net/index