Cara termudah untuk menyalin tabel dari satu database ke yang lain?

151

Apa metode terbaik untuk menyalin data dari tabel di satu database ke tabel di database lain ketika database berada di bawah pengguna yang berbeda?

Saya tahu saya bisa menggunakannya

INSERT INTO database2.table2 SELECT * from database1.table1

Tapi di sini masalahnya adalah keduanya database1dan database2berada di bawah pengguna MySQL yang berbeda. Jadi user1dapat mengakses database1saja dan user2dapat mengakses database2saja. Ada ide?

Sparky
sumber
6
Anda dapat memberikan hibah tingkat tabel kepada pengguna. lihat: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh
2
Sayangnya ini tidak akan berfungsi dalam kasus saya, karena saya menggunakan server hosting bersama Godaddy. Mereka tidak akan mengizinkan untuk melakukan hal-hal seperti itu dengan database.
Sparky
@mmdemirbas Satu tabel dalam database memiliki hampir 1 juta baris. Basis data akan sangat besar. Juga ketika saya mencoba untuk mengekspor, hanya sekitar 10.000 baris yang diekspor - mungkin karena ukurannya yang besar.
Sparky
Saya tahu Anda dapat menggunakan RENAME untuk memindahkan tabel, dan ini sangat cepat. Apakah ada trik yang setara untuk menyalin tabel?
Dan
BTW: Anda harus berhati-hati bahwa daftar bidang dalam urutan yang sama di kedua tabel. Kalau tidak, akan perlu untuk memilih bidang dengan nama dari tabel di database1 sehingga mereka memetakan ke bidang yang benar dalam tabel di database2. Masalah ini muncul untuk saya di mana saya telah membuat cadangan database di mana table1 dimodifikasi setelah pembuatan awal, dan database baru di mana ia dibuat dari file mysqldump.
Steve L

Jawaban:

113

Jika Anda memiliki akses shell, Anda dapat menggunakannya mysqldumpuntuk membuang konten database1.table1dan mengirimkannya mysqlke database2. Masalahnya di sini table1adalah masih table1.

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

Mungkin Anda perlu mengganti nama table1menjadi table2dengan permintaan lain. Di sisi lain Anda mungkin menggunakan sed untuk mengubah table1 ke table2 antara ke pipa.

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

Jika table2 sudah ada, Anda bisa menambahkan parameter ke mysqldump pertama yang jangan biarkan buat tabel-create.

mysqldump --no-create-info --no-create-db --user=user1 --password=password1 database1 table1 \
| sed -e 's/`table1`/`table2`/' \
| mysql --user=user2 --password=password2 database2
helm
sumber
Masalah dengan ini adalah ketika itu otomatis Anda harus menunjukkan kata sandi. Jika tidak otomatis dan dilakukan oleh pengguna dari baris perintah tidak apa-apa.
Nelles
100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

di mana db1 adalah tujuannya dan db2 adalah sumbernya

Mainmeat
sumber
Apakah ini berfungsi, jika kedua pengguna tidak memiliki izin untuk memilih data dari satu sama lain?
Beryllium
1
ini tidak akan bekerja di server mysql yang berbeda?
PUG
8
Ini tidak menyalin indeks
bcoughlan
@Beryllium tidak, ini mengharuskan pengguna untuk memiliki izin untuk kedua DB. jaminator tidak ini tidak akan berfungsi di server yang berbeda, tapi saya tidak berpikir pertanyaannya bertanya tentang itu. bcoughlan kau benar. ini adalah kelemahan besar dalam pendekatan ini: Tidak benar mempertahankan struktur tabel.
thomasrutter
4
Tabel yang disalin tidak memiliki kunci primer dan setel kenaikan otomatis. Anda harus menjalankan ini setelahALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger
60

Jika Anda menggunakan PHPMyAdmin, itu bisa sangat sederhana. Misalkan Anda memiliki database berikut:

DB1 & DB2

DB1 memiliki tabel pengguna yang ingin Anda salin ke DB2

Di bawah PHPMyAdmin, buka DB1, lalu buka tabel pengguna.

Pada halaman ini, klik pada tab "Operasi" di kanan atas. Di bawah Operasi, cari bagian Salin tabel ke (database.table):

& kamu selesai!

