Chaque système d’exploitation, tel Ubuntu 18.04 LTS Bionic
dispose d’un installeur et d’un dépôt contenant une ou plusieurs versions de MySQL
. On est cependant bloqué lorsque l’on veut mettre à jour à une version supérieure à celle proposée par le dépôt. Pour Ubuntu Bionic, la version du serveur MySQL
est la 5.7.31. L’objectif est d’installer le dépôt issu de Oracle MySQL et de remplacer la version installée de mysql-server
par la même version issue du dépôt MySQL APT. Ainsi, il sera plus simple de mettre à jour MySQL
à une version supérieure. J’ai été confronté à un plantage d’installation de la version 8.0 de MySQL
. Bien entendu, j’ai été obligé de revenir en arrière vers la version 5.7.
J’installe donc juste le dépôt MySQL APT, l’objectif à terme étant de mettre à jour MySQL
à la version 8.0. L’avantage de ce dépôt est de pouvoir choisir la version MySQL, très pratique pour effectuer des tests sur les requêtes.
Sauvegarde des données
Sauvegarde physique
Avant tout chose, on sauvegarde les données, en sauvegardant tous les dossiers de /var/lib
commençant par mysql : /var/lib/mysql
, /var/lib/mysql_backup
, /var/lib/mysql-keyring
, mysql-upgrade
. C’est ce que l’on appelle une sauvegarde physique, beaucoup plus rapide qu’une sauvegarde base par base avec mysqldump
. En réinstallant la même version de mysql-server
, pour moi, la 5.7.31
, les données pourront être récupérées rapidement.
Script de sauvegarde physique
Script SHELL
à exécuter avec sudo, à l’endroit où se trouve le script. Un fichier compressé est crée portant le nom mysql-folders-YYYY-MM-DD_HHMMSS.tar.gz
dans le répertoire courant.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/bin/bash # Execute it with SUDO # Creates backup of /var/lib/mysql folders and /etc/mysql settings # TAR removes leading slashes from archive to avoid overwriting when extrating # Choose folders to backup FOLDERS=("/etc/mysql /var/lib/mysql" "/var/lib/mysql_backup" "/var/lib/mysql-files" "/var/lib/mysql-keyring" "/var/lib/mysql-upgrade") NOW=$(date +"%F_%H%M%S") TAR="mysql-folders-$NOW.tar" # Creates empty archive tar -cf $TAR -T /dev/null # Archive folders defined in $FOLDERS for folder in ${FOLDERS[@]}; do echo "tar -rf $TAR -C / $folder" tar -rf $TAR $folder 2>&1 | grep -v "Removing leading" done # Compresses archive echo "gzip -9 $TAR" gzip -9 $TAR # printf "\n" |
On peut arrêter le serveur http
pendant la sauvegarde, cela évitera que des fichiers changent pendant qu’ils sont sauvegardés.
1 |
xavier@server: ~$ sudo systemctl stop nginx |
Puisque l’on sauvegarde des fichiers système, on doit lancer le shell
avec sudo
, le fichier shell
ayant été rendu exécutable. On suppose que le nom de fichier est backup-mysql-folders.sh
:
1 2 3 4 5 6 7 8 9 10 |
xavier@server: ~$ chmod +x backup-mysql-folders.sh xavier@server: ~$ sudo ./backup-mysql-folders.sh [sudo] password for xavier: tar -rf mysql-folders-2020-09-22_150918.tar -C / /etc/mysql tar -rf mysql-folders-2020-09-22_150918.tar -C / /var/lib/mysql tar -rf mysql-folders-2020-09-22_150918.tar -C / /var/lib/mysql_backup tar -rf mysql-folders-2020-09-22_150918.tar -C / /var/lib/mysql-files tar -rf mysql-folders-2020-09-22_150918.tar -C / /var/lib/mysql-keyring tar -rf mysql-folders-2020-09-22_150918.tar -C / /var/lib/mysql-upgrade gzip -9 mysql-folders-2020-09-22_150918.tar |
Une fois la sauvegarde effectuée, on peut relancer le serveur :
1 |
xavier@server: ~$ sudo systemctl start nginx |
Sauvegarde logique avec mysqldump
On écrit un script SHELL
pour faire le travail. Il consistera de dumper toutes les bases personnelles au format .sql
, hors celles du système avec mydsqldump
, afin de pouvoir les restaurer. L’objectif est alors d’obtenir autant de fichier .sql
que l’on a de bases personnelles :
Script de sauvegarde logique avec mysqldump
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/bin/bash # Backup all personal databases NOW=$(date +"%F_%H%M%S") TAR="mysqldump-$NOW.tar" EXCLUDE=(information_schema mysql performance_schema sys) # Creates empty archive echo "tar -cf $TAR -T /dev/null" tar -cf $TAR -T /dev/null # Dumps databases and adds it to backup for DB in $(mysql -e 'show databases' -s --skip-column-names -u $ROOT); do if [[ ! ${EXCLUDE[*]} =~ "$DB" ]]; then echo "mysqldump -u $ROOT $DB > $DB.sql" mysqldump -u $ROOT $DB > $DB.sql echo "tar -rf $TAR $DB.sql" tar -rf $TAR $DB.sql rm $DB.sql fi done # Compresses archive echo "gzip -9 $TAR" gzip -9 $TAR echo "" |
On pourrait ajouter une commande pour uploader l’archive obtenue sur un serveur de sauvegarde. Je montrerai cela dans un nouvel article. De même, on peut arrêter le serveur http
pendant cette opération.
Ajouter le dépôt MySQL APT
On va d’abord sur la page du dépôt MySQL APT et l’on télécharge le fichier d’installation .deb. L’adresse du fichier .deb
est https://repo.mysql.com/nom-du-fichier.deb
, le nom du fichier est donné sur la page : mysql-apt-config_0.8.15-1_all.deb
.
On télécharge ce fichier d’installation sur le serveur :
1 |
xavier@server: ~$ wget https://repo.mysql.com/mysql-apt-config_0.8.15-1_all.deb |
Installation
On installe alors le paquet package :
1 |
xavier@server: ~$ sudo dpkg -i mysql-apt-config_0.8.15-1_all.deb |
Pendant l’installation, des écrans demandent de choisir la version du serveur MySQL à installer avec le dépôt. Les options par défaut sont surlignées.
On pourra toujours changer les versions plus tard, pour mettre à jour à une version supérieure. Pour accepter un choix que l’on a surligné, on appuie sur Entrée. À la fin, lorsque les choix sont faits, on surligne OK
et l’on appuie sur Entrée.
En principe, pour régler les dépendances brisées d’un paquet installé avec dpkg -i
, on lance :
1 |
xavier@server: ~$ sudo apt-get install -f |
Normalement, on n’a pas à le faire, mais c’est une précaution supplémentaire.
On met alors à jour les informations de apt
avec le dépôt MySQL APT
:
1 |
xavier@server: ~$ sudo apt-get update |
On peut maintenant voir la version de mysql-server
, prête à être installée :
1 2 3 |
xavier@server: ~$ apt-cache policy mysql-server Installed: 5.7.31-0ubuntu0.18.04.1 Candidate: 5.7.31-1ubuntu18.04 |
Il faut impérativement arrêter le serveur MySQL :
1 |
xavier@server: ~$ sudo systemctl stop mysql |
Et on lance l’installation, cela se passe bien. On a toujours mySQL 5.7
, mais le dépôt a changé, c’est maintenant MySQL Community Server. On peut installer mySQL 8.0
.
Mise à jour vers mySQL 8.0
On relance le dépôt MySQL APT pour sélectionner la version mysql 8.0
du serveur de base de données.
1 |
xavier@server: ~$ sudo dpkg-reconfigure mysql-apt-config |
On sélectionne mySQL Server & Cluster
:
On appuie sur Entrée, et l’on sélectionne la version mysql
8.0 :
Sur le dernier écran, on sélectionne OK
et l’on appuie sur Entrée.
On met à jour le cache APT
:
1 |
xavier@server: ~$ sudo apt-get update |
On peut alors vérifier la version du serveur MySQL candidate à l’installation :
1 2 3 4 |
xavier@server: ~$ apt-cache policy mysql-server mysql-server: Installed: 5.7.31-0ubuntu0.18.04.1 Candidate: 8.0.21-1ubuntu18.04 |
Installation
Le serveur MySQL doit être impérativement stoppé :
1 |
xavier@server: ~$ sudo systemctl stop mysql |
On installe mysql 8.0
. On a bien arrêté le serveur mysql
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
xavier@server: ~$ sudo apt-get install mysql-server Reading package lists... Done Building dependency tree Reading state information... ... Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: mecab-ipadic mecab-ipadic-utf8 mecab-utils mysql-client mysql-common mysql-community-client mysql-community-client-core mysql-community-server mysql-community-server-core The following packages will be REMOVED: mysql-client-5.7 mysql-client-core-5.7 mysql-server-5.7 mysql-server-core-5.7 The following NEW packages will be installed: mecab-ipadic mecab-ipadic-utf8 mecab-utils mysql-client mysql-community-client mysql-community-client-core mysql-community-server mysql-community-server-core The following packages will be upgraded: mysql-common mysql-server 2 upgraded, 8 newly installed, 4 to remove and 0 not upgraded. Need to get 0 B/36.0 MB of archives. After this operation, 95.8 MB of additional disk space will be used. Do you want to continue? [Y/n] |
On répond donc Y
. Et c’est parti …
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Do you want to continue? [Y/n] Y Preconfiguring packages ... (Reading database ... 194546 files and directories currently installed.) Preparing to unpack .../mysql-server_8.0.21-1ubuntu18.04_amd64.deb ... Unpacking mysql-server (8.0.21-1ubuntu18.04) over (5.7.31-0ubuntu0.18.04.1) ... (Reading database ... 194544 files and directories currently installed.) Removing mysql-server-5.7 (5.7.31-0ubuntu0.18.04.1) ... ... Installing new version of config file /etc/apparmor.d/usr.sbin.mysqld ... Installing new version of config file /etc/mysql/mysql.cnf ... Installing new version of config file /etc/mysql/mysql.conf.d/mysqld.cnf ... update-alternatives: using /etc/mysql/mysql.cnf to provide /etc/mysql/my.cnf (my.cnf) in auto mode Setting up mysql-server (8.0.21-1ubuntu18.04) ... Processing triggers for man-db (2.8.3-2ubuntu0.1) ... Processing triggers for libc-bin (2.27-3ubuntu1.2) ... xavier@server:~$ xavier@server:~$ mysql -V mysql Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL) xavier@server:~$ |
J’ai bien cru l’installation avait plantée à un moment, car cela n’avançait plus, mais c’est arrivé à terme. J’ai relancé mysql
, quoique je pense qu’il était déjà parti, et j’ai pu enregistrer et finir cet article.
Et hop, MySQL 8.0.21
est installé.