![](/img/trans.png)
[英]News database with comments, how to get rid of duplicates - with mysql and PHP?
[英]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.