Làm cách nào để thay đổi an toàn biến innodb của MySQL 'innodb_log_file_size'?


105

Vì vậy, tôi khá mới để điều chỉnh InnoDB. Tôi đang dần thay đổi bảng (khi cần thiết) từ MyIsam sang InnoDB. Tôi đã có khoảng 100 MB trong innodb, vì vậy tôi đã tăng innodb_buffer_pool_sizebiến lên 128 MB:

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

Khi tôi đi thay đổi innodb_log_file_sizegiá trị (ví dụ my.cnf trên các bình luận trang cấu hình innodb của mysql để thay đổi kích thước tệp nhật ký thành 25% kích thước bộ đệm. Vì vậy, bây giờ my.cnf của tôi trông như thế này:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

Khi tôi khởi động lại máy chủ, tôi gặp lỗi này:

110216 9:48:41 InnoDB: Khởi tạo nhóm bộ đệm, kích thước = 128.0M
110216 9:48:41 InnoDB: Đã hoàn thành khởi tạo nhóm bộ đệm
InnoDB: Lỗi: tệp nhật ký ./ib_logfile0 có kích thước khác nhau 0 5242880 byte
InnoDB: so với chỉ định trong tệp .cnf 0 33554432 byte!
110216 9:48:41 [ERROR] Plugin 'InnoDB' đã trả về lỗi init.
110216 9:48:41 [ERROR] Plugin 'InnoDB' đăng ký làm KỸ SƯ BẢO QUẢN không thành công.

Vì vậy, câu hỏi của tôi: Có an toàn để xóa log_files cũ, hoặc có một phương pháp khác để thay đổi innodb_log_file_sizebiến?


1
Chỉ cần nhận xét innodb_log_file_size trong my.ini .....

5
hmm, tại sao tôi muốn bình luận nó để sử dụng giá trị mặc định khi tôi đang cố gắng thay đổi nó từ giá trị mặc định?
Derek Downey

Có bằng cách nhận xét dòng innodb_log_file_size hoạt động của nó .. Cảm ơn.
muhammad umar farooq thẳng thắn

2
@muhammadumarfarooqfrank Tất nhiên là nó hoạt động - bởi vì bạn không thay đổi giá trị của biến nữa, do đó làm cho toàn bộ điểm phải di chuyển. Tôi muốn có một cách để downvote bình luận.
dr01

Câu trả lời:


83

Có, an toàn để xóa tệp nhật ký sau khi mysqld đã bị tắt

Để làm điều này, chỉ cần thực hiện các bước sau:

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

Bắt đầu mysqld sẽ tạo lại ib_logfile0ib_logfile1

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

CẬP NHẬT 2011-10-20 16:40 EDT

Nó xóa sạch tất cả dữ liệu trong Nhóm bộ đệm InnoDB trước khi làm lại Tệp nhật ký, bạn nên đặt tùy chọn này khoảng 1 giờ trước khi tắt máy:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Theo mặc định, innodb_max_denty_pages_pct là 75 (MySQL 5.5+) hoặc 90 (trước MySQL 5.5). Đặt giá trị này thành 0 sẽ giữ cho số trang bẩn dưới 1% của Bộ đệm InnoDB. Thực hiện service mysql stoplàm điều này anyway. Ngoài ra, tắt máy sẽ hoàn thành bất kỳ mục nào còn lại trong nhật ký làm lại. Để giữ tùy chọn này, chỉ cần thêm nó vào /etc/my.cnf:

[mysqld]
innodb_max_dirty_pages_pct = 0

CẬP NHẬT 2013-04-19 16:16 EDT

Tôi đã cập nhật câu trả lời của mình thêm một chút với innodb_fast_shutdown vì tôi đã sử dụng để khởi động lại mysql và dừng mysql để làm điều này. Bây giờ, một bước này rất quan trọng vì mọi giao dịch không được cam kết có thể có các bộ phận chuyển động khác trong và ngoài Nhật ký giao dịch InnoDB ( Xem Cơ sở hạ tầng của InnoDB ).

Xin lưu ý rằng việc đặt innodb_fast_shutdown thành 2 cũng sẽ xóa sạch các bản ghi nhưng các phần chuyển động hơn vẫn tồn tại và được chọn trên Crash Recovery trong quá trình khởi động của mysqld. Cài đặt 0 là tốt nhất.


1
Câu trả lời tốt đẹp và cập nhật là tuyệt vời là tốt. Đề nghị duy nhất của tôi là SAO CHÉP ib_logfiles sang một vị trí khác trong trường hợp có sự cố. Điều này sẽ giúp bạn có một ý tưởng về cách kích thước các tệp: mysqlperformanceblog.com/2011/07/09/ Khăn
Justin Noel

5
Làm việc với tôi cũng vậy, NHƯNG: UI giao diện điều khiển linux có thể gây hiểu lầm - khởi động mysqld mất rất nhiều thời gian nếu bạn đặt kích thước tệp nhật ký lớn (vài trăm MB trở lên). Bảng điều khiển UI đang hiển thị cho bạn các dấu chấm và sau đó hiển thị "không thành công!", Nhưng trên thực tế, MySQL vẫn đang khởi động. Đợi và tiếp tục đọc tệp nhật ký (hoặc theo dõi tệp nhật ký bằng "tail -f [log-file]") cho đến khi bạn thấy "mysqld: sẵn sàng cho các kết nối." và cả hai tệp nhật ký được phân bổ trên đĩa.
f055

2
CẢNH BÁO!! Bước 3 không làm việc cho tôi và trái tim tôi gần như ngừng đập khi tôi thấy mysql tải lên mà không có InnoDB, Phải dừng mysql và xóa chúng bằng tay và khởi động lại MySQL. hai lời khuyên: 1. sao lưu các tệp nhật ký đã có của bạn, 2. xóa các tệp theo cách thủ công
Peeyush Kushwaha

2
Peeyush là chính xác. Ngay cả tài liệu mysql cũng khuyên bạn nên sao lưu logfiles của mình trong trường hợp có sự cố xảy ra
Greg

1
@Greg đây là lý do tại sao tôi sử dụng SET GLOBAL innodb_fast_shutdown = 0;. Khi MySQL tắt, mọi thứ giao dịch được tuôn ra từ tất cả các bộ phận chuyển động, bao gồm các bản ghi làm lại (ib_logfile0 và ib_logfile1). Người ta có thể giữ chúng. Tôi vẫn chưa gặp phải vấn đề với các bản ghi hoàn toàn lộn xộn.
RolandoMySQLDBA

31

Thay vào đó tôi muốn giới thiệu phương thức chính thức mà tôi tái tạo ở đây để thuận tiện:

Để thay đổi số lượng hoặc kích thước của tệp nhật ký InnoDB trong MySQL 5.6.7 trở về trước , hãy sử dụng các hướng dẫn sau. Quy trình sử dụng phụ thuộc vào giá trị của innodb_fast_shutdown, quyết định này có mang lại không gian bảng hệ thống cập nhật đầy đủ trước khi thực hiện thao tác tắt máy hay không:

  • Nếu innodb_fast_shutdown không được đặt thành 2: Dừng máy chủ MySQL và đảm bảo rằng nó tắt mà không có lỗi, để đảm bảo rằng không có thông tin nào cho các giao dịch nổi bật trong nhật ký làm lại. Sao chép các tệp nhật ký làm lại cũ vào một nơi an toàn, trong trường hợp có lỗi xảy ra trong quá trình tắt máy và bạn cần chúng để khôi phục không gian bảng. Xóa các tệp nhật ký cũ khỏi thư mục tệp nhật ký, chỉnh sửa my.cnf để thay đổi cấu hình tệp nhật ký và khởi động lại máy chủ MySQL. mysqld thấy rằng không có tệp nhật ký InnoDB nào tồn tại khi khởi động và tạo tệp mới.

  • Nếu innodb_fast_shutdown được đặt thành 2: Đặt innodb_fast_shutdown thành 1:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

Sau đó làm theo các hướng dẫn trong mục trước.

Kể từ MySQL 5.6.8 , cài đặt innodb_fast_shutdown không còn phù hợp khi thay đổi số lượng hoặc kích thước của tệp nhật ký InnoDB. Ngoài ra, bạn không còn cần phải xóa các tệp nhật ký cũ, mặc dù bạn vẫn có thể muốn sao chép các tệp nhật ký cũ vào nơi an toàn, như một bản sao lưu. Để thay đổi số lượng hoặc kích thước của tệp nhật ký InnoDB, hãy thực hiện các bước sau:

  1. Dừng máy chủ MySQL và đảm bảo rằng nó tắt mà không có lỗi.

  2. Chỉnh sửa my.cnf để thay đổi cấu hình tệp nhật ký. Để thay đổi kích thước tệp nhật ký, hãy định cấu hình innodb_log_file_size. Để tăng số lượng tệp nhật ký, hãy định cấu hình innodb_log_files_in_group.

  3. Khởi động lại máy chủ MySQL.

Nếu InnoDB phát hiện ra rằng innodb_log_file_size khác với kích thước tệp nhật ký làm lại, nó sẽ viết một điểm kiểm tra nhật ký, đóng và xóa các tệp nhật ký cũ, tạo tệp nhật ký mới ở kích thước được yêu cầu và mở tệp nhật ký mới.


Đây là một câu trả lời tốt như một bản cập nhật cho câu hỏi này. +1 !!!
RolandoMySQLDBA

2
Đây không phải là một "cập nhật". Những trang hướng dẫn này đã tồn tại từ lâu. Tôi luôn đề xuất thông tin trực tiếp từ hướng dẫn sử dụng (một trong những hướng dẫn tốt nhất hiện có) thay vì phát minh lại bánh xe và sao chép thông tin (đó là điều mà DBA ghét nhất).
RandomSeed

Đây là phương pháp ưa thích kể từ MySQL 5.6. Nếu bạn vẫn đang chạy trên một phiên bản trước 5.6, thì điều này sẽ không hoạt động.
Derek Downey

20

innodb_buffer_pool_size- chỉ cần thay đổi my.cnf( my.ini) và khởi động lại mysqld.

innodb_log_file_sizeít quan trọng hơn Đừng thay đổi nó trừ khi có lý do. Roland cung cấp các bước , nhưng một khía cạnh làm tôi lo lắng ... Tôi không biết hai bước đầu tiên có quan trọng không; có vẻ như họ có thể là:

  1. set innodb_fast_shutdown = OFF
  2. khởi động lại mysql
  3. dừng mysql
  4. xóa logfiles
  5. bắt đầu mys

Các tệp nhật ký theo dõi các doanh nghiệp chưa hoàn thành; " innodb_fast_shutdown" nói để đối phó với những thứ đó sau khi khởi động lại. Vì vậy, loại bỏ các tập tin có thể mất thông tin?

Các phiên bản mới đã cải thiện mọi thứ: (thảo luận thêm trong Nhận xét)

  • 5.6 Cho phép innodb_log_file_size> 4GB
  • 5.6 innodb_log_file_sizecó thể được thay đổi mà không cần xóa iblog *
  • 5.7 cho phép thay đổi kích thước động innodb_buffer_pool_size

Tôi có nên thay đổi log_file_size không?

Sử dụng GLOBAL STATUSđể tính số phút trước chu kỳ đăng nhập.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

Nếu nó ít hơn 60 (phút), thì có thể giúp tăng log_file_size. Nếu nó nhiều hơn, thì các tệp nhật ký đang lãng phí không gian đĩa. Rằng "1 giờ" là khá tùy tiện, vì vậy nếu bạn ở gần nó, đừng bận tâm thay đổi log_file_size.

Để innodb_log_files_in_groupmặc định là 2.


+1 mối quan tâm của bạn dường như được hỗ trợ bởi các tài liệu
Jack Douglas

Tôi đã xem câu trả lời này và tôi thích dòng đầu tiên. Tôi thường có các khách hàng mang mysql xuống và --skip-networkingđề phòng để có được những thay đổi vào phút cuối. Dòng đầu tiên của bạn (đặt innodb_fast_shutdown = OFF) sẽ loại bỏ điều đó. +1 !!!
RolandoMySQLDBA

1
Cảm ơn các upvote. Độc giả mới có thể không cần điều này. Trong 5.6.8 , innodb_log_file_sizeđã được cải tiến để cho phép thay đổi nó mà không xóa các tệp iblog.
Rick James

Dis bạn có nghĩa là "quan trọng hơn", không "ít quan trọng"?
Igor

@Igor - Không. Nếu bạn có log_file_size quá nhỏ, sẽ có thêm I / O đập qua nó. Tôi hiếm khi thấy điều đó. Nếu bạn có nó quá lớn, bạn chỉ đang lãng phí dung lượng đĩa. Mục tiêu trong việc thiết lập nó là xoay vòng trong một giờ. Nhưng 10 phút so với 10 giờ - không quan trọng lắm. thêm ...
Rick James

1

Khi bạn đăng nhập vào mysql, hãy gõ các lệnh đó:

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

Bạn sẽ nhận được hai số. Đầu tiên bạn nhận được một và sau đó chờ trong một phút. Bạn sẽ nhận được một cái khác.

Giả sử cái thứ nhất là 3.456.718.123 và cái thứ hai là 4.098.873.134

Bây giờ (4.098.873.134-3.856.718.123) * 60/1024/1024

Kết quả là = 13.856 MB

Bạn có hai tệp nhật ký. Vì vậy, hãy chia nó thành hai và bạn sẽ nhận được số gần 7.000 MB. Để chắc chắn, hãy đặt kích thước tệp nhật ký của bạn 8GB


1
Không rõ ràng (với tôi ít nhất) rằng điều này thực sự trả lời câu hỏi. Đây dường như là một gợi ý cho kích thước thay thế cho tệp nhật ký, chứ không phải làm thế nào để thay đổi kích thước của tệp nhật ký một cách an toàn .
RDFozz

1
@RDFozz bạn nói đúng. Điều này không trả lời làm thế nào để thay đổi kích thước tệp nhật ký. Câu hỏi này trả lời làm thế nào để tìm ra con số để đặt innodb_log_file_size. Tôi đã trả lời một câu hỏi như vậy năm năm trước (Xem phân nhóm Log File Sizetrong dba.stackexchange.com/questions/23189/ mẹo )
RolandoMyQueryDBA

Tôi chỉ muốn giúp: / Tôi biết đó không phải là câu trả lời chính xác.
Linux Newbie

-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && dịch vụ mysql khởi động lại || khởi động lại dịch vụ mysql

Hãy dùng thử, đảm bảo sẽ hoạt động [được thử nghiệm trên Debian 6]


2
Điều này không đảm bảo tắt máy sạch sẽ. Nó có thể hoạt động trong trường hợp trung bình trên một máy chủ chỉ tải nhẹ, nhưng không nên nếu bạn quan tâm đến tính toàn vẹn cơ sở dữ liệu của mình.
Emil Vikström
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.