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?
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}
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.
pour bases de données multiples:
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 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
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
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
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