最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Mysql删除表名中有特殊字符的表

来源:动视网 责编:小采 时间:2020-11-09 08:15:23
文档

Mysql删除表名中有特殊字符的表

Mysql删除表名中有特殊字符的表:欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 由于公司业务和应用的调整,之前在Mysql中的很多表都不需要了,故需要对数据库进行整理。 刚开始,我在想:不就删除一些表吗?很好解决,写个简单的脚本就可以了。我先看了数据库中有80000多个表
推荐度:
导读Mysql删除表名中有特殊字符的表:欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 由于公司业务和应用的调整,之前在Mysql中的很多表都不需要了,故需要对数据库进行整理。 刚开始,我在想:不就删除一些表吗?很好解决,写个简单的脚本就可以了。我先看了数据库中有80000多个表


欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 由于公司业务和应用的调整,之前在Mysql中的很多表都不需要了,故需要对数据库进行整理。 刚开始,我在想:不就删除一些表吗?很好解决,写个简单的脚本就可以了。我先看了数据库中有80000多个表,很

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入

  由于公司业务和应用的调整,之前在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的左边的字符,试了一下,果然成功了。

  于是,我将脚本中的 $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删除表名中有特殊字符的表:欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 由于公司业务和应用的调整,之前在Mysql中的很多表都不需要了,故需要对数据库进行整理。 刚开始,我在想:不就删除一些表吗?很好解决,写个简单的脚本就可以了。我先看了数据库中有80000多个表
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top