Mekey Salaria
sumber
1
Sangat sederhana! Inilah saatnya aku bisa merayakan menjadi malas!
Daniel Dut
1
You Save my time..i melakukan pendekatan naif..pertama mengekspor dan kemudian mengimpor.
Hamza Zafeer
1
Tidak ada jawaban lain yang berfungsi, hanya Anda yang menyalin indeks juga
Bsienn
1
Ini tidak akan berfungsi jika tabel itu sangat besar, yaitu lebih dari 4 GB. Sebagai contoh, saya punya tabel 22GB yang tidak bisa digunakan oleh phpMyAdmin.
Mark D
1
Jawaban sempurna. Tidak tahu tentang fitur phpmyadmin ini.
zookastos
23

Meja Kerja MySql : Sangat Dianjurkan

Alat Migrasi Basis Data Dari MySql Workbench

Ini akan dengan mudah menangani masalah migrasi. Anda dapat memigrasi tabel-tabel tertentu dari database yang dipilih antara MySql dan SqlServer. Anda harus mencobanya pasti.

mmdemirbas
sumber
Saya akan mencoba ini, saya sudah menyiapkannya tetapi bertanya-tanya apakah Anda telah membandingkan mysql Workbenchmigrasi ke SQLYogsalinan basis data? Dari tampilan cepat saya tampaknya mereka sangat mirip, tetapi meja kerja mysql adalah fitur yang lebih baru
wired00
Tidak, saya tidak mencoba SQLYog.
mmdemirbas
Tidak jelas bagaimana cara bermigrasi ke SQL Server dari MySQL menggunakan meja kerja MySql. Saya di Workbench dan tidak menemukan petunjuk dari bantuan atau UI. Saya tahu SSMA untuk MySQL berfungsi untuk saya.
subsci
2
Menarik, tetapi program ketahuan melakukan migrasi dengan database besar, baris perintah bekerja paling baik.
Claudionor Oliveira
1
@mmdemirbas, " Anda dapat memigrasikan tabel yang dipilih dari database yang dipilih antara MySql dan SqlServer. " Tetapi pertanyaan OP bukan tentang SQL Server.
sampablokuper
19

Saya menggunakan Navicat untuk MySQL ...

Itu membuat semua manipulasi basis data mudah!

Anda cukup memilih kedua database di Navicat dan kemudian gunakan.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1
Nick M
sumber
13

Saya tahu ini adalah pertanyaan lama, hanya menjawab agar siapa pun yang mendarat di sini mendapat pendekatan yang lebih baik.

Pada 5.6.10 yang dapat Anda lakukan

CREATE TABLE new_tbl LIKE orig_tbl;

Lihat dokumentasi di sini: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html

Mir Adnan
sumber
1
Itu tidak akan menyalin Data! Baca dokumentasi yang telah Anda referensikan:> ** CREATE TABLE ... LIKE tidak menyimpan DATA **
dgpro
11

Jika tabel Anda berada di server mysql yang sama, Anda dapat menjalankan yang berikut ini

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;
Weston Ganger
sumber
bagaimana dengan indeks lainnya ?! Pertanyaannya menyatakan untuk menyalin tabel tidak hanya datanya
Jorj
9

Gunakan fungsionalitas Ekspor dan Impor MySql Workbench. Langkah-langkah:
1. Pilih nilai yang Anda inginkan

E.g. select * from table1; 
  1. Klik pada tombol Ekspor dan simpan sebagai CSV.
  2. buat tabel baru menggunakan kolom yang sama seperti yang pertama

    E.g. create table table2 like table1; 
  3. pilih semua dari tabel baru

    E.g. select * from table2;  
  4. Klik Impor dan pilih file CSV yang Anda ekspor di langkah 2

Contoh tombol Ekspor dan Impor di MySql Workbench

Biniam
sumber
1
Itu hanya berfungsi untuk tabel dengan kurang dari satu miliar baris saya pikir.
Diogo Paim
9

Berikut ini cara mudah lainnya:

  1. gunakan DB1; tampilkan buat tabel TB1;
    • salin sintaks di sini di clipboard untuk membuat TB1 di DB2
  2. gunakan DB2;
    • rekatkan sintaks di sini untuk membuat tabel TB1

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

MojganK
sumber
Ini membantu saya untuk secara otomatis menyalin database, tanpa harus menggunakan program gui, terima kasih.
New2HTML
4

Coba mysqldbcopy( dokumentasi )

Atau Anda dapat membuat " tabel gabungan " pada host target Anda. Tabel Federasi memungkinkan Anda untuk melihat tabel dari server database yang berbeda seolah-olah itu adalah tabel lokal. ( dokumentasi )

Setelah membuat tabel gabungan, Anda dapat menyalin data dengan yang biasa insert into TARGET select * from SOURCE

