web-dev-qa-db-fra.com

Passer certaines tables avec mysqldump

Est-il possible de restreindre certaines tables à partir de la commande mysqldump?

Par exemple, j'utiliserais la syntaxe suivante pour dump only table1 et table2:

mysqldump -u username -p database table1 table2 > database.sql

Mais existe-t-il une méthode similaire pour vider toutes les tables sauf table1 et table2? Je n'ai rien trouvé dans la documentation de mysqldump, est-ce que brute-force (en spécifiant tous les noms de table) est la seule solution?

485
Zac

Vous pouvez utiliser l'option --ignore-table . Alors tu pourrais faire

mysqldump -u USERNAME -pPASSWORD DATABASE --ignore-table=DATABASE.table1 > database.sql

Il n'y a pas d'espace après le -p (ce n'est pas une faute de frappe).

Si vous voulez ignorer plusieurs tables, vous pouvez utiliser un script simple comme celui-ci.

#!/bin/bash
PASSWORD=XXXXXX
Host=XXXXXX
USER=XXXXXX
DATABASE=databasename
DB_FILE=dump.sql
EXCLUDED_TABLES=(
table1
table2
table3
table4
tableN   
)

IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
   IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done

echo "Dump structure"
mysqldump --Host=${Host} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE} > ${DB_FILE}

echo "Dump content"
mysqldump --Host=${Host} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
821
Brian Fisher

En me basant sur la réponse de @ Brian-Fisher et en répondant aux commentaires de certaines personnes de ce post, j'ai une pléthore de tables énormes (et inutiles) dans ma base de données, je voulais donc ignorer leur contenu lors de la copie, tout en conservant la structure :

mysqldump -h <Host> -u <username> -p <schema> --no-data > db-structure.sql
mysqldump -h <Host> -u <username> -p <schema> --no-create-info --ignore-table=schema.table1 --ignore-table=schema.table2 > db-data.sql

Les deux fichiers résultants sont structurellement corrects, mais les données transférées font maintenant environ 500 Mo au lieu de 9 Go, ce qui est bien mieux pour moi. Je peux maintenant importer ces deux fichiers dans une autre base de données à des fins de test sans avoir à vous soucier de manipuler 9 Go de données ou de manquer d'espace disque.

97
DuffJ

pour plusieurs bases de données:

mysqldump -u user -p --ignore-table=db1.tbl1 --ignore-table=db2.tbl1 --databases db1 db2 ..
52
user1219736

Un autre exemple pour ignorer plusieurs tables

/usr/bin/mysqldump -uUSER -pPASS --ignore-table={db_test.test1,db_test.test3} db_test> db_test.sql

en utilisant --ignore-table et créer un tableau de tables, avec une syntaxe comme database.table

--ignore-table={db_test.table1,db_test.table3,db_test.table4}

Liens avec des informations qui vous aideront

compress sortie mysqldump

Note: testé sur le serveur Ubuntu avec MySQL Ver 14.14 Distrib 5.5.55

Importer une base de données

 mysql -uUSER  -pPASS db_test < db_test.sql

Simple script pour ignorer les tables

#!/bin/bash

#tables to ignore
_TIGNORE=(
my_database.table1
my_database.table2
my_database.tablex
)

