Sauter certaines tables avec mysqldump

y a-t-il un moyen de restreindre certaines tables de la commande mysqldump?

par exemple, j'utiliserais la syntaxe suivante pour Dumper seulement Tableau1 et tableau2:

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

mais y a-t-il une façon similaire de vider toutes les tables sauf Tableau1 et tableau2? Je n'ai rien trouvé dans la documentation de mysqldump, donc la force brute (en spécifiant tous les noms de table) est la seule façon d'y aller?

467
demandé sur Zac 2009-01-08 20:30:17

7 réponses

vous pouvez utiliser l'option --ignore-table . Donc vous pouvez faire

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

il n'y a pas de blanc après -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}
788
répondu Paul Sheldrake 2018-09-22 22:29:15

S'appuyant sur la réponse de @Brian-Fisher et répondant aux commentaires de certaines des personnes sur ce post, j'ai un tas d'énormes (et inutiles) tables dans ma base de données donc je voulais sauter leur contenu lors de la copie, mais garder 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 solides mais les données stockées sont maintenant ~500MB plutôt que 9GO, beaucoup 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 la manipulation de 9 GO de données ou de l'espace disque disponible.

90
répondu DuffJ 2017-02-16 04:11:59

pour bases de données multiples:

mysqldump -u user -p --ignore-table=db1.tbl1 --ignore-table=db2.tbl1 --databases db1 db2 ..
50
répondu user1219736 2014-05-20 20:02:28

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 des syntaxes comme database.table

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

des Liens avec des informations qui vous aideront à

compresse sortie mysqldump

Note: testé dans le serveur ubuntu avec mysql Ver 14.14 Distrib 5.5.55

l'Importation de la base de données

 mysql -uUSER  -pPASS db_test < db_test.sql
20
répondu DarckBlezzer 2018-04-04 22:56:29

pour exclure certains tableaux données , mais pas le tableau structure . Voici comment je fais:

Vidage de la structure de base de données de toutes les tables, sans toutes les données:

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

puis dump la base de données avec les données, sauf les tableaux exclus, et ne dump 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
répondu Benedikt Köppel 2016-11-07 09:50:29

Dump toutes les bases de données avec toutes les tables mais sauter certaines tables

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

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

if [ -z "" ] ; then
  echo
  echo "ERROR: root password Parameter missing."
  exit
fi
DB_host=localhost
MYSQL_USER=root
MYSQL_PASS=
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   []
# strpos haystack needle [optional offset of an input string]
strpos()
{
    local str=
    local offset=
    if [ -n "${offset}" ]; then
        str=`substr "${str}" ${offset}`
    else
        offset=0
    fi
    str=${str/*/}
    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
répondu rubo77 2017-05-23 12:34:44

j'aime la solution de Rubo77, Je ne l'avais pas vue avant de modifier celle de Paul. Celui-ci va sauvegarder une seule base de données, à l'exclusion de toutes les tables que vous ne voulez pas. Il sera alors gzip, et supprimer tous les fichiers de plus de 8 jours. Je vais probablement utiliser 2 versions de ceci qui font une pleine (moins la table des logs) une fois par jour, et une autre qui vient de sauvegarder les tables les plus importantes qui changent le plus chaque heure en utilisant des travaux de quelques 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
répondu Alan 2018-10-04 22:34:20