在MySQL大表删除场景下,通常步骤是:
1、对相关的表ibd文件创建硬链接
2、然后执行drop table
3、使用第三方的工具对硬链接文件进行删除
下面是一个用chatgpt帮写的truncate程序。
cat delete_large_file.c 内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#define DEFAULT_BLOCK_SIZE (100 * 1024 * 1024) // 默认100MB
#define DEFAULT_SLEEP_TIME 1 // 默认1秒
void log_message(const char *message, off_t current_size) {
time_t raw_time;
struct tm *time_info;
char buffer[80];
time(&raw_time);
time_info = localtime(&raw_time);
strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", time_info);
FILE *log_file = fopen("truncate_log.txt", "a");
if (log_file != NULL) {
fprintf(log_file, "[%s] %s Current Size: %ld bytes\n", buffer, message, current_size);
fclose(log_file);
}
}
int main(int argc, char *argv[]) {
if (argc < 2 || argc > 4) {
fprintf(stderr, "Usage: %s <file> [block_size_in_MB] [sleep_time_in_seconds]\n", argv[0]);
return EXIT_FAILURE;
}
const char *filename = argv[1];
off_t block_size = DEFAULT_BLOCK_SIZE;
int sleep_time = DEFAULT_SLEEP_TIME;
if (argc >= 3) {
block_size = atol(argv[2]) * 1024 * 1024; // 将MB转换为字节
}
if (argc == 4) {
sleep_time = atoi(argv[3]);
}
struct stat st;
// 获取文件信息
if (stat(filename, &st) == -1) {
perror("Error getting file size");
return EXIT_FAILURE;
}
off_t filesize = st.st_size;
log_message("Start truncating file", filesize);
while (filesize > 0) {
off_t new_size = filesize - block_size;
if (new_size < 0) {
new_size = 0; // 如果剩余部分小于块大小,则直接设为0
}
// 使用truncate减小文件大小
if (truncate(filename, new_size) == -1) {
perror("Error truncating file");
return EXIT_FAILURE;
}
log_message("File truncated", new_size);
filesize = new_size;
if (sleep_time > 0) {
sleep(sleep_time); // 休眠指定的时间
}
}
// 文件大小已降至0,现在删除文件
if (unlink(filename) == -1) {
perror("Error deleting file");
return EXIT_FAILURE;
}
log_message("File deleted successfully", 0);
printf("File deleted successfully.\n");
return EXIT_SUCCESS;
}
编译
gcc -o delete_large_file delete_large_file.c
演示
./delete_large_file bigfile 10 1
# 10表示每次truncate 10MB,1表示每次sleep 1秒。 这里便于演示设置的truncate步长比较小。
# 默认不加这2个参数则每次truncate 100MB,每次sleep1秒
当前目录下会生成相关的日志文件,如下:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。