วิธีที่ง่ายที่สุดในการคัดลอกตารางจากฐานข้อมูลหนึ่งไปยังอีก?


151

วิธีที่ดีที่สุดในการคัดลอกข้อมูลจากตารางในฐานข้อมูลหนึ่งไปยังตารางในฐานข้อมูลอื่นคือเมื่อฐานข้อมูลอยู่ภายใต้ผู้ใช้ที่แตกต่างกัน?

ฉันรู้ว่าฉันสามารถใช้

INSERT INTO database2.table2 SELECT * from database1.table1

แต่ที่นี่ปัญหาคือทั้งสองdatabase1และdatabase2อยู่ภายใต้ผู้ใช้ MySQL ที่แตกต่างกัน ดังนั้นuser1สามารถเข้าถึงได้database1เท่านั้นและuser2สามารถเข้าถึงได้database2เท่านั้น ความคิดใด ๆ


6
คุณสามารถมอบระดับตารางให้กับผู้ใช้ ดูที่: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
น่าเสียดายที่สิ่งนี้ไม่ได้ผลในกรณีของฉันเพราะฉันใช้เซิร์ฟเวอร์โฮสติ้งที่ใช้ร่วมกันกับ Godaddy พวกเขาจะไม่อนุญาตให้ทำสิ่งต่าง ๆ กับฐานข้อมูล
Sparky

@mmdemirbas หนึ่งตารางในฐานข้อมูลมีเกือบ 1 ล้านแถว ดัมพ์ฐานข้อมูลจะมีขนาดใหญ่มาก นอกจากนี้เมื่อฉันพยายามที่จะส่งออกมีเพียงประมาณ 10,000 แถวเท่านั้นที่ถูกส่งออก - อาจเป็นเพราะขนาดใหญ่
Sparky

ฉันรู้ว่าคุณสามารถใช้ RENAME เพื่อย้ายตารางและมันเร็วมาก มีเคล็ดลับเทียบเท่าการคัดลอกตารางหรือไม่
Dan

BTW: คุณจะต้องดูแลว่ารายการเขตข้อมูลอยู่ในลำดับเดียวกันในทั้งสองตาราง มิฉะนั้นจะต้องเลือกฟิลด์ตามชื่อจากตารางในฐานข้อมูล 1 เพื่อให้แมปกับฟิลด์ที่ถูกต้องในตารางในฐานข้อมูล 2 ปัญหานี้เกิดขึ้นสำหรับฉันที่ฉันได้สำรองฐานข้อมูลที่ table1 ถูกแก้ไขหลังจากการสร้างครั้งแรกและฐานข้อมูลใหม่ที่มันถูกสร้างขึ้นจากไฟล์ mysqldump
Steve L

คำตอบ:


113

หากคุณมีการเข้าถึงเปลือกคุณอาจจะใช้mysqldumpการถ่ายโอนข้อมูลเนื้อหาของdatabase1.table1ท่อมันจะmysql database2ปัญหาที่นี่table1คือยังคงtable1อยู่

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

บางทีคุณอาจต้องเปลี่ยนชื่อtable1เป็นtable2แบบสอบถามอื่น ในทางกลับกันคุณอาจใช้ sed เพื่อเปลี่ยน table1 เป็น table2 ระหว่างไปเป็น pipes

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

หาก table2 มีอยู่แล้วคุณอาจเพิ่มพารามิเตอร์ลงใน mysqldump แรกที่ไม่อนุญาตให้สร้างการสร้างตาราง

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

ปัญหานี้คือเมื่อมันเป็นไปโดยอัตโนมัติคุณต้องแสดงรหัสผ่าน หากไม่อัตโนมัติและผู้ใช้ทำจากบรรทัดคำสั่งมันก็โอเค
Nelles

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

โดย db1 คือปลายทางและ db2 เป็นแหล่งที่มา


ใช้งานได้หรือไม่หากผู้ใช้สองคนไม่มีสิทธิ์เลือกข้อมูลจากกัน
เบริลเลียม

1
สิ่งนี้จะไม่ทำงานในเซิร์ฟเวอร์ mysql อื่น ๆ ใช่ไหม?
PUG

8
สิ่งนี้ไม่คัดลอกเหนือดัชนี
bcoughlan

