it-roy-ru.com

Пропустить определенные таблицы с mysqldump

Есть ли способ ограничить определенные таблицы из команды mysqldump?

Например, я бы использовал следующий синтаксис для вывода only table1 и table2:

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

Но есть ли аналогичный способ вывести все таблицы кроме table1 и table2? Я ничего не нашел в документации по mysqldump, так что единственный ли путь - перебор (с указанием всех имен таблиц)?

485
Zac

Вы можете использовать параметр --ignore-table . Так что вы могли бы сделать

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

Пробел после -p отсутствует (это не опечатка).

Если вы хотите игнорировать несколько таблиц, вы можете использовать простой скрипт, как этот

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

Основываясь на ответе @ Brian-Fisher и отвечая на комментарии некоторых людей к этому посту, у меня есть куча огромных (и ненужных) таблиц в моей базе данных, поэтому я хотел пропустить их содержимое при копировании, но сохранить структуру :

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

Полученные два файла являются структурно исправными, но выгруженные данные теперь составляют ~ 500 МБ, а не 9 ГБ, что намного лучше для меня. Теперь я могу импортировать эти два файла в другую базу данных для целей тестирования, не беспокоясь о манипулировании 9 ГБ данных или нехватке дискового пространства.

97
DuffJ

для нескольких баз данных:

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

Еще один пример игнорирования нескольких таблиц

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

используя --ignore-table и создайте массив таблиц с такими синтаксисами, как database.table

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

Ссылки с информацией, которая поможет вам

сжатие вывода mysqldump

Примечание: протестировано на сервере Ubuntu с MySQL версии 14.14 Distrib 5.5.55

Импорт базы данных

 mysql -uUSER  -pPASS db_test < db_test.sql

Простой скрипт для игнорирования таблиц

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

Исключить некоторые таблицы данные , но не таблицу структуру . Вот как я это делаю:

Дамп структуры базы данных всех таблиц, без каких-либо данных:

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

Затем выведите базу данных с данными, кроме исключенных таблиц, и не создавайте структуру:

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

Затем, чтобы загрузить его в новую базу данных:

mysql -u user -p newdatabase < database_structure.sql
mysql -u user -p newdatabase < database_data.sql
3
Benedikt Köppel

Сбросить все базы данных со всеми таблицами, но пропустить определенные таблицы

на 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

С небольшой помощью https://stackoverflow.com/a/17016410/1069083

Он использует lzop, который гораздо быстрее, см .: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO

0
rubo77

Вы можете использовать команду mysqlpump с 

--exclude-tables=name

команда. Он указывает список таблиц через запятую, которые нужно исключить.

Синтаксис mysqlpump очень похож на mysqldump, но он более производительный ... Подробнее об использовании опции exclude вы можете прочитать здесь: https://dev.mysql.com/doc/refman/5.7/ ru/mysqlpump.html # mysqlpump-filtering

0
ThorstenC

Мне нравится решение Rubo77, я не видел его до того, как изменил решение Пола. Это будет резервное копирование одной базы данных, исключая любые таблицы, которые вы не хотите. Затем он скопирует его и удалит все файлы старше 8 дней. Я, вероятно, буду использовать 2 версии этого, которые делают полный (минус таблица журналов) один раз в день, и еще одна, которая просто создает резервные копии наиболее важных таблиц, которые меняются чаще всего каждый час, используя пару заданий 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
0
Alan