2010-07-14 44 views
21

Tôi muốn làm điều đó bằng cách sử dụng mã và không sử dụng công cụ như "Bộ công cụ di chuyển MySQL". Cách dễ nhất tôi biết là mở một kết nối (sử dụng các kết nối MySQL) tới DB1 và ​​đọc dữ liệu của nó. Mở kết nối tới DB2 và ghi dữ liệu vào nó. Có cách nào tốt hơn/dễ nhất không?Làm cách nào để chuyển dữ liệu giữa 2 cơ sở dữ liệu MySQL?

+1

hai cơ sở dữ liệu trên cùng một máy chủ hoặc hai cơ sở dữ liệu trên các máy chủ khác nhau? –

+0

@Itay: Tôi không chắc chắn thời tiết họ đang ở trên cùng một máy chủ hay không? Tôi biết rằng điều này tạo ra sự khác biệt nhưng không đến với tâm trí của tôi để hỏi họ.Tôi sẽ làm vào ngày mai. – Morano88

Trả lời

20

Đầu tiên tôi sẽ cho rằng bạn đang không ở trong một vị trí để chỉ cần sao chép dữ liệu/thư mục, bởi vì nếu bạn sau đó sử dụng ảnh chụp/sao lưu/khôi phục hiện có của bạn có thể sẽ đủ (và kiểm tra các thủ tục sao lưu/khôi phục của bạn vào món hời).

Trong trường hợp đó, nếu hai bảng có cùng cấu trúc nói chung là nhanh nhất và trớ trêu thay, cách tiếp cận dễ nhất sẽ là sử dụng SELECT ... INTO OUTFILE ... ở một đầu và LOAD DATA INFILE ... trên cai khac.

Xem http://dev.mysql.com/doc/refman/5.1/en/load-data.html và .../select.html để biết chi tiết dứt khoát.

Đối với các bảng nhỏ sau đây sẽ làm việc:

SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

LOAD DATA INFILE '/tmp/mytable.csv' INTO TABLE mytable 
    FIELDS TERMINATED BY ',' 
    OPTIONALLY ENCLOSED BY '"' 
    ESCAPED BY '\\\\' 
    LINES TERMINATED BY '\\n' ; 

Chúng tôi cũng sử dụng FIFO của để có hiệu lực tuyệt vời để tránh việc thực sự viết vào đĩa, hoặc nếu chúng tôi cần phải ghi vào đĩa đối với một số lý do nào, để chuyển nó qua gzip.

tức là.

mkfifo /tmp/myfifo 
gzip -c /tmp/myfifo > /tmp/mytable.csv.gz & 
... SEL 

ECT... INTO OUTFILE '/tmp/myfifo' ..... 
wait 

gunzip -c /tmp/mytable.csv.gz > /tmp/myfifo & 
... LOAD DATA INFILE /tmp/myfifo ..... 
wait 

Về cơ bản, bạn có thể nén dữ liệu đó vào một FIFO, bạn có thể nén dữ liệu đó vào một nội dung trái tim.

+0

Cảm ơn, mặc dù nó nằm trong hướng dẫn sử dụng dev.mysql nhưng nó không hoạt động một cách proberly. Nó cho tôi lỗi này: Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho đúng cú pháp để sử dụng gần '\ n' 'tại dòng 1) Nó không chấp nhận' \ n '.. tại sao? – Morano88

+0

Stack Overflow bị hỏng truy vấn mẫu. Trong nguồn, dấu gạch chéo trong mệnh đề ESCAPED BY đã được thoát, nhưng lối thoát bị mất khi chuyển đổi thành html. Xin lỗi về điều đó, tôi đã không nhận thấy sự tham nhũng - tôi đã sửa nó ở trên. – Recurse

+0

Đây chính xác là những gì tôi cần để sử dụng để tăng tốc độ sao lưu cơ sở dữ liệu khá lớn, nhưng tôi không thể lấy ví dụ của bạn để làm việc. Tôi có thể tạo FIFO, và nếu tôi đổ ra đường ống bằng mysqldump nó hoạt động tốt. Tuy nhiên, nếu tôi cố gắng đổ ra đường ống bằng cách sử dụng SELECT ... INTO OUTFILE tôi nhận được một lỗi "myfifo đã tồn tại". –

11

Công cụ lưu trữ FEDERATED? Không phải là nhanh nhất trong nhóm, nhưng trong một thời gian, ngẫu nhiên, hoặc một lượng nhỏ dữ liệu nó sẽ làm. Đó là giả sử bạn đang nói về 2 SERVERS. Với 2 cơ sở dữ liệu trên một và cùng một máy chủ nó sẽ chỉ đơn giản là:

INSERT INTO databasename1.tablename SELECT * FROM databasename2.tablename; 
+0

Cảm ơn rất nhiều, tôi không chắc chắn Nếu 2 cơ sở dữ liệu trên cùng một máy chủ hay không. – Morano88

+0

Điều này thật tuyệt vời cho hoàn cảnh của tôi. Chúc mừng :) – Nick

+0

Làm việc tuyệt vời với Amazon RDS nơi bạn không có quyền truy cập vào máy cơ bản đang chạy MySQL instance, loại trừ các giải pháp liên quan đến INFILE/OUTFILE. – Andz

1

Bạn có thể sử dụng mysqldumpmysql (dòng lệnh khách hàng). Đây là những công cụ dòng lệnh và trong câu hỏi bạn viết bạn không muốn sử dụng chúng, nhưng vẫn sử dụng chúng (thậm chí bằng cách chạy chúng từ mã của bạn) là cách dễ nhất; mysqldump giải quyết rất nhiều vấn đề.

Bạn có thể tạo select s từ một cơ sở dữ liệu và insert sang một cơ sở dữ liệu khác, điều này khá dễ dàng. Nhưng nếu bạn cũng cần phải chuyển lược đồ cơ sở dữ liệu (create table s, vv), nó sẽ phức tạp hơn một chút, đó là lý do tôi khuyên bạn nên mysqldump. Nhưng nhiều công cụ PHP-MySQL-admin cũng thực hiện điều này, vì vậy bạn có thể sử dụng chúng hoặc xem mã của chúng.

Hoặc có thể bạn có thể sử dụng bản sao MySQL.

+0

Thao tác này (chọn, chèn) có hoạt động nếu hai cơ sở dữ liệu nằm trên 2 máy chủ khác nhau không? Không, tôi chỉ muốn di chuyển dữ liệu, không phải bảng dữ liệu, vv .. – Morano88

+0

Có, bạn sẽ có kết nối tvo - cho mỗi máy chủ - trong một kết nối bạn chạy SELECT, sau đó trong INSERT khác với dữ liệu trả về từ SELECT đó . – Messa

0

Nếu bạn bật ghi nhật ký nhị phân trên máy chủ hiện tại của bạn (và có tất cả các bản ghi bin), bạn có thể thiết lập sao chép cho máy chủ thứ hai

Các vấn đề liên quan