@Beryllium ไม่ต้องการให้ผู้ใช้มีสิทธิ์สำหรับทั้งสองฐานข้อมูล jaminator ไม่สามารถใช้กับเซิร์ฟเวอร์อื่นได้ แต่ฉันไม่คิดว่าคำถามจะถามเกี่ยวกับสิ่งนั้น bcoughlan คุณถูกต้อง นี่เป็นข้อบกพร่องใหญ่ในแนวทางนี้: มันไม่ได้รักษาโครงสร้างของตารางไว้อย่างเหมาะสม
thomasrutter

4
ตารางที่คัดลอกไม่มีคีย์หลักและชุดเพิ่มอัตโนมัติ คุณต้องเรียกใช้สิ่งนี้หลังจากALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger

60

หากคุณใช้PHPMyAdminอาจเป็นเรื่องง่าย สมมติว่าคุณมีฐานข้อมูลต่อไปนี้:

DB1 & DB2

DB1 มีผู้ใช้ตารางที่คุณต้องการคัดลอกไปยัง DB2

ภายใต้ PHPMyAdmin ให้เปิด DB1 จากนั้นไปที่ตารางผู้ใช้

ในหน้านี้คลิกที่แท็บ"การดำเนินการ"ที่ด้านบนขวา ภายใต้การดำเนินการให้ค้นหาส่วนคัดลอกตารางไปยัง (ฐานข้อมูลตาราง):

คุณเสร็จแล้ว!


1
ง่ายตาย! นี่คือเมื่อฉันสามารถเฉลิมฉลองการขี้เกียจ!
Daniel Dut

1
คุณประหยัดเวลาของฉัน .. ฉันกำลังทำสิ่งที่ไร้เดียงสา ... เริ่มต้นการส่งออกก่อน
Hamza Zafeer

1
ไม่มีคำตอบอื่นใดที่ทำงานได้มีเพียงคุณที่คัดลอกดัชนีเช่นกัน
Bsienn

1
สิ่งนี้จะไม่ทำงานหากตารางมีขนาดใหญ่เป็นพิเศษนั่นคือเกิน 4 GB ตัวอย่างเช่นฉันมีตารางซึ่งมีขนาด 22GB ที่ phpMyAdmin ใช้งานไม่ได้
Mark D

1
คำตอบที่สมบูรณ์แบบ ไม่ทราบเกี่ยวกับฟีเจอร์นี้ของ phpmyadmin
zookastos

23

MySql Workbench : แนะนำอย่างยิ่ง

เครื่องมือการย้ายฐานข้อมูลจาก MySql Workbench

สิ่งนี้จะจัดการกับปัญหาการโยกย้ายได้อย่างง่ายดาย คุณสามารถโยกย้ายตารางของฐานข้อมูลที่เลือกระหว่าง MySql และ SqlServer คุณควรทดลองใช้อย่างแน่นอน


ฉันกำลังจะไปนี้ฉันมีการตั้งค่า แต่สงสัยว่าคุณเปรียบเทียบการmysql Workbenchโยกย้ายกับSQLYogสำเนาฐานข้อมูลของหรือไม่ จากรูปลักษณ์ที่รวดเร็วของฉันดูเหมือนว่าพวกเขาจะคล้ายกันมาก แต่ mysql workbench เป็นคุณลักษณะที่ใหม่กว่า
wired00

ไม่ฉันไม่ได้ลองใช้ SQLYog
mmdemirbas

ไม่ชัดเจนว่าจะย้ายไปยัง SQL Server จาก MySQL โดยใช้ MySql workbench ได้อย่างไร ฉันอยู่ใน Workbench และไม่พบเบาะแสจากความช่วยเหลือหรือ UI ฉันรู้ว่า SSMA สำหรับ MySQL ใช้งานได้สำหรับฉัน
subsci

2
ที่น่าสนใจ แต่โปรแกรมจับการโยกย้ายด้วยฐานข้อมูลขนาดใหญ่บรรทัดคำสั่งทำงานได้ดีที่สุด
Claudionor Oliveira

1
@mmdemirbas " คุณสามารถโยกย้ายตารางที่เลือกของฐานข้อมูลที่เลือกระหว่าง MySql และ SqlServer " คำถามของ OP ไม่เกี่ยวกับ SQL Server
sampablokuper

19

ฉันใช้ Navicat สำหรับ MySQL ...

มันทำให้การจัดการฐานข้อมูลทั้งหมดเป็นเรื่องง่าย!

คุณเพียงเลือกฐานข้อมูลทั้งสองใน Navicat แล้วใช้

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

