Linux / mysql: có an toàn khi sao chép các tệp db mysql bằng lệnh cp từ db này sang db khác không?


11

Hầu hết các hướng dẫn đều khuyên dùng mysqldump và SQL đơn giản để sao chép một bảng vào db anoter. Làm thế nào về cp shell linux? Tôi chỉ có thể làm

cp /db1/mytable.frm /db2/mytable.frm

Câu trả lời:


21

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

MyISAM

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

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.MYD (Cơ sở dữ liệu bảng)
  • /var/lib/mysql/db1/mytable.MYI (Chỉ mục 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;

InnoDB

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 đó ?

  • Bảng dữ liệu trang
  • Bảng chỉ mục trang
  • Bảng MetaData (danh sách quản lý id vùng bảng)
  • Dữ liệu MVCC (để hỗ trợ Cách ly giao dịch và Tuân thủ ACID )

InnoDB (vô hiệu hóa innodb_file_per_table)

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.

InnoDB (kích hoạt innodb_file_per_table)

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à:

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

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.

CẢNH BÁO (hoặc NGUY HIỂM như Robot sẽ nói trong Lost in Space )

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.


4
Các phản hồi khác đã nói điều này, vì vậy có lẽ nó "không cần phải nói", nhưng dù sao cũng tốt để nói: InnoDB tiếp tục ghi vào các tệp ngay cả khi cơ sở dữ liệu không hoạt động, vì vậy sao chép các tệp của nó trong khi MySQL đang chạy gần như chắc chắn gây ra tham nhũng! Bạn có thể tắt, chụp ảnh hệ thống tập tin hoặc sử dụng Percona XtraBackup để khắc phục điều này.
tước Schwartz

1
Câu trả lời tuyệt vời như mọi khi, @Rolando! Câu hỏi lớn duy nhất tôi có: Tại sao một người nào đó muốn làm điều này trái ngược với việc thực hiện một kết xuất và nhập trực tiếp MySQL? Tôi giả định kích thước cơ sở dữ liệu tuyệt đối, nhưng cảm thấy rằng nên được đưa lên.
JakeGould

1
@JakeGould Việc tải tập lệnh mysqldump vào mysql yêu cầu xử lý nhiều SQL, chèn hàng nghìn hàng cùng một lúc, sử dụng chu kỳ CPU, tạo ra các kế hoạch giải thích, xây dựng lại các chỉ mục (BTree Insertions, Leaf Node Splits, cân bằng lại bảng, quét từng bảng -unique để xây dựng) chỉ để sản xuất cùng một bảng. Trong trường hợp của MyISAM, tại sao phải phát minh lại bánh xe? Chỉ cần sao chép của .frm, .MYD.MYI.
RolandoMySQLDBA

@JakeGould Trong trường hợp của InnoDB, tôi đã sao chép một cơ sở dữ liệu trực tiếp đang sử dụng tất cả InnoDB với rsync. Sau khi sao chép bằng rsync, tôi đã tắt mysql, thực hiện rsync cuối cùng và khởi động lại mysql mà không gặp vấn đề gì. Tôi đã viết một bài đăng như trước: serverfault.com/questions/288140/
Kẻ

8

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.


2
Để giải thích: bạn không phải dừng dịch vụ mỗi lần, nếu hệ thống tệp của bạn có khả năng, bạn có thể thực hiện ảnh chụp nhanh LVM và sao lưu điều đó; hoặc đóng băng hệ thống tập tin chính nó.
mỏng

Miễn là một cá nhân có thể ăn thời gian chết, đây là cách dễ nhất. +1 !!!
RolandoMySQLDBA

2

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


1

Không, bạn nên sao lưu bằng mysqdump và khôi phục bằng tiện ích mysql cli, sao chép tệp frm mà bạn chỉ sao chép cấu trúc bảng chứ không phải dữ liệu bên trong và nếu bạn đang ở trên innodb thì sao chép tệp trực tiếp là không thể.

Cách tốt nhất là đổ và khôi phục lại bảng.

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.