92

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

4

5 回答 5

76

你可以这样做 :

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
于 2013-03-27T10:22:20.580 回答
54

JoDev 的回答对我来说非常有效,只需对 sed 正则表达式进行小幅调整:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
于 2014-10-12T18:09:30.157 回答
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
于 2014-07-08T22:09:49.097 回答
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 中,在将更改推送到 prod 之前,我总是检查是否有任何我忘记对所有 dbs 进行的结构更改。

于 2016-06-28T19:29:30.787 回答
-2

mysqldump -u [用户] -p [密码] -d --skip-opt --single-transaction [DB_SCHEMA] > [FILE.ESTENSIONE]

于 2014-03-14T15:37:44.207 回答