Bir tabloyu bir veritabanından diğerine kopyalamanın en kolay yolu?


151

Veritabanları farklı kullanıcılar altında olduğunda, verileri bir veritabanındaki tablodan başka bir veritabanındaki tabloya kopyalamanın en iyi yöntemi nedir?

Kullanabileceğimi biliyorum

INSERT INTO database2.table2 SELECT * from database1.table1

Ama burada sorun hem olmasıdır database1ve database2farklı MySQL kullanıcıları altındadır. Böylece yalnızca user1erişebilir database1ve yalnızca user2erişebilir database2. Herhangi bir fikir?


6
Kullanıcılara tablo düzeyinde hibeler verebilirsiniz. bkz: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
Ne yazık ki bu benim durumumda işe yaramaz, ben bir Godaddy paylaşılan barındırma sunucusu kullanıyorum gibi. Onlar veritabanı ile böyle şeyler yapmaya izin alışkanlık.
Sparky

@mmdemirbas Veritabanındaki bir tabloda yaklaşık 1 milyon satır vardır. Veritabanı dökümü çok büyük olacak. Ayrıca ihraç etmeye çalıştığımda, muhtemelen büyük boyuttan dolayı sadece yaklaşık 10000 satır ihraç ediliyor.
Sparky

Tabloları taşımak için RENAME kullanabileceğinizi biliyorum ve çok hızlı. Tabloları kopyalamak için eşdeğer bir hile var mı?
Dan

BTW: Alan listesinin her iki tabloda da aynı sırada olmasına dikkat etmeniz gerekir. Aksi takdirde, database2'deki tablodaki doğru alanlarla eşlenebilmeleri için database1'deki tablodan alanların adlarına göre seçilmesi gerekir. Bu sorun benim için ilk oluşturulduktan sonra table1'in değiştirildiği bir veritabanını ve mysqldump dosyasından oluşturulduğu yeni veritabanını yedeklediğim yerdi.
Steve L

Yanıtlar:


113

Kabuk erişiminiz varsa mysqldump, içeriğini boşaltmak database1.table1ve buna yönlendirmek için mysqlkullanabilirsiniz database2. Buradaki sorun table1hala öyle table1.

mysqldump --user=user1 --password=password1 database1 table1 \
| mysql --user=user2 --password=password2 database2

Belki adlandırmak gerekir table1için table2başka bir sorgu ile. Diğer bir yolla sed komut satırları arasında table1 yerine table2 değiştirmek için sed kullanabilirsiniz.

mysqldump --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

Table2 zaten varsa, tablo oluşturmaları oluşturmasına izin vermeyen ilk mysqldump parametrelerini ekleyebilirsiniz.

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2

Buradaki sorun, otomatikleştirildiğinde şifreyi göstermeniz gerektiğidir. Otomatik değilse ve kullanıcı tarafından komut satırından yapılıyorsa sorun yok.
Nelles

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

burada db1 hedef ve db2 kaynak


İki kullanıcının birbirinden veri seçme izni yoksa bu işe yarar mı?
Berilyum

1
Bu alışkanlık farklı mysql sunucuda olsa çalışmaz?
PUG

8
Bu dizinleri kopyalamaz
bcoughlan

@Beryllium no, bu kullanıcının her iki DB için izinlere sahip olmasını gerektirir. jaminator hayır bu farklı sunucularda çalışmaz, ama sorunun bu konuda sorduğunu sanmıyorum. bcoughlan haklısın. bu yaklaşımda büyük bir kusur var: Masa yapısını düzgün bir şekilde korumuyor.
thomasrutter

4
Kopyalanan tabloda birincil anahtar ve otomatik artış ayarlanmadı. Bunu bundan sonra çalıştırmalısınızALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger

60

PHPMyAdmin kullanıyorsanız , gerçekten basit olabilir. Aşağıdaki veritabanlarına sahip olduğunuzu varsayalım:

DB1 & DB2

DB1'de DB2'ye kopyalamak istediğiniz bir tablo kullanıcısı var

PHPMyAdmin altında, DB1'i açın ve ardından kullanıcılar tablosuna gidin.

Bu sayfada, sağ üstteki "İşlemler" sekmesini tıklayın. İşlemler altında, Tabloyu şuraya kopyala (database.table) bölümünü bulun:

& bitirdiniz!


1
Ölü basit! Bu tembel olmayı kutlayabildiğim zamandır!
Daniel Dut

1
Sen benim zamandan tasarruf .. saf bir yaklaşım yapıyordum .. ilk ihracat ve sonra ithal.
Hamza Zafeer

