เปลี่ยนเป็น Innodb_flush_log_at_trx_commit แบบไดนามิก


11

สิ่งนี้เกี่ยวข้องกับคำถามนี้ มันจะช่วยให้ได้ประสิทธิภาพที่ดีขึ้นสำหรับตาราง InnoDB

ตามคู่มือ MySQL , innodb_flush_log_at_trx_commitเป็นตัวแปรแบบไดนามิกทั่วโลก ดังนั้นฉันสามารถเปลี่ยนได้โดยใช้คำสั่ง SET GLOBAL และดูเหมือนว่าจะทำงานได้

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

แต่มันไม่ได้เปลี่ยนการตั้งค่า MySQL จริง เมื่อฉันอัปเดตmy.cnfและรีสตาร์ทเซิร์ฟเวอร์ MySQL มันทำงานได้ ดังนั้นฉันไม่สามารถเปลี่ยนตัวแปรโกลบอลในขณะใช้งาน

ฉันชอบค่าเริ่มต้นinnodb_flush_log_at_trx_commit=1แต่ฉันต้องการเปลี่ยนเป็น 2 ก่อนที่ฉันจะเรียกใช้กระบวนการกู้คืนสำหรับฐานข้อมูลขนาดใหญ่เพื่อให้เร็วขึ้น แต่เมื่อกระบวนการเสร็จสิ้นฉันต้องการเปลี่ยนค่ากลับเป็น 1 เป็นไปได้ไหมที่จะทำสิ่งนี้ในเวลาทำงาน

ฉันไม่สามารถเข้าถึงmy.cnfบนเซิร์ฟเวอร์โฮสต์ที่แชร์ของฉันได้

คำตอบ:


12

แม้ว่าฉันจะเห็นด้วยกับคำแนะนำของ Rolando ในการเปลี่ยนแปลงinnodb_flush_methodแต่ฉันก็ไม่ได้ชัดเจนว่าคุณหมายถึงอะไรโดย:

มันไม่ได้เปลี่ยนการตั้งค่า MySQL จริง

ฉันต้องการชี้ให้เห็น caveatที่ทำให้การเปลี่ยนแปลงตัวแปร GLOBAL ส่งผลกระทบต่อการเชื่อมต่อใหม่ใด ๆ แต่ไม่ได้ปรับเปลี่ยนเซสชันปัจจุบัน (เหมืองของฉัน):

การเปลี่ยนแปลงตัวแปรโกลบอลไม่ส่งผลกระทบต่อตัวแปรเซสชันสำหรับไคลเอ็นต์ใด ๆ ที่เชื่อมต่ออยู่ในปัจจุบัน ( ไม่ใช่แม้กระทั่งของไคลเอ็นต์ที่ออกคำสั่ง SET GLOBAL )

ดังนั้นเพื่อตรวจสอบว่า:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

2
คำตอบนี้สมเหตุสมผลแล้ว เอกสาร ( dev.mysql.com/doc/refman/5.5/en/ … ) ไม่ได้บอกว่าตัวแปรในระดับเซสชั่นสามารถเปลี่ยนแปลงได้เพียงระดับโลกเท่านั้น ฉันพบว่าหลายครั้งที่เปลี่ยน max_connections ด้วยSET GLOBAL max_connections = 1000;และเมื่อฉันวิ่งSHOW VARIABLES LIKE 'max_connections';ไปดูค่าเก่าจะทำให้ถั่วหมายความว่าจนกว่าฉันจะออกจากระบบและกลับเข้ามา +1 สำหรับมุมมองนี้ที่ได้รับอนุญาตและมักถูกลืม
RolandoMySQLDBA

@Rolando ฉันด้วย! ก็ดีใจเมื่อฉันพบว่าฉันสามารถ 'เชื่อมต่อ' แทนการออกจากระบบและกลับเข้ามาประหยัดเวลา!
Derek Downey

แนวคิดของการทำงานconnectนั้นเป็นเรื่องใหม่สำหรับฉันใน MySQL ฉันทำอย่างนั้นเป็นล้านครั้งใน PostgreSQL และ Oracle ฉันไม่เคยคิดว่า MySQL อนุญาตให้
RolandoMySQLDBA

@ ทดสอบขอขอบคุณสำหรับคำตอบของคุณ จากการทดสอบในระดับลึกของฉันมันทำงานได้แบบไดนามิก ใน localhost ของฉันตัวแปรเซสชันถูกเปลี่ยนโดยไม่ต้องเชื่อมต่อ (ฉันได้รับข้อผิดพลาดเมื่อมีปัญหาconnect) ด้วยค่า 2 การนำเข้า 2,241,319 บันทึกใช้เวลา 27 นาที 43 วินาทีขณะที่ใช้เวลาประมาณ 1 วันกับค่า 1 ดูเหมือนว่าการตั้งค่าจะทำงานในเซสชันปัจจุบัน แต่จะเรียกคืนการตั้งค่าดั้งเดิม (จากmy.cnf) หลังจากรีสตาร์ท
Sithu