#create text for ignore tables
_TDELIMITED="$(IFS=" "; echo "${_TIGNORE[*]/#/--ignore-table=}")"

#don't forget to include user and password
/usr/bin/mysqldump -uUSER -pPASSWORD --events ${_TDELIMITED} --databases my_database | gzip -v > backup_database.sql.gz
23
DarckBlezzer

Pour exclure une table data , mais pas la table structure . Voici comment je le fais:

Vide la structure de la base de données de toutes les tables, sans aucune donnée:

mysqldump -u user -p --no-data database > database_structure.sql

Puis videz la base de données avec les données, sauf les tables exclues, et ne videz pas la structure:

mysqldump -u user -p --no-create-info \
    --ignore-table=database.table1 \
    --ignore-table=database.table2 database > database_data.sql

Ensuite, pour le charger dans une nouvelle base de données:

mysql -u user -p newdatabase < database_structure.sql
mysql -u user -p newdatabase < database_data.sql
3
Benedikt Köppel

Vide toutes les bases de données avec toutes les tables mais ignore certaines tables

sur github: https://github.com/rubo77/mysql-backup.sh/blob/master/mysql-backup.sh

#!/bin/bash
# mysql-backup.sh

if [ -z "$1" ] ; then
  echo
  echo "ERROR: root password Parameter missing."
  exit
fi
DB_Host=localhost
MYSQL_USER=root
MYSQL_PASS=$1
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
#MYSQL_CONN=""

BACKUP_DIR=/backup/mysql/

mkdir $BACKUP_DIR -p

MYSQLPATH=/var/lib/mysql/

IGNORE="database1.table1, database1.table2, database2.table1,"

# strpos $1 $2 [$3]
# strpos haystack needle [optional offset of an input string]
strpos()
{
    local str=${1}
    local offset=${3}
    if [ -n "${offset}" ]; then
        str=`substr "${str}" ${offset}`
    else
        offset=0
    fi
    str=${str/${2}*/}
    if [ "${#str}" -eq "${#1}" ]; then
        return 0
    fi
    echo $((${#str}+${offset}))
}

cd $MYSQLPATH
for i in */; do
    if [ $i != 'performance_schema/' ] ; then 
    DB=`basename "$i"` 
    #echo "backup $DB->$BACKUP_DIR$DB.sql.lzo"
    mysqlcheck "$DB" $MYSQL_CONN --silent --auto-repair >/tmp/tmp_grep_mysql-backup
    grep -E -B1 "note|warning|support|auto_increment|required|locks" /tmp/tmp_grep_mysql-backup>/tmp/tmp_grep_mysql-backup_not
    grep -v "$(cat /tmp/tmp_grep_mysql-backup_not)" /tmp/tmp_grep_mysql-backup

    tbl_count=0
    for t in $(mysql -NBA -h $DB_Host $MYSQL_CONN -D $DB -e 'show tables') 
    do
      found=$(strpos "$IGNORE" "$DB"."$t,")
      if [ "$found" == "" ] ; then 
        echo "DUMPING TABLE: $DB.$t"
        mysqldump -h $DB_Host $MYSQL_CONN $DB $t --events --skip-lock-tables | lzop -3 -f -o $BACKUP_DIR/$DB.$t.sql.lzo
        tbl_count=$(( tbl_count + 1 ))
      fi
    done
    echo "$tbl_count tables dumped from database '$DB' into dir=$BACKUP_DIR"
    fi
done

Avec un peu d'aide de https://stackoverflow.com/a/17016410/1069083

Il utilise lzop qui est beaucoup plus rapide, voir: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO

0
rubo77

Par souci d'exhaustivité, voici un script qui pourrait en réalité être une solution permettant d'obtenir une sauvegarde à partir d'une base de données, en excluant (en ignorant) toutes les vues. Le nom de la base de données est supposé être employé:

ignore=$(mysql --login-path=root1 INFORMATION_SCHEMA \
    --skip-column-names --batch \
    -e "select 
          group_concat(
            concat('--ignore-table=', table_schema, '.', table_name) SEPARATOR ' '
          ) 
        from tables 
        where table_type = 'VIEW' and table_schema = 'employees'")

mysqldump --login-path=root1 --column-statistics=0 --no-data employees $ignore > "./backups/som_file.sql"   

Vous pouvez mettre à jour la logique de la requête. En général, en utilisant group_concat et concat, vous pouvez générer presque toute chaîne ou commande Shell souhaitée.

0
hpaknia

Vous pouvez utiliser la commande mysqlpump avec la commande 

--exclude-tables=name

commander. Il spécifie une liste de tables à exclure séparées par des virgules.

La syntaxe de mysqlpump est très similaire à celle de mysqldump, mais sa façon de procéder est plus performante . Plus d'informations sur l'utilisation de l'option d'exclusion peuvent être lues ici: https://dev.mysql.com/doc/refman/5.7/ fr/mysqlpump.html # mysqlpump-filtering

0
ThorstenC

J'aime la solution de Rubo77, je ne l'avais pas vue avant de modifier celle de Paul. Celui-ci sauvegardera une base de données unique, en excluant les tables que vous ne voulez pas. Il sera ensuite gzip, et supprimera tous les fichiers de plus de 8 jours. J'utiliserai probablement 2 versions de cette version qui effectuent une analyse complète (table moins) une fois par jour, et une autre qui sauvegarde les tables les plus importantes qui changent le plus toutes les heures à l'aide de quelques tâches cron.

#!/bin/sh
PASSWORD=XXXX
Host=127.0.0.1
USER=root
DATABASE=MyFavoriteDB

now="$(date +'%d_%m_%Y_%H_%M')"
filename="${DATABASE}_db_backup_$now"
backupfolder="/opt/backups/mysql"
DB_FILE="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt

EXCLUDED_TABLES=(
logs
)
IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
   IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done

echo "Dump structure started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --Host=${Host} --user=${USER} --password=${PASSWORD} --single-transaction --no-data --routines ${DATABASE}  > ${DB_FILE} 
echo "Dump structure finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "Dump content"
mysqldump --Host=${Host} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info --skip-triggers ${IGNORED_TABLES_STRING} >> ${DB_FILE}
gzip ${DB_FILE}

find "$backupfolder" -name ${DATABASE}_db_backup_* -mtime +8 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0
0
Alan