ฉันรู้ว่านี่เป็นคำถามเก่า ๆ เพียงตอบเพื่อให้ทุกคนที่มาที่นี่ได้รับแนวทางที่ดีกว่า

ตั้งแต่ 5.6.10 คุณสามารถทำได้

CREATE TABLE new_tbl LIKE orig_tbl;

ดูเอกสารที่นี่: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html


1
มันจะไม่คัดลอกข้อมูล! อ่านเอกสารที่คุณอ้างอิง:> ** สร้างตาราง ... เหมือนไม่เก็บข้อมูลใด ๆ **
dgpro

11

หากตารางของคุณอยู่บนเซิร์ฟเวอร์ mysql เดียวกันคุณสามารถเรียกใช้สิ่งต่อไปนี้

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;

ดัชนีอื่น ๆ ล่ะ! คำถามระบุให้คัดลอกตารางไม่เพียง แต่ข้อมูล
Jorj

9

ใช้ฟังก์ชันส่งออกและนำเข้าของ MySql Workbench ขั้นตอน:
1. เลือกค่าที่คุณต้องการ

E.g. select * from table1; 
  1. คลิกที่ปุ่มส่งออกและบันทึกเป็น CSV
  2. สร้างตารางใหม่โดยใช้คอลัมน์ที่คล้ายกันเป็นตารางแรก

    E.g. create table table2 like table1; 
  3. เลือกทั้งหมดจากตารางใหม่

    E.g. select * from table2;  
  4. คลิกที่นำเข้าและเลือกไฟล์ CSV ที่คุณส่งออกในขั้นตอนที่ 2

ตัวอย่างของปุ่มส่งออกและนำเข้าใน MySql Workbench


1
ใช้งานได้กับตารางที่มีน้อยกว่าหนึ่งพันล้านแถวเท่านั้นที่ฉันคิด
Diogo Paim

9

นี่เป็นอีกวิธีที่ง่าย:

  1. ใช้ DB1 แสดงสร้างตาราง TB1;
    • คัดลอกไวยากรณ์ที่นี่ในคลิปบอร์ดเพื่อสร้าง TB1 ใน DB2
  2. ใช้ DB2
    • วางไวยากรณ์ที่นี่เพื่อสร้างตาราง TB1

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


สิ่งนี้ช่วยให้ฉันทำการคัดลอกฐานข้อมูลโดยอัตโนมัติโดยไม่ต้องใช้โปรแกรม gui ขอบคุณ
2HTML

4

ลองmysqldbcopy( เอกสาร )

หรือคุณสามารถสร้าง " ตารางรวม " บนโฮสต์เป้าหมายของคุณ ตารางแบบรวมช่วยให้คุณเห็นตารางจากเซิร์ฟเวอร์ฐานข้อมูลอื่นราวกับว่าเป็นตารางในเครื่อง ( เอกสาร )

หลังจากสร้างตารางรวมคุณสามารถคัดลอกข้อมูลได้ตามปกติ insert into TARGET select * from SOURCE


1
ฉันได้อ่านเกี่ยวกับตารางรวมแล้ว แต่ Amazon RDS (ตอนนี้) ไม่รองรับ ... XP
Chococroc

4

ด้วย MySQL Workbench คุณสามารถใช้ Data Export เพื่อดัมพ์ตารางไปยังไฟล์ SQL ภายในเครื่อง (เฉพาะข้อมูล, โครงสร้างเท่านั้นหรือโครงสร้างและข้อมูล) จากนั้นนำเข้าข้อมูลเพื่อโหลดลงในฐานข้อมูลอื่น

คุณสามารถมีการเชื่อมต่อหลายรายการ (โฮสต์ที่แตกต่างกันฐานข้อมูลผู้ใช้) เปิดในเวลาเดียวกัน


3

วิธีง่ายๆในการรับแบบสอบถามทั้งหมดที่คุณต้องการคือการใช้ข้อมูลจาก information_schema และ concat

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

จากนั้นคุณจะได้รับรายการผลลัพธ์ที่มีลักษณะดังนี้:

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

จากนั้นคุณสามารถเรียกใช้คิวรีเหล่านั้นได้

อย่างไรก็ตามมันจะไม่ทำงานกับ MySQL Views คุณสามารถหลีกเลี่ยงสิ่งเหล่านี้ได้โดยต่อท้ายAND TABLE_TYPE = 'BASE TABLE'จากแบบสอบถามเริ่มต้น:


