Eliminación rápida de tablas súper grandes de MySQL

La eliminación directa de tablas grandes en MySQL puede provocar que MySQL se cuelgue y afecte el negocio. La premisa para eliminar una tabla muy grande es que la tabla sea un espacio de tabla independiente, para que la eliminación sea efectiva.

Primero, la tabla crea un vínculo físico.

# du -sh pay_bills.ibd 
175G        pay_bills.ibd

# 创建硬链接
# ln pay_bills.ibd pay_bills.ibd_hdlk

2. Ejecutar eliminación de tabla

En Linux, cada archivo de almacenamiento tendrá un índice de inodo que apunta al archivo, y varios nombres de archivos pueden apuntar al mismo archivo de almacenamiento a través del mismo índice de inodo.

Si el índice de Inodo al que hace referencia el nombre del archivo también está referenciado por otros nombres de archivo, solo se eliminará la referencia entre el nombre del archivo y el índice de Inodo.
Si el índice de Inodo al que hace referencia el nombre del archivo no está referenciado por otros nombres de archivo, el El nombre del archivo y el índice de Inode se eliminarán. La referencia entre el índice de Inode y el archivo de almacenamiento señalado por el índice de Inode se eliminarán.

De hecho, solo se elimina una referencia de archivo a pay_bills.ibd y nuestra referencia de pay_bills.ibd_hdlk al archivo físico aún existe, por lo que no se realizará la operación de eliminación a nivel del sistema operativo y la fluctuación de IO es pequeña, lo que reduce el impacto en MySQL.

mysql> drop table pay_bills;
Query OK, 0 rows affected (3.24 sec)

3. Ejecutar eliminación de archivos

  • Instalar la herramienta truncar
# yum install coreutils -y
  • ejecutar el script de eliminación
#!/bin/bash

TRUNCATE=/usr/bin/truncate

# 从175G开始每次删除2G,最后如果脚本truncate后还剩下部分文件,使用rm删除

for i in `seq 175 -2 1`; do 
  $TRUNCATE -s ${i}G  pay_bills.ibd_hdlk
  sleep 1
done

rm -f pay_bills.ibd_hdlk

Supongo que te gusta

Origin blog.csdn.net/qq_25854057/article/details/123718804
Recomendado
Clasificación