การเพิ่มดัชนีช้ามาก…มี mysql cmd เพื่อรับ ETA หรือแสดงความคืบหน้าหรือไม่


13

ขณะนี้ฉันกำลังเรียกใช้คิวรีแก้ไขบนตารางของฉัน (รายการ 20M) เพื่อเพิ่มดัชนี มันใช้งานมานานกว่า 3 วันแล้ว (ติดอยู่ที่ 'คัดลอกไปยังตาราง tmp')

มีวิธีที่ฉันสามารถดูความคืบหน้าของแบบสอบถามหรือในคำอื่น ๆ มีวิธีที่ฉันจะได้รับเวลาประมาณเสร็จ?

ขอบคุณ


4
MyISAM? InnoDB? หาก InnoDB ไฟล์ต่อตารางเปิดอยู่หรือไม่
Charles

คำถามที่ดี - สิ่งที่ดีที่สุดที่ฉันคิดได้ทันทีคือการเดาอย่างคร่าวๆโดยใช้ขนาดของไฟล์ชั่วคราวและไฟล์จริง - จะทำการค้นคว้าเพิ่มเติมอีก

กรุณาSHOW CREATE TABLE tblname\Gบนโต๊ะและบอกดัชนีที่คุณต้องการ
RolandoMySQLDBA

คำตอบ:


3

เมื่อ mysql เปลี่ยนแปลงตารางเป็นหลักมันจะทำสำเนาของมันแล้วทำการ swaps คัดลอกด้วยวิธีนี้ถ้าคุณยกเลิกการอัพเดทตรงกลางตารางนั้นจะยังคงอยู่ในสถานะเสถียร ดังนั้นคุณสามารถดูในไดเรคทอรีข้อมูล mysql (/ var / lib / mysql /?) เพื่อดูว่าไฟล์ใหม่มีขนาดใหญ่เพียงใดซึ่งจะบอกคุณว่ามันอยู่ไกลแค่ไหน นี่เป็นเรื่องยากยิ่งขึ้นกับ Innodb แต่มีตาราง tmp ที่ถูกสร้างขึ้นที่ไหนสักแห่ง

คุณสามารถลดระยะเวลาที่ดัชนีใช้อย่างมากโดยการเพิ่มตัวแปรบัฟเฟอร์การเรียงลำดับของคุณ (myisam_sort_buffer_size, sort_buffer_size) ทำให้สิ่งเหล่านั้นมีขนาดใหญ่เท่าที่คุณสามารถทำได้ คุณสามารถลดเวลาในการปรับเปลี่ยนได้สองสามวันแม้กระทั่งลดลงไปสองสามชั่วโมงขึ้นอยู่กับจำนวนหน่วยความจำที่คุณมี ฉันทำตารางบันทึก 150M ในเวลาประมาณ 3 ชั่วโมง


น่าเสียดายที่ฉันไม่พบตาราง tmp ใด ๆ ฉันใช้ innoDB โดยตั้ง innodb_file_per_table เป็น OFF

2

เนื่องจาก innodb_fle_per_table ปิดคุณไม่สามารถดูตารางและวัดความคืบหน้าได้

ฉันทำโพสต์ก่อนหน้านี้เกี่ยวกับวิธีการทำเช่นนี้สำหรับ MyISAM คุณสามารถทำสิ่งนี้กับ InnoDB ได้หากเปิดใช้งาน InnodDB และเปิดใช้งานโครงสร้างของ InnoDBใหม่เท่านั้น มันยังต้องดูในระบบปฏิบัติการที่ขนาดของไฟล์ที่เป็นปัญหา

เมื่อคุณใช้งานการล้างข้อมูลบน InnoDB อย่างสมบูรณ์และคุณได้เปิดใช้งาน innodb_file_per_table แล้วคุณอาจต้องการดำเนินการปรับปรุงดัชนีดังต่อไปนี้:

ตัวอย่างคุณมีดังต่อไปนี้

  • อินสแตนซ์ MySQL พร้อม / var / lib / mysql เป็น datadir
  • ตาราง InnoDB db.lotsofdataมีชื่อเรียก20 ล้านชื่อ:

ตารางมีลักษณะดังนี้:

CREATE TABLE db.lotsofdata
(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(30),
    PRIMARY KEY (id)
) ENGINE=InnoDB;

สมมติว่าคุณต้องการสร้างดัชนีชื่อ คุณสามารถทำได้:

CREATE TABLE db.lotsofdata_new LIKE db.lotsofdata;
ALTER TABLE db.lotsofdata_new ADD INDEX (name);
INSERT INTO db.lotsofdata_new SELECT * db.lotsofdata;
ALTER TABLE db.lotsofdata RENAME db.lotsofdata_old;
ALTER TABLE db.lotsofdata_new RENAME db.lotsofdata;
TRUNCATE TABLE db.lotsofdata_old;
ALTER TABLE db.lotsofdata_old ENGINE=InnoDB;
DROP TABLE db.lotsofdata_old;

ในขณะที่ INSERT กำลังทำงานคุณไปที่ระบบปฏิบัติการและดำเนินการดังนี้

cd /var/lib/mysql/db
watch ls -l lotsofda*.ibd

lotsofdata_new.ibdนี้จะให้รายชื่อของขนาดปัจจุบันของ เมื่อมันใหญ่กว่าlotsofdata.ibdนั้นคุณก็รู้ว่าคุณใกล้จะสำเร็จแล้ว

BTW MariaDB มีสถานะความคืบหน้าการดำเนินการภายใน


ขอบคุณสำหรับคำติชมของคุณ สำหรับตอนนี้ฉันตัดสินใจที่จะฆ่าแบบสอบถามและลองอีกครั้งหลังจากอัปเกรดเป็นรุ่นล่าสุดของ mysql หวังว่ามันจะเป็นไปอย่างราบรื่นมากขึ้น
Atai Voltaire

1

ไม่มีวิธีที่เชื่อถือได้เพื่อดูความคืบหน้าของการสร้างดัชนี หากคุณมี innodb-file-per-table คุณอาจได้รับการบ่งชี้บางอย่างโดยดูที่ไฟล์. ibd ชั่วคราวที่สร้างขึ้นในไดเรกทอรีข้อมูลและเปรียบเทียบกับขนาดของไฟล์ปัจจุบัน แต่นั่นไม่มาก เชื่อถือได้เนื่องจากไฟล์ข้อมูลปัจจุบันของคุณอาจมีการบวมเนื่องจากการลบ / การแตกแฟรกเมนต์และไฟล์ข้อมูลใหม่จะมีดัชนีเพิ่มเติมที่ไฟล์ก่อนหน้าของคุณไม่ได้

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

  • คุณใช้ MySQL รุ่นใด

เซิร์ฟเวอร์ Percona กลับค่อนข้างเป็นวิธี (ก่อน 5.5) เปิดใช้งานปลั๊กอิน InnoDB ตามค่าเริ่มต้น


0

pt-online-schema-change โดย Percona แสดงเวลาที่เหลือโดยประมาณ โดยค่าเริ่มต้นมันพิมพ์ออกมาประมาณการเวลาที่เหลืออยู่และร้อยละความคืบหน้าทุก ๆ 30 วินาที

นอกจากนี้ยังมีฟังก์ชั่นเพิ่มเติมเมื่อเทียบกับเพียงแค่เรียกใช้คำสั่ง ALTER ด้วยตัวเอง

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

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