Tam bir mysql mysqldump dosyasından tek bir tabloyu geri yükleyebilir miyim?


194

Yaklaşık 440 mega olan tüm tablolarımızdan oluşan mysql veritabanımın mysqldump yedeklemesine sahibim. Sadece bir mysqldump form tabloların içeriğini geri yüklemek istiyorum. Mümkün mü? Teorik olarak, istediğim tabloyu yeniden oluşturan bölümü kesebilirdim, ancak bu boyuttaki bir metin belgesini nasıl etkili bir şekilde düzenleyeceğimi bile bilmiyorum.


2
FWIW, ayrıca mydumper da kullanabilirsiniz . Bu, mysqldump gibi mantıksal bir döküm oluşturur, ancak tablo başına ayrı dosyalar verir ve hem boşaltma hem de yükleme çok iş parçacıklı yapabilir, bu nedenle daha az zaman alır.
Bill Karwin

Yanıtlar:


290

Yalnızca istediğiniz tabloyu ayıklamak için sed'i kullanmayı deneyebilirsiniz.

Diyelim ki tablonuzun adı mytableve mysql.dump dosyası büyük dökümünüzü içeren dosyadır:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump

Bu dosyada kopyalar mytable.dumparasında yer alan neyi CREATE TABLE mytableve sonraki CREATE TABLEsonraki tabloya karşılık gelir.

Daha sonra mytable.dumptablonun yapısını mytableve verileri (listesini içeren INSERT) içeren dosyayı ayarlayabilirsiniz .


5
Bu benim cevabımdan bile daha güzel çünkü CREATE TABLE ile de ilgileniyor, ancak "thisismytabletoo" adlı başka bir tablo elde etmemek için backquotes ile arama yapmalısınız.
JCCyC

1
Doğru. Tüm mysql dökümlerinde tablo adlarının her zaman arka tırnak ile çevrilip çevrilmediğinden veya "CABLEATE TABLE mytable" da mümkün olup olmadığından emin değildim. Dökümün nasıl göründüğünü bilirsek ilk normal ifadeyi kolayca uyarlayabiliriz. İkinci bir sorun, tablo mytable benzersiz değilse (biri db1 veritabanında ve diğeri db2 veritabanında) olabilir. Her ikisi de mytable.dump dosyasına aktarılacaktır. Tablo benzersiz değilse, aynı sed komutunu kullanabiliriz, önce CREATE DATABASE ile yalnızca doğru veritabanını ayıklamak için. Ardından, CREATE TABLE ile sed komutunu kullanın.
uloBasEI

13
Tatlı! Üst tarafa DROP TABLE eklemeyi ve dosyanın alt kısmındaki DROP TABLE [sonraki tablo] 'yu kaldırmayı unutmayın.
Nathan

20
DÜŞME TABLOSU eklememek / kaldırmak için, Table structure for tableTABLO OLUŞTUR ile eşleştirmek yerine yoruma göre eşleştirmek daha yararlıdır . Bu, biri DROP TABLE ifadesini kaldırmayı unutursa ve tek komutlu tablo geri yüklemesi (gzip | sed | mysql) için borulamaya izin verirse bir sonraki tablonun bırakılmamasını sağlar. Ancak, bu çözüm mysqldump yorum sözdizimine bağlıdır (ne kadar standart olduğunu bilmiyorum).
Olexa

12
OLEXA en modifikasyonu ile mükemmeldir: sed -n -e 'için / Tablo yapısı * `Tablom /, / Tablo yapısı için / s.' Whole.sql> mytable.sql
DeeEnEs

120

UloBasEI'nin sed komutunun değiştirilmiş bir sürümünü kullandım. Önceki DROP komutunu içerir ve mysql veri tablonuza (UNLOCK) dökümü yapılana kadar okur. Benim için çalıştı (yeniden) wp_users bir sürü Wordpress sitesine aktarma .

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql

3
bu aslında yukarıdaki cevap olarak seçilen çözümden çok daha iyi bir çözümdür. Daha fazla oy almadýđýna inanamýyorum.
rICh

9
Ben tablo adına en az backtick tırnak eklemeyi öneririm: benim durumumda olduğu gibi `mytable`tabloları eşleştirme mytable2ve benzeri önlemek için .
bartekbrak

