mysqldump-仅导出结构而没有自动增量


87

我有一个MySQL数据库,我试图找到一种仅导出其结构而没有自动递增值的方法。mysqldump --no-data几乎可以完成这项工作,但是会保留auto_increment值。有没有不用PHPMyAdmin就能做到的方法(我知道它可以做到)?


看起来与MySQL 5.5(服务器)类似,--no-data默认情况下会省略auto_increment值。
Joey Adams

您确定@JoeyAdams吗?那不是我所经历的行为
2016年

2
@JoeyAdams MySQL 5.7。*的mysqldump在使用--no-data时不会忽略auto_increment。
Tiberiu-Ionuț Stan,

Answers:


68

你可以这样做 :

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql

正如其他人所提到的,如果你想sed以正常工作,添加g(用于这样叶形更换)参数:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql

(如果您已经安装了GUI工具这仅适用:mysqldump --skip-auto-increment

新的更新感谢评论。

\b是无用的,有时候会打破命令。请参阅此SO主题以获取解释。因此,最佳答案是:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql

11
我认为这不是--skip-auto-increment真正的选择。我在文档中找不到它。此问题的两个MySQL错误均未提及:2078630957。哪个版本的mysqldump具有此选项?
Rich

1
--skip-auto-increment如果没记错的话,是在MySQL GUI工具中添加的一个选项。(不确定^^)所以实际上这并不是一个解决方案!但是第二个内联命令是正确的,我在这里创建了有关自动增量问题的主题,并提供了sed过滤的想法!
JoDev

4
如果导出多个表(仅最后一个表),则Sed选项不会删除所有自动增量。另外,-skip-auto-increment不是现有选项。这个答案如何得到如此高的评价?
Lex

3
sed命令的末尾需要a:sed's /.../.../ g'来替换所有出现的内容。
p91paul 2015年

该命令不正确。--skip-auto-increment不存在。正则表达式不正确。正如p91paul指出的那样,需要添加g修饰符以替换所有出现的内容。请使用@JohnW解决方案。
Aalex Gabi

52

JoDev的答案对sed正则表达式进行了少许调整,对我来说非常有效:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql

1
是的,我不确定\bsed语句中的作用是什么,但是按照@JohnW的建议,删除该开关也对我有用。
戴维

4

它是--create-options,默认情况下包含在--opt中,它会生成AUTO_INCREMENT表定义。

如果只想要基表,

mysql -hlocalhost -uuser -ppass --skip-column-names --batch \
    -e "select table_name from tables where table_type = 'BASE TABLE' and table_schema = 'schemaname'" INFORMATION_SCHEMA \
| xargs mysqldump -hlocalhost -uuser -ppass \
    --no-data --skip-triggers --skip-opt --no-create-db \
    schemaname

如果您还需要视图,触发器和例程,

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname

3
请注意,这也将丢弃所有的自动递增字段,drop tableS,字符集,等等
迪安娜

2

感谢这篇文章,我得以回答我的问题:

如何对数据库进行版本控制?

然后我刚刚创建了这个脚本: db_bkp.sh

#!/bin/sh
filename="db_structure.sql"
backupfolder="/var/www/"
fpath="$backupfolder/$filename"
usr="DBUSER"
pass="DBPASS"
db="DBNAME"
mysqldump --user=$usr --password=$pass --no-data $db | sed 's/ AUTO_INCREMENT=[0-9]*//g' > "$fpath"

然后我将其添加到crontab中:

30 5 * * * sh /home/scripts/db_bkp.sh

然后在我的仓库中,我将结果添加db_structure.sql到git中,然后在将更改推送到产品之前,我总是检查是否忘记了对所有数据库执行的结构更改。


-1

mysqldump -u [用户] -p [密码] -d --skip-opt-单事务[DB_SCHEMA]> [FILE.ESTENSIONE]


6
这还将删除其启用字段上的auto_increment标志,而不仅仅是结尾处的auto_increment值。
Aquarion'4

--skip-opt这里这里
克里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.