Tôi có thể sao chép cơ sở dữ liệu MySQL bằng cách sao chép các tệp không? Các tập tin chứa chính xác những gì?


13

Tôi đang sử dụng cơ sở dữ liệu MySQL và sử dụng máy Ubuntu Linux.

Cơ sở dữ liệu của tôi đặt tên db_test, tôi nhận thấy rằng dưới con đường /var/lib/mysql/db_test, có những file hậu tố với .frm, .MYD, .MYInhư sau:

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

Dường như mỗi .frm, .MYD, .MYInhóm tập tin ánh xạ với một bảng trong cơ sở dữ liệu.

Tôi có hai câu hỏi sau đây để hỏi:

  1. Ba tập tin đang làm chính xác là gì?

  2. Nếu tôi có thể tạo một thư mục mới theo con đường /var/lib/mysql/nói db_test_2, và sao chép tất cả các tập tin từ db_test_1thư mục để db_test_2, nó cũng sẽ tạo ra một cơ sở dữ liệu mới db_test_2trong đó có chính xác các nội dung tương tự (bảng) như db_test_1's?

Liệu các tệp cơ sở dữ liệu vật lý này có hành động di chuyển tạo ra kết quả giống như các hành động dòng lệnh sau không:

  1. đổ cơ sở dữ liệu db_test_1ra

  2. tạo một cơ sở dữ liệu mới db_test_2

  3. Sau đó đổ db_test_1cơ sở dữ liệu trở lại cơ sở dữ liệu mới db_test_2?

Nếu vậy, có vẻ như các tệp di chuyển nhanh hơn nhiều sau đó sử dụng mysqldumpđể sao chép cơ sở dữ liệu (hoặc để nhập dữ liệu từ một DB sang DB khác trong MySQL). Bất kỳ ý kiến ​​về điều này?

Câu trả lời:


5
  1. AFAIR, .frm là tệp mô tả (trong đó mô tả cấu trúc bảng cơ sở dữ liệu), .MYD là tệp có dữ liệu, .MYI là tệp có chỉ mục.

  2. Có, sao chép sẽ nhanh hơn nhiều. Nhưng có một vấn đề: đó không phải là nguyên tử. Các tệp sao chép tải cao sẽ không nhất quán và thậm chí có thể bị hỏng. Đặc biệt nếu bạn đang sử dụng một số công cụ 'thông minh' hơn như InnoDB.

Chỉnh sửa: ps Bạn có thể sao chép các tệp này một cách an toàn, nhưng trước khi bạn nên dừng máy chủ mysql.


4

Bạn có một công cụ cmd-line thực hiện chính xác điều này: mysqlhotcopy

Nó hoạt động tốt với các bảng myisam, nhưng không phải với các bảng InnoDb.

Nếu bạn đã cấu hình máy chủ của mình với lvm và đặt / var / lib / mysql của bạn vào một ổ đĩa chuyên dụng thì đây là cách tôi khuyên bạn nên sao lưu rất nhanh và theo cách không chặn tất cả các cơ sở dữ liệu của bạn:

mysql -U root -p
  > flush tables with read lock;

Thao tác này sẽ xóa tất cả các bảng của bạn vào đĩa và chặn mọi thao tác r / w

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;

Cần phải thích ứng với cấu hình của bạn, điều này tạo ra một ảnh chụp nhanh hệ thống tập tin của cơ sở dữ liệu của bạn. Nó không mất thời gian

  > unlock tables;

Điều này được thực hiện, hoạt động R / W được nối lại.

Bây giờ bạn có thể mount / dev / vg_myserver / lvMysql_snap và tạo một kho lưu trữ tar của cơ sở dữ liệu của bạn!


Đây có vẻ là một cách nhanh chóng để sao lưu db. Nhưng những gì về việc chuyển đổi ảnh chụp nhanh đó trở lại để trở thành cơ sở dữ liệu trực tiếp của tôi? Đó là phần tôi thực sự quan tâm. Tôi có thể mysqldumpdb của tôi trong vòng dưới 2 giây. Khôi phục nó là phần chậm, mất 5-10 phút.
Butussy Butkus

trên các bản sao lưu lvm gần đây có thể được hoàn nguyên về nguồn gốc, nhưng nó có thể không phải là những gì bạn muốn để quản lý sao lưu cơ sở dữ liệu.
Olivier S

Liên quan đến mysqlhotcopy: "Tiện ích này không được hỗ trợ trong MySQL 5.6.20 và bị xóa trong MySQL 5.7" Từ: [ dev.mysql.com/doc/refman/5.6/en/mysqlhotcopy.html]
zeusstl

0

Điều này sẽ hoạt động cho MyISAM, nhưng không phải cho InnoDB. Xem /server//a/367321/57569

Từ câu trả lời đó, về InnoDB:

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.

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.