前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux下大文件的删除

linux下大文件的删除

原创
作者头像
保持热爱奔赴山海
发布2024-11-10 22:28:39
510
发布2024-11-10 22:28:39
举报
文章被收录于专栏:数据库相关

在MySQL大表删除场景下,通常步骤是:

1、对相关的表ibd文件创建硬链接

2、然后执行drop table

3、使用第三方的工具对硬链接文件进行删除

下面是一个用chatgpt帮写的truncate程序。

cat delete_large_file.c 内容如下:

代码语言: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;
}

编译

代码语言:bash
复制
gcc -o delete_large_file delete_large_file.c

演示

代码语言:bash
复制
./delete_large_file bigfile 10 1   

# 10表示每次truncate 10MB,1表示每次sleep 1秒。 这里便于演示设置的truncate步长比较小。
# 默认不加这2个参数则每次truncate 100MB,每次sleep1秒

当前目录下会生成相关的日志文件,如下:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档