我怎样才能摆脱MySQL转储这些评论?
我试图创build一个简单的结构只有我的数据库转储。 使用mysqldump
给了我一个像这样的结果:
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS `foo`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */;
无论我尝试什么,我似乎都无法摆脱这些评论。
我正在使用: mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql
编辑:但我希望保留其他意见,如-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)
哇! 即使这样看,这些也不是真正的评论。 它们是条件执行令牌。
采取这一行:
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
如果mySQL的版本是4.00.14 或更高 ,那么MySQL服务器将运行这个语句。
这个神奇的注释语法logging在手册的注释语法部分。
你可能不想摆脱这个东西。
我知道这是一个古老的问题,但至less这是一个答案。 我也无法在mysqldump中find一个标志来删除条件注释,或者确实是一个更好的选项来设置这些注释的最小mysql版本。 如果你只是想要全部使用它们,你可以使用grep或者sed(sed leaves blank lines,grep不会):
mysqldump ... | grep -v '^\/\*![0-9]\{5\}.*\/;$' mysqldump ... | sed -e 's/^\/\*![0-9]\{5\}.*\/;$//g'
为了回答我自己希望有条件地删除依赖于mysql版本的注释,请使用其中的一个(删除任何有关<mysql5)的注释:
mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$' mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g'
试试--skip-comments
?
谢谢
编辑:
我明白了,试试这个
--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset
玩耍,删除一些选项,直到你得到所需的结果,基本上这是一样的 – --compact
没有--skip-comments
--compact
--skip-comments
--skip-comments
删除有关的版本和东西的意见..
从技术上讲,你试图摆脱的路线不是评论。 他们在开始时暂时修改一些variables,然后在最后将它们重置为以前的值。
在你的情况下,它们不是非常有用(但它们也是无害的),因为你正在使用–no-data,但是我认为值得一提的是这些行确实起到了一个目的,而不仅仅是注释。
你有没有尝试快捷方式 – --compact
?
信息在这里 。
那些不是评论,那部分脚本的执行取决于你的mysql的版本。
您可以删除“评论部分”,如
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */
至
SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0
使脚本更“舒适”的阅读。
如果您尝试在比“comment”中指定的版本更新的版本中运行“舒适”脚本,则会出现错误。
既然你在Windows上,如果没有人find更好的解决scheme,那么你可以使用Python脚本:
import re, sys sql = sys.stdin.read() regex = re.compile(r'/\*![^\n]* \*/;\n', re.M) print regex.sub('', sql)
使用命令行:
python program.py < your.sql > output.sql
它删除所有这样的行:
/*!....... */;
如果你试图在git / github中包含你的structure.sql文件,你可能会发现这个答案很糟糕,你可以在rake db之后使用下面的代码去掉自动增量:structure:dump
# Remove beginning auto increments to prevent merge conflicts filename = 'db/structure.sql' File.atomic_write(filename) do |output| File.open(filename, 'rb').each do |input| output.write(input.gsub(/\s+AUTO_INCREMENT=\d+\s+/, ' ')) end end
另一个select是,如果你使用vi / vim,并且需要一个快速和肮脏的方式来保存语句内容,但是需要使用括号注释:
: %s/\/\*!\d\+\s//g : %s/\*\///g
(只有在mysqldump
上才是安全的,因为它会对结尾*/
注释标记进行核对,但是至less从5.5开始,用户可读的注释使用了行注释语法)。
可能运行一个正则expression式来删除包含40014或40111等的行
不是一个直接的答案 – 但我已经彻底抛弃mq-parallel-dump直接mysqldump – 它更快(产生多个进程),并根据你将要做的转储输出,更灵活,因为它有效地封装mysqldump和'select成outfile“语法。
我使这个脚本规范了转储,包括删除条件注释: https : //github.com/luissquall/dbdump 。
你只需要:
npm install -g @luissquall/dbdump # Redirect output to a file dbdump -u user -p -d database > struct.sql
正如@Ollie和其他一些人所指出的那样,这些是以评论风格写的有条件执行的标记,但是起到了一定的作用。 没有他们,你可能会遇到重新执行外键约束重新创build表的问题。 例如,表A具有用于表B的FK,因此表A不能被创build,直到表B等等。 在不禁用密钥检查的情况下,您可能永远无法重新创build它们,这取决于您的表格命令是如何处理的。
我不知道这是你在找什么,我只是想摆脱所有的mysql注释的东西,能够使用语法荧光笔,我用一个简单的正则expression式,并全部replace下面的“/ \ *![ 0-9] {5} | \ * /“和瞧! 代码中的漂亮颜色;)