Mysql删除表名中有特殊字符的表
  由于公司业务和应用的调整,之前在Mysql中的很多表都不需要了,故需要对数据库进行整理。
 
   刚开始,我在想:不就删除一些表吗?很好解决,写个简单的脚本就可以了。我先看了数据库中有80000多个表,很多表都是以IP命名的,而这些表就是要清理的对象。
 
   于是我使用下面一条命令,先将所有表名导出到一个文件中:
 
   mysql -uroot -p123456 -A -e "use cdn;show tables;" >allDBName.txt
 
   然后,执行:cat allDBName.txt|grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.">ipDB.txt 将以IP开始的表名导入到ipDB.txt中。再使用如下脚本,进行删除。
 
   #! /bin/bash
 
   cat ipDB.txt|while read DBname
 
   do
 
   mysql -uroot -p123456 -A -e "use cdn;DROP TABLE IF EXISTS $DBname;" 2》drop.err
 
   if [ $? -ne 0 ] ;then
 
   echo "Drop $DBname failed"
 
   fi
 
   done
 
   exit 0
 
   我在后台执行了以上脚本,也没看执行是否正确,个人感觉应该没问题了,于是就做其它事情去了。可是,一段时间后,我在information_schema数据库下,执行下列语句,查看数据库大小时,发现与删除表之前的数据库大小不减,反而增加了(实际环境中,正在跑着业务)。
 
   select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as datasize from TABLES where table_schema='cdn';
 
   再看刚才脚本的目录下,多了一个drop.err文件,发现里面全是同一个错误:
 
   ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''192.168.1.30'' at line 1
 
   我很疑惑,为什么会报错呢?于是我在终端中进入到数据库,执行:
 
   DROP TABLE IF EXISTS '192.168.1.30';
 
   可是还是报相同的错误,我很是疑惑。WHY?根本就没道理啊,没有语法错误啊!后来仔细一想,感觉不对:表名里面的点一概失算特殊字符,可能是这个问题。于是我查阅了一些资料,遇到这种问题的解决方法是:把表名放到``里面,注意`是跟字母在一起的数字1的左边的字符,试了一下,果然成功了托福答案 www.qcwy123.com 
 
   于是,我将脚本中的 $DBname变成`$DBname`,但是中兴的时候,居然又报错了:command not found,仔细一想应该是双引号的问题,于是将引号改成单引号,胆码如下:
 
   #! /bin/bash
 
   cat ipDB.txt|while read DBname
 
   do
 
   mysql -uroot -p123456 -A -e 'use cdn;DROP TABLE IF EXISTS `$DBname`;' 2》drop.err
 
   if [ $? -ne 0 ] ;then
 
   echo "Drop $DBname failed"
 
   fi
 
   done
 
   exit 0
 
   然后执行,没有再报错,问题应该解决了吧!可我一查看标的数量,居然还是没有变化,天理何在啊!没报错了,但怎么就没将表删除了。再仔细想想,原来是shell脚本中特殊字符的处理,改成以下就好了:
 
   #! /bin/bash
 
   cat ipDB.txt|while read DBname
 
   do
 
   mysql -uroot -p123456 -A -e "use cdn;DROP TABLE IF EXISTS \`$DBname\`;" 2》drop.err
 
   if [ $? -ne 0 ] ;then
 
   echo "Drop $DBname failed"
 
   fi
 
   done
 
   exit 0
 
   此时,再次执行,没报错,再看看表的数量,果然变少了。居然被几个符号搞了一天!唉!吸取点教训吧!
Mysql删除表名中有特殊字符的表的更多相关文章
- MySQL ALTER命令-修改数据表名或者修改数据表字段
		
需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 删除,添加或修改表字段 如下命令使用了 ALTER 命令及 DROP 子句来删除表的 i 字段: ALTER TABLE ...
 - sqlite 查询数据库中所有的表名,判断某表是否存在,将某列所有数值去重后获得数量
		
1.列出当前db文件中所有的表的表名 SQL语句:SELECT * FROM sqlite_master WHERE type='table'; 结构如下: 注:网上有人说可以带上db文件的名称,如: ...
 - SQL表名,应该用表对应资源对象的复数形式还是单数形式
		
原文:http://blog.csdn.net/lizeyang 问题 SQL表名,应该用表对应资源对象的复数形式还是单数形式.例如一个用户表,表名是用user还是users更合适呢? 精华回答 ...
 - 让 MySQL 在 Linux 下表名不区分大小写(实为表名全小写)
		
把 Windows 下的应用部署到 Linux 下,使用到了 Quartz 集群的特性,所以建了 MySql 的中间表,一启动看到报错: Invocation of init method faile ...
 - 查询MySQL中某个数据库中有多少张表
		
SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES WHERE table_schema = '数据库' GRO ...
 - linux中mysql表名默认区分大小写导致表找不到的问题
		
天将window的项目迁移到linux上面,然后登录时一直报用户表找不到的错误信息. 检查发现数据库中的表名是m_user, 后来才想起来是大小写问题, 找到问题原因,解决方案如下: 修改/etc/m ...
 - ZT:在mybatis的Mapping文件写入表名  出现异常ORA-00903: 表名无效 的解决
		
简而言之,把#{tablename}换成${tablename}就能解决问题. 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:htt ...
 - mysql查询一个库中有多少张表
		
SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES WHERE table_schema = 'palm_2_0_ ...
 - mysql 删除以某字符串开头的表
		
Select 'SET FOREIGN_KEY_CHECKS = 0;'unionSelect CONCAT( 'drop table ', table_name, ';' )FROM informa ...
 
随机推荐
- HBase MultiVersionConsistencyControl
			
注明:本文部分文字和图片翻译或引用自http://blogs.apache.org/hbase/entry/apache_hbase_internals_locking_and. HBase在保证高性 ...
 - cryptopp开源库的使用(零):windows下使用visual studio编译
			
编译相当简单:打开目录下的sln文件直接编译即可,官方支持到vc2012,我使用vs2013也没有错误,优秀的开源库总是便于使用. 编译的时候注意运行库得选择需要跟使用该库的保持一致,否则会出现重定义 ...
 - C++开源小贱鸡(simsimi api)
			
小贱鸡 这是一个基于Qt C++的跨平台聊天软件,源于群里面玩这个的很多. 你需要一个Qt环境编译程序以便使用. 下载:http://pan.baidu.com/s/1gdnDgC7 项目地址:htt ...
 - 数组在C++和java中的区别
			
几乎所有的程序设计语言都支持数组.在C和C++中使用数组是很危险的.因为C和C++中的数组就是内存块.如果一个程序要访问其自身内存块之外的数组,或者在数组初始化之前使用它,都会产生难以预料的后果. j ...
 - maven + selenium + jenkins 教程收集
			
maven + selenium + jenkins 教程收集 Complete Guide for Selenium integration with jenkins Maven http://le ...
 - windows 编程 —— 消息与参数(定时器、初始化消息、改变大小)
			
目录: 定时器 WM_TIMER 初始化消息 WM_CREATE 改变大小 WM_SIZE 定时器: 接收消息:WM_TIMER 参数wParam:wParam参数等于定时器的ID值(上述情形为1). ...
 - js给页面加style
			
今天做项目时遇到一个问题,我的a.jsp引入了b.jsp,c.jsp也引入了b.jsp,而b.jsp里面的style是根据引入的不同动态改变的(在a.jsp.c.jsp中写js改变).网上找了好多代码 ...
 - hdu 4540 威威猫系列故事——打地鼠 dp小水题
			
威威猫系列故事——打地鼠 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...
 - JQuery属性过滤(转)
			
属性过滤(Attribute Filters)的内容就是html元素中的属性 其包括以下几个选择器: [attribute] [attribute=value] [attribute!=value] ...
 - 数据结构 - 求二叉树中结点的最大距离(C++)
			
// ------BTreeMaxNodeLength.cpp------ #include <iostream> using namespace std; template <cl ...