Mysqldump ile bazı tabloları atla


558

Belirli tabloları mysqldump komutundan kısıtlamanın bir yolu var mı?

Örneğin, yalnızca table1 ve table2 dökümü için aşağıdaki sözdizimini kullanırdım :

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

Ancak table1 ve table2 dışındaki tüm tabloları dökmenin benzer bir yolu var mı? Mysqldump belgelerinde hiçbir şey bulamadım, bu yüzden kaba kuvvet (tüm tablo adlarını belirterek) gitmek için tek yol mu?

Yanıtlar:


940

Sen kullanabilirsiniz --ignore masa seçeneği. Böylece yapabilirsin

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

Sonra boşluk yok -p(bu bir yazım hatası değil).

Birden çok tabloyu yoksaymak istiyorsanız, bunun gibi basit bir komut dosyası kullanabilirsiniz

#!/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
Teşekkür ederim! Mükemmel çalıştı ... Bunu nasıl özlediğimi bilmiyorum.
Zac

20
sadece tablo içeriğini atlamanın bir yolu var mı? Yedeklemek istediğim yapı.
Andres SK

5
--No-data = true seçeneğini kullanabilirsiniz, ancak bunu tablo başına düzeyinde yapıp yapamayacağınızı bilmiyorum.
Brian Fisher

60
veritabanı adı her --ignore-table için ayarlanmamışsa, '--ignore-table = <database>. <table>' seçeneğinin geçersiz kullanımı hatası alırsınız. Veritabanını her zaman bildirdiğinizden emin olun!
supajb

26
bazı tablo verilerini göz ardı etmek istiyorsanız, ancak yine de yapılarını dökerseniz, bu tablolar için mysqldump'ı tekrar çalıştırabilir ve yeni oluşturduğunuz yedeklemeye birleştirebilirsiniz
carpii

119

@ Brian-Fisher'ın cevabına dayanarak ve bu yazıdaki bazı kişilerin yorumlarına cevap veriyorum, veritabanımda bir sürü büyük (ve gereksiz) tablo var, bu yüzden kopyalarken içeriklerini atlamak istedim, ancak yapıyı korudum :

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

Ortaya çıkan iki dosya yapısal olarak sağlam ancak dökümü yapılan veriler şimdi 9GB yerine ~ 500MB, benim için çok daha iyi. Şimdi bu iki dosyayı 9GB veri işleme veya disk alanınız tükenme konusunda endişelenmenize gerek kalmadan test amacıyla başka bir veritabanına aktarabilirim.


MySQL 5.5.43 altında test edildi ve kullanıldı (debian-linux-gnu (x86_64) için) Teşekkürler
Abdel

Basit ve zarif. Harika bir çözüm.
Greg Glockner

4
harika bir çözüm. Daha sonra çalışmak için tetikleyicinin ikinci ifadesine - atlama-tetikleyicileri eklemek zorunda kaldım (tetikleyicilerin olduğu varsayılarak), ama aksi halde: mükemmel
Rainer Mohr

Teşekkür ederim, bu çalışıyor ve çok kullanışlı.
Himalaya Garg

59

birden çok veritabanı için:

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

5
Bu konuya zaten daha iyi bir cevap var.
alxgb

19
Bu doğru, ancak bu çözüm birden çok veritabanı ile çalışır.
Alex

İlginç - Önce düşündüm mysqldve mysqldumpaynı programlar olurdu.
Martin Thoma

4
Aradığım şey bu
2-3mins

43

Birden çok tabloyu yok saymak için başka bir örnek

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

--ignore-tablegibi bir sözdizimi içeren bir dizi tablo kullanma ve oluşturmadatabase.table

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

Size yardımcı olacak bilgiler içeren bağlantılar

sıkıştırmak çıkış mysqldump

Not: Ubuntu sunucusunda mysql Ver 14.14 Distrib 5.5.55 ile test edilmiştir

Veritabanını içe aktar

 mysql -uUSER  -pPASS db_test < db_test.sql

Tabloları yoksaymak için basit komut dosyası

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

Birden çok tabloyu yoksaymak istediğinizde komut dosyası kullanmaktan kaçınmanın harika bir yolu. Bu cevap daha fazla "+1"
almalıdır

mükemmel cevap!!! +1 benim günümü yaptı :)
SagarPPanchal

7

Bazı tablo verilerini hariç tutmak , ancak tablo yapısını hariç tutmak için . İşte nasıl yaparım:

Herhangi bir veri olmadan tüm tabloların veritabanı yapısını dökün:

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

Daha sonra veritabanını hariç tutulan tablolar dışında verilerle dökün ve yapıyı dökmeyin:

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

Ardından, yeni bir veritabanına yüklemek için:

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


0

Tüm veritabanlarını tüm tablolarla birlikte dök, ancak belirli tabloları atla

github'da: 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

Biraz https://stackoverflow.com/a/17016410/1069083 yardımıyla

Çok daha hızlı olan lzop kullanıyor, bkz: http://pokecraft.first-world.info/wiki/Quick_Benchmark:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO


Paylaştığınız belge, gzip'in lzop'tan daha hızlı olduğunu söylüyor.
jrosell

0

Rubo77'nin çözümünü seviyorum, Paul'ü değiştirmeden önce görmedim. Bu, istemediğiniz tablolar hariç tek bir veritabanını yedekleyecektir. Daha sonra gzip eder ve 8 günden eski dosyaları siler. Muhtemelen günde bir kez tam (eksi günlükler tablosu) yapan 2 versiyonunu kullanacağım ve başka bir çift cron işleri kullanarak her saatte en çok değişen en önemli tabloları yedekler.

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

Tamlık uğruna, aslında tüm görünümleri hariç tutarak (yoksayarak) bir veritabanından yedek almak için tek satırlık olabilecek bir komut dosyası. Db adının çalışan olduğu varsayılır:

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"   

Sorgunun mantığını güncelleyebilirsiniz. Genel olarak kullanarak group_concatve concatneredeyse istediğiniz herhangi bir dize veya kabuk komutu üretebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.