Oct 07 2009

Renommer une base MySQL en ligne de commande

Category: Linux,Script Shell,SQL

Voici un script shell bash, mysqlrename.sh, qui permet de renommer correctement une base de données MySQL.
En supposant que le nom actuel de la base soit CURRENT_NAME et que le nouveau nom devra être NEW_NAME, le script procède ainsi:

  • il crée une base vierge NEW_NAME ; s'il échoue, il s'arrête ;
  • il fait un dump de la base CURRENT_NAME en redirigeant la sortie standard dans un nouveau processus MySQL qui exécute les instructions du dump en utilisant la base NEW_NAME (utilisation de l'option -D) ; s'il échoue, il s'arrête encore immédiatement ;
  • enfin, si tout c'est correctement déroulé, il supprime la base CURRENT_NAME.

Le script admet les options -u et -p de MySQL qui permettent de définir respectivement l'utilisateur et le mot de passe et il attend évidement deux arguments: le CURRENT_NAME et le NEW_NAME, dans cet ordre.
Cela peut donc donner mysqlrename.sh -uUtilisateur -pMotDePasse CURRENT_BASE NEW_BASE ou encore mysqlrename.sh -uUtilisateur CURRENT_BASE NEW_BASE ou simplement mysqlrename.sh CURRENT_BASE NEW_BASE
Le script est tellement simple qu'il donne l'occasion de se rafraîchir la mémoire sur le traitement des options et des paramètres par l'utilisation conjointe de getopts et shift.

#!/bin/bash

# mysqlrename.sh: rename MySQL database
# Copyright (C) 2009  Philippe Ivaldi http://www.piprime.fr/
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

function help()
{
    printf "Usage: %s: [-uValue] [-pValue] CURRENT_NAME NEW_NAME\n" $self
    echo "Rename the MySQL database CURRENT_NAME to NEW_NAME"
    exit 1
}

function abort
{
    error=$?
    echo 'Process aborted !'
    exit $error
}

USER=''
PASS=''
self=$(basename $0)

while getopts u:p:h option
do
    case $option in
        u)
            USER=" -u${OPTARG}"
            ;;
        p)
            PASS="${OPTARG}"
            ;;
        h)
            help
            ;;
        *)
            echo -e "Try ${self} -h"
            exit 1
            ;;
    esac
done

shift $(($OPTIND-1)) # On passe aux arguments

# Il faut exactement deux arguments
[ $# -ne 2 ] && help

OPTIONS="-p${PASS}${USER}"

mysql $OPTIONS -e"CREATE DATABASE \`$2\`;" || abort
mysqldump $OPTIONS "$1" | mysql $OPTIONS -D "$2" || abort
mysql $OPTIONS -e"DROP DATABASE \`$1\`;"