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