我正在尝试创建一个简单的结构,只转储我的数据库。使用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)
答案 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
?
答案 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的要求。 (不完全是,我明白了)
编辑:一分钟后,我意识到,这是 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} | \ * /“瞧!代码中的漂亮颜色;)