web-dev-qa-db-fra.com

vider toutes les tables mysql dans des fichiers séparés automatiquement?

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?

56
user151841

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
54
Salient Digital

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"
53
Trutane

Vous pouvez accomplir ceci en:

  1. Obtenir la liste des bases de données dans mysql
  2. vide chaque base de données avec 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
17
Elias Torres Arroyo

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'"
5
WillRubel
#!/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
2
djadk

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
1
WonderLand

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"
0
sneaky

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.

0
Riedsio