Пропустіть певні таблиці за допомогою mysqldump


558

Чи є спосіб обмежити певні таблиці з команди mysqldump?

Наприклад, я використовував би такий синтаксис, щоб скинути лише таблицю1 та таблицю2:

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

Але чи є подібний спосіб скинути всі таблиці, крім table1 та table2? Я нічого не знайшов у документації на mysqldump, тож чи просто брутальною силою (із зазначенням усіх назв таблиці) є єдиний шлях?

Відповіді:


940

Можна скористатися параметром --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}

4
Дякую! Працював чудово ... Я не знаю, як я це пропустив.
Зак

20
чи є спосіб просто пропустити вміст таблиці? структуру, яку я хочу резервного копіювання.
Андрес СК

5
Можна скористатися параметром --no-data = true, але я не знаю, чи можна це робити на рівні таблиці.
Брайан Фішер

60
якщо ім'я бази даних не встановлено для кожної таблиці --ignore, ви отримаєте помилку "Незаконне використання параметра --ignore-table = <database>. <table>". Переконайтеся, що ви завжди декларуєте базу даних!
супайб

26
якщо ви хочете ігнорувати дані деяких таблиць, але все ж скидаєте їх структуру, ви можете запустити mysqldump знову для цих таблиць і об'єднати їх у створену вами резервну копію
carpii

119

Спираючись на відповідь від @ 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 ГБ даних або втрату місця на диску.


Випробувано та використано під MySQL 5.5.43 (для debian-linux-gnu (x86_64)) Спасибі
Абдел

Простий і елегантний. Прекрасне рішення.
Грег Глокнер

4
чудове рішення. Мені довелося додати --skip-triggers до другого твердження, щоб дамп працював пізніше (якщо припустити, що у вас є тригери), але в іншому випадку: ідеально
Rainer Mohr

Дякую, це працює і дуже корисно.
Гімалаї Гарг

59

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

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

5
На цю тему вже є відповідь, яка говорить про це, краще.
alxgb

19
Це правильно, але це рішення працює з декількома базами даних.
Олексій

Цікаво - я спочатку подумав mysqldі mysqldumpбули б ті самі програми.
Мартін Тома

4
це те, що я шукаю - відповідь з однолінійним рішенням, яке не змушує мене читати щось за 2-3 хвилини: P
jebbie

43

Ще один приклад ігнорування декількох таблиць

/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 Ver 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

Прекрасний спосіб уникнути використання сценарію, коли ви хочете ігнорувати кілька таблиць. Ця відповідь повинна отримати більше "+1"
svfat

ідеальна відповідь !!! +1 зробив мій день :)
SagarPPanchal

7

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

Скиньте структуру бази даних усіх таблиць без будь-яких даних:

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

1

Ви можете використовувати mysqlpumpкоманду за допомогою

--exclude-tables=name

командування. Він визначає розділений комою список таблиць, який потрібно виключити.

Синтаксис mysqlpump дуже схожий на mysqldump, але він має більш високу ефективність. Більш детальну інформацію про використання параметра виключення ви можете прочитати тут: https://dev.mysql.com/doc/refman/5.7/uk/mysqlpump.html#mysqlpump-filtering


0

Вивантажте всі бази даних з усіма таблицями, але пропустіть певні таблиці

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


Документ, яким ви ділитесь, говорить, що gzip швидше, ніж lzop.
jrosell

0

Мені подобається рішення Rubo77, я не бачив його до того, як я змінив рішення Павла. Ця буде створити резервну копію єдиної бази даних, виключаючи будь-які таблиці, які ви не хочете. Потім він запустить його та видалить файли старше 8 днів. Я, ймовірно, буду використовувати дві версії цього, які роблять повну (мінус таблицю журналів) раз на день, і іншу, яка просто створює резервні копії найважливіших таблиць, які змінюються найбільше щогодини, використовуючи пару завдань.

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

Для повноти, ось сценарій, який насправді може бути однолінійним, щоб отримати резервну копію з бази даних, виключаючи (ігноруючи) всі перегляди. Ім'я db прийнято вважати службовцями:

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"   

Ви можете оновити логіку запиту. Загалом, використовуючи group_concatі concatви можете генерувати практично будь-яку бажану команду рядка або оболонки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.