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

问题描述 投票:75回答:13

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

mysql export mysqldump
13个回答
144
投票

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

走这条线:

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

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

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

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


0
投票

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

你只需要:

npm install -g @luissquall/dbdump

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

0
投票

使用--dump-date = FALSE

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

资料来源:mysqldump option summary

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


-1
投票

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


-2
投票

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


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'

31
投票

试试--skip-comments

谢谢

编辑:

我明白了..试试吧

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

玩游戏去除一些选项,直到你得到所需的结果,基本上这与没有--compact--skip-comments相同

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


14
投票

你试过快捷选项--compact了吗?

Information here


11
投票

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

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


3
投票

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

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

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

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

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

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


0
投票

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


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

它会删除所有这样的行:

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

0
投票

如果你偶然发现这个答案试图在git / github中包含你的structure.sql文件,你可以在你运行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
© www.soinside.com 2019 - 2024. All rights reserved.