2009-08-18 62 views
6

Tôi có Cơ sở dữ liệu MySQL khoảng 1,7 GB. Tôi thường trở lại nó bằng cách sử dụng mysqldump và điều này mất khoảng 2 phút. Tuy nhiên, tôi muốn biết câu trả lời cho các câu hỏi sau:Sao lưu cơ sở dữ liệu MySQL

  1. Khối mysqldump có đọc và/hoặc ghi vào cơ sở dữ liệu không? Bởi vì trong một kịch bản trực tiếp, tôi sẽ không muốn chặn người dùng sử dụng cơ sở dữ liệu trong khi nó đang được sao lưu. Nó sẽ là lý tưởng cho tôi để chỉ sao lưu cơ sở dữ liệu WHOLE một lần trong, nói, một tuần, nhưng trong những ngày trung gian chỉ có một bảng cần phải được sao lưu như những người khác sẽ không thay đổi. Có cách nào để đạt được điều này?

  2. Liệu mysqlhotcopy có thay thế tốt hơn cho các mục đích này không?

Trả lời

2
  1. Không, bạn có thể chỉ định bảng để được khóa bằng --lock-bảng nhưng họ không theo mặc định
  2. Nếu bạn không chỉ định bất kỳ bảng sau đó toàn bộ DB được sao lưu , hoặc bạn có thể chỉ định một danh sách các bảng:

    mysqldump [tùy chọn] db_name [bảng]

  3. Không sử dụng nó xin lỗi, tuy nhiên tôi chạy một số MySQL DBS, một số lớn hơn số nhỏ hơn 1.7 GB và tôi sử dụng mysqldump cho tất cả các bản sao lưu của tôi .

+0

Cảm ơn Macros cho câu trả lời của bạn! – TMM

5

mysqlhotcopy không hoạt động trong một số trường hợp readlock bị mất, và không làm việc với các bảng InnoDB.

mysqldump được sử dụng nhiều hơn vì nó có thể sao lưu tất cả các loại bảng.

Từ MySQL tài liệu

mysqlhotcopy là một kịch bản Perl đã được ban đầu được viết và đóng góp bởi Tim Bunce. Nó sử dụng LOCK BẢNG, FLUSH BẢNG, và cp hoặc scp để thực hiện sao lưu cơ sở dữ liệu một cách nhanh chóng. Đây là cách nhanh nhất để tạo bản sao lưu của cơ sở dữ liệu hoặc các bảng đơn, nhưng nó chỉ có thể chạy trên cùng một máy nơi các thư mục cơ sở dữ liệu được đặt. mysqlhotcopy chỉ hoạt động để sao lưu các bảng MyISAM và ARCHIVE. Nó chạy trên Unix và NetWare

mysqldump khách hàng là một chương trình sao lưu ban đầu được viết bởi Igor Romanenko. Nó có thể được sử dụng để đổ một cơ sở dữ liệu hoặc một tập hợp các cơ sở dữ liệu để sao lưu hoặc chuyển sang một máy chủ SQL khác (không nhất thiết phải là một máy chủ MySQL). Kết xuất thường chứa các câu lệnh SQL để tạo bảng, điền vào nó, hoặc cả hai. Tuy nhiên, mysqldump cũng có thể được sử dụng để tạo tệp trong CSV, văn bản được phân cách khác hoặc định dạng XML.

Tạm biệt.

+0

Cảm ơn RRUZ về thông tin hữu ích! – TMM

3

1) mysqldump chỉ chặn khi bạn yêu cầu (một trong các --lock-table, --lock-all-tables, --single-transaction). nhưng nếu bạn muốn bản sao lưu của mình nhất quán thì mysqldump nên khối (sử dụng - giao dịch đơn lẻ hoặc --lock-all-tables) hoặc bạn có thể nhận được ảnh chụp nhanh cơ sở dữ liệu không nhất quán. Lưu ý: - giao dịch đơn lẻ chỉ hoạt động cho InnoDB.

2) chắc chắn, chỉ cần liệt kê các bảng bạn muốn được sao lưu sau tên cơ sở dữ liệu:

mysqldump OPTIONS DATABASE TABLE1 TABLE2 ... 

Hoặc bạn có thể loại trừ các bảng bạn không muốn:

mysqldump ... --ignore-table=TABLE1 --ignore-table=TABLE2 .. DATABASE 

Vì vậy, bạn có thể thực hiện toàn bộ kết xuất cơ sở dữ liệu mỗi tuần một lần và chỉ sao lưu các bảng thay đổi mỗi ngày một lần.

3) mysqlhotcopy inly hoạt động trên các bảng MyISAM và trong hầu hết các ứng dụng bạn tốt hơn với InnoDB. Có những công cụ thương mại (khá đắt) cho các hotbackup của các bảng innodb. Gần đây cũng có một mã nguồn mở mới cho mục đích này - Xtrabackup

Ngoài ra, để tự động quá trình bạn có thể sử dụng astrails-safe. Nó hỗ trợ sao lưu cơ sở dữ liệu với mysqldump và hệ thống tập tin với tar. + mã hóa + tải lên S3, + nhiều tính năng khác. Chưa có hỗ trợ xtrabackup, nhưng sẽ dễ dàng thêm nếu đây là những gì bạn cần.

+0

cảm ơn câu trả lời hữu ích @Vitaly Kushner – kta

3

Thêm nô lệ mysql vào thiết lập của bạn sẽ cho phép bạn thực hiện sao lưu đồng bộ mà không cần khóa cơ sở dữ liệu sản xuất.

Thêm một nô lệ cũng cung cấp cho bạn nhật ký thay đổi nhị phân. Một bãi chứa là một ảnh chụp nhanh của cơ sở dữ liệu tại thời điểm bạn lấy bãi chứa. Nhật ký nhị phân chứa tất cả các câu lệnh đã sửa đổi dữ liệu cùng với dấu thời gian.

Nếu bạn gặp sự cố vào giữa ngày và chỉ thực hiện sao lưu một lần mỗi ngày, bạn đã mất một nửa ngày làm việc. Với các bản ghi nhị phân và mysqldump, bạn có thể khôi phục từ ngày trước đó và 'phát' các bản ghi chuyển tiếp tới điểm hỏng hóc.

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

Nếu MySQL chạy trên một máy chủ Linux với đĩa LVM hoặc một máy chủ các cửa sổ với VSS, bạn nên kiểm tra Zamanda. Nó có sự khác biệt nhị phân của dữ liệu trên đĩa, đó là nhanh hơn nhiều để đọc và khôi phục hơn một bãi chứa văn bản của cơ sở dữ liệu.

0

Đối với mysql và PHP thử này này cũng sẽ loại bỏ các tập tin sau n ngày

$dbhost = 'localhost'; 
$dbuser = 'xxxxx'; 
$dbpass = 'xxxxx'; 
$dbname = 'database1'; 
$folder = 'backups/'; // Name of folder you want to place the file 
$filename = $dbname . date("Y-m-d-H-i-s") . ".sql"; 
$remove_days = 7; // Number of days that the file will stay on the server 



$command="mysqldump --host=$dbhost --user=$dbuser --password=$dbpass $dbname > $folder$filename"; 
system($command); 

$files = (glob("$folder"."*.sql")); 

    foreach($files as $file) { 
     if(is_file($file) 
     && time() - filemtime($file) >= $remove_days*24*60*60) { // 2 days = 2*24*60*60 
      unlink($file); 
      echo "$file removed \n"; 
     } else { echo "$file was last modified: " . date ("F d Y H:i:s.", filemtime($file)) . "\n"; } 
    } 
Các vấn đề liên quan