จะเปลี่ยน MySQL innodb variable ได้อย่างไร 'innodb_log_file_size'


105

ดังนั้นฉันค่อนข้างใหม่ในการปรับแต่ง InnoDB ฉันค่อยๆเปลี่ยนตาราง (จำเป็น) จาก MyIsam เป็น InnoDB ฉันมี innodb ประมาณ 100MB ดังนั้นฉันจึงเพิ่มinnodb_buffer_pool_sizeตัวแปรเป็น 128MB:

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

เมื่อฉันไปเปลี่ยนinnodb_log_file_sizeค่า (ตัวอย่าง my.cnf บนหน้าการกำหนดค่า innodb ของ mysql แสดงความคิดเห็นเพื่อเปลี่ยนขนาดไฟล์บันทึกเป็น 25% ของขนาดบัฟเฟอร์ดังนั้นตอนนี้ my.cnf ของฉันมีลักษณะเช่นนี้:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

เมื่อฉันรีสตาร์ทเซิร์ฟเวอร์ฉันได้รับข้อผิดพลาดนี้:

110216 9:48:41 InnoDB: การเตรียมใช้งานบัฟเฟอร์พูล, ขนาด = 128.0M
110216 9:48:41 InnoDB: การเตรียมใช้งานบัฟเฟอร์พูลเสร็จสมบูรณ์
InnoDB: ข้อผิดพลาด: ล็อกไฟล์. / ib_logfile0 มีขนาดต่างกัน 0 5242880 bytes
InnoDB: มากกว่าที่ระบุใน ไฟล์. cnf 0 33554432 ไบต์!
110216 9:48:41 [ข้อผิดพลาด] ปลั๊กอินของฟังก์ชัน 'InnoDB' init ส่งคืนข้อผิดพลาด
110216 9:48:41 [ข้อผิดพลาด] ปลั๊กอินการลงทะเบียน 'InnoDB' เนื่องจาก STORAGE ENGINE ล้มเหลว

ดังนั้นคำถามของฉัน: ปลอดภัยที่จะลบ log_files เก่าหรือมีวิธีอื่นในการเปลี่ยนinnodb_log_file_sizeตัวแปรหรือไม่?


1
เพียงแค่แสดงความคิดเห็น innodb_log_file_size ใน my.ini .....

5
อืมทำไมฉันถึงต้องการแสดงความคิดเห็นออกมาเพื่อใช้ค่าเริ่มต้นเมื่อฉันพยายามที่จะเปลี่ยนจากค่าเริ่มต้น?
Derek Downey

ใช่โดยการแสดงความคิดเห็นในบรรทัด innodb_log_file_size ผลงานของมัน .. ขอบคุณ
มูฮัมหมัด umar farooq ตรงไปตรงมา

2
@muhammadumarfarooqfrank แน่นอนว่ามันใช้งานได้ - เพราะคุณไม่ได้เปลี่ยนค่าของตัวแปรอีกต่อไป ฉันหวังว่าจะมีวิธีในการลดความคิดเห็น
dr01

คำตอบ:


83

ใช่มันปลอดภัยที่จะลบไฟล์บันทึกเมื่อ mysqld ถูกปิด

ด้วยเหตุนี้ให้ทำตามขั้นตอนต่อไปนี้:

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

เริ่มต้นขึ้น mysqld จะสร้างib_logfile0และib_logfile1

ให้มันลอง !!!

อัพเดท 2011-10-20 16:40 EDT

มันล้างข้อมูลออกทั้งหมดใน InnoDB Buffer Pool ก่อนทำซ้ำไฟล์บันทึกคุณควรตั้งค่าตัวเลือกนี้ประมาณ 1 ชั่วโมงก่อนปิดเครื่อง:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

โดยค่าเริ่มต้นinnodb_max_dirty_pages_pctคือ 75 (MySQL 5.5+) หรือ 90 (ก่อนหน้า MySQL 5.5) การตั้งค่านี้เป็นศูนย์จะทำให้จำนวนหน้าสกปรกต่ำกว่า 1% ของ InnoDB Buffer Pool การแสดงservice mysql stopทำสิ่งนี้ต่อไป นอกจากนี้การปิดระบบจะทำให้รายการที่เหลืออยู่ในบันทึกการทำซ้ำเสร็จสิ้น เพื่อให้ตัวเลือกนี้เพิ่มไปยัง /etc/my.cnf:

[mysqld]
innodb_max_dirty_pages_pct = 0

อัพเดท 2013-04-19 16:16 น. EDT

ฉันปรับปรุงคำตอบของฉันอีกเล็กน้อยด้วยinnodb_fast_shutdownเพราะฉันเคยรีสตาร์ท mysql และหยุด mysql เพื่อทำสิ่งนี้ ในตอนนี้หนึ่งขั้นตอนนี้มีความสำคัญเนื่องจากทุกธุรกรรมที่ไม่มีข้อผูกมัดอาจมีชิ้นส่วนที่เคลื่อนไหวอื่น ๆ ทั้งภายในและภายนอกบันทึกการทำธุรกรรมของ InnoDB ( ดูโครงสร้างพื้นฐานของ InnoDB )

โปรดทราบว่าการตั้งค่าinnodb_fast_shutdownเป็น 2 จะช่วยล้างบันทึกออกเช่นกัน แต่ยังมีชิ้นส่วนที่เคลื่อนไหวอยู่จำนวนมากและยังได้รับเลือกใน Crash Recovery ระหว่างการเริ่มต้นของ mysqld การตั้งค่า 0 นั้นดีที่สุด


1
คำตอบที่ดีและการปรับปรุงก็ดีเช่นกัน ข้อเสนอแนะเดียวของฉันคือการคัดลอก ib_logfiles ไปยังตำแหน่งอื่นในกรณีที่มีสิ่งผิดปกติ สิ่งนี้จะช่วยให้คุณทราบวิธีปรับขนาดไฟล์: mysqlperformanceblog.com/2011/07/09/ …
Justin Noel

5
ทำงานให้ฉันเช่นกัน BUT: linux console UI อาจทำให้เข้าใจผิด - การเริ่มต้น mysqld ใช้เวลานานถ้าคุณตั้งค่าขนาดไฟล์บันทึกขนาดใหญ่ (หลายร้อย MB หรือมากกว่า) UI คอนโซลแสดงจุดให้คุณเห็นแล้วแสดงว่า "ล้มเหลว!" แต่ในความเป็นจริงแล้ว MySQL ยังคงเริ่มต้น รอและอ่านไฟล์บันทึกต่อไป (หรือตรวจสอบไฟล์บันทึกด้วย "tail -f [log-file]") จนกว่าคุณจะเห็น "mysqld: พร้อมสำหรับการเชื่อมต่อ" และล็อกไฟล์ทั้งสองที่จัดสรรบนดิสก์
f055

2
คำเตือน !! ขั้นตอนที่ 3 ไม่ได้ผลสำหรับฉันและหัวใจของฉันก็เกือบจะหยุดลงเมื่อฉันเห็น mysql ที่โหลดขึ้นมาโดยไม่มี InnoDB ต้องหยุด mysql และลบออกด้วยตนเองและเริ่ม MySQL อีกครั้ง คำแนะนำสองข้อ: 1. สำรองไฟล์บันทึกที่มีอยู่แล้ว 2. ลบไฟล์ด้วยตนเอง
Peeyush Kushwaha

2
Peeyush ถูกต้อง แม้เอกสาร MySQLแนะนำให้สำรอง logfiles ของคุณในกรณีอะไรผิดพลาด
เกร็ก

1
@ Greg SET GLOBAL innodb_fast_shutdown = 0;นี่คือเหตุผลที่ผมใช้ เมื่อ MySQL ปิดตัวลงธุรกรรมทั้งหมดจะถูกล้างออกจากส่วนที่เคลื่อนไหวทั้งหมดรวมถึงบันทึกการทำซ้ำ (ib_logfile0 และ ib_logfile1) หนึ่งสามารถเก็บไว้ได้ ฉันยังไม่พบปัญหากับบันทึกที่ถูกลบทิ้งทั้งหมด
RolandoMySQLDBA

31

ฉันอยากจะแนะนำวิธีการอย่างเป็นทางการซึ่งฉันทำซ้ำที่นี่เพื่อความสะดวก:

หากต้องการเปลี่ยนจำนวนหรือขนาดของไฟล์บันทึกของ InnoDB ในMySQL 5.6.7 หรือเก่ากว่าให้ใช้คำแนะนำต่อไปนี้ โพรซีเดอร์ที่ใช้ขึ้นอยู่กับค่าของ innodb_fast_shutdown ซึ่งกำหนดว่าจะให้พื้นที่ตารางระบบเป็นปัจจุบันอย่างสมบูรณ์หรือไม่ก่อนการปิดระบบ:

  • หาก innodb_fast_shutdown ไม่ได้ถูกตั้งค่าเป็น 2: หยุดเซิร์ฟเวอร์ MySQL และตรวจสอบให้แน่ใจว่ามันปิดลงโดยไม่มีข้อผิดพลาดเพื่อให้แน่ใจว่าไม่มีข้อมูลสำหรับการทำธุรกรรมที่โดดเด่นในบันทึกการทำซ้ำ คัดลอกไฟล์บันทึกการทำซ้ำเก่าไปยังที่ที่ปลอดภัยในกรณีที่มีสิ่งผิดปกติระหว่างการปิดระบบและคุณต้องการให้พวกเขากู้คืนพื้นที่ตาราง ลบไฟล์บันทึกเก่าออกจากไดเรกทอรีไฟล์บันทึกแก้ไข my.cnf เพื่อเปลี่ยนการกำหนดค่าไฟล์บันทึกและเริ่มเซิร์ฟเวอร์ MySQL อีกครั้ง mysqld เห็นว่าไม่มีไฟล์บันทึกของ InnoDB เมื่อเริ่มต้นและสร้างไฟล์ใหม่

  • หาก innodb_fast_shutdown ถูกตั้งค่าเป็น 2: ตั้งค่า innodb_fast_shutdown เป็น 1:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

จากนั้นทำตามคำแนะนำในรายการก่อนหน้า

ในฐานะของ MySQL 5.6.8การตั้งค่า innodb_fast_shutdown จะไม่เกี่ยวข้องเมื่อเปลี่ยนจำนวนหรือขนาดของไฟล์บันทึก InnoDB นอกจากนี้คุณไม่จำเป็นต้องลบไฟล์บันทึกเก่าอีกต่อไปแม้ว่าคุณอาจยังต้องการคัดลอกไฟล์บันทึกเก่าไปยังที่ปลอดภัยเพื่อเป็นการสำรองข้อมูล ในการเปลี่ยนจำนวนหรือขนาดของไฟล์บันทึกของ InnoDB ให้ทำตามขั้นตอนต่อไปนี้:

  1. หยุดเซิร์ฟเวอร์ MySQL และตรวจสอบให้แน่ใจว่าปิดเครื่องโดยไม่มีข้อผิดพลาด

  2. แก้ไข my.cnf เพื่อเปลี่ยนการกำหนดค่าไฟล์บันทึก หากต้องการเปลี่ยนขนาดไฟล์บันทึกให้กำหนดค่า innodb_log_file_size หากต้องการเพิ่มจำนวนไฟล์บันทึกให้กำหนดค่า innodb_log_files_in_group

  3. เริ่มเซิร์ฟเวอร์ MySQL อีกครั้ง

หาก InnoDB ตรวจพบว่า innodb_log_file_size แตกต่างจากขนาดไฟล์บันทึกการทำซ้ำมันจะเขียนจุดตรวจสอบบันทึกปิดและลบไฟล์บันทึกเก่าสร้างไฟล์บันทึกใหม่ตามขนาดที่ร้องขอและเปิดไฟล์บันทึกใหม่


นี่เป็นคำตอบที่ดีในการอัปเดตคำถามนี้ +1 !!!
RolandoMySQLDBA

2
นี่ไม่ใช่ "อัปเดต" หน้าคู่มือเหล่านี้มีอยู่นาน ฉันมักจะแนะนำข้อมูลมือแรกจากคู่มือ (หนึ่งในคู่มือที่ดีที่สุดออกมี) มากกว่า reinventing ล้อและข้อมูลที่ซ้ำกัน (ซึ่งเป็นสิ่งที่เราเกลียดที่สุด DBA)
RandomSeed

นี่เป็นวิธีที่ต้องการตั้งแต่ MySQL 5.6 หากคุณยังคงทำงานกับรุ่นก่อนหน้า 5.6 สิ่งนี้จะไม่ทำงาน
Derek Downey

20

innodb_buffer_pool_size- เพียงเปลี่ยนmy.cnf( my.ini) และรีสตาร์ท mysqld

innodb_log_file_sizeมีความสำคัญน้อยกว่า อย่าเปลี่ยนแปลงเว้นแต่จะมีเหตุผล Roland ทำตามขั้นตอนแต่แง่มุมหนึ่งทำให้ฉันกังวล ... ฉันไม่รู้ว่าสองขั้นตอนแรกนั้นสำคัญหรือไม่ ดูเหมือนว่าพวกเขาจะเป็น:

  1. set innodb_fast_shutdown = OFF
  2. รีสตาร์ท mysql
  3. หยุด mysql
  4. ลบ logfiles
  5. เริ่ม mysql

ไฟล์บันทึกติดตามธุรกิจที่ยังไม่เสร็จ " innodb_fast_shutdown" บอกว่าจัดการกับสิ่งนั้นหลังจากรีสตาร์ท ดังนั้นการลบไฟล์อาจทำให้ข้อมูลสูญหาย?

เวอร์ชันใหม่มีการปรับปรุงสิ่งต่าง ๆ : (การอภิปรายเพิ่มเติมในความคิดเห็น)

  • 5.6 ช่วยให้สำหรับinnodb_log_file_size> 4GB
  • 5.6 innodb_log_file_sizeสามารถเปลี่ยนแปลงได้โดยไม่ลบ iblog ครั้งแรก *
  • 5.7 ช่วยให้การปรับขนาดแบบไดนามิก innodb_buffer_pool_size

ฉันควรเปลี่ยน log_file_size หรือไม่

ใช้GLOBAL STATUSเพื่อคำนวณจำนวนนาทีก่อนรอบการบันทึก

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

หากน้อยกว่า 60 (นาที) ก็อาจช่วยเพิ่ม log_file_size ถ้ามันมีมากขึ้นแล้วไฟล์บันทึกจะเสียพื้นที่ดิสก์ "1 ชั่วโมง" นั้นค่อนข้างไม่มีข้อ จำกัด ดังนั้นหากคุณอยู่ใกล้กับมันอย่าลังเลที่จะเปลี่ยน log_file_size

ปล่อยให้innodb_log_files_in_groupเป็นค่าเริ่มต้นของ 2


+1 ความกังวลของคุณได้รับการสนับสนุนจากเอกสาร
แจ็คดักลาส

ฉันดูคำตอบนี้และฉันชอบบรรทัดแรก ฉันมักจะมีลูกค้าทำให้ mysql ล้ม--skip-networkingเหลวเพื่อป้องกันไม่ให้เกิดการเปลี่ยนแปลงในนาทีสุดท้าย บรรทัดแรกของคุณ (ตั้งค่า innodb_fast_shutdown = OFF) กำจัดสิ่งนั้น +1 !!!
RolandoMySQLDBA

1
ขอบคุณสำหรับการโหวต ผู้อ่านใหม่อาจไม่ต้องการสิ่งนี้ ใน5.6.8 , innodb_log_file_sizeได้รับการปรับปรุงเพื่อช่วยให้การเปลี่ยนแปลงได้โดยไม่ต้องลบไฟล์ที่ iBlog
Rick James

คุณหมายถึง "สำคัญยิ่งกว่า" ไม่ใช่ "สำคัญน้อยกว่า" ใช่หรือไม่
Igor

@Igor - ไม่ถ้าคุณมีขนาดเล็กเกินไป log_file_size จะมี I / O พิเศษพุ่งผ่าน ฉันไม่ค่อยเห็นสิ่งนั้น หากคุณมีมันใหญ่เกินไปคุณเพียงแค่เสียพื้นที่ดิสก์ เป้าหมายในการตั้งค่าคือการหมุนเวียนในหนึ่งชั่วโมง แต่ 10 นาทีต่อ 10 ชั่วโมง - ไม่สำคัญมาก ขึ้น ...
Rick James

1

เมื่อคุณเข้าสู่ mysql ให้พิมพ์คำสั่งเหล่านั้น:

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

คุณจะได้ตัวเลขสองตัว ก่อนอื่นคุณจะได้รับจากนั้นรอสักครู่ คุณจะได้รับอีก

สมมติว่าอันแรกคือ 3.456.718.123 และอันที่สองคือ 4.098.873.134

ตอนนี้ (4.098.873.134-3.856.718.123) * 60/1024/1024

ผลลัพธ์คือ = 13.856 MB

คุณมีไฟล์บันทึกสองไฟล์ ดังนั้นจงหารมันสองครั้งแล้วคุณจะได้ตัวเลขใกล้เคียง 7.000 MB เพื่อให้แน่ใจว่าตั้งค่าขนาดไฟล์บันทึกของคุณ 8GB


1
ไม่ชัดเจน (สำหรับฉันอย่างน้อย) ว่าสิ่งนี้ตอบคำถามได้จริง นี่เป็นข้อเสนอแนะสำหรับขนาดอื่นสำหรับไฟล์บันทึกไม่ใช่วิธีการเปลี่ยนขนาดของไฟล์บันทึกอย่างปลอดภัย
RDFozz

1
@RDFozz คุณพูดถูก นี่ไม่ได้ตอบวิธีเปลี่ยนขนาดของไฟล์บันทึก คำถามนี้ตอบคำถามเกี่ยวกับการหาตัวเลขเพื่อตั้งค่า innodb_log_file_size ฉันตอบคำถามนี้ไปแล้วเมื่อห้าปีก่อน (ดูหัวข้อย่อยLog File Sizeในdba.stackexchange.com/questions/23189/… )
RolandoMySQLDBA

ฉันแค่ต้องการช่วย: / ฉันรู้ว่ามันไม่ใช่คำตอบที่แน่นอน
Linux Newbie

-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && บริการ mysql เริ่มต้นใหม่ || บริการ mysql รีสตาร์ท

ลองใช้รับรองว่าใช้งานได้ [ทดสอบกับ Debian 6]


2
สิ่งนี้ไม่รับประกันว่าจะปิดระบบอย่างสมบูรณ์ มันอาจทำงานได้ในกรณีทั่วไปบนเซิร์ฟเวอร์ที่มีไฟโหลดเพียงอย่างเดียว แต่ไม่แนะนำถ้าคุณใส่ใจกับความสมบูรณ์ของฐานข้อมูลของคุณ
Emil Vikström
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.