• 线网环境如何删除大表


    比如一张大表,底层ibd文件大约是50G-100G,或者你理解成一张大表200G以上吧。哈哈!!!
    
    利用硬链接和truncate降低drop table对线上环境的影响
    
    在drop table的时候,所有进程不管是DDL还是DML都被hang起,直到drop结束才继续执行;
    这是因为InnoDB会维护一个全局独占锁(在table cache上面),直到drop table完成才释放。
    在我们常用的ext3,ext4,xfs,ntfs文件系统,要删除一个大文件(几十G,甚至几百G)还是需要点时间的。
    下面我们介绍一个快速drop table的方法,不管多大的表,InnoDB都可以很快返回,表删除完成。
    
    至于原理: 就是利用os hard link的原理,
    当多个文件名同时指向同一个inode时,这个inode的引用数N>1,删除其中任何一个文件名都会很快。
    因为其直接的物理文件块没有被删除,只是删除了一个指针而已。
    当inode的引用数N=1时,这时候再去删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时。
    
    开始科普Linux软硬链接知识:
        Linux系统中的“快捷方式”。
        在Windows系统中,快捷方式就是指向原始文件的一个链接文件,可以让用户从不同的位置来访问原始的文件;原文件一旦被删除或剪切到其他地方后,会导致链接文件失效。
        但是,这个看似简单的东西在Linux系统中可不太一样。
        在Linux系统中存在硬链接和软连接两种文件。
        硬链接(hard link):可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。
        软链接(也称为符号链接[symbolic link]):仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。
    
        ln命令中可用的参数以及作用
        参数    作用
        -s      创建“符号链接”(如果不带-s参数,则默认创建硬链接)
        -f      强制创建文件或目录的链接
        -i      覆盖前先询问
        -v      显示创建链接的过程
    
    
    跑truncate table,4亿条数据会不会造成长时间锁表呢?有什么更好的方法吗?
    最好是create新表,然后交叉rename对调,再drop/truncate table或其他方式清除数据。
    
    
    一、可操作步骤:
    创建新的tmp表,正式表与tmp表表名交换(注意在一个SQL里完成,并锁表)
    对tmp表创建硬链接 ln tmp.ibd tmp.ibd.hdlk
    在mysql中删除表tmp(truncate / drop都行)
    然后找个业务不繁忙的时间删除数据文件或者用coreutils 的truncate慢慢搞。
        truncate -s 1024 * 1024 * 4 filename 或者 rm -rf filename
    
    
    二、关于truncate table,官档解释:
    Logically, TRUNCATE TABLE is similar to a DELETE statement that deletes all rows, or a sequence of DROP TABLE and CREATE TABLE statements.
    When a table is truncated, it is dropped and re-created in a new .ibd file, and the freed space is returned to the operating system.
  • 相关阅读:
    JSTL标签
    EL(表达式语言)
    JDBC技术
    Java中的一些术语的解释
    Servlet过滤器和监听器
    MVC-初识
    EF-初识
    .NET细节知识总结,不断更新
    多线程-Task、await/async
    多线程-Thread和ThreadPool
  • 原文地址:https://www.cnblogs.com/zhouwanchun/p/16555390.html
Copyright © 2020-2023  润新知