Làm cách nào để tăng tốc độ khôi phục MySQL từ tệp kết xuất?


28

Tôi đang khôi phục cơ sở dữ liệu 30 GB từ tệp mysqldump sang cơ sở dữ liệu trống trên máy chủ mới. Khi chạy SQL từ tệp kết xuất, quá trình khôi phục bắt đầu rất nhanh và sau đó bắt đầu chậm hơn và chậm hơn. Chèn riêng lẻ hiện đang mất hơn 15 giây. Các bảng chủ yếu là MyISAM với một InnoDB nhỏ. Máy chủ không có kết nối hoạt động khác. SHOW PROCESSLIST;chỉ hiển thị phần chèn từ khôi phục (và chính danh sách quy trình hiển thị).

Có ai có bất kỳ ý tưởng những gì có thể gây ra sự chậm lại đáng kể?

Có bất kỳ biến MySQL nào mà tôi có thể thay đổi để tăng tốc độ khôi phục trong khi nó đang tiến triển không?


Đã chỉnh sửa để sửa các loại bảng
Dave Forgac

Câu trả lời:


26

Một điều có thể làm chậm quá trình là key_buffer_size , đó là kích thước của bộ đệm được sử dụng cho các khối chỉ mục. Điều chỉnh ít nhất 30% RAM của bạn hoặc quá trình lập chỉ mục lại có thể sẽ quá chậm.

Để tham khảo, nếu bạn đang sử dụng InnoDB và khóa ngoại, bạn cũng có thể vô hiệu hóa kiểm tra khóa ngoại và bật lại ở cuối (sử dụng SET FOREIGN_KEY_CHECKS=0SET FOREIGN_KEY_CHECKS=1).


1
Tôi đã tìm thấy hai điều: key_buffer_size được đặt thành 8MB và có một bảng InnoDB trong hỗn hợp với các khóa ngoại. Đã tăng key_buffer_size lên 1GB và tạm thời tắt kiểm tra khóa ngoại. Việc khôi phục hoàn thành sau 5 phút. Cảm ơn!
Dave Forgac

ồ Rất vui vì nó đã giúp :)
Marco Ramos

2
Tôi chỉ nhận thấy rằng tôi đã gõ '5' phút. Tôi khá chắc chắn rằng nó giống như hơn 50 phút nhưng vẫn hợp lý hơn ;-)
Dave Forgac

5
key_buffer_size là dành cho MYISAM.
Fernando Fabreti

@FernandoFabreti - đó là một điểm quan trọng đối với nhiều độc giả, nhưng OP đã chỉ định họ chủ yếu có MyISAM
mc0e

22

Liên kết này cho thấy những gì người ta có thể làm để tăng tốc quá trình khôi phục.

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

Người ta có thể đặt các lệnh ở đầu tệp kết xuất

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

Và đặt các câu lệnh này vào cuối tập tin kết xuất

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

Điều này làm việc cho tôi. Chúc mừng khôi phục :-)


8
Điều này đã giúp khá nhiều. Thay vì chỉnh sửa tệp, tôi đã tạo pre.sql và post.sql từ các đoạn trên và sử dụng nó để khôi phục db:cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs

1

Lý do duy nhất tôi có thể hình ảnh tại sao khôi phục sẽ dần dần chậm lại là lập chỉ mục. Điều tra tắt chỉ mục cho đến khi kết thúc và sau đó để cho nó làm toàn bộ cùng một lúc.


1

Nếu bạn có bản sao vật lý của tệp kết xuất (thư mục DB), bạn có thể sao chép nó vào máy chủ mới nếu máy chủ mới có cùng phiên bản MySQL và nó sẽ hoạt động tốt. Điều này hoạt động tốt với MyISAM và đối với tôi, tôi nghĩ rằng tốt hơn là khôi phục dữ liệu dựa trên tệp kết xuất SQL logic.


0

nếu bạn có nhiều bảng thì có thể bạn sẽ được lợi từ khôi phục song song mk .


Điều này hiện không được chấp nhận và chỉ nên được sử dụng để khôi phục dữ liệu thử nghiệm, không phải để khôi phục các bản sao lưu thực tế.
Svandragt

0

Điều này sẽ làm:

mysql --init-lệnh = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql


-1

Tôi đề nghị bạn

  1. Kiểm tra bảng của bạn: Nó có kích hoạt? Xóa tất cả các kích hoạt
  2. SET: AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( và đừng quên để rollback THAY ĐỔI NÀY )
  3. SỬ DỤNG LINE LINE mysql -u root -pPasss requests < mydb.sql
  4. Kiểm tra kích thước tệp cơ sở dữ liệu của bạn

Chúc may mắn

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.