繁体   English   中英

我怎样才能摆脱 MySQL 转储中的这些评论?

[英]How can I get rid of these comments in a MySQL dump?

我正在尝试创建一个简单的结构,仅转储我的数据库。 使用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服务器将运行此语句。

此魔术注释语法记录在本手册的“ 注释语法”部分中。

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

我知道这是一个古老的问题,但至少这是一个答案。 我也找不到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'

试试--skip-comments

谢谢

编辑:

我明白了..试试吧

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

在你得到想要的结果之前,可以去除一些选项,基本上这与--compact没有--skip-comments

--skip-comments删除与版本和内容相关的注释。

你试过快捷方式选项--compact吗?

这里的信息

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

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

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

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

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

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=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

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

由于您使用的是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

它会删除所有这样的行:

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

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

你只需要:

npm install -g @luissquall/dbdump

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

保持条件执行注释非常重要。 但是如果您完全知道将加载转储的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

我使用以下多行 Perl 正则表达式从我的转储文件中删除这些行:

perl -0pie 's/\/\*\!\d+(.*?)\*\//\1/gms' dump.sql

我发现其他sed解决方案在我的触发过程跨越多行的情况下不够用。

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

使用--dump-date=FALSE

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

来源: mysqldump选项摘要

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM