table Pule algumas tabelas com o mysqldump




restore mysql backup to mariadb (7)

Existe uma maneira de restringir certas tabelas do comando mysqldump?

Por exemplo, eu usaria a seguinte sintaxe para despejar apenas table1 e table2:

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

Mas existe uma maneira semelhante de despejar todas as tabelas, exceto table1 e table2? Eu não encontrei nada na documentação do mysqldump, então a força bruta (especificando todos os nomes das tabelas) é a única maneira de ir?


Outro exemplo para ignorar várias tabelas

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

usando --ignore-table e criar uma matriz de tabelas, com sintaxes como database.table

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

Links com informações que ajudarão você

Comprimir saída mysqldump

Nota: testado no servidor ubuntu com o mysql Ver 14.14 Distrib 5.5.55

Banco de dados de importação

 mysql -uUSER  -pPASS db_test < db_test.sql

Script simples para ignorar tabelas

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

para vários bancos de dados:

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

Eu gosto da solução do Rubo77, eu não tinha visto antes de modificar o Paul's. Este backup de um único banco de dados, excluindo as tabelas que você não deseja. Ele irá então gzip-lo e excluir todos os arquivos com mais de 8 dias de idade. Provavelmente vou usar 2 versões deste que fazem uma tabela completa (menos logs) uma vez por dia, e outra que apenas faz o backup das tabelas mais importantes que mudam mais a cada hora usando um par de tarefas 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

Despeje todos os bancos de dados com todas as tabelas, mas pule algumas tabelas

no 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

Com uma pequena ajuda de https://.com/a/17016410/1069083

Ele usa o lzop, que é muito mais rápido, veja: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


Você pode usar o comando mysqlpump com o

--exclude-tables=name

comando. Ele especifica uma lista separada por vírgula de tabelas a serem excluídas.

A sintaxe do mysqlpump é muito parecida com o mysqldump, mas tem um desempenho melhor. Mais informações sobre como usar a opção excluir você pode ler aqui: https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#mysqlpump-filtering


Com base na resposta do @Brian-Fisher e respondendo aos comentários de algumas pessoas neste post, eu tenho um monte de tabelas enormes (e desnecessárias) no meu banco de dados, então eu queria pular o conteúdo deles ao copiar, mas manter a estrutura :

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

Os dois arquivos resultantes são estruturalmente sólidos, mas os dados descartados agora são ~ 500MB em vez de 9GB, muito melhores para mim. Agora posso importar esses dois arquivos para outro banco de dados para fins de teste sem ter que me preocupar em manipular 9 GB de dados ou ficar sem espaço em disco.


Você pode usar a --ignore-table . Então você poderia fazer

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

Não há espaços em branco após -p (isto não é um erro de digitação).

Se você quiser ignorar várias tabelas, você pode usar um script simples 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}




mysqldump