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?
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}
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.
pour plusieurs bases de données:
mysqldump -u user -p --ignore-table=db1.tbl1 --ignore-table=db2.tbl1 --databases db1 db2 ..
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
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
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
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.
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
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