Lewati tabel tertentu dengan mysqldump


559

Apakah ada cara untuk membatasi tabel tertentu dari perintah mysqldump?

Sebagai contoh, saya akan menggunakan sintaks berikut untuk membuang hanya table1 dan table2:

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

Tetapi apakah ada cara yang mirip untuk membuang semua tabel kecuali table1 dan table2? Saya belum menemukan apa pun di dokumentasi mysqldump, jadi apakah brute-force (menentukan semua nama tabel) satu-satunya cara untuk melakukannya?

Jawaban:


942

Anda dapat menggunakan opsi --ignore-table . Jadi kamu bisa melakukannya

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

Tidak ada spasi putih setelah -p(ini bukan salah ketik).

Jika Anda ingin mengabaikan beberapa tabel, Anda dapat menggunakan skrip sederhana seperti ini

#!/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
Terima kasih! Bekerja dengan sempurna ... Saya tidak tahu bagaimana saya melewatkan itu.
Zac

20
apakah ada cara untuk melewatkan isi tabel? struktur yang ingin saya backup.
Andres SK

5
Anda dapat menggunakan opsi --no-data = true, tapi saya tidak tahu apakah Anda bisa melakukannya pada level per tabel.
Brian Fisher 2-10

60
jika nama database tidak disetel untuk setiap --ignore-table maka Anda akan mendapatkan kesalahan 'Penggunaan ilegal opsi --ignore-table = <database>. <table>'. Pastikan Anda selalu mendeklarasikan basis data!
supajb

26
jika Anda ingin mengabaikan beberapa data tabel, tetapi masih membuang strukturnya, Anda dapat menjalankan mysqldump lagi untuk tabel tersebut, dan menggabungkannya ke cadangan yang baru saja Anda buat
carpii

119

Membangun jawaban dari @ Brian-Fisher dan menjawab komentar dari beberapa orang di posting ini, saya memiliki banyak tabel besar (dan tidak perlu) di database saya jadi saya ingin melewatkan konten mereka ketika menyalin, tetapi tetap struktur :

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

Dua file yang dihasilkan secara struktural baik tetapi data yang dibuang sekarang ~ 500MB daripada 9GB, jauh lebih baik bagi saya. Sekarang saya dapat mengimpor dua file ini ke database lain untuk tujuan pengujian tanpa harus khawatir tentang memanipulasi data 9GB atau kehabisan ruang disk.


Diuji dan digunakan di bawah MySQL 5.5.43 (untuk debian-linux-gnu (x86_64)) Terima kasih
Abdel

Sederhana dan elegan. Solusi hebat.
Greg Glockner

4
solusi hebat Saya harus menambahkan --skip-trigger ke pernyataan kedua agar dump berfungsi nanti (dengan asumsi Anda memiliki trigger), tetapi sebaliknya: sempurna
Rainer Mohr

Terima kasih, ini berhasil dan sangat berguna.
Himalaya Garg

59

untuk banyak basis data:

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

5
Sudah ada balasan untuk utas ini yang mengatakan itu, lebih baik.
alxgb

19
Itu benar, tetapi solusi ini bekerja dengan banyak basis data.
Alex

Menarik - Saya pertama kali berpikir mysqlddan mysqldumpakan menjadi program yang sama.
Martin Thoma

4
itulah yang saya cari - jawaban satu-liner dengan solusi yang tidak memaksa saya untuk membaca sesuatu selama 2-3 menit: P
jebbie

43

Contoh lain untuk mengabaikan beberapa tabel

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

menggunakan --ignore-tabledan membuat array tabel, dengan sintaksis sepertidatabase.table

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

Tautan dengan informasi yang akan membantu Anda

kompres keluaran mysqldump

Catatan: diuji di server ubuntu dengan mysql Ver 14.14 Distrib 5.5.55

Impor basis data

 mysql -uUSER  -pPASS db_test < db_test.sql

Script sederhana untuk mengabaikan tabel

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

Cara hebat untuk menghindari menggunakan skrip saat Anda ingin mengabaikan beberapa tabel. Jawaban itu seharusnya menerima lebih banyak "+1"
svfat

jawaban sempurna !!! +1 made my day :)
SagarPPanchal

7

Untuk mengecualikan beberapa data tabel , tetapi tidak struktur tabel . Inilah cara saya melakukannya:

Dump struktur database semua tabel, tanpa data apa pun:

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

Kemudian dump database dengan data, kecuali tabel yang dikecualikan, dan jangan dump struktur:

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

Kemudian, untuk memuatnya ke database baru:

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


0

Buang semua database dengan semua tabel tetapi lewati tabel tertentu

di 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

Dengan sedikit bantuan https://stackoverflow.com/a/17016410/1069083

Ini menggunakan lzop yang jauh lebih cepat, lihat: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


Dokumen yang Anda bagikan mengatakan gzip lebih cepat dari lzop.
jrosell

0

Saya suka solusi Rubo77, saya belum pernah melihatnya sebelum saya memodifikasi solusi Paul. Yang ini akan membuat cadangan satu database, tidak termasuk tabel yang tidak Anda inginkan. Ini kemudian akan gzip, dan menghapus file apa pun yang berumur lebih dari 8 hari. Saya mungkin akan menggunakan 2 versi ini yang melakukan penuh (tabel log dikurangi) sekali sehari, dan yang lain hanya mencadangkan tabel paling penting yang paling banyak berubah setiap jam menggunakan beberapa pekerjaan 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

Demi kelengkapan, berikut adalah skrip yang sebenarnya bisa menjadi satu-liner untuk mendapatkan cadangan dari database, tidak termasuk (mengabaikan) semua tampilan. Nama db diasumsikan sebagai karyawan:

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"   

Anda dapat memperbarui logika kueri. Secara umum menggunakan group_concatdan concatAnda dapat menghasilkan hampir semua perintah string atau shell yang diinginkan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.