Déplacer ses bases de données MySQL

L'emplacement des données de MySQL est indiqué dans la variable datadir qui se trouve dans le fichier my.cnf. Toutefois, il peut exister plusieurs fichiers my.cnf :

$ mysqld --verbose --help | head -n13 | tail -n2
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 

Éventuellement ce fichier contient des directives !includedir. Il faut alors chercher dans ces répertoires le fichier qui contient datadir.

Dans la suite, nous allons déplacer les données dans /home/mysql.

Tout d'abord on arrête le service :

$ sudo service mysql stop

On édite le fichier qui contient datadir :

datadir		= /home/mysql

On suppose que l'ancienne valeur de datadir était /var/lib/mysql. On déplace les données :

$ sudo mv /var/lib/mysql /home

Malheureusement cela ne suffit pas. Le premier problème vient du fichier/usr/share/mysql/mysql-systemd-start :

$ head  /usr/share/mysql/mysql-systemd-start -n25 | tail -n16
sanity () {
  if [ ! -r /etc/mysql/my.cnf ]; then
    echo "MySQL configuration not found at /etc/mysql/my.cnf. Please create one."
    exit 1
  fi

  if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
    echo "MySQL data dir not found at /var/lib/mysql. Please create one."
    exit 1
  fi

  if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
    echo "MySQL system database not found. Please run mysql_install_db tool."
    exit 1
  fi
}

Il faut donc créer le répertoire /var/lib/mysql/mysql avec les bons droits :

$ sudo mkdir -p /var/lib/mysql/mysql
$ sudo chown -R mysql:mysql /var/lib/mysql
$ sudo chmod -R 700 /var/lib/mysql

Il faut maintenant configurer AppArmor. D'après ce qui suit, nous devons modifier le fichier local/usr.sbin.mysqld :

$ tail /etc/apparmor.d/usr.sbin.mysqld -n3
  # Site-specific additions and overrides. See local/README for details.
  #include <local/usr.sbin.mysqld>

Modifier le fichier /etc/apparmor.d/local/usr.sbin.mysqld en ajoutant :

# Allow data dir access
  /home/mysql/ r,
  /home/mysql/** rwk,

Rechargez :

sudo service apparmor reload

Redémarrez le service :

sudo service mysql start

Vérifiez le changement :

$ mysql -u root -p -e 'select @@datadir'
Enter password: 
+--------------+
| @@datadir    |
+--------------+
| /home/mysql/ |
+--------------+