una transaction tabla solo single restaurar drop sql mysql database mysqldump

transaction - restaurar solo una tabla mysql



Saltar ciertas tablas con mysqldump (7)

¿Hay alguna forma de restringir ciertas tablas desde el comando mysqldump?

Por ejemplo, usaría la siguiente sintaxis para volcar solo table1 y table2:

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

Pero, ¿hay una forma similar de volcar todas las tablas excepto table1 y table2? No he encontrado nada en la documentación de mysqldump, ¿así que la fuerza bruta (especificando todos los nombres de las tablas) es la única manera de hacerlo?


Volcar todas las bases de datos con todas las tablas pero omitir ciertas tablas

en 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

Con un poco de ayuda de https://.com/a/17016410/1069083

Utiliza lzop, que es mucho más rápido, consulte: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


Me gusta la solución de Rubo77, no la había visto antes de modificar la de Paul. Éste realizará una copia de seguridad de una sola base de datos, excluyendo las tablas que no desee. Luego lo comprimirá y eliminará cualquier archivo con más de 8 días de antigüedad. Probablemente usaré 2 versiones de esto que hacen una completa (una tabla de registros menos) una vez al día, y otra que simplemente realiza una copia de seguridad de las tablas más importantes que cambian más cada hora usando un par de trabajos 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


Otro ejemplo para ignorar tablas múltiples

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

usando --ignore-table y crea una matriz de tablas, con sintaxis como database.table

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

Enlaces con información que te ayudará.

comprimir la salida mysqldump

Nota: probado en el servidor ubuntu con mysql Ver 14.14 Distrib 5.5.55

Importar base de datos

mysql -uUSER -pPASS db_test < db_test.sql


Para excluir algunos datos de la tabla, pero no la estructura de la tabla. Así es como lo hago:

Volcar la estructura de la base de datos de todas las tablas, sin ningún dato:

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

Luego, voltee la base de datos con datos, excepto las tablas excluidas, y no voltee la estructura:

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

Luego, para cargarlo en una nueva base de datos:

mysql -u user -p newdatabase < database_structure.sql mysql -u user -p newdatabase < database_data.sql


Puedes usar la opción --ignore-table . Para que pudieras hacer

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

No hay espacios en blanco después de -p (esto no es un error tipográfico).

Si desea ignorar varias tablas, puede usar un script simple como este

#!/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}


Sobre la base de la respuesta de @ Brian-Fisher y respondiendo a los comentarios de algunas de las personas en este post, tengo un montón de tablas enormes (e innecesarias) en mi base de datos, así que quise omitir sus contenidos al copiar, pero mantengo la estructura :

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

Los dos archivos resultantes son estructuralmente sólidos, pero los datos volcados ahora son ~ 500MB en lugar de 9GB, mucho mejor para mí. Ahora puedo importar estos dos archivos a otra base de datos para realizar pruebas sin tener que preocuparme por manipular 9 GB de datos o quedarse sin espacio en disco.


para múltiples bases de datos:

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