1
Diğer cevapların hiçbiri işe
yaramıyor

1
Tablonun özellikle büyük olması, yani 4 GB'den fazla olması durumunda bu işe yaramaz. Örneğin, phpMyAdmin'in çalışamayacağı 22GB'lık bir tablo var.
Mark D

1
Mükemmel cevap. Phpmyadmin bu özelliği hakkında bilmiyordum.
zookastos

23

MySql Çalışma Tezgahı : Kesinlikle Önerilir

MySql Workbench'ten Veritabanı Taşıma Aracı

Bu, göç sorunlarını kolayca çözecektir. Seçilen veritabanlarının seçili tablolarını MySql ve SqlServer arasında taşıyabilirsiniz. Kesinlikle denemelisiniz.


Bu bir gitmek vermek üzereyim, kurulum var ama mysql Workbenchgeçiş SQLYogveritabanı kopyasını karşılaştırmak merak ediyorum ? Hızlı
bakışımdan

Hayır, SQLYog'u denemedim.
mmdemirbas

MySql çalışma tezgahını kullanarak MySQL'den SQL Server'a nasıl geçileceği belli değildir. Workbench'teyim ve yardım veya kullanıcı arayüzünden hiçbir ipucu bulamıyorum. MySQL için SSMA'nın benim için çalıştığını biliyorum.
subsci

2
İlginç, ancak program büyük bir veritabanı ile geçiş yaparken yakalandı, komut satırı en iyi çalıştı.
Claudionor Oliveira

1
@mmdemirbas, " Seçilen veritabanlarının seçili tablolarını MySql ve SqlServer arasında taşıyabilirsiniz. " OP'nin sorusu SQL Server ile ilgili değil.
17'de

19

MySQL için Navicat kullanıyorum ...

Tüm veritabanı manipülasyonunu kolaylaştırır!

Navicat'ta her iki veritabanını da seçip kullanabilirsiniz.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1


11

Tablolarınız aynı mysql sunucusundaysa, aşağıdakileri çalıştırabilirsiniz

CREATE TABLE destination_db.my_table SELECT * FROM source_db.my_table;
ALTER TABLE destination_db.my_table ADD PRIMARY KEY (id); 
ALTER TABLE destination_db.my_table MODIFY COLUMN id INT AUTO_INCREMENT;

diğer dizinler ne olacak ?! Soru, bir tabloyu sadece verilerini kopyalamakla kalmayacak
Jorj

9

MySql Workbench'in Dışa Aktarma ve İçe Aktarma işlevini kullanın. Adımlar:
1. İstediğiniz değerleri seçin

E.g. select * from table1; 
  1. Dışa Aktar düğmesini tıklayın ve CSV olarak kaydedin.
  2. birincisine benzer sütunları kullanarak yeni bir tablo oluştur

    E.g. create table table2 like table1; 
  3. yeni tablodan hepsini seç

    E.g. select * from table2;  
  4. İçe Aktar'ı tıklayın ve 2. adımda dışa aktardığınız CSV dosyasını seçin

MySql Workbench'teki Dışa Aktar ve İçe Aktar düğmeleri örneği


1
Sadece bir milyardan az satır içeren tablolar için çalışıyor.
Diogo Paim

9

İşte başka bir kolay yol:

  1. DB1 kullanın; show TB1 tablo oluştur;
    • DB2'de TB1 oluşturmak için sözdizimini panoya kopyalayın
  2. DB2 kullanın;
    • TB1 tablosunu oluşturmak için sözdizimini buraya yapıştırın

INSERT INTO DB2.TB1 SELECT * from DB1.TB1;


Bu, bir gui programı kullanmak zorunda kalmadan bir veritabanının kopyalanmasını otomatikleştirmeme yardımcı oldu, teşekkürler.
New2HTML

4

Deneyin mysqldbcopy( dokümantasyon )

Veya hedef ana makinenizde bir " birleşik tablo " oluşturabilirsiniz . Birleşik tablolar, farklı bir veritabanı sunucusundan bir tabloyu yerel bir tablo gibi görmenizi sağlar. ( dokümantasyon )

Birleşik tabloyu oluşturduktan sonra, verileri normal insert into TARGET select * from SOURCE


1
Federasyon tabloları hakkında okudum, ancak Amazon RDS (şu anda) bunu desteklemiyor ... XP
Chococroc

4

MySQL Workbench ile yalnızca tabloyu yerel bir SQL dosyasına (Yalnızca Veri, Yalnızca Yapı veya Yapı ve Veri) ve ardından Veri İçe Aktarma'yı kullanarak diğer DB'ye yüklemek için Veri Aktarma'yı kullanabilirsiniz.