Aaron Digulla
sumber
1
Saya sudah membaca tentang tabel gabungan, tetapi Amazon RDS (sekarang) tidak memiliki dukungan untuk itu ... XP
Chococroc
4

Dengan MySQL Workbench Anda dapat menggunakan Ekspor Data untuk membuang hanya tabel ke file SQL lokal (Hanya Data, Hanya Struktur atau Struktur dan Data) dan kemudian Impor Data untuk memuatnya ke DB lain.

Anda dapat memiliki banyak koneksi (host yang berbeda, database, pengguna) terbuka secara bersamaan.

Doug Krugman
sumber
3

Salah satu cara sederhana untuk mendapatkan semua pertanyaan yang Anda butuhkan adalah menggunakan data dari information_schema dan concat.

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

Anda kemudian akan mendapatkan daftar hasil yang terlihat seperti ini:

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;
...

Anda kemudian dapat menjalankan kueri tersebut.

Namun itu tidak akan berfungsi dengan Tampilan MySQL. Anda dapat menghindarinya dengan menambahkan AND TABLE_TYPE = 'BASE TABLE'dari permintaan awal:

John Mellor
sumber
1

Apakah ini sesuatu yang perlu Anda lakukan secara teratur, atau hanya satu?

Anda dapat melakukan ekspor (misalnya menggunakan phpMyAdmin atau serupa) yang akan skrip tabel Anda dan isinya ke file teks, maka Anda bisa mengimpor kembali itu ke dalam Database lain.

Sepster
sumber
Saya perlu melakukannya hanya sekali. Tetapi masalahnya adalah tabel dalam database memiliki hampir 1 juta baris. Basis data akan sangat besar. Juga ketika saya mencoba untuk mengekspor, hanya sekitar 10.000 baris yang diekspor - mungkin karena ukurannya yang besar.
Sparky
Ah, ya itu batasan. Artikel WordPress Codex ini mungkin membantu? Ini adalah artikel wordpress, tetapi mungkin memberi Anda beberapa wawasan (ada bagian tentang cara membuang tabel menggunakan baris perintah, dalam kasus di mana DB terlalu besar untuk ditangani oleh phpMyAdmin).
Sepster
Alat baris perintah mysqldump tidak memiliki masalah dengan 1 juta baris, atau beberapa miliar baris - semua yang akan mempengaruhi adalah berapa banyak waktu yang dibutuhkan dan berapa banyak hard drive Anda hasil menempati (dengan asumsi Anda output ke file). Pengalaman saya dengan perintah ekspor phpMyAdmin adalah bahwa itu jauh lebih terbatas daripada mysqldump.
thomasrutter
1

gunakan langkah-langkah di bawah ini untuk menyalin dan menyisipkan beberapa kolom dari satu tabel database ke tabel database lain-

  1. CREATE TABLE tablename (datatype nama kolom (ukuran), tipe nama kolom (ukuran));

2.MASUKKAN KE db2.tablename SELECT columnname1, columnname2 DARI db1.tablename;

Wisnu Lebih Banyak
sumber
1

Pertama buat dump. Menambahkan --no-create-info --no-create-dbbendera jika table2sudah ada:

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

Lalu masukkan user1kata sandi. Kemudian:

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

Lalu masukkan user2kata sandi.

Sama seperti @helmors yang menjawab tetapi pendekatannya lebih aman karena kata sandi tidak diekspos dalam teks mentah ke konsol (reverse-i-search, password sniffers, dll). Pendekatan lain baik-baik saja jika dijalankan dari file skrip dengan pembatasan yang sesuai ditempatkan pada izin itu.

wizzfizz94
sumber
0

DI xampp cukup ekspor tabel yang diperlukan sebagai file .sql dan kemudian impor ke yang diperlukan

Sameera Sampath
sumber
-1

buat tabel destination_customer seperti sakila.customer (Database_name.tablename), ini hanya akan menyalin struktur tabel sumber, untuk data juga untuk disalin dengan struktur lakukan ini buat table destination_customer sebagai pilih * dari sakila.customer

rajat prakash
sumber
Ini sepertinya menjadi jawaban untuk pertanyaan yang sama sekali berbeda. Tidak ada CREATE TABLE LIKEdalam pertanyaan, jadi mengapa menyebutkan bahwa itu salah? Dan tidak ada penjelasan tentang bagaimana jawaban ini memecahkan masalah bahwa tidak ada pengguna yang memiliki akses ke tabel yang lain.
Toby Speight