@DerekDowney นี่เป็นเพียงการตั้งค่าบางอย่างinnodb_flush_log_at_trx_commitใช่ไหม หรือว่าสำหรับการตั้งค่าทั้งหมดการตั้งค่าglobalจะไม่ส่งผลกระทบต่อเซสชันปัจจุบัน
Pacerier

7

โดยการตั้งค่าinnodb_flush_log_at_trx_commitคุณมีความเสี่ยงกับการทำงานร่วมกันระหว่าง mysqld / OS ฉันพูดแบบนี้เพราะระบบปฏิบัติการที่เชื่อถือได้เพื่อดำเนินการล้าง

หมายเหตุข้อควรระวังในเอกสาร MySQL

ระบบปฏิบัติการหลายระบบและฮาร์ดแวร์ดิสก์บางตัวไม่สามารถทำงานแบบฟลัช - ทู - ดิสก์ได้ พวกเขาอาจบอก mysqld ว่ามีการล้างเกิดขึ้นแม้ว่าจะไม่ได้ ความทนทานของการทำธุรกรรมจะไม่รับประกันแม้ว่าจะมีการตั้งค่าที่ 1 และในกรณีที่เลวร้ายที่สุดไฟดับอาจทำให้ฐานข้อมูล InnoDB เสียหายได้ การใช้แคชดิสก์สำรองแบตเตอรี่ในตัวควบคุมดิสก์ SCSI หรือในดิสก์ตัวเองเร่งความเร็วในการล้างไฟล์และทำให้การดำเนินการปลอดภัยยิ่งขึ้น คุณสามารถลองใช้คำสั่ง Unix hdparm เพื่อปิดการใช้งานการแคชดิสก์เขียนในแคชฮาร์ดแวร์หรือใช้คำสั่งอื่น ๆ ที่เฉพาะเจาะจงกับผู้จำหน่ายฮาร์ดแวร์

สิ่งนี้บอกได้ดังต่อไปนี้: ระบบปฏิบัติการสามารถโกหกเหมือนสามีที่กำลังโกง ระบบปฏิบัติการบอกว่ามันจะล้างข้อมูลลงดิสก์และไม่ได้ทำ ดังนั้นแม้ว่าคุณจะตั้งค่า innodb_flush_log_at_trx_commit คุณจะต้องทำการหย่า OS ล้างไปยังดิสก์จาก mysqld's flush ไปยังดิสก์

ลองตั้งค่าinnodb_flush_methodเป็น O_DIRECT หากคุณยังไม่ได้ดำเนินการ คุณอาจเห็นความแตกต่างเนื่องจากวิธีการ flush แตกต่างกันอย่างมาก (ดูMar 04, 2011โพสต์ของฉันชี้แจงใน MySQL innodb_flush_method ตัวแปร )

ข้อแม้

my.cnfในขณะที่คุณกล่าวถึงคุณไม่ได้มีการเข้าถึง โปรดติดต่อ SysAdmin ที่ผู้ให้บริการของคุณและรับinnodb_flush_methodเปลี่ยนไป

อัพเดท 2012-12-10 12:45 EDT

ฉันกำลังใช้งาน MySQL 5.5.12 อยู่ในปัจจุบันบนพีซีของฉัน เมื่อฉันเชื่อมต่อและเรียกใช้show variables like 'innodb_flush_method';ฉันได้รับ

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

เนื่องจากมันว่างเปล่ามันก็แค่ระบุว่าใช้การตั้งค่าเริ่มต้น โปรดอ่านโพสต์เมื่อวันที่ 04 มีนาคม 2011 สำหรับคำชี้แจงเกี่ยวกับตัวแปร MySQL innodb_flush_method


ฉันทดสอบใน localhost ของฉันก่อน ฉันไม่สามารถหาinnodb_flush_methodในmy.ini(ไม่ได้my.cnf) ข้อมูลเซิร์ฟเวอร์ - Apache 2.4.1, PHP 5.4.4, MySQL 5.5
Sithu

ฉันสังเกตเห็นว่าไม่ว่าจะเป็นเซิร์ฟเวอร์รุ่นใดหรือ ini / cnf ไฟล์การกำหนดค่าไม่มีinnodb_flush_methodการตั้งค่าและSHOW VARIABLESไม่แสดง
Sithu

ขอบคุณสำหรับการอัปเดตของคุณฉันได้รับเช่นกันฉันแค่สงสัยว่าทำไมเราไม่เห็นคุณค่าของมัน เนื่องจากฉันไม่พบmy.iniหรือmy.cnfไม่ได้เป็นตัวแปรแบบไดนามิกฉันไม่แน่ใจว่าฉันจะกำหนดค่าได้อย่างไร
Sithu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.