Cách dễ nhất để sao chép một bảng từ cơ sở dữ liệu này sang cơ sở dữ liệu khác?


151

Phương pháp tốt nhất để sao chép dữ liệu từ một bảng trong một cơ sở dữ liệu sang một bảng trong cơ sở dữ liệu khác khi các cơ sở dữ liệu nằm dưới những người dùng khác nhau là gì?

Tôi biết rằng tôi có thể sử dụng

INSERT INTO database2.table2 SELECT * from database1.table1

Nhưng vấn đề ở đây là cả hai database1database2đều thuộc những người dùng MySQL khác nhau. Vì vậy, chỉ user1có thể truy cập database1và chỉ user2có thể truy cập database2. Bất kỳ ý tưởng?


6
Bạn có thể cấp trợ cấp cho bảng cho người dùng. xem: dev.mysql.com/doc/refman/5.5/en/grant.html
Omesh

2
Thật không may, điều này sẽ không hoạt động trong trường hợp của tôi, vì tôi đang sử dụng máy chủ lưu trữ chia sẻ Godaddy. Họ sẽ không cho phép làm những việc như vậy với cơ sở dữ liệu.
Sparky

@mmdemirbas Một bảng trong cơ sở dữ liệu có gần 1 triệu hàng. Các bãi chứa cơ sở dữ liệu sẽ rất lớn. Ngoài ra khi tôi cố gắng xuất, chỉ có khoảng 10000 hàng đang được xuất - có thể là do kích thước lớn.
Sparky

Tôi biết bạn có thể sử dụng RENAME để di chuyển các bảng và nó cực nhanh. Có một mẹo tương đương để sao chép bảng?
Dan

BTW: Bạn sẽ cần lưu ý rằng danh sách trường theo cùng một thứ tự trong cả hai bảng. Nếu không, sẽ cần phải chọn các trường theo tên từ bảng trong cơ sở dữ liệu1 để chúng ánh xạ tới các trường chính xác trong bảng trong cơ sở dữ liệu2. Vấn đề này xuất hiện với tôi khi tôi đã sao lưu cơ sở dữ liệu trong đó bảng1 đã được sửa đổi sau khi tạo ban đầu và cơ sở dữ liệu mới nơi nó được tạo từ tệp mysqldump.
Steve L

Câu trả lời:


113

Nếu bạn có quyền truy cập shell, bạn có thể sử dụng mysqldumpđể kết xuất nội dung database1.table1và chuyển nó mysqlsang database2. Vấn đề ở đây table1là vẫn còn table1.

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

Có lẽ bạn cần đổi tên table1thành table2với một truy vấn khác. Mặt khác, bạn có thể sử dụng sed để thay đổi bảng1 thành bảng2 giữa các đường ống.

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

Nếu bảng2 đã tồn tại, bạn có thể thêm các tham số vào mysqldump đầu tiên không cho phép tạo bảng tạo.

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

Vấn đề với điều này là khi nó được tự động, bạn phải hiển thị mật khẩu. Nếu không tự động và được thực hiện bởi người dùng từ dòng lệnh thì không sao.
Nelles

100

CREATE TABLE db1.table1 SELECT * FROM db2.table1

trong đó db1 là đích và db2 là nguồn


Điều này có hoạt động không, nếu hai người dùng không có quyền chọn dữ liệu từ nhau?
Beryllium

1
Điều này sẽ không làm việc trên các máy chủ mysql khác nhau mặc dù?
PUG

8
Điều này không sao chép trên các chỉ mục
bcoughlan

@Beryllium không có điều này đòi hỏi người dùng phải có quyền cho cả hai DB. jaminator không điều này sẽ không hoạt động trên các máy chủ khác nhau, nhưng tôi không nghĩ rằng câu hỏi đã hỏi về điều đó. bcoughlan bạn đúng. Đây là một lỗ hổng lớn trong cách tiếp cận này: Nó không bảo vệ đúng cấu trúc bảng.
thomasrutter

4
Bảng đã sao chép không có khóa chính và bộ tăng tự động. Bạn phải chạy cái này sauALTER TABLE db1.table1 ADD PRIMARY KEY (id); ALTER TABLE db1.table1 MODIFY COLUMN id INT AUTO_INCREMENT;
Weston Ganger

60

Nếu bạn đang sử dụng PHPMyAdmin, nó có thể thực sự đơn giản. Giả sử bạn có cơ sở dữ liệu sau:

DB1 & DB2

DB1 có một người dùng bảng mà bạn muốn sao chép vào DB2

Trong PHPMyAdmin, mở DB1, sau đó chuyển đến bảng người dùng.

Trên trang này, nhấp vào tab "Hoạt động" ở trên cùng bên phải. Trong phần Hoạt động, hãy tìm phần Sao chép bảng vào (cơ sở dữ liệu.table):

& Bạn xong việc rồi!


1
Chết một cách đơn giản! Đây là khi tôi có thể ăn mừng vì lười biếng!
Daniel Dut

1
Bạn tiết kiệm thời gian của tôi..tôi đang làm cách tiếp cận ngây thơ..đầu tiên xuất khẩu và sau đó nhập khẩu.
Hamza Zafeer

1
Không có câu trả lời nào khác hoạt động, chỉ có câu trả lời của bạn cũng sao chép chỉ mục
Bsienn

1
Điều này sẽ không hoạt động nếu bảng đặc biệt lớn, tức là vượt quá 4 GB. Ví dụ: tôi có một bảng là 22GB mà phpMyAdmin không thể làm việc được.
Đánh dấu

1
Câu trả lời hoàn hảo. Không biết về tính năng này của phpmyadmin.
zookastos

23

MySql Workbench : Được khuyến nghị mạnh mẽ

Công cụ di chuyển cơ sở dữ liệu từ MySql Workbench

Điều này sẽ dễ dàng xử lý các vấn đề di chuyển. Bạn có thể di chuyển các bảng đã chọn của cơ sở dữ liệu đã chọn giữa MySql và SqlServer. Bạn nên thử một cách chắc chắn.


Tôi chuẩn bị thực hiện điều này, tôi đã thiết lập nó nhưng tự hỏi liệu bạn đã so sánh việc mysql Workbenchdi chuyển với SQLYogbản sao cơ sở dữ liệu chưa? Từ cái nhìn nhanh của tôi, có vẻ như chúng rất giống nhau, nhưng bàn làm việc của mysql là một tính năng mới hơn
Wired00

Không, tôi đã không thử SQLYog.
mmdemirbas

Không rõ ràng làm thế nào để di chuyển sang SQL Server từ MySQL bằng bàn làm việc MySql. Tôi đang ở Workbench và không tìm thấy manh mối nào từ trợ giúp hoặc UI. Tôi biết SSMA cho MySQL hoạt động với tôi.
subsci

2
Thú vị, nhưng chương trình bắt gặp khi thực hiện di chuyển với cơ sở dữ liệu lớn, dòng lệnh hoạt động tốt nhất.
Claudionor Oliveira

1
@mmdemirbas, "Tuy nhiên, bạn có thể di chuyển các bảng cơ sở dữ liệu đã chọn giữa MySql và SqlServer. " Tuy nhiên, câu hỏi của OP không phải là về SQL Server.
sampablokuper

19

Tôi sử dụng Navicat cho MySQL ...

Nó làm cho tất cả các thao tác cơ sở dữ liệu dễ dàng!

Bạn chỉ cần chọn cả hai cơ sở dữ liệu trong Navicat và sau đó sử dụng.

 INSERT INTO Database2.Table1 SELECT * from Database1.Table1

13

Tôi biết đây là câu hỏi cũ, chỉ cần trả lời để bất cứ ai đặt chân đến đây đều có cách tiếp cận tốt hơn.

Kể từ 5.6.10 bạn có thể làm

CREATE TABLE new_tbl LIKE orig_tbl;

Tham khảo tài liệu tại đây: https://dev.mysql.com/doc/refman/5.7/en/create-table-like.html


1
Nó sẽ không sao chép dữ liệu! Đọc tài liệu bạn đã tham khảo:> ** TẠO BẢNG ... THÍCH không lưu giữ bất kỳ DỮ LIỆU nào **
dgpro

11

Nếu các bảng của bạn nằm trên cùng một máy chủ mysql, bạn có thể chạy như sau

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;

Còn các chỉ số khác thì sao?! Câu hỏi nêu rõ sao chép bảng không chỉ dữ liệu của nó
Jorj

9

Sử dụng chức năng Xuất và Nhập của MySql Workbench. Các bước:
1. Chọn các giá trị bạn muốn

E.g. select * from table1; 
  1. Nhấp vào nút Xuất và lưu dưới dạng CSV.
  2. tạo một bảng mới bằng cách sử dụng các cột tương tự như bảng đầu tiên

    E.g. create table table2 like table1; 
  3. chọn tất cả từ bảng mới

    E.g. select * from table2;  
  4. Nhấp vào Nhập và chọn tệp CSV bạn đã xuất ở bước 2

Mẫu các nút Xuất và Nhập trong Bàn làm việc MySql


1
Nó chỉ hoạt động cho các bảng có ít hơn một tỷ hàng tôi nghĩ.
Diogo Paim

9

Đây là một cách dễ dàng khác:

  1. sử dụng DB1; hiển thị tạo bảng TB1;
    • sao chép cú pháp ở đây trong clipboard để tạo TB1 trong DB2
  2. sử dụng DB2;
    • dán cú pháp vào đây để tạo bảng TB1

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


Điều này giúp tôi tự động hóa việc sao chép cơ sở dữ liệu mà không phải sử dụng chương trình gui.
New2HTML

4

Hãy thử mysqldbcopy( tài liệu )

Hoặc bạn có thể tạo một " bảng liên kết " trên máy chủ đích của mình. Các bảng được liên kết cho phép bạn xem một bảng từ một máy chủ cơ sở dữ liệu khác nhau như thể nó là một bảng cục bộ. ( tài liệu )

Sau khi tạo bảng được liên kết, bạn có thể sao chép dữ liệu với thông thường insert into TARGET select * from SOURCE


1
Tôi đã đọc về các bảng được liên kết, nhưng Amazon RDS (ngay bây giờ) không hỗ trợ cho nó ... XP
Chococroc

4

Với MySQL Workbench, bạn có thể sử dụng Xuất dữ liệu để kết xuất bảng vào tệp SQL cục bộ (Chỉ dữ liệu, Chỉ cấu trúc hoặc Cấu trúc và Dữ liệu) và sau đó Nhập dữ liệu để tải nó vào DB khác.

Bạn có thể mở nhiều kết nối (máy chủ, cơ sở dữ liệu, người dùng khác nhau) cùng một lúc.


3

Một cách đơn giản để có được tất cả các truy vấn bạn cần là sử dụng dữ liệu từ information_schema và concat.

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

Sau đó, bạn sẽ nhận được một danh sách các kết quả trông như thế này:

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

Sau đó bạn có thể chạy các truy vấn đó.

Tuy nhiên, nó sẽ không hoạt động với MySQL Views. Bạn có thể tránh chúng bằng cách nối thêm AND TABLE_TYPE = 'BASE TABLE'từ truy vấn ban đầu:


1

Đây có phải là thứ bạn cần làm thường xuyên, hay chỉ là một thứ?

Bạn có thể thực hiện xuất (ví dụ: sử dụng phpMyAdmin hoặc tương tự) sẽ kịch bản ra bảng và nội dung của nó thành tệp văn bản, sau đó bạn có thể nhập lại vào Cơ sở dữ liệu khác.


Tôi chỉ cần làm một lần. Nhưng vấn đề là bảng trong cơ sở dữ liệu có gần 1 triệu hàng. Các bãi chứa cơ sở dữ liệu sẽ rất lớn. Ngoài ra khi tôi cố gắng xuất, chỉ có khoảng 10000 hàng đang được xuất - có thể là do kích thước lớn.
Sparky

Ah, vâng, đó là một hạn chế. Bài viết Codex WordPress này có thể giúp gì? Đây là một bài viết wordpress, nhưng có thể cung cấp cho bạn một cái nhìn sâu sắc (có một phần về cách kết xuất các bảng bằng dòng lệnh, trong trường hợp DB quá lớn để phpMyAdmin xử lý).
Sepster

Công cụ dòng lệnh mysqldump không có vấn đề gì với 1 triệu hàng hoặc vài tỷ hàng - tất cả những gì sẽ ảnh hưởng là thời gian sử dụng và bao nhiêu ổ cứng của bạn chiếm kết quả (giả sử bạn xuất nó ra một tệp). Kinh nghiệm của tôi với lệnh xuất của phpMyAdmin là nó hạn chế hơn nhiều so với mysqldump.
thomasrutter

1

sử dụng các bước dưới đây để sao chép và chèn một số cột từ một bảng cơ sở dữ liệu sang một bảng cơ sở dữ liệu khác-

  1. CREATE TABLE tablename (kiểu tên cột (kích thước), kiểu dữ liệu tên cột (kích thước));

2.INERT VÀO db2.tablename CHỌN cột tên1, cột tên2 TỪ db1.tablename;


1

Đầu tiên tạo bãi chứa. Đã thêm các --no-create-info --no-create-dbcờ nếu table2đã tồn tại:

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

Sau đó nhập user1mật khẩu. Sau đó:

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

Sau đó nhập user2mật khẩu.

Giống như câu trả lời của @musors nhưng cách tiếp cận an toàn hơn vì mật khẩu không bị lộ trong văn bản thô đối với bảng điều khiển (tìm kiếm ngược, tìm mật khẩu, v.v.). Cách tiếp cận khác là tốt nếu nó được thực thi từ tệp tập lệnh với các hạn chế phù hợp được đặt trên các quyền của nó.


0

IN xampp chỉ cần xuất bảng được yêu cầu dưới dạng tệp .sql và sau đó nhập nó vào yêu cầu


-1

tạo bảng Destination_customer như sakila.customer (Database_name.tablename), điều này sẽ chỉ sao chép cấu trúc của bảng nguồn, để dữ liệu cũng được sao chép với cấu trúc, hãy tạo bảng Destination_customer như chọn * từ sakila.customer


Đây dường như là một câu trả lời cho một câu hỏi hoàn toàn khác. Không có CREATE TABLE LIKEcâu hỏi nào, vậy tại sao lại đề cập rằng nó sai? Và không có lời giải thích nào về cách câu trả lời này giải quyết vấn đề mà cả người dùng không có quyền truy cập vào các bảng khác.
Toby Speight
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.