Aynı anda birden çok bağlantınız (farklı ana bilgisayarlar, veritabanları, kullanıcılar) açabilirsiniz.


3

İhtiyacınız olan tüm sorguları almanın basit bir yolu, information_schema ve concat'tan gelen verileri kullanmaktır.

SELECT concat('CREATE TABLE new_db.', TABLE_NAME, ' LIKE old_db.', TABLE_NAME, ';') FROM `TABLES` WHERE TABLE_SCHEMA = 'old_db';

Daha sonra şöyle görünen sonuçların bir listesini alırsınız:

CREATE TABLE new_db.articles LIKE old_db.articles;
CREATE TABLE new_db.categories LIKE old_db.categories;
CREATE TABLE new_db.users LIKE old_db.users;
...

Daha sonra bu sorguları çalıştırabilirsiniz.

Ancak MySQL Views ile çalışmaz. AND TABLE_TYPE = 'BASE TABLE'İlk sorgudan ekleyerek bunlardan kaçınabilirsiniz :


1

Bu düzenli olarak yapmanız gereken bir şey mi, yoksa sadece bir tane mi?

Tablonuzu ve içindekileri bir metin dosyasına yazacak bir dışa aktarma (örn. PhpMyAdmin veya benzeri kullanarak) yapabilir, ardından bunu diğer Veritabanına yeniden aktarabilirsiniz.


Sadece bir kez yapmam gerek. Ancak sorun, veritabanındaki tablonun neredeyse 1 milyon sıraya sahip olmasıdır. Veritabanı dökümü çok büyük olacak. Ayrıca ihraç etmeye çalıştığımda, muhtemelen büyük boyuttan dolayı sadece yaklaşık 10000 satır ihraç ediliyor.
Sparky

Ah, evet bu bir sınırlama. Bu WordPress Codex makalesi yardımcı olabilir mi? Bu bir wordpress makalesi, ancak size bir fikir verebilir (DB'nin phpMyAdmin'in işleyemeyeceği kadar büyük olması durumunda, komut satırını kullanarak tabloların nasıl döküleceğine dair bir bölüm vardır).
Sepster

Mysqldump komut satırı aracının 1 milyon satır veya birkaç milyar satırla ilgili herhangi bir sorunu yoktur - etkileyecek tek şey ne kadar zaman alacağı ve sonucun ne kadar yer kapladığıdır (sonucun bir dosyaya çıktığını varsayarsak). PhpMyAdmin'in export komutuyla ilgili deneyimim, mysqldump'tan çok daha sınırlı olmasıdır.
thomasrutter

1

Bazı sütunları bir veritabanı tablosundan başka bir veritabanı tablosuna kopyalayıp eklemek için aşağıdaki adımları kullanın.

  1. CREATE TABLE tablename (sütun adı veri türü (boyut), sütun adı veri türü (boyut));

2.INSERT INTO db2.tablename SELECT sütun adı1, sütun adı2 FROM db1.tablename;


1

Önce dökümü oluşturun. Zaten varsa --no-create-info --no-create-dbbayraklar eklendi table2:

mysqldump -u user1 -p database1 table1 > dump.sql

Ardından user1şifreyi girin . Sonra:

sed -e 's/`table1`/`table2`/' dump.sql
mysql -u user2 -p database2 < dump.sql

Sonra user2şifreyi girin .

@Helmors yanıtıyla aynıdır, ancak şifreler konsola ham metinde (ters arama, şifre algılayıcılar, vb.) Maruz kalmadığı için yaklaşım daha güvenlidir. Diğer yaklaşım, izinleri üzerinde uygun kısıtlamalar bulunan bir komut dosyasından yürütülürse iyidir.


0

IN xampp sadece gerekli tabloyu bir .sql dosyası olarak verin ve sonra gereken tabloya alın


-1

sakila.customer gibi masa destination_customer oluşturmak , bu da yapıyla kopyalanan veriler için kaynak tablonun yapısını kopyalamak sadece bu do (Database_name.tablename) sakila.customer seçin * olarak tablo destination_customer oluşturmak


Bu tamamen farklı bir sorunun cevabı gibi görünüyor. Soruda hayır yok CREATE TABLE LIKE, o zaman neden bunun yanlış olduğunu söylediniz? Ve bu cevabın, hiçbir kullanıcının diğerinin tablolarına erişememesi sorununu nasıl çözdüğüne dair bir açıklama yok .
Toby Speight
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.