2012-05-08 29 views
10

Tôi duy trì cơ sở dữ liệu MySQL lớn. Tôi cần phải sao lưu nó mỗi đêm, nhưng DB hoạt động tất cả các thời gian. Có những truy vấn từ người dùng. Bây giờ tôi chỉ vô hiệu hóa các trang web và sau đó làm một bản sao lưu, nhưng điều này là rất xấu khi dịch vụ bị vô hiệu hóa và người dùng không thích điều này.Cơ sở dữ liệu lớn sao lưu thực hành tốt nhất

Cách tốt để sao lưu dữ liệu nếu dữ liệu được thay đổi trong khi sao lưu là gì?

Thực tiễn tốt nhất cho việc này là gì?

+0

Có thể phù hợp hơn với [dba.stackexchange.com] (http://dba.stackexchange.com/). – Filburt

+0

Tôi sử dụng bảng myiasm –

Trả lời

9

Tôi đã thực hiện chương trình này sử dụng một nô lệ sao chép chỉ đọc của máy chủ cơ sở dữ liệu của tôi.

Sao chép cơ sở dữ liệu MySQL khá dễ dàng để thiết lập và giám sát. Bạn có thể thiết lập để có được tất cả các thay đổi được thực hiện cho cơ sở dữ liệu sản xuất của bạn, sau đó mang nó off-line hàng đêm để tạo một bản sao lưu.

Máy chủ Sao chép Slave có thể được đưa lên dưới dạng chỉ đọc để đảm bảo rằng không có thay đổi nào có thể được thực hiện trực tiếp.

Có nhiều cách khác để thực hiện việc này mà không yêu cầu nô lệ nhân rộng, nhưng theo kinh nghiệm của tôi là một cách khá vững chắc để giải quyết vấn đề này.

Đây là liên kết tới tài liệu trên MySQL Replication.

+3

+1 Sao lưu từ cơ sở dữ liệu được sao chép là cách tiêu chuẩn. –

+1

Thật thú vị. Điều gì xảy ra khi bạn làm nô lệ trực tuyến sau khi sao lưu? MySQL có bắt đầu sao chép các thay đổi mới nhất cho nó không? Đây có phải là tải lớn đến máy chủ khi mysql thực hiện điều này? –

+3

Sao chép được xử lý bởi một luồng đơn trên máy chủ chính gửi một giao dịch tại một thời điểm đến nô lệ mà sau đó chúng được áp dụng. Một khi bạn mang lại cho các nô lệ trở lại trực tuyến nó bắt kịp theo cách mà không đặt một tải trọng đáng kể trên tổng thể. Nó sử dụng một kết nối cơ sở dữ liệu duy nhất. Tải trên tổng thể không phải là một vấn đề. Tôi đã làm điều này trên một cơ sở dữ liệu lớn với gần 1TB dữ liệu trong đó. –

0

Điều bạn muốn làm được gọi là "sao lưu trực tuyến". Dưới đây là một con trỏ đến một ma trận các tùy chọn có thể với nhiều thông tin:

http://www.zmanda.com/blogs/?p=19

Nó về cơ bản nắm để phụ trợ lưu trữ mà bạn đang sử dụng và bao nhiêu phần cứng bạn có sẵn.

2

Điều này một phần phụ thuộc vào việc bạn có sử dụng innodb hoặc myiasm hay không. Đối với innodb; mySQL có riêng của họ (mà tốn tiền) giải pháp cho việc này (bản sao nóng InnoDB) nhưng có một phiên bản mã nguồn mở từ Percona bạn có thể muốn xem xét:

http://www.percona.com/doc/percona-xtrabackup/

1

Nếu bạn có cơ sở dữ liệu MySQL MyISAM thực sự lớn (50G + như tôi), bạn có thể sử dụng khóa và rsync. Theo tài liệu MySQL bạn có thể sao chép một cách an toàn các tệp thô trong khi khóa đọc đang hoạt động và bạn không thể làm điều đó với InnoDB. Vì vậy, nếu mục tiêu là không thời gian chết và bạn có thêm không gian HD, tạo ra một kịch bản:

rsync -aP --delete /var/lib/mysql/* /tmp/mysql/sync 

Sau đó làm như sau:

  1. Do flush tables
  2. Run script
  3. Do flush tables with read lock;
  4. Chạy tập lệnh một lần nữa
  5. Làm unlock tables;

Trên rsync chạy đầu tiên sẽ sao chép rất nhiều mà không dừng MySQL. Lần chạy thứ hai sẽ rất ngắn, nó sẽ chỉ trì hoãn các truy vấn viết, vì vậy nó là một giải pháp thời gian chết thực sự bằng không thực.

  1. Thực hiện một số khác rsync từ /tmp/mysql/sync đến máy chủ từ xa, nén, giữ các phiên bản gia tăng, bất cứ điều gì bạn muốn.
+0

Giải pháp thú vị. Bạn có thể xác nhận rằng khôi phục từ các bản sao lưu này hoạt động không? (Bạn đã phải sử dụng sao lưu của bạn để phục hồi trong trường hợp khẩn cấp? Bạn gặp phải bất kỳ vấn đề hoặc bất ngờ trong quá trình phục hồi?) – rinogo

+0

Đây không phải là một bản sao lưu, nhưng một bản sao thực sự chính xác của dữ liệu MySQL, do đó, không có gì ngạc nhiên. Tôi đã sử dụng phương pháp này khi di chuyển từ máy chủ này sang máy chủ khác. – sekrett

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