Bir tablo yapısını nasıl yedekleyebilirim ama MySQL'deki verilerini DEĞİL


20

Veritabanı yedeklememi yapmak için MySQL Administrator kullanıyorum. Ben tüm tabloları ile tüm veritabanını mükemmel yedekleyebilirsiniz. Boyutu çok büyük olan bazı tablolar vardır, bu yüzden sadece tabloların yapısını (sadece öğelerini) yedekleyebilir miyim ama verilerini değil merak ediyorum.

Yanıtlar:


40

Kullanım --no-dataverileri, yalnızca tablo yapısını dökümü değil bunu söylemek için mysqldump ile anahtarı.

Bu, tablolar için CREATE TABLE deyiminin çıktısını alır.

Böyle bir şey

mysqldump --no-data -h localhost -u root -ppassword mydatabase > mydatabase_backup.sql

Belirli tabloları hedeflemek için, bunları veritabanı adından sonra girin.

mysqldump --no-data -h localhost -u root -ppassword mydatabase table1 table2 > mydatabase_backup.sql

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_no-data

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html


+1 doğru görünüyor.
David Pashley

Çok teşekkürler LukeR. Bununla başa çıkabilirdim. Yazma anında bile mysqldump hakkında hiçbir şey bilmiyordum ama --no-data anahtarı ile sorunu çözebilir. Sonra da ben de bu alternatif ile bu sorunu çözmek olabilir bu yüzden MySQL Yöneticisi bu tablonun "CREATE SCRIPT" bulundu.

3

LukeR'ın dediği gibi, mysqldump için --no-data seçeneği istediğinizi yapar.

Buna ek olarak, burada tüm mysql veritabanlarını düz metin dosyalarına döken ve her veritabanının tablo şeması ve verileri için ayrı döküm dosyaları oluşturan bir yedekleme komut dosyası (başka bir mysql sunucusunda tabloları geri yüklemek veya oluşturmak istemek oldukça yaygındır) ve yalnızca CREATE TABLE / CREATE INDEX vb komutlarıyla küçük bir dosyanız olduğunda bunu yapmak çok daha kolaydır)

#! / Bin / bash

# backup-mysql.sh
#
# Craig Sanders <cas@taz.net.au>
# Bu komut dosyası kamu malı. onunla ne istersen yap.

MyUser = "KULLANICI ADI"
Mypwd = "PASSWD"

ARGS = "- tek işlem --flush-log --complete-insert"

VERİTABANLARI = $ (mysql -D mysql --skip-column-names -B -e 'veritabanlarını göster;' | egrep -v 'information_schema');


Backupdir = / var / yedekleri / MySQL

YEAR = $ (tarih + "% Y")
AY = $ (tarih + "% m")
DAY = $ (tarih + "% d")

TARİH = "$ YEAR- $ AY / $ YEAR- $ Ay-$ GÜN"

mkdir -p $ YEDEKLEME / $ TARİH
cd $ BACKUPDIR / $ DATE

i $ DATABASES için i; yapmak
  echo -n "$ i yedekleniyor: şema ..."
  mysqldump $ ARGS --no-data -u $ MYUSER -p $ MYPWD $ i> $ i.schema.sql

  echo -n "veri ..."
  mysqldump $ ARGS --skip-opt --no-create-db --no-create-info -u $ MYUSER -p $ MYPWD $ i> $ i.data.sql

  echo -n "sıkıştırılıyor ..."
  gzip -9fq $ i.schema.sql $ i.data.sql
  echo "bitti."
tamam

# 30 günden eski yedek dosyaları sil
ESKİ = $ ($ BACKUPDIR tipi d -mtime +30'u bul)
eğer [-n "$ OLD"]; sonra
        eski yedekleme dosyalarını silme yankısı: $ OLD
        echo $ ESKİ | xargs rm -rfv
fi

Cevabınız için çok teşekkürler Craig! İlk önce LukeR cevabını alıyorum. Senaryo için teşekkürler, iyi bir referans.

--routinesŞema komut dosyasına eklemeyi önerebilir miyim ?
Jonathan

0

Bunu, mysqlkomut satırını kullanarak DESCRIBE <tablename>ve sonuçları kopyalayıp yapıştırarak manuel olarak da yapabilirsiniz .


DESCRIBE size kopyalayıp yapıştırabileceğiniz bir şey vermeyecektir. SHOW CREATE TABLE olacaktır.
David Pashley

o CREATE deyimi olması gerekir ne bir dökümü değil, ama o does göstermek sütun türleri ve ilişkileri
warren
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.