1

นี่เป็นสิ่งที่คุณต้องทำอย่างสม่ำเสมอหรือเพียงแค่หยุด

คุณสามารถทำการส่งออก (เช่นใช้ phpMyAdmin หรือคล้ายกัน) ที่จะเขียนตารางและเนื้อหาในไฟล์ข้อความของคุณจากนั้นคุณสามารถนำเข้าข้อมูลนั้นไปยังฐานข้อมูลอื่นได้อีกครั้ง


ฉันต้องทำเพียงครั้งเดียว แต่ปัญหาคือตารางในฐานข้อมูลมีเกือบ 1 ล้านแถว ดัมพ์ฐานข้อมูลจะมีขนาดใหญ่มาก นอกจากนี้เมื่อฉันพยายามที่จะส่งออกมีเพียงประมาณ 10,000 แถวเท่านั้นที่ถูกส่งออก - อาจเป็นเพราะขนาดใหญ่
Sparky

อาใช่ข้อ จำกัด บทความ WordPress Codex นี้อาจช่วย? มันเป็นบทความเวิร์ดเพรส แต่อาจให้ข้อมูลเชิงลึกกับคุณ (มีส่วนเกี่ยวกับวิธีการถ่ายโอนข้อมูลตารางโดยใช้บรรทัดคำสั่งในกรณีที่ DB มีขนาดใหญ่เกินไปสำหรับ phpMyAdmin ที่จะจัดการ)
Sepster

เครื่องมือบรรทัดคำสั่ง mysqldump ไม่มีปัญหากับ 1 ล้านแถวหรือหลายพันล้านแถวสิ่งที่จะส่งผลกระทบคือระยะเวลาที่ต้องใช้และปริมาณของฮาร์ดไดรฟ์ที่คุณใช้อยู่นั้นเป็นเท่าใด ประสบการณ์ของฉันกับคำสั่งการส่งออกของ phpMyAdmin คือมันมีข้อ จำกัด มากกว่า mysqldump มาก
thomasrutter

1

ใช้ขั้นตอนด้านล่างเพื่อคัดลอกและแทรกบางคอลัมน์จากตารางฐานข้อมูลหนึ่งไปยังอีกตารางฐานข้อมูล

  1. สร้างตาราง tablename (คอลัมน์ประเภทข้อมูล (ขนาด), ประเภทข้อมูลคอลัมน์ (ขนาด));

2. INSERT เข้าสู่ db2.tablename SELECT columnname1, columnname2 จาก db1.tablename;


1

สร้างการถ่ายโอนข้อมูลก่อน เพิ่ม--no-create-info --no-create-dbธงหากtable2มีอยู่แล้ว:

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

จากนั้นป้อนuser1รหัสผ่าน แล้ว:

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

จากนั้นป้อนuser2รหัสผ่าน

เช่นเดียวกับ @helmors คำตอบ แต่วิธีการมีความปลอดภัยมากขึ้นเนื่องจากรหัสผ่านจะไม่ถูกเปิดเผยในข้อความดิบไปยังคอนโซล (reverse-i-search, sniffers รหัสผ่านและอื่น ๆ ) วิธีการอื่นนั้นใช้ได้ถ้ามันถูกเรียกใช้จากไฟล์สคริปต์ที่มีข้อ จำกัด ที่เหมาะสมในการอนุญาต


0

ใน xampp เพียงแค่ส่งออกตารางที่ต้องการเป็นไฟล์. sql แล้วนำเข้าตารางที่ต้องการ


-1

สร้าง table ปลายทาง_customerเช่น sakila.customer (Database_name.tablename), นี่จะคัดลอกโครงสร้างของตารางต้นฉบับเท่านั้น, สำหรับข้อมูลที่จะได้รับการคัดลอกด้วยโครงสร้างทำสิ่งนี้สร้าง table_customer ของตารางเป็น select * จาก sakila.customer


นี่ดูเหมือนจะเป็นคำตอบสำหรับคำถามที่แตกต่างอย่างสิ้นเชิง ไม่มีCREATE TABLE LIKEคำถามดังนั้นทำไมพูดถึงว่ามันผิด และไม่มีคำอธิบายว่าคำตอบนี้แก้ปัญหาที่ผู้ใช้คนใดไม่สามารถเข้าถึงตารางอื่น ๆ ได้
Toby Speight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.