ฉันไปทำงานในตอนบ่ายและต้องตกใจเมื่อได้ยินว่ามีปัญหากับเว็บไซต์ dedecms ของฉัน เมื่อฉันเยี่ยมชมเว็บไซต์ ฉันพบข้อผิดพลาดแบบเต็มหน้าจอ ฉันตรวจสอบบันทึก mysql และข้อความแสดงข้อผิดพลาดคือ:
Table '. dedecmsv4dede_archives' ถูกทำเครื่องหมายว่าขัดข้องและควรได้รับการซ่อมแซม
โดยระบุว่าตารางบทความ dede_archives ถูกทำเครื่องหมายว่ามีปัญหาและจำเป็นต้องได้รับการซ่อมแซม ดังนั้นฉันจึงกู้คืนข้อมูลในอดีตอย่างรวดเร็วและออนไลน์เพื่อค้นหาสาเหตุ ปัญหาก็จะได้รับการแก้ไขในที่สุด วิธีแก้ไขมีดังนี้:
ค้นหาเครื่องมือ bin/myisamchk ในไดเร็กทอรีการติดตั้ง mysql และป้อนในบรรทัดคำสั่ง:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
จากนั้นเครื่องมือ myisamchk จะช่วยคุณกู้คืนดัชนี ของตารางข้อมูล รีสตาร์ท mysql และปัญหาได้รับการแก้ไขแล้ว
การวิเคราะห์ปัญหา:
1. สาเหตุของข้อผิดพลาด ชาวเน็ตบางคนบอกว่าเป็นข้อผิดพลาดของดัชนีที่เกิดจากการสืบค้นและอัปเดตตาราง dede_archives บ่อยครั้ง เนื่องจากเพจของฉันไม่ได้สร้างแบบคงที่ แต่เป็นเพจไดนามิก ฉันค่อนข้างเห็นด้วยกับข้อความนี้ . กล่าวอีกนัยหนึ่งว่าฐานข้อมูล MYSQL ได้รับความเสียหายด้วยเหตุผลบางประการ ตัวอย่างเช่น ไฟฟ้าดับกะทันหันของเซิร์ฟเวอร์ฐานข้อมูล การดำเนินการบางอย่างกับไฟล์ต้นฉบับของตารางเมื่อให้บริการกับตารางฐานข้อมูลอาจทำให้ฐานข้อมูล MYSQL เกิดความเสียหาย ตารางเสียหายและข้อมูลไม่สามารถอ่านได้ กล่าวโดยสรุปคือ นาฬิกาได้รับความเสียหายเนื่องจากปัญหาที่ไม่อาจหยั่งรู้ได้
หมายเลขปัญหาคือ 145
2. แนวทางแก้ไขปัญหา
เมื่อคุณพยายามแก้ไขปัญหาตารางที่เสียหาย การซ่อมแซมมีสามประเภท หากคุณได้รับข้อความแสดงข้อผิดพลาดที่ระบุว่าไม่สามารถสร้างไฟล์ชั่วคราวได้ ให้ลบไฟล์ที่ระบุในข้อความแล้วลองอีกครั้ง ซึ่งโดยปกติจะเป็นไฟล์ที่ค้างจากการดำเนินการซ่อมแซมครั้งก่อน
การแก้ไขทั้งสามรายการมีดังนี้:
% myisamchk --recover --quick /path/to/tblName
% myisamchk --กู้คืน /path/to/tblName
% myisamchk --ปลอดภัยกู้คืน /path/to/tblName
วิธีแรกคือวิธีที่เร็วที่สุดและใช้เพื่อแก้ไขปัญหาที่พบบ่อยที่สุด ส่วนวิธีสุดท้ายจะช้าที่สุดและใช้เพื่อแก้ไขปัญหาที่ไม่สามารถแก้ไขได้ด้วยวิธีการอื่น
การตรวจสอบและซ่อมแซมไฟล์ข้อมูล MySQL หากวิธีการข้างต้นไม่สามารถซ่อมแซมตารางที่เสียหายได้ ก่อนที่คุณจะยอมแพ้ คุณสามารถลองใช้เคล็ดลับสองข้อนี้:
หากคุณสงสัยว่ามีข้อผิดพลาดที่แก้ไขไม่ได้เกิดขึ้นในไฟล์ดัชนี (*.MYI) ของตาราง หรือแม้แต่ไฟล์สูญหาย คุณสามารถใช้ไฟล์ข้อมูล (*.MYD) และไฟล์รูปแบบข้อมูล (*.frm) เพื่อ สร้างมันขึ้นมาใหม่ ขั้นแรกให้ทำสำเนาไฟล์ข้อมูล (tblName.MYD) รีสตาร์ทบริการ MySQL ของคุณและเชื่อมต่อ ใช้คำสั่งต่อไปนี้เพื่อลบเนื้อหาของตาราง:
mysql> ลบจาก tblName;
ในขณะที่ลบเนื้อหาของตาราง ไฟล์ดัชนีใหม่จะถูกสร้างขึ้น ออกจากระบบและปิดบริการอีกครั้ง จากนั้นเขียนทับไฟล์ข้อมูลใหม่ (ว่าง) ด้วยไฟล์ข้อมูลที่คุณเพิ่งบันทึก (tblName.MYD) สุดท้าย ใช้ myisamchk เพื่อทำการซ่อมแซมมาตรฐาน (วิธีที่สองด้านบน) เพื่อสร้างข้อมูลดัชนีใหม่ตามเนื้อหาของข้อมูลในตารางและไฟล์รูปแบบของตาราง
หากไฟล์รูปแบบของตารางของคุณ (tblName.frm) หายไปหรือมีข้อผิดพลาดที่แก้ไขไม่ได้ แต่คุณรู้วิธีใช้คำสั่ง CREATE TABLE ที่เกี่ยวข้องเพื่อสร้างตารางใหม่ คุณสามารถสร้างไฟล์ .frm ใหม่ และใช้กับไฟล์ข้อมูลของคุณได้ และไฟล์ดัชนี (หากมีปัญหากับไฟล์ดัชนี ให้ใช้วิธีการด้านบนเพื่อสร้างไฟล์ใหม่) ขั้นแรกให้ทำสำเนาของข้อมูลและไฟล์ดัชนี จากนั้นลบไฟล์ต้นฉบับ (ลบบันทึกทั้งหมดที่เกี่ยวข้องกับตารางนี้ในไดเร็กทอรีข้อมูล)
เริ่มบริการ MySQL และสร้างตารางใหม่โดยใช้ไฟล์ CREATE TABLE ต้นฉบับ ไฟล์ .frm ใหม่น่าจะทำงานได้ดี แต่จะดีที่สุดหากคุณซ่อมแซมแบบมาตรฐาน (วิธีที่สองด้านบน)
3. ข้อมูลเบื้องต้นเกี่ยวกับเครื่องมือ myisamchk (ดูคู่มืออย่างเป็นทางการของ mysql)
คุณสามารถใช้ยูทิลิตี้ myisamchk เพื่อรับข้อมูลเกี่ยวกับตารางฐานข้อมูลหรือเพื่อตรวจสอบ ซ่อมแซม และปรับให้เหมาะสม myisamchk ใช้กับตาราง MyISAM (ตารางที่สอดคล้องกับไฟล์ .MYI และ .MYD)
วิธีการเรียก myisamchk:
shell> myisamchk [ตัวเลือก] tbl_name ...
ตัวเลือกระบุสิ่งที่คุณต้องการให้ myisamchk ทำ พวกเขาจะอธิบายในภายหลัง คุณยังสามารถรับรายการตัวเลือกได้โดยการเรียก myisamchk --help
tbl_name คือตารางฐานข้อมูลที่คุณต้องการตรวจสอบหรือซ่อมแซม หากคุณไม่ได้รัน myisamchk ที่ไหนสักแห่งในไดเร็กทอรีฐานข้อมูล คุณต้องระบุพาธไปยังไดเร็กทอรีฐานข้อมูล เนื่องจาก myisamchk ไม่รู้ว่าฐานข้อมูลของคุณอยู่ที่ใด ในความเป็นจริง myisamchk ไม่สนใจว่าไฟล์ที่คุณกำลังดำเนินการจะอยู่ในไดเร็กทอรีฐานข้อมูลหรือไม่ คุณสามารถคัดลอกไฟล์ที่เกี่ยวข้องกับตารางฐานข้อมูลที่อื่นและดำเนินการกู้คืนที่นั่นได้
หากต้องการ คุณสามารถใช้บรรทัดคำสั่ง myisamchk เพื่อตั้งชื่อหลายตารางได้ คุณยังสามารถระบุตารางได้ด้วยการตั้งชื่อไฟล์ดัชนี (โดยมีส่วนต่อท้าย ".MYI") ช่วยให้คุณสามารถระบุตารางทั้งหมดในไดเร็กทอรีโดยใช้สคีมา "*.MYI" ตัวอย่างเช่น หากคุณอยู่ในไดเร็กทอรีฐานข้อมูล คุณสามารถตรวจสอบตาราง MyISAM ทั้งหมดในไดเร็กทอรีดังนี้:
shell> myisamchk *.MYI
หากคุณไม่ได้อยู่ในไดเร็กทอรีฐานข้อมูล คุณสามารถตรวจสอบตารางทั้งหมดที่นั่นได้โดยการระบุเส้นทางไปยังไดเร็กทอรี:
shell> myisamchk /path/to/database_dir/*.MYI
คุณสามารถตรวจสอบตารางทั้งหมดในฐานข้อมูลทั้งหมดได้ด้วยการระบุไวด์การ์ดสำหรับเส้นทางไปยังไดเร็กทอรีข้อมูล MySQL:
shell> myisamchk /path/to/datadir/*/*.MYI
วิธีที่แนะนำในการตรวจสอบตาราง MyISAM ทั้งหมดอย่างรวดเร็วคือ:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
หากคุณต้องการตรวจสอบตาราง MyISAM ทั้งหมดและซ่อมแซมตารางที่เสียหาย คุณสามารถใช้คำสั่งต่อไปนี้:
shell> myisamchk --silent --force --fast --update-state
-O key_buffer=64M -O sort_buffer=64M
-O read_buffer=1M -O write_buffer=1M
/path/to/datadir/*/*.MYI
คำสั่งนี้ถือว่าคุณมีหน่วยความจำว่างมากกว่า 64MB สำหรับรายละเอียดเกี่ยวกับการจัดสรรหน่วยความจำด้วย myisamchk โปรดดูส่วนที่ 5.9.5.5 “การใช้หน่วยความจำ myisamchk”
เมื่อคุณรัน myisamchk คุณต้องแน่ใจว่าโปรแกรมอื่นไม่ได้ใช้ตาราง มิฉะนั้น เมื่อคุณรัน myisamchk ข้อความแสดงข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น:
คำเตือน: ไคลเอนต์กำลังใช้งานหรือไม่ได้ปิดตารางอย่างถูกต้อง
สิ่งนี้บ่งชี้ว่าคุณกำลังพยายามตรวจสอบตารางที่กำลังอัพเดตโดยโปรแกรมอื่น (เช่น เซิร์ฟเวอร์ mysqld) ที่ไม่ได้ปิดไฟล์หรือยุติลงโดยไม่ได้ปิดไฟล์อย่างถูกต้อง
หาก mysqld ทำงานอยู่ คุณจะต้องบังคับให้ล้างการแก้ไขตารางใดๆ ที่ยังอยู่ในหน่วยความจำผ่าน FLUSH TABLES เมื่อคุณรัน myisamchk คุณต้องแน่ใจว่าโปรแกรมอื่นไม่ได้ใช้ตาราง วิธีที่ง่ายที่สุดในการหลีกเลี่ยงปัญหาคือใช้ CHECK TABLE แทน myisamchk เพื่อตรวจสอบตาราง