3
sadece kıçımı kurtardın
Gabriel Alack

1
@ user706420 Hmm, terminalinizin suçlanmayacağından emin misiniz? sedkodlamaya müdahale etmemelidir ...
bryn

6
SQL dosyaları olmayanlar için DROP TABLE(MySQL dökümü buna sahip değildi) kullanmak isteyebilir: sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql Bu, bir MySQl dökümünde her tablodan önce sağlanan tablo yorumlarını kullanır ve /*!40101 SET @saved_cs_client = @@character_set_client */;dahil edilmesini sağlar.
hamx0r

50

Bu daha kolay yapılabilir mi? Ben böyle yaptım:

Geçici bir veritabanı oluşturun (örn. Geri yükleme):

mysqladmin -u root -p geri yükle

Temp veritabanındaki tam dökümü geri yükleyin:

mysql -u kök -p geri yükleme <fulldump.sql

Kurtarmak istediğiniz tabloyu boşaltın:

mysqldump geri yükleme mytable> mytable.sql

Tabloyu başka bir veritabanına içe aktarın:

mysql -u kök -p veritabanı <mytable.sql


2
Çoğu insanın ihtiyacı olan şey budur.
sjas

2
Göre bu düzenleme önerisi , siz "--one veritabanı" parametresini eklemeniz gerekir, sadece geri emin olmak için bir veritabanı ve diğer her şeyi yok etmez.
SL Barth - Monica

7
Gerçekten büyük bir db için çok garip olabilir - 100 MB'lık bir tablo için 150 GB veri geri yükleyin.
Enyby

Ben sadece "--one-database" olmadan koştu ve hala tabloları gayet iyi birleştirdi. Mevcut tablolarımı kaldırmadı.
Kasım

1
Çok kötü uygulama! Dökümde birkaç DB vardı ve yalnızca bir tane geri yüklemeye çalışıyorum, tüm diğerlerini sildi.
AndreyP

11

Basit bir çözüm, sadece ayrı olarak geri yüklemek istediğiniz tablonun bir dökümü oluşturmaktır. Aşağıdaki sözdizimiyle bunu yapmak için mysqldump komutunu kullanabilirsiniz:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

Ardından normal şekilde içe aktarın ve yalnızca dökümlenmiş tabloyu içe aktarın.


9

Öyle ya da böyle, bunu yapan herhangi bir işlem, dökümün tüm metninden geçmek ve bir şekilde ayrıştırmak zorunda kalacaktır. Sadece grep için

INSERT INTO `the_table_i_want`

ve çıkış mysql içine boru. INSERT'leri doğru şekilde aldığınızdan emin olmak için daha önce dökümdeki ilk tabloya bir göz atın.

Düzenleme: Tamam, biçimlendirme bu sefer doğru.


Hemen açmayı düşünmediğim için aptalım. Grep pastırmamı her gün kurtarıyor gibi görünüyor. Diğer iki öneri de bang-up olanlar ve tamamen ne grep harikalar olmadan yapardı olurdu. Hepinize teşekkür ederim!
Mobius

6
Eğer
grep'i

7

@Bryn komutunu denemelisiniz, ancak `sınırlayıcı ile aksi takdirde bir önek veya sonek içeren tabloları da çıkaracaksınız, genellikle yaptığım budur:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql

Ayrıca test amacıyla, içe aktarmadan önce tablo adını değiştirmek isteyebilirsiniz:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql

İçe aktarmak için mysql komutunu kullanabilirsiniz:

mysql -u root -p'password' mydatabase < mytable_restore.sql

6
  1. Destek olmak

    $ mysqldump -A | gzip > mysqldump-A.gz
  2. Tek bir tabloyu geri yükle

    $ mysql -e "truncate TABLE_NAME" DB_NAME
    $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
    

4

Bununla başa çıkmanın olası bir yolu, geçici bir veritabanına geri yüklemek ve bu tabloyu geçici veritabanından dökmektir. Ardından yeni komut dosyasını kullanın.



3
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql

Tüm SQL dökümleri bir DROP TABLEifade içermediğinden bu, yukarıdaki diğerlerinden daha iyi bir çözümdür . Bu işe yarayacak her türlü çöplük.


2

Bu da yardımcı olabilir.

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'

2

Tablo hem döküm hem de veritabanında aynı yapıda olmalıdır.

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

veya

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`

1

Modern metin editörlerinin çoğu, sisteminiz buna bağlıysa, bu boyutta bir metin dosyasını işleyebilmelidir.

Her neyse, bunu bir kez çok hızlı bir şekilde yapmak zorunda kaldım ve herhangi bir araç bulmak için zamanım yoktu. Yeni bir MySQL örneği ayarladım, tüm yedeklemeyi içe aktardım ve sonra istediğim tabloyu tükürdüm.

Sonra bu tabloyu ana veritabanına aktardım.

Sıkıcı ama oldukça kolay. İyi şanslar.


1

Vi düzenleyicisini kullanabilirsiniz. Tür:

vi -o mysql.dump mytable.dump

hem tüm dökümü hem de mysql.dumpyeni bir dosyayı açmak için mytable.dump. /Tuşuna basarak uygun eki bulun ve ardından bir cümle yazın, örneğin: "mytable" içine yerleştirin, ardından bu satırı kullanarak kopyalayın yy. ctrl+wArdından bir sonraki dosyaya geçin down arrow key, kopyalanan satırı yapıştırın pp. Son olarak yazarak yeni dosyayı kaydedin :wqve oldukça vi editörü tarafından :q.

Verileri birden fazla kesici uç kullanarak döktüyseniz , kopyalanacak satır sayısı Nyyolan tümünü kullanarak bir kerede tümünü kopyalayabilir (sıralayabilirsiniz) N.

920 MB boyutunda bir dosya ile yaptım.


0

Notepad ++ veya Vim gibi iyi bir metin editörü edinin (zaten bu konuda yetkinseniz). Tablo adını arayın ve bu tablo için yalnızca CREATE, ALTER ve INSERT komutlarını vurgulayabilmeniz gerekir. Fare yerine klavyenizle gezinmek daha kolay olabilir. Ve bol miktarda veya RAM'li bir makinede olduğunuzdan emin olurum, böylece tüm dosyayı bir kerede yüklerken sorun yaşamayacaksınız. İhtiyacınız olan satırları vurgulayıp kopyaladıktan sonra, yalnızca kopyalanan parçayı kendi yedekleme dosyasına yedeklemek ve ardından MySQL'e aktarmak iyi bir fikir olacaktır.


1
Bu gerçekten çok kolay ve yeni başlayanlar tarafından bile anlaşılabilir. Bunun neden reddedildiğini bilmiyorum.
Karl Johan Vallner

0

SQL parçaları "Tablo için tablo yapısı my_table" ve " Tablo için damping verileri" ile engellenir my_table.

Çeşitli bölümlerin satır numaralarını almak için aşağıdaki gibi bir Windows komut satırı kullanabilirsiniz. Aranan dizeyi gerektiği gibi ayarlayın.

"" sql.txt tablosu için find / n "

Aşağıdakiler iade edilecektir:

---------- SQL.TXT

[4384] - Masa için masa yapısı my_table

[4500] - Tablo için damping verileri my_table

[4514] - Masa için masa yapısı some_other_table

... vb.

Bu size ihtiyacınız olan satır numaralarını getirir ... şimdi, eğer sadece onları nasıl kullanacağımı bilseydim ... araştırıyor.




0

Daha önce bahsedilen 'sed' çözümleri güzel ancak belirtildiği gibi% 100 güvenli değil

  • Şu verileri içeren INSERT komutlarınız olabilir: ... CREATE TABLE ... (her neyse) ... mytable ...

  • hatta tam olarak "CREATE TABLE` mytable`; " Örneğin DML komutlarını saklıyorsanız!

(ve tablo çok büyükse manuel olarak kontrol etmek istemezsiniz)

Ben kullanılan döküm sürümünün tam sözdizimini doğrulamak ve daha kısıtlayıcı bir desen arama var:

". *" Kullanmaktan kaçının ve satırın başlangıcından başlamak için "^" kullanın. İlk 'DROP'u almayı tercih ederim

Sonuçta, bu benim için daha iyi çalışıyor:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
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.