Je voudrais obtenir des dumps de chaque table mysql dans des fichiers séparés. Le manuel indique que la syntaxe est la suivante:
mysqldump [options] db_name [tbl_name ...]
Ce qui indique que vous connaissez les noms de table à l’avance. Je pourrais configurer le script qui connaît maintenant le nom de chaque table, mais disons que j'ajoute une nouvelle table sur la route et oublie de mettre à jour le script de vidage. Ensuite, il me manque des dumps pour une ou plusieurs tables.
Est-il possible de vider automatiquement chaque table existante dans un fichier séparé? Ou vais-je devoir faire du script-fu; interroger la base de données, obtenir tous les noms de table et les vider par nom.
Si je choisis la route script-fu, quelles langues de script peuvent accéder à une base de données mysql?
Le programme en ligne de commande mysqldump le fait pour vous - bien que les docs ne soient pas très clairs à ce sujet.
Une chose à noter est que ~/output/dir doit être accessible en écriture à l'utilisateur qui possède mysqld. Sur Mac OS X:
Sudo chown -R _mysqld:_mysqld ~/output/dir
mysqldump --user=dbuser --password --tab=~/output/dir dbname
Après avoir exécuté ce qui précède, vous aurez un fichier tablename.sql contenant le schéma de chaque table (déclaration de table) et le fichier tablename.txt contenant les données.
Si vous voulez un cliché uniquement avec un schéma, ajoutez l'indicateur --no-data:
mysqldump --user=dbuser --password --no-data --tab=~/output/dir dbname
Voici un script qui vide les données de la table sous forme de commandes SQL dans des fichiers compressés distincts. Cela ne nécessite pas d'être sur l'hôte du serveur MySQL, ne code pas en dur le mot de passe dans le script, et est juste pour une base de données spécifique, pas toutes les bases du serveur:
#!/bin/bash
# dump-tables-mysql.sh
# Descr: Dump MySQL table data into separate SQL files for a specified database.
# Usage: Run without args for usage info.
# Author: @Trutane
# Ref: http://stackoverflow.com/q/3669121/138325
# Notes:
# * Script will Prompt for password for db access.
# * Output files are compressed and saved in the current working dir, unless DIR is
# specified on command-line.
[ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_Host> <DB_USER> <DB_NAME> [<DIR>]" && exit 1
DB_Host=$1
DB_user=$2
DB=$3
DIR=$4
[ -n "$DIR" ] || DIR=.
test -d $DIR || mkdir -p $DIR
echo -n "DB password: "
read -s DB_pass
echo
echo "Dumping tables into separate SQL command files for database '$DB' into dir=$DIR"
tbl_count=0
for t in $(mysql -NBA -h $DB_Host -u $DB_user -p$DB_pass -D $DB -e 'show tables')
do
echo "DUMPING TABLE: $DB.$t"
mysqldump -h $DB_Host -u $DB_user -p$DB_pass $DB $t | gzip > $DIR/$DB.$t.sql.gz
tbl_count=$(( tbl_count + 1 ))
done
echo "$tbl_count tables dumped from database '$DB' into dir=$DIR"
Vous pouvez accomplir ceci en:
mysqldump
# Optional variables for a backup script
MYSQL_USER="root"
MYSQL_PASS="something"
BACKUP_DIR=/srv/backup/$(date +%Y-%m-%dT%H_%M_%S);
test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR"
# Get the database list, exclude information_schema
for db in $(mysql -B -s -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' | grep -v information_schema)
do
# dump each database in a separate file
mysqldump -u $MYSQL_USER --password=$MYSQL_PASS "$db" | gzip > "$BACKUP_DIR/$db.sql.gz"
done
Voici l'importation correspondante.
#!/bin/bash
# import-files-mysql.sh
# Descr: Import separate SQL files for a specified database.
# Usage: Run without args for usage info.
# Author: Will Rubel
# Notes:
# * Script will Prompt for password for db access.
[ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_Host> <DB_USER> <DB_NAME> [<DIR>]" && exit 1
DB_Host=$1
DB_user=$2
DB=$3
DIR=$4
DIR=$DIR/*
echo -n "DB password: "
read -s DB_pass
echo
echo "Importing separate SQL command files for database '$DB' into '$DB'"
file_count=0
for f in $DIR
do
echo "IMPORTING FILE: $f"
gunzip -c $f | mysql -h $DB_Host -u $DB_user -p$DB_pass $DB
(( file_count++ ))
done
echo "$file_count files importing to database '$DB'"
#!/bin/bash
for i in $(mysql -uUser -pPASSWORD DATABASE -e "show tables;"|grep -v Tables_in_);do mysqldump -uUSER -pPASSWORD DATABASE $i > /backup/dir/$i".sql";done
tar -cjf "backup_mysql_"$(date +'%Y%m%d')".tar.bz2" /backup/dir/*.sql
Il semble que tout le monde ici ait oublié autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;
qui est supposé accélérer le processus d'importation ...
#!/bin/bash
MYSQL_USER="USER"
MYSQL_PASS="PASS"
if [ -z "$1" ]
then
echo "Dumping all DB ... in separate files"
for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names);
do
echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$I.sql"
mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I >> "$I.sql";
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$I.sql"
gzip "$I.sql"
done
echo "END."
else
echo "Dumping $1 ..."
echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$1.sql"
mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $1 >> "$1.sql";
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$1.sql"
gzip "$1.sql"
fi
Si vous voulez vider toutes les tables de toutes les bases de données, combinez simplement les réponses d'Elias Torres Arroyo et de Trutane: Et si vous ne voulez pas donner votre mot de passe sur un terminal, stockez simplement votre mot de passe dans un fichier de configuration supplémentaire (chmod 0600) - voir Mysqldump lancé par cron et la sécurité par mot de passe
#!/usr/bin/env bash
# this file
# a) gets all databases from mysql
# b) gets all tables from all databases in a)
# c) creates subfolders for every database in a)
# d) dumps every table from b) in a single file
# this is a mixture of scripts from Trutane (http://stackoverflow.com/q/3669121/138325)
# and Elias Torres Arroyo (https://stackoverflow.com/a/14711298/8398149)
[ $# -lt 3 ] && echo "Usage: $(basename $0) <DB_Host> <DB_USER> <DIR>" && exit 1
DB_Host=$1
DB_user=$2
BACKUP_DIR=$3/$(date +%Y-%m-%dT%H_%M_%S);
test -d "$BACKUP_DIR" || mkdir -p "$BACKUP_DIR"
# Get the database list, exclude information_schema
database_count=0
tbl_count=0
for db in $(mysql --defaults-extra-file=/yourfile/config.cnf -B -s -u $DB_user -e 'show databases' | grep -v information_schema)
do
# dump each database in a separate file
(( database_count++ ))
DIR=$BACKUP_DIR/$db
[ -n "$DIR" ] || DIR=.
test -d $DIR || mkdir -p $DIR
echo
echo "Dumping tables into separate SQL command files for database '$db' into dir=$DIR"
for t in $(mysql --defaults-extra-file=/yourfile/config.cnf -NBA -h $DB_Host -u $DB_user -D $db -e 'show tables')
do
echo "DUMPING TABLE: $db.$t"
mysqldump --defaults-extra-file=/yourfile/config.cnf -h $DB_Host -u $DB_user $db $t > $DIR/$db.$t.sql
tbl_count=$(( tbl_count + 1 ))
done
echo "Database $db is finished"
done
echo "Backup completed"
Je ne suis pas bash master, mais je le ferais simplement avec un script bash. Sans toucher à MySQL, avec la connaissance du répertoire de données et du nom de la base de données, vous pouvez simplement analyser tous les fichiers .frm (un pour chaque table de ce répertoire db /) pour obtenir une liste de tables.
Je suis sûr qu'il existe des moyens de le rendre plus fluide et d'accepter des arguments ou autres, mais cela a bien fonctionné pour moi.
tables_in_a_db_to_sql.sh
#!/bin/bash
database="this_is_my_database"
datadir="/var/lib/mysql/"
datadir_escaped="\/var\/lib\/mysql\/"
all_tables=($(ls $datadir$database/*.frm | sed s/"$datadir_escaped$database\/"/""/g | sed s/.frm//g))
for t in "${all_tables[@]}"; do
outfile=$database.$t.sql
echo "-- backing up $t to $outfile"
echo "mysqldump [options] $database $t > $outfile"
# mysqldump [options] $database $t > $outfile
done
Remplissez les options [options] et la convention de sortie désirée, et décommentez la dernière ligne mysqldump.