Mysqldump yedekleme için veritabanlarını yoksaymak için herhangi bir seçenek?


23

Sunucumuzda 40 veritabanımız var.

Mysqldump kullanarak 36 veritabanını yedeklemek istiyoruz. Mysqldump komutunda kalan 4 veritabanını nasıl görmezden gelebilirim? MySQL'de yedekleme için veritabanlarını yoksayması için mysqldump seçeneği var mı?

General mysqldump komutunu biliyorum ama çok uzun. Sadece 4 veritabanını yoksaymak istiyorum ve kalan dbs yedeğini almam gerekiyor.

Yanıtlar:


16

16 Aralık 2011 tarihinde, soruyu cevapladım. Belirli masaları nasıl yazabilirim?

Belirli bir tablo adı kümesi içermeyen tüm tabloları topladım.

Aynı ilkeleri kullanarak, tüm veritabanı adlarını information_schema.schematamysqldump'd istediğiniz meta veri tablosundan toplayabilir , bu listeyi döndürmek için bir sorgu oluşturabilir, ardından mysqldump komutunu formüle etmek için bu veritabanı listesini kullanabilirsiniz.

DATABASES_TO_EXCLUDE="db1 db2 db3"
EXCLUSION_LIST="'information_schema','mysql'"
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
    EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -ANe"${SQLSTMT}"`
do
    MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done
MYSQLDUMP_OPTIONS="--routines --triggers"
mysqldump ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES} > MySQLDatabases.sql

Yapmanız gereken tek şey mysqldump'd istemediğiniz veritabanlarını koymak DATABASES_TO_EXCLUDE

Bir şans ver !!!


information_schemaZaten terkedilmediğini dışlamaya gerek yok . mysqldump does not dump the INFORMATION_SCHEMA or performance_schema database by default. To dump either of these, name it explicitly on the command line and also use the --skip-lock-tables option. You can also name them with the --databases option. Before MySQL 5.5 mysqldump silently ignores INFORMATION_SCHEMA even if you name it explicitly on the command line. dev.mysql.com/doc/refman/5.5/en/mysqldump.html
Luka

15

İstemediğiniz veritabanlarını hariç tutmak için grep kullanın:

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
mysqldump --databases $candidates 

Bakarak /programming/19354870/bash-command-line-and-input-limit o uzun satırları işlemek mümkün olacak gibi görünüyor. Aksi takdirde her zaman yapabilirsiniz

candidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$")
for candidate in $candidates[*]; do
    mysqldump $candidate 
done

Bir `` eklemelisiniz | Yapıştırma -sd "" -` 'den sonra grepçoklu satır çıktısından tek bir satıra geçmek için her veritabanı adı ile gerekli olan bir boşlukla ayrılmış mysqldump. Yani komut olacaktırcandidates=$(echo "show databases" | mysql | grep -Ev "^(Database|mysql|performance_schema|information_schema)$" | paste -sd " " -)
Anthony O.

8

Bunun mümkün olduğunu sanmıyorum, ancak boşaltmak istediğiniz tüm veritabanlarının adlarını yazmanız gereken bu çözümü deneyebilirsiniz.

mysqldump -u root -password --databases db1 db2 db3 ... db36 > mydb_dump.sql

Çözüm yardımcı olursa bana bildirin.


1
Bu komutu biliyorum ama çok uzun. 4 veritabanını yoksaymak istiyorum ve kalan dbs yedeğini almak gerekiyor.
ashuthosh

3

Burada bile birçok mükemmel cevap var, bu yüzden bu yazı sadece bir seçenek daha eklemek için. Komut dosyasında 2 satırın altında, sunucularınızı bazı DB'leri yok sayarak tüm DB'lerin yedeğini alabilirsiniz.

DB_LIST=`mysql -Nse "SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR ' ') FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql','information_schema','performance_schema','sys');"`

mysqldump -R -B $DB_LIST > BACKUPNAME.sql

1
sysBu, MySQL
5.7'nin bir

teşekkürler @RolandoMySQLDBA, her zaman mükemmel yayınlarınızdan / bloglarınızdan yardım alırım ... iltifatınız için tekrar teşekkürler ...
Zafar Malik


1

Birçoğu her zaman mysqldump'un veritabanlarını yoksaymasını istedi.

Bu seçeneğin şimdi var olduğuna inanır mısın ??? Hayır, mysqldump'ta değil.

Oracle (toowee, Yuck, hala dili kapatmıyor) , Oracle veritabanlarını atmak için DataPump'a (expdb impdp) sahip. Oracle ailesindeki MySQL 5.7'den beri (hala zarar veriyor ), yeni yedekleme yardımcı programına --exclude -databases ve diğer temiz seçeneklerle birlikte gelen mysqlpump adı verilir . Eski üvey kardeşi datapump gibi , mysqlpump da dökümü hızlandırmak ve işleri bölmek için paralelliğe sahiptir . Şu anda, işe dahil edilmedim, ama çok umut verici görünüyor. Mysqlpump'a derinlemesine daldığımda , bunun Oracle'ın veri pompasıyla aynı görünümü ve hissi getirdiğini bulabilirim .

MySQL Parallel Universe'de bu konuda hikayeleri olan biri varsa, lütfen buraya gönderin.


0

Rolando'nun cevabı oldukça güzel, ama projeler arasında tekrar kullanılabilecek bir senaryo istedim. Ben de senaryosunu aldım ve değiştirdim, böylece şöyle bir şey yapabilirsin

$ mysqldump-ignore-databases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema' '--skip-lock-tables' > mydbs.sql

İşte değiştirilmiş komut dosyası:

#!/usr/bin/env bash

# This is an adapted version of Rolando's awesome script at
# /dba//a/35104/94046

# Usage: mysqldump-ignore-databases.sh username password dbs-to-exclude mysqldump-options
# e.g.
#   mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'information_schema mysql performance_schema'
#                               '--skip-lock-tables' > dbs.sql
#
#   mysqldumpIgnoreDatabases.sh 'myuser' 'mypwd' 'mysql' '-h example.com' '-h example.com' > dbs.sql

USERNAME=$1
PASSWORD=$2
DATABASES_TO_EXCLUDE=$3
MYSQLDUMP_OPTIONS=$4
MYSQL_OPTIONS=$5

EXCLUSION_LIST=""
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
  if [ "${EXCLUSION_LIST}" != "" ]
  then
    EXCLUSION_LIST="${EXCLUSION_LIST},"
  fi
  EXCLUSION_LIST="${EXCLUSION_LIST}'${DB}'"
done

SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"

MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -u${USERNAME} -p${PASSWORD} ${MYSQL_OPTIONS} -ANe"${SQLSTMT}"`
do
  MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done

mysqldump -u${USERNAME} -p${PASSWORD} ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES}

(Hala bir --ignore-databaseseçeneğin mysqldump'un gelecekteki bir sürümüne ekleneceğini umuyorum )


0

MySQL 5.7.8’den bu yana, mysqlpump(aynı değil mysqldump) aynı şekilde kullanabilirsiniz:

mysqlpump --user=user --password --exclude-databases=db1,db2,db3,db4 --result-file=partial_backup.sql

Sadece yerine db1,db2,db3,db4dışlamak istediğiniz dört veritabanları ile.

Kaynak: MySQL Server Blog

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.