Bỏ qua các bảng nhất định với mysqldump


558

Có cách nào để hạn chế các bảng nhất định từ lệnh mysqldump không?

Ví dụ: tôi sử dụng cú pháp sau để chỉ kết xuất bảng1 và bảng2:

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

Nhưng có một cách tương tự để kết xuất tất cả các bảng ngoại trừ bảng1 và bảng2? Tôi chưa tìm thấy bất cứ điều gì trong tài liệu mysqldump, vì vậy, brute-force (chỉ định tất cả các tên bảng) là cách duy nhất để đi?

Câu trả lời:


940

Bạn có thể sử dụng tùy chọn --ignore-bảng . Vì vậy, bạn có thể làm

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

Không có khoảng trắng sau -p(đây không phải là một lỗi đánh máy).

Nếu bạn muốn bỏ qua nhiều bảng, bạn có thể sử dụng một tập lệnh đơn giản như thế này

#!/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
Cảm ơn bạn! Hoạt động hoàn hảo ... Tôi không biết làm thế nào tôi bỏ lỡ điều đó.
Zac

20
Có cách nào để bỏ qua nội dung bảng? cấu trúc tôi muốn sao lưu.
Andres SK

5
Bạn có thể sử dụng tùy chọn --no-data = true, nhưng tôi không biết liệu bạn có thể làm điều đó ở cấp độ bảng không.
Brian Fisher

60
nếu tên cơ sở dữ liệu không được đặt cho mỗi bảng --ignore thì bạn sẽ gặp lỗi 'Sử dụng bất hợp pháp tùy chọn --ignore-table = <cơ sở dữ liệu>. <bảng>'. Hãy chắc chắn rằng bạn luôn khai báo cơ sở dữ liệu!
supajb

26
nếu bạn muốn bỏ qua một số dữ liệu bảng, nhưng vẫn kết xuất cấu trúc của chúng, bạn có thể chạy lại mysqldump cho các bảng đó và nối nó vào bản sao lưu bạn vừa tạo
carpii

119

Dựa trên câu trả lời từ @ Brian-Fisher và trả lời bình luận của một số người trong bài đăng này, tôi có một loạt các bảng lớn (và không cần thiết) trong cơ sở dữ liệu của mình vì vậy tôi muốn bỏ qua nội dung của họ khi sao chép, nhưng vẫn giữ cấu trúc :

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

Hai tệp kết quả là âm thanh có cấu trúc nhưng dữ liệu bị đổ bây giờ là ~ 500MB thay vì 9GB, tốt hơn nhiều đối với tôi. Bây giờ tôi có thể nhập hai tệp này vào cơ sở dữ liệu khác cho mục đích thử nghiệm mà không phải lo lắng về việc thao túng 9GB dữ liệu hoặc hết dung lượng đĩa.


Đã thử nghiệm và sử dụng trong MySQL 5.5.43 (đối với debian-linux-gnu (x86_64)) Cảm ơn
Abdel

Đơn giản và thanh lịch. Một giải pháp tuyệt vời.
Greg Glockner

4
giải pháp tuyệt vời. Tôi đã phải thêm --skip-trigger vào câu lệnh thứ hai để kết xuất hoạt động sau (giả sử bạn có trình kích hoạt), nhưng nếu không: hoàn hảo
Rainer Mohr

Cảm ơn bạn, điều này đang làm việc và rất hữu ích.
Himalaya Garg

59

cho nhiều cơ sở dữ liệu:

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

5
Đã có một câu trả lời cho chủ đề này nói rằng, tốt hơn.
alxgb

19
Đúng vậy, nhưng giải pháp này hoạt động với nhiều cơ sở dữ liệu.
Alex

Thú vị - Lần đầu tiên tôi nghĩ mysqldmysqldumpsẽ là các chương trình tương tự.
Martin Thoma

4
đó là những gì tôi đang tìm kiếm - một câu trả lời đơn lẻ với giải pháp không bắt buộc tôi phải đọc thứ gì đó trong 2-3 phút: P
jebbie

43

Một ví dụ khác để bỏ qua nhiều bảng

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

sử dụng --ignore-tablevà tạo một mảng các bảng, với các cú pháp nhưdatabase.table

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

Liên kết với thông tin sẽ giúp bạn

nén đầu ra mysqldump

Lưu ý: đã thử nghiệm trên máy chủ Ubuntu với mysql Ver 14,14 Phân phối 5.5.55

Nhập cơ sở dữ liệu

 mysql -uUSER  -pPASS db_test < db_test.sql

Kịch bản đơn giản để bỏ qua các bảng

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

Cách tuyệt vời để tránh sử dụng tập lệnh khi bạn muốn bỏ qua nhiều bảng. Câu trả lời đó sẽ nhận được nhiều hơn "+1"
svfat

câu trả lời hoàn hảo!!! +1 đã tạo nên ngày của tôi :)
SagarPPanchal

7

Để loại trừ một số dữ liệu bảng , nhưng không phải cấu trúc bảng . Đây là cách tôi làm điều đó:

Kết xuất cấu trúc cơ sở dữ liệu của tất cả các bảng, không có bất kỳ dữ liệu nào:

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

Sau đó kết xuất cơ sở dữ liệu với dữ liệu, ngoại trừ các bảng bị loại trừ và không kết xuất cấu trúc:

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

Sau đó, để tải nó vào cơ sở dữ liệu mới:

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

1

Bạn có thể sử dụng mysqlpumplệnh với

--exclude-tables=name

chỉ huy. Nó chỉ định một danh sách các bảng được phân tách bằng dấu phẩy để loại trừ.

Cú pháp của mysqlpump rất giống với mysqldump, nhưng cách của nó hiệu quả hơn. Thông tin thêm về cách sử dụng tùy chọn loại trừ bạn có thể đọc tại đây: https://dev.mysql.com/doc/refman/5.7/en/mysqlpump.html#mysqlpump-filtering


0

Kết xuất tất cả các cơ sở dữ liệu với tất cả các bảng nhưng bỏ qua các bảng nhất định

trên 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

Với sự giúp đỡ của https://stackoverflow.com/a/17016410/1069083

Nó sử dụng lzop nhanh hơn nhiều, xem: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


Tài liệu bạn chia sẻ cho biết gzip nhanh hơn lzop.
jrosell

0

Tôi thích giải pháp của Rubo77, tôi đã không thấy nó trước khi tôi sửa đổi Paul. Cái này sẽ sao lưu một cơ sở dữ liệu, không bao gồm bất kỳ bảng nào bạn không muốn. Sau đó, nó sẽ gzip nó và xóa bất kỳ tập tin nào hơn 8 ngày tuổi. Tôi có thể sẽ sử dụng 2 phiên bản này để thực hiện đầy đủ (trừ bảng nhật ký) mỗi ngày một lần và một phiên bản khác chỉ sao lưu các bảng quan trọng nhất thay đổi nhiều nhất mỗi giờ bằng cách sử dụng một vài công việc định kỳ.

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

Để hoàn thiện, đây là một kịch bản thực sự có thể là một lớp lót để có được bản sao lưu từ cơ sở dữ liệu, ngoại trừ (bỏ qua) tất cả các khung nhìn. Tên db được coi là nhân viên:

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"   

Bạn có thể cập nhật logic của truy vấn. Nói chung bằng cách sử dụng group_concatconcatbạn có thể tạo ra hầu hết bất kỳ lệnh chuỗi hoặc shell mong muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.