zoukankan      html  css  js  c++  java
  • Mysql怎样删除以“#sql-”开头的暂时表

    author:skate
    time:2014/09/28

    Mysql怎样删除以“#sql-”开头的暂时表

    现象:在重建索引后,发现Mysqlserver的磁盘空间快满了

    在用例如以下命令重建索引

    mysql> alter table skatetab add unique index(id, uid), drop primary key, add primary key(uid, id);

    在重建索引的过程中,由于空间不足,导致Mysql server reboot,重新启动之后发现空间少了100G。于是查看是哪个文件夹占用了这100G,最后发如今数据文件夹里发现
    非常多类似#sql-*.ibd暂时文件和同文件名称的#sql-*.frm。既然知道是暂时表了,那就删除吧,肯定不能直接通过rm删除了,由于在ibdata里保存字典信息和Undo信
    息,数据库重新启动后会报错的。

    删除的方法:

    在alter table的过程中,假设Mysql突然crash了。就会在数据文件夹里存在一些中间表,这些中间表是以“#sql-”开头的暂时表,在你的数据文件夹里会看到
    #sql-*.ibd和对应的 #sql-*.frm ,假设 #sql-*.ibd 和 #sql-*.frm两个文件都存在数据文件夹里的话,能够直接drop table。类似:

    mysql> drop table `#mysql50##sql-928_76f7`;

    前缀”#mysql50#“是让Mysql忽略文件名称的安全编码,这个前缀是在Mysql5.1引入的

    由于我的数据文件夹里#sql-*.ibd 和 #sql-*.frm两个文件都存,所以直接drop就能够了。磁盘空间100多G也回收了,例如以下所看到的

    mysql> drop table `#mysql50##sql-928_76f7`;
    Query OK, 0 rows affected (16.28 sec)


    说明:假设在数据文件夹里仅仅有#sql-*.ibd。而没有#sql-*.frm的话,就须要特殊处理
    1.在还有一数据schema里创建一个和欲删除表一样的表结构(包含同样的列和索引)

    mysql> create database test
    mysql> create table test.tmp like  skatetab;       //仅仅复制表的结构和索引。不复制数据

    2.把新创建的暂时表的.frm文件拷贝到欲删除的数据文件夹里。并改动和 ”#sql-*.ibd“一样的文件名称

    shell> cp test/tmp.frm  #sql-928_76f7.frm

    3.确认#sql-*.ibd 和 #sql-*.frm两个文件都存,然后直接drop,例如以下:
     
    mysql> drop table `#mysql50##sql-928_76f7`;


    參考:http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html


    ------end------

  • 相关阅读:
    WIN10 UBUNTU 异常:sleep: cannot read realtime clock: Invalid argument
    Mysql表名大小写忽略
    Spring boot自定义配置文件并映射到指定类中
    list addAll产生异常java.lang.UnsupportedOperationException
    Oracle extract函数提取时分秒的问题
    JOOQ默认schema
    Druid数据库连接失败,无限尝试问题
    Mysql安装后root无法登陆(Access denied for user 'root'@'localhost')
    JavaSE第17篇:集合之Map集合
    JavaSE第16篇:集合之Collection集合下篇
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5087915.html
Copyright © 2011-2022 走看看