การลบไฟล์ mysql-bin ปลอดภัยหรือไม่


92

ฉันมีการจำลองแบบ MM ใน mysql และฉันต้องการที่จะบีบพื้นที่ว่างในกล่องเพื่อลบไฟล์ที่ไม่จำเป็นฉันเจอmysql-binไฟล์เหล่านี้ข้างใน/var/db/mysql/มีหลายร้อยไฟล์เช่นmysql-bin.000123นั้นmysql-bin.000223ฯลฯ ฉันได้ตรวจสอบการจำลองแบบ mysql ด้วยการทำshow master statusและshow slave statusพวกเขา การใช้ไฟล์ MySQL-bin บางที่บางตำแหน่ง แต่ผมคิดว่าทุกไฟล์ bin อื่น ๆ ที่เหลือซึ่งจะไม่ถูกนำมาใช้อีกต่อไป ในกรณีนี้ปลอดภัยที่จะลบไฟล์ mysql-bin ทั้งหมดยกเว้นไฟล์ที่การเรพลิเคทกำลังชี้ไปที่?

หากปลอดภัยที่จะลบจะมีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อลบไฟล์เหล่านั้นโดยอัตโนมัติเมื่อไม่ได้ใช้งาน

คำตอบ:


136

โปรดอย่าเพิ่งลบพวกเขาในระบบปฏิบัติการ

คุณต้องปล่อยให้ mysqld ทำเพื่อคุณ นี่คือวิธีที่ mysqld จัดการ:

ไฟล์mysql-bin.[index]จะเก็บรายการบันทึกไบนารีทั้งหมดที่ mysqld สร้างขึ้นและหมุนอัตโนมัติ กลไกในการล้างถังขยะร่วมกับmysql-bin.[index]:

PURGE BINARY LOGS TO 'binlogname';
PURGE BINARY LOGS BEFORE 'datetimestamp';

สิ่งเหล่านี้จะล้างข้อมูลบันทึกไบนารีทั้งหมดก่อนที่คุณจะระบุ binlog หรือการประทับเวลา

ตัวอย่างเช่นถ้าคุณเรียกใช้

PURGE BINARY LOGS TO 'mysql-bin.000223';

mysql-bin.000223นี้จะลบบันทึกไบนารีทั้งหมดก่อน

ถ้าคุณวิ่ง

PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY) + INTERVAL 0 SECOND;

สิ่งนี้จะลบบันทึกไบนารีทั้งหมดก่อนเที่ยงคืน 3 วันที่ผ่านมา

หากคุณต้องการให้ binlog หมุนโดยอัตโนมัติและเก็บไว้ 3 วันจากนั้นเพียงตั้งค่านี้:

mysql> SET GLOBAL expire_logs_days = 3;

จากนั้นเพิ่มลงใน /etc/my.cnf

[mysqld]
expire_logs_days=3

และ mysqld จะลบบันทึกสำหรับคุณ

แสดงสถานะการเป็นทาส \ G

นี่เป็นสิ่งสำคัญ เมื่อคุณเรียกใช้SHOW SLAVE STATUS\Gคุณจะเห็นบันทึกไบนารีสองรายการจาก Master:

  • Master_Log_File
  • Relay_Master_Log_File

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

PURGE BINARY LOGS TO 'Whatever Relay_Master_Log_File Is';

ด้วยวิธีนี้การจำลองแบบจะไม่ถูกขัดจังหวะ


1
โปรดทราบการพิมพ์ - ขีดล่างไม่ใช่ขีดกลาง: [mysqld] expire_logs_days=3(และคุณจะต้องรวม[mysqld]ส่วน
changokun

@changokun นั่นไม่ใช่การพิมพ์ผิด my.cnf จะยอมรับเครื่องหมายขีดกลาง เรียกใช้SET GLOBAL expire_logs_days = 3;จากไคลเอนต์ mysql จะไม่ยอมรับพวกเขา ตัวอย่างใน MySQL Docs: dev.mysql.com/doc/refman/5.5/en/mysqld-option-tables.html
RolandoMySQLDBA

มันใช้งานได้สำหรับฉัน คำถามสิ่งที่เป็นความแตกต่างระหว่างที่ ... mysql> SET GLOBAL expire_logs_days = 3;และexpire-logs-days=3ใน/etc/my.cnf.. พวกเขาเดียวกันได้หรือไม่ สิ่งนี้ซ้ำซ้อนหรือไม่? หรือเป็นสิ่งสำคัญที่จะเรียกใช้SET GLOBAL...แล้วเพิ่มexpire-logs-days=..? ขอบคุณ
Nino Paolo

ลบบันทึกทั้งหมดอย่างรวดเร็วชัด: PURGE BINARY LOGS BEFORE DATE(NOW());เหตุใดจึงไม่มีค่าเริ่มต้นที่มีเหตุผลสำหรับสิ่งนี้ ฉันไม่มีที่ไหนเลยไม่เคยเปลี่ยนขนาดไฟล์บันทึกเป็นจำนวนมหาศาล ฉันมีล็อกไฟล์ 10.0 GB หลังจากรันคำสั่งนี้ขนาดโฟลเดอร์ mysql.bin ของฉันจะลดลงเป็น 1.6GB
Michael Trouw

20

ขึ้นอยู่กับกลยุทธ์การสำรองข้อมูลของคุณ หนึ่งในสาเหตุหลักที่ทำให้การบันทึกแบบไบนารีอยู่รอบ ๆ คือการคืนค่าฐานข้อมูลของคุณเป็น 'จุดในเวลา' หากฐานข้อมูลของคุณขัดข้องและต้องมีการกู้คืนคุณจะกู้คืนการสำรองข้อมูลเต็มรูปแบบล่าสุดจากนั้นเล่นไฟล์บันทึกไบนารีเริ่มต้นด้วยตำแหน่งของการสำรองข้อมูลเต็มรูปแบบ

ดังนั้นหากคุณทำการสำรองข้อมูลเต็มรูปแบบทุกวันและคุณมีไบนารีของบันทึก 7 วันเป็นไปได้ว่าคุณสามารถลบไบนารีของบันทึกไบนารีที่ผ่านมา 4-6 วันที่ผ่านมาได้ คุณสามารถควบคุมจำนวนวันที่บันทึกค่าไบนารีได้ด้วยการexpire_logs_daysตั้งค่า

คุณสามารถลบบันทึกไบนารีที่คุณไม่ต้องการได้ด้วยการดูว่าบันทึกที่เก่าแก่ที่สุดที่คุณต้องการเก็บไว้คืออะไร:

ls -lh /path/to/binary/logs/mysql-bin.0*

แล้วใน mysql:

mysql> PURGE BINARY LOGS TO 'mysql-bin.XXXXX';

5

ลองสิ่งนี้:

RESET MASTER;

ตามที่เอกสารระบุไว้:

RESET MASTER ช่วยให้คุณสามารถลบไฟล์บันทึกไบนารีและไฟล์ดัชนีบันทึกไบนารีที่เกี่ยวข้องส่งคืนข้อมูลมาสเตอร์ไปยังสถานะก่อนที่จะเริ่มการบันทึกไบนารี

นี่จะเป็นการลบไฟล์บันทึกไบนารีที่เกี่ยวข้องทั้งหมดซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ

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