86

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

4

14 回答 14

173

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

采取这一行:

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

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

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

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

于 2009-12-16T20:27:30.973 回答
41

我知道这是一个古老的问题,但至少这里有一个答案。我也找不到在 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'
于 2011-12-28T15:14:00.887 回答
34

试试--skip-comments

谢谢

编辑:

我明白了..试试这个

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

尝试删除一些选项,直到获得所需的结果,基本上这与--compact没有相同--skip-comments

--skip-comments删除与版本和东西有关的评论..

于 2009-12-16T17:55:34.077 回答
20

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

信息在这里

于 2009-12-16T17:49:24.930 回答
13

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

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

于 2009-12-16T19:03:48.900 回答
4

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

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

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

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

使脚本更“舒适”地阅读。

如果您尝试在比“注释”中指定的版本更新的版本中运行“舒适”脚本,则会收到错误消息。

于 2011-08-02T15:44:16.503 回答
2

保留条件执行注释非常重要。但是,如果您绝对知道将加载转储的 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
于 2019-09-05T13:41:16.170 回答
1

利用--dump-date=FALSE

完全符合 OP 的要求。(不完全是,我明白了)

来源:mysqldump 选项摘要

编辑:一分钟后我意识到,这不是要寻找的,而是离开这里......希望有人可以使用它:这条日期线破坏了源代码控制,因为它总是在变化......

于 2019-01-22T16:11:24.680 回答
0

如果您在尝试将您的 structure.sql 文件包含在 git/github 中时偶然发现了这个答案,您可以在 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
于 2013-04-03T01:12:03.307 回答
0

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

于 2009-12-16T18:08:22.867 回答
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

它会删除所有这样的行:

/*!....... */;
于 2009-12-16T18:48:27.820 回答
0

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

你只需要:

npm install -g @luissquall/dbdump

# Redirect output to a file
dbdump -u user -p -d database > struct.sql
于 2015-06-02T15:03:36.173 回答
-1

我不知道这是否是您要查找的内容,我只是想摆脱所有 mysql 注释以便能够使用语法荧光笔,我使用了一个简单的正则表达式并将所有内容替换为以下 "/\*![ 0-9]{5}|\*/" 瞧!代码中的漂亮颜色;)

于 2013-10-07T14:13:27.137 回答
-1

正如@Ollie 和其他一些人所指出的,这些是以注释风格编写的条件执行标记,但有其用途。没有它们,您可能会遇到重新创建具有严格强制外键约束的表的问题。例如,表 A 对表 B 具有 FK,因此在表 B 这样做之前无法创建表 A,依此类推。如果不禁用密钥检查,您可能永远无法重新创建它们,具体取决于您的表顺序是如何被罚款的。

于 2015-07-22T16:27:23.953 回答