ซ่อมแซมตารางทั้งหมดในครั้งเดียว


112

วิธีตรวจสอบตารางทั้งหมดในฐานข้อมูลในครั้งเดียว?

แทนที่จะพิมพ์คำค้นหาcheck table ''tablename'';สำหรับตารางทั้งหมดทีละตาราง

มีคำสั่งง่ายๆเหมือนcheck allหรืออะไรแบบนั้นไหม?

คำตอบ:



108

คำสั่งคือ:

mysqlcheck -u root -p --auto-repair --check --all-databases

คุณต้องระบุรหัสผ่านเมื่อถูกถาม

หรือคุณสามารถเรียกใช้รหัสนี้ได้ แต่ไม่แนะนำเนื่องจากรหัสผ่านเขียนเป็นข้อความที่ชัดเจน:

mysqlcheck -u root --password=THEPASSWORD --auto-repair --check --all-databases

7
mysqlcheck -u root -p --auto-repair --check --optimize - all-databases Error: mysqlcheck ไม่รองรับคำสั่งที่ขัดแย้งกันหลายคำสั่ง
Alekc

11
หากคุณได้รับข้อผิดพลาดคำสั่งที่ขัดแย้งกันให้นำอ็อพชัน --optimize ออก
Sarcastron

ฉันเดาว่าคุณต้องใช้หนึ่งในตัวเลือกเหล่านี้เท่านั้น: ซ่อมแซมอัตโนมัติตรวจสอบหรือปรับให้เหมาะสม ฉันใช้การซ่อมรถยนต์เท่านั้นและใช้งานได้
Packet Tracer

ฉันลองสิ่งที่คุณพูด แต่ฉันได้รับ: mysqlcheck: มีข้อผิดพลาด: 1045: การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'root' @ 'localhost' (โดยใช้รหัสผ่าน: ใช่) เมื่อพยายามเชื่อมต่อและฉันรู้ว่าฉันใช้รหัสผ่านที่ถูกต้อง
Doug

24

ใช้แบบสอบถามต่อไปนี้เพื่อพิมพ์REPAIRสถิติ SQL สำหรับตารางทั้งหมดภายในฐานข้อมูล:

select concat('REPAIR TABLE ', table_name, ';') from information_schema.tables 
where table_schema='mydatabase'; 

mydatabaseหลังจากนั้นคัดลอกแบบสอบถามทั้งหมดและดำเนินการได้ใน

หมายเหตุ: แทนที่mydatabaseด้วยชื่อ DB ที่ต้องการ


9

ไม่จำเป็นต้องพิมพ์รหัสผ่านเพียงใช้คำสั่งใด ๆ ต่อไปนี้ (อธิบายด้วยตนเอง):

mysqlcheck --all-databases -a #analyze
mysqlcheck --all-databases -r #repair
mysqlcheck --all-databases -o #optimize

8

คำสั่งต่อไปนี้ใช้ได้กับฉันโดยใช้พรอมต์คำสั่ง (ในฐานะผู้ดูแลระบบ) ใน Windows:

mysqlcheck -u root -p -A --auto-repair

เรียกใช้ mysqlcheck กับผู้ใช้รูทแจ้งรหัสผ่านตรวจสอบฐานข้อมูลทั้งหมดและซ่อมแซมตารางที่เสียหายโดยอัตโนมัติ


3

ไม่มีคำสั่งเริ่มต้นในการทำเช่นนั้น แต่คุณสามารถสร้างโพรซีเดอร์เพื่อทำงานได้ มันจะวนซ้ำไปตามแถวinformation_schemaและเรียกREPAIR TABLE 'tablename';ทุกแถว CHECK TABLEยังไม่รองรับงบที่เตรียมไว้ นี่คือตัวอย่าง (แทนที่ MYDATABASE ด้วยชื่อฐานข้อมูลของคุณ):

CREATE DEFINER = 'root'@'localhost'
PROCEDURE MYDATABASE.repair_all()
BEGIN
  DECLARE endloop INT DEFAULT 0;
  DECLARE tableName char(100);
  DECLARE rCursor CURSOR FOR SELECT `TABLE_NAME` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA`=DATABASE();
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET endloop=1;

  OPEN rCursor;
  FETCH rCursor INTO tableName;

  WHILE endloop = 0 DO
    SET @sql = CONCAT("REPAIR TABLE `", tableName, "`");
    PREPARE statement FROM @sql;
    EXECUTE statement;

    FETCH rCursor INTO tableName;
  END WHILE;

  CLOSE rCursor;
END

1

ฉันชอบสิ่งนี้สำหรับการตรวจสอบง่ายๆจากเปลือก:

mysql -p<password> -D<database> -B -e "SHOW TABLES LIKE 'User%'" \
| awk 'NR != 1 {print "CHECK TABLE "$1";"}' \
| mysql -p<password> -D<database>

1
คุณสามารถใช้mysql -ssเพื่อสร้างชื่อคอลัมน์ที่ละเว้นจากเอาต์พุตซึ่งจะอนุญาตให้ลบออกNR != 1จากรหัสของคุณ
Fluffy

1

สำหรับโฮสต์ plesk สิ่งหนึ่งที่ควรทำ: (ทั้งคู่ทำเหมือนกัน)

mysqlrepair -uadmin -p$(cat /etc/psa/.psa.shadow) -A
# or
mysqlcheck -uadmin -p$(cat /etc/psa/.psa.shadow) --repair -A

1

คุณอาจต้องใช้ชื่อผู้ใช้และรหัสผ่าน:

mysqlcheck -A --auto-repair -uroot -p

คุณจะได้รับแจ้งให้ใส่รหัสผ่าน

mysqlcheck -A --auto-repair -uroot -p{{password here}}

หากคุณต้องการใส่ cron แต่รหัสผ่านของคุณจะปรากฏเป็นข้อความธรรมดา!


1

หากตารางที่เสียหายยังคงอยู่หลังจากนั้น

mysqlcheck -A --auto-repair

ลอง

mysqlcheck -A --auto-repair --use-frm

-use-frm ทำอะไร?
davidman77

--use-frm สำหรับการดำเนินการซ่อมแซมบนตาราง MyISAM รับโครงสร้างตารางจากพจนานุกรมข้อมูลเพื่อให้สามารถซ่อมแซมตารางได้แม้ว่าส่วนหัว. MYI จะเสียหาย (cf. dev.mysql.com/doc/refman/8.0/en/… )
Laloi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.