zoukankan      html  css  js  c++  java
  • Mysql忽略文件名的安全编码

    author:skate
    time:2014/09/28

    mysql如何删除以“#sql-”开头的临时表

    现象:在重建索引后,发现Mysql服务器的磁盘空间快满了

    在用如下命令重建索引

    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_2881064151`;

    前缀”#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`;

  • 相关阅读:
    tomcat做成windows服务之后使用JMX监控的问题
    Spring CORS
    人大金仓
    今天遇到奇怪的事:SVN本地代码的标记突然没了,Clean up也报错
    你真得懂Javascript中的==等于运算符吗?
    Codeforces 384E 线段树+dfs序
    一个图形引擎的画面风格是由那些因素(技术)决定的?
    【BZOJ 1146】【CTSC 2008】网络管理network
    ajax核心技术1---XMLHttpRequset对象的使用
    Android中Application类的详解:
  • 原文地址:https://www.cnblogs.com/cbryge/p/6124955.html
Copyright © 2011-2022 走看看