Question Ignorer certaines tables avec mysqldump


Y at-il un moyen de restreindre certaines tables de la commande mysqldump?

Par exemple, j'utiliserais la syntaxe suivante pour vider seulement table1 et table2:

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

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


459
2018-01-08 17:30


origine


Réponses:


Vous pouvez utiliser le --ignore-table option. Donc tu pourrais faire

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

Il n'y a pas d'espace 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 ${DATABASE} > ${DB_FILE}

echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} --no-create-info ${IGNORED_TABLES_STRING} >> ${DB_FILE}

772



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

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 transférées sont maintenant d'environ 500 Mo au lieu de 9 Go, ce qui est bien meilleur pour moi. Je peux maintenant importer ces deux fichiers dans une autre base de données à des fins de test sans avoir à me soucier de manipuler 9 Go de données ou de manquer d'espace disque.


89



pour plusieurs bases de données:

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

48



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}

Liens avec des informations qui vous aideront

compresser la sortie mysqldump

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

Importer la base

 mysql -uUSER  -pPASS db_test < db_test.sql

18



Pour exclure une table Les donnéesmais pas la table structure. Voici comment je le fais:

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

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

Puis vider la base de données avec des données, à l'exception des tables exclues, et ne pas vider 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



Vider toutes les bases de données avec toutes les tables mais ignorer 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