Câu trả lời:
Sao chép rất đơn giản đối với MyISAM và hoàn toàn rủi ro 100% (gần tự tử) với InnoDB.
Từ câu hỏi của bạn, bạn đã đưa lên
cp /db1/mytable.frm /db2/mytable.frm
Điều này là OK để làm. Tuy nhiên, bạn không thể di chuyển .frm. Bạn phải di chuyển tất cả các thành phần. Từ câu hỏi của bạn, hãy lấy một bảng có tên db1.mytable. Trong một cài đặt bình thường, bảng được đặt trong / var / lib / mysql / db1. Sẽ có ba tập tin tạo thành bảng.
Bạn phải di chuyển cả ba tập tin để di chuyển một bảng. Nếu tất cả các bảng của bạn sử dụng công cụ lưu trữ MyISAM, bạn có thể tắt mysql và sao chép đi. Nếu bạn chỉ đơn giản là tạo một bản sao của bảng và đặt nó vào cơ sở dữ liệu khác, bạn nên làm điều đó bằng cách sử dụng SQL.
Ví dụ: nếu bạn muốn sao chép db1.mytable vào cơ sở dữ liệu db2, hãy làm điều này:
CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;
Bây giờ nếu bạn chỉ di chuyển bảng từ db1 sang db2, bạn có thể làm điều này:
ALTER TABLE db1.mytable RENAME db2.mytable;
Sao chép rất nguy hiểm vì cơ sở hạ tầng mà InnoDB hoạt động. Có hai cơ sở hạ tầng cơ bản: 1) innodb_file_per_table bị vô hiệu hóa và 2) innodb_file_per_table được bật
Gót chân của InnoDB của Achilles là tệp không gian bảng hệ thống được gọi là ibdata1 (thường nằm trong / var / lib / mysql). Những gì có trong tập tin đó ?
Với innodb_file_per_table bị vô hiệu hóa, tất cả các loại thông tin InnoDB này đều nằm trong ibdata1. Biểu hiện duy nhất của bất kỳ bảng InnoDB nào ngoài ibdata1 là tệp .frm của bảng InnoDB. Sao chép tất cả dữ liệu InnoDB cùng một lúc yêu cầu sao chép tất cả / var / lib / mysql.
Sao chép một bảng InnoDB riêng lẻ là hoàn toàn không thể. Bạn phải mysqldump để trích xuất một kết xuất của bảng dưới dạng biểu diễn logic của dữ liệu và các định nghĩa chỉ mục tương ứng của nó. Sau đó, bạn sẽ tải kết xuất đó sang cơ sở dữ liệu khác trên cùng một máy chủ hoặc máy chủ khác.
Với innodb_file_per_table được bật, dữ liệu bảng và các chỉ mục của nó nằm trong thư mục cơ sở dữ liệu bên cạnh tệp .frm. Ví dụ: đối với bảng db1.mytable, biểu hiện của bảng InnoDB bên ngoài ibdata1 sẽ là:
Tất cả siêu dữ liệu cho db1.mytable vẫn nằm trong ibdata1 và hoàn toàn không có cách nào khác . Làm lại nhật ký và dữ liệu MVCC vẫn còn tồn tại với ibdata1.
Nếu bạn đang nghĩ đến việc chỉ sao chép tệp .frm và .ibd, bạn đang ở trong thế giới bị tổn thương. Sao chép tệp .frm và .ibd của bảng InnoDB chỉ tốt nếu bạn có thể đảm bảo rằng id vùng bảng của tệp .ibd khớp chính xác với mục nhập id vùng bảng trong metdata của tệp ibdata1.
Tôi đã viết hai bài đăng trong DBA StackExchange về khái niệm id không gian bảng này
Đây là liên kết tuyệt vời về cách reattach và tệp .ibd đến ibdata1 trong trường hợp id không gian bảng không khớp: http : //www.chrryptender.com/?tag=innodb-error-tablespace-id-in-file . Sau khi đọc nó, bạn sẽ có thể thấy lý do tại sao tôi nói gần tự tử.
Đối với InnoDB bạn chỉ cần điều này
CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
để tạo một bản sao của bảng InnoDB. Nếu bạn đang di chuyển nó sang một máy chủ DB khác, hãy sử dụng mysqldump.
.frm
, .MYD
và .MYI
.
Sao chép toàn bộ datadir MySQL là một kỹ thuật thực tế, giả sử dịch vụ MySQL bị dừng và bạn muốn sao chép toàn bộ máy chủ cơ sở dữ liệu.
Đây là một kỹ thuật hữu ích để dịch chuyển cơ sở dữ liệu với các chỉ mục lớn và kết xuất mysql sẽ không bao gồm các chỉ mục, sẽ cần phải được tạo lại tại thời điểm nhập. Tôi đã thấy kỹ thuật này hữu ích khi thiết lập nô lệ MySQL.
Sao chép một tệp riêng lẻ sẽ phụ thuộc vào lược đồ bảng được sử dụng, nhưng trong hầu hết các trường hợp không phải là một giải pháp phù hợp.
Sử dụng xtrabackup w / ow w / o innobackupex và bạn sẽ ổn trên cả cơ sở dữ liệu myisam và innodb. Lưu ý rằng việc khôi phục cơ sở dữ liệu innodb không chỉ là sao chép lại các tệp ngay cả khi bạn sử dụng xtrabackup. Cho biết nếu bạn cần thêm thông tin