MySQL có cách nào để nhập một bãi rác khổng lồ (32 GB) nhanh hơn không?


67

Tôi có kết xuất SQL 32 GB khổng lồ mà tôi cần nhập vào MySQL. Tôi đã không phải nhập một bãi chứa SQL lớn như vậy trước đây. Tôi đã làm như thường lệ:

mysql -uroot dbname < dbname.sql

Nó mất quá nhiều thời gian. Có một bảng với khoảng 300 triệu hàng, nó đã lên tới 1,5 triệu trong khoảng 3 giờ. Vì vậy, có vẻ như toàn bộ sự việc sẽ mất 600 giờ (tức là 24 ngày) và không thực tế. Vì vậy, câu hỏi của tôi là, có cách nào nhanh hơn để làm điều này?

Thông tin thêm / Kết quả

  1. Các bảng đều là InnoDB và không có khóa ngoại nào được xác định. Tuy nhiên, có nhiều chỉ số.
  2. Tôi không có quyền truy cập vào máy chủ gốc và DB vì vậy tôi không thể tạo bản sao lưu mới hoặc tạo bản sao "nóng", v.v.
  3. Thiết lập innodb_flush_log_at_trx_commit = 2như được đề xuất ở đây dường như không cải thiện (hiển thị rõ ràng / hàm mũ).
  4. Số liệu thống kê máy chủ trong quá trình nhập (từ MySQL Workbench): https://imgflip.com/gif/ed0c8 .
  5. Phiên bản MySQL là cộng đồng 5.6.20.
  6. innodb_buffer_pool_size = 16M và innodb_log_buffer_size = 8M. Tôi có cần phải tăng những thứ này không?

Bạn có thể thêm các thành phần nhanh hơn vào máy chủ, cụ thể là nhiều bộ nhớ RAM và SSD hơn không?

@Bert máy chủ có 8 GB RAM, hầu hết chỉ chưa được sử dụng. Không thể thêm dung lượng nữa. Điều đó sẽ giúp như thế nào? Có thực sự là các hoạt động viết rất chậm?

Nút thắt là gì? CPU Core có được chốt không?
Chris S

@ChrisS không, mức sử dụng CPU là 3 đến 4%. Tôi không chắc nút cổ chai là gì. Tôi nghĩ đó là chỉ số. Làm thế nào một người sẽ tìm / xác nhận nút cổ chai?

1
Nếu bạn có sql, bạn có thể chỉnh sửa các câu lệnh tạo chỉ mục và xem nếu nó đi nhanh hơn? khi bạn đã nhập dữ liệu, bạn sẽ cần tạo lại chúng

Câu trả lời:


84

Vadim Tkachenko của Percona đã thể hiện đại diện bằng hình ảnh tuyệt vời này của InnoDB

Kiến trúc InnoDB

Bạn chắc chắn cần phải thay đổi như sau

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

Tại sao các cài đặt này?

Khởi động lại mysql như thế này

service mysql restart --innodb-doublewrite=0

Điều này vô hiệu hóa Bộ đệm ghi đôi của InnoDB

Nhập dữ liệu của bạn. Khi hoàn tất, khởi động lại mysql bình thường

service mysql restart

Điều này tái hiện bộ đệm ghi đôi InnoDB

Hãy thử một lần !!!

GHI CHÚ: Bạn nên nâng cấp lên 5.6,21 cho các bản vá bảo mật mới nhất .


1
Tôi đã tạo một tập lệnh bash linux cho nó, hạ thấp một số giá trị để hoạt động bên trong vagrant với bộ nhớ thấp hơn gist.github.com/OZZlE/57d550c3cc1c1ff17481e465e4f6d674
OZZIE

9

Bạn có thực sự cần toàn bộ cơ sở dữ liệu để được khôi phục? Nếu bạn không, 2c của tôi:

Bạn có thể trích xuất các bảng cụ thể để thực hiện khôi phục trên "khối". Một cái gì đó như thế này:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

Tôi đã làm điều đó một lần và mất 10 phút để trích xuất bảng tôi cần - quá trình khôi phục hoàn toàn của tôi mất 13 ~ 14 giờ, với kết xuất 35 GB (được nén).

Các /pattern/,/pattern/pvới -nthông số làm cho một lát "giữa các mô hình" - bao gồm họ.

Dù sao, để khôi phục 35GB, tôi đã sử dụng máy AWS EC2 (c3.8xlarge), cài đặt Percona qua yum (Centos) và chỉ cần thêm / thay đổi các dòng sau trên my.cnf:

max_allowed_packet=256M
wait_timeout=30000

Tôi nghĩ rằng con số quá cao, nhưng đã làm việc cho thiết lập của tôi.


5

Cách nhanh nhất để nhập cơ sở dữ liệu của bạn là sao chép các tệp (.frm, .MYD, .MYI) nếu MyISAM, trực tiếp vào / var / lib / mysql / "tên cơ sở dữ liệu".

Nếu không, bạn có thể thử: mysql > use database_name; \. /path/to/file.sql

Đó là một cách khác để nhập dữ liệu của bạn.


1

một cách để giúp tăng tốc độ nhập là khóa bảng trong khi nhập. sử dụng tùy chọn --add-lock để mysqldump.

mysqldump --add-drop-table --add-locks --database db > db.sql

hoặc bạn có thể bật một số tham số hữu ích với --opt điều này sẽ bật một loạt các điều hữu ích cho kết xuất.

mysqldump --opt --database db > db.sql

Nếu bạn có một thiết bị lưu trữ khác trên máy chủ thì hãy sử dụng nó - sao chép từ thiết bị này sang thiết bị khác là một cách để tăng tốc độ chuyển.

bạn cũng có thể lọc ra các bảng không bắt buộc với --ignore-table

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.