如何在MySQL转储中删除这些注释?

时间:2009-12-16 17:47:04

标签: mysql export mysqldump

我正在尝试创建一个简单的结构,只转储我的数据库。使用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)

14 个答案:

答案 0 :(得分:144)

WHOA!这些并不是真正的评论,即使它们看起来那样。它们是条件执行令牌。

采取这一行:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

如果mySQL的版本是4.00.14 或更高,那么MySQL服务器将运行此语句。

这个神奇的注释语法记录在手册的Comment Syntax部分。

你可能不想摆脱这些东西。

答案 1 :(得分:37)

我知道这是一个古老的问题,但至少这是一个答案。我也找不到mysqldump中的标志来删除条件注释,或者确实是为这些注释设置最小mysql版本的更好选项。如果你只想把它们全部核对,你可以使用grep或sed(sed留空行,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'

答案 2 :(得分:30)

试试--skip-comments

由于

修改

我明白了..试试这个

--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

在获得所需结果之前,请尽量删除部分选项,基本上与没有--compact

--skip-comments相同

--skip-comments删除与版本和内容有关的评论..

答案 3 :(得分:13)

您是否尝试过快捷方式选项--compact

Information here

答案 4 :(得分:11)

从技术上讲,你试图摆脱的线路不是评论。他们在开始时暂时修改一些变量,然后将它们重置为最后的前一个值。

在你的情况下它们不是很有用(但它们也是无害的),因为你正在使用--no-data,但我认为值得一提的是这些线条确实有用,而不仅仅是评价。

答案 5 :(得分:3)

这些不是注释,脚本部分的执行取决于你的mysql的版本。

您可以删除“评论部分”,例如

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

让脚本更“舒适”阅读。

如果您尝试在比“评论”中指定的版本更新的版本中运行“舒适”脚本,则会出现错误。

答案 6 :(得分:1)

使用--dump-date = FALSE

确切执行OP的要求。 (不完全是,我明白了)

来源:mysqldump option summary

编辑:一分钟后,我意识到,这是 me 并不是在寻找OP,而是在这里……希望有人可以使用它: 此日期行会破坏源代码管理,因为它总是会更改...

答案 7 :(得分:0)

可能在其上运行正则表达式以删除包含40014或40111等的行。

答案 8 :(得分:0)

由于您使用的是Windows,如果没有人找到更好的解决方案,那么您可以改用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

删除所有这样的行:

/*!....... */;

答案 9 :(得分:0)

如果你偶然发现这个问题试图将你的structure.sql文件包含在git / github中,你可以在使用db:db: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

答案 10 :(得分:0)

我制作了这个脚本来规范转储,包括删除条件注释:https://github.com/luissquall/dbdump

你必须:

npm install -g @luissquall/dbdump

# Redirect output to a file
dbdump -u user -p -d database > struct.sql

答案 11 :(得分:0)

保留条件执行注释非常重要。但是,如果您绝对知道,将加载转储的MySQL版本大于或等于创建转储版本的MySQL版本,则可以使用以下命令删除“注释”部分:

sed -r  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g

它将转换诸如

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

SET SQL_MODE=@OLD_SQL_MODE ;

因为这一行必须必须在任何MySQL> = 4.1.1

上运行

请注意,这不会删除多行条件执行注释,例如在转储触发器时。

由于无法预测未来,因此最好将转储带有评论的内容存储起来,并仅在您希望对其进行可视化时将其删除。

mysqldump ... > dump.sql
cat dump.sql | sed -E  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g > dump.no-comments.sql

答案 12 :(得分:-1)

正如@Ollie和其他一些人指出的那样,这些是以评论风格编写的条件执行令牌,但却有目的。如果没有它们,您可能会遇到使用严格强制的外键约束重新创建表的问题。例如,表A对于表B具有FK,因此在表B执行之前不能创建表A,依此类推。在不禁用密钥检查的情况下,您可能永远无法根据表顺序的细化来重新创建它们。

答案 13 :(得分:-2)

我不知道它是不是你在寻找什么,我只是想摆脱所有的mysql评论的东西,以便能够使用语法荧光笔,我用一个简单的正则表达式并用以下“/ \替换所有*![0-9] {5} | \ * /“瞧!代码中的漂亮颜色;)