Điểm:0

Khôi phục cơ sở dữ liệu MySQL rất chậm

lá cờ ar

Tôi vừa mới mua một máy tính để bàn gia đình mới. Tôi có ba cơ sở dữ liệu MySQL mà tôi muốn chuyển qua. Tôi đã hủy tất cả chúng bằng mysqldump trước khi tháo ổ đĩa khỏi máy cũ.

Việc khôi phục cơ sở dữ liệu lớn nhất mất nhiều thời gian (cho đến nay đã được 24 giờ). Tôi đang khôi phục thông qua:

mysql -uxxxx -p
Nhập mật khẩu: yyyy
mysql> tạo cơ sở dữ liệu foo;
mysql> sử dụng foo;
mysql> bắt đầu giao dịch;
mysql> \. <tệp kết xuất>

tôi cầu nguyện tôi nhớ làm khi điều này kết thúc!

Tôi đã từ bỏ nỗ lực khôi phục đầu tiên của mình mà không cần giao dịch vì mất quá nhiều thời gian.Tôi dự định không bận tâm đến giao dịch khi khôi phục hai cơ sở dữ liệu khác vì nó dường như không có gì khác biệt.

Tôi có thể làm gì để tăng tốc độ khôi phục không? Tôi có nên thực hiện sao lưu theo cách khác không - Tôi chỉ sử dụng vanilla mysqldump dòng lệnh, với --skip-column-statistic vì kết xuất sẽ thất bại, như được đề xuất trong câu trả lời stackoverflow này.

Để tham khảo, máy mới chạy Windows 10 và MySQL 8.0.25 Community; máy cũ chạy Windows 7 và MySQL 5.6.22.

Xem xét kỹ hơn các tệp kết xuất (để tìm phiên bản máy chủ), tôi thấy rằng các bảng được tạo với các chỉ mục của chúng, theo sau là rất nhiều câu lệnh INSERT INTO. Điều này không có vẻ đặc biệt thông minh. Có cách nào để gây ra mysqldump để tạo ra một tập lệnh:

  1. Tạo các bảng không có chỉ mục
  2. Chèn các hàng; và sau đó
  3. Tạo các chỉ mục.

có vẻ như là một cách tiếp cận tốt hơn khi cơ sở dữ liệu đang được khôi phục. (Hơi ngạc nhiên là đây không phải là mặc định!) Tôi cho rằng điều này có thể thực hiện được với MySQL - Tôi đã sử dụng SQLLite trong 3 năm qua và chắc chắn là có thể thực hiện được ở đó.

Cập nhật

câu hỏi này không phải là hoàn toàn trả lời bởi Làm cách nào để tăng tốc độ khôi phục MySQL từ tệp kết xuất?, vì câu hỏi đó đặc biệt đề cập đến các bảng MyISAM và của tôi là InnoDB. (Xin lỗi. Lẽ ra tôi nên đề cập đến công cụ lưu trữ trong câu hỏi ban đầu của mình.)

Tuy nhiên, câu trả lời đó đã thúc đẩy và cung cấp thông tin cho những nỗ lực của tôi để giải quyết vấn đề, điều mà tôi ghi lại trong câu trả lời của riêng mình bên dưới.

nurdglaw avatar
lá cờ ar
Hừm. Nó cũng có thể làm. Tôi sẽ phải xem xét kỹ hơn. Đối với giá trị của nó, quá trình khôi phục hiện đã chạy được ~24 giờ. Đánh giá theo các giá trị `AUTO_INCREMENT=` trong tệp kết xuất, ba bảng lần lượt có 2,6 triệu, 250k và 8,5 triệu hàng. Nó hiện đang khôi phục bảng thứ ba. Tôi chưa kiểm tra chính xác có bao nhiêu hàng được chèn với mỗi lệnh INSERT INTO, nhưng mỗi lệnh hiện mất 3-4 phút để hoàn thành. Điều này chắc chắn giống như một vấn đề lập chỉ mục. Tôi không có khóa ngoại, đó là trọng tâm của bài viết được tham chiếu, nhưng AUTOCOMMIT có vẻ là thủ phạm. Cảm ơn!
nurdglaw avatar
lá cờ ar
Tôi muốn đợi quá trình khôi phục này kết thúc và xem xét việc sửa đổi các kết xuất của hai cơ sở dữ liệu khác (nhỏ hơn nhiều) để chỉ tạo các chỉ mục sau khi hoàn thành tất cả các CHÈN. Sau đó, tôi sẽ thử lặp lại quá trình khôi phục cho db lớn với những thay đổi đó.
nurdglaw avatar
lá cờ ar
@MichaelHampton PPS: Nếu bạn biến nhận xét của mình thành câu trả lời, tôi chắc chắn sẽ ủng hộ nó (nếu tôi có đủ đại diện.) Cảm ơn một lần nữa.
Michael Hampton avatar
lá cờ cz
Nếu nó giải quyết được vấn đề của bạn, thì chỉ cần nhấp vào nút ở trên.
nurdglaw avatar
lá cờ ar
@Laura Elvira Hernández Lara - Cảm ơn bạn đã đề xuất chỉnh sửa. Xin vui lòng tha thứ cho tôi vì đã từ chối đề xuất của bạn và thay thế "Cảm ơn trước" cho những gì (tôi nghĩ) ban đầu tôi dự định đưa vào đó. Có trời mới biết tại sao tôi nghĩ "Cảm ơn trước" là một trình giữ chỗ thích hợp.
lá cờ ua
Trừ khi bạn đang chạy 8.0, mối quan tâm của bạn về `START` và `COMMIT` là không liên quan. Các câu lệnh DDL ngầm định `COMMIT`. Vì vậy, một sự cố sẽ khiến một số bảng được tải, một số thì không.
Điểm:0
lá cờ ar

Cuối cùng, tôi đã từ bỏ việc chờ quá trình nhập hoàn tất, sau hơn 24 giờ.

Tôi đã sửa đổi các tập lệnh được tạo bởi mysqldump để tạo các bảng không có chỉ mục phụ và chỉ tạo các chỉ mục khi tất cả CHÈN các câu lệnh đã được thực hiện.Với thay đổi này, quá trình nhập đã hoàn tất khi tôi kiểm tra ba giờ sau khi bắt đầu.

Sau đó, tôi đã sửa đổi thêm tập lệnh để chèn các hàng trong một giao dịch, bằng cách thêm ĐẶT AUTOCOMMIT=0; BẮT ĐẦU GIAO DỊCH; lúc đầu và LÀM; cuối cùng. Với thay đổi này, quá trình khôi phục hoàn tất sau 90 phút.

Trong khi chỉnh sửa các kết xuất được tạo, tôi nhận thấy rằng chúng bao gồm

/*!40000 ALTER TABLE `xxx` DISABLE KEYS */;

/*!40000 ALTER TABLE `xxx` BẬT CÁC PHÍM */;

xung quanh CHÈN các câu lệnh. tôi nhìn lên tài liệu trên các lệnh này và phát hiện ra rằng chúng chỉ áp dụng cho các bảng MyISAM. Các tài liệu về mysqldump tính thiết thực nói rằng những dòng này (bao gồm cả dấu phân cách nhận xét và số ma thuật 40000) được tạo nếu bạn chỉ định --disable-phím trên dòng lệnh. Tài liệu tiện ích cũng nói rằng nó sẽ thêm hành vi "chèn mọi thứ vào một giao dịch" mà tôi thấy mong muốn nếu bạn chỉ định --no-autocommit trên dòng lệnh.


Tóm lại, lẽ ra tôi nên thực hiện các bản sao lưu với

 mysqldump --no-autocommit...

Ít nhất là trong trường hợp của tôi (mysqldump phiên bản 8.0.25 và một bảng InnoDb) thì --disable-phím tùy chọn không tạo ra sự khác biệt; THAY ĐỔI BẢNG ... BẬT|TẮT CÁC PHÍM các câu lệnh (đã nhận xét và có số ma thuật) luôn được tạo. Tôi làm cần sửa đổi kết xuất đã tạo để tạo các bảng không có khóa phụ và thêm chúng một khi tất cả CHÈN VÀO các câu lệnh đã được thực hiện.

nurdglaw avatar
lá cờ ar
Tại sao downvote / xóa phiếu bầu, xin vui lòng?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.