【问题标题】:mysqldump - Export structure only without autoincrementmysqldump - 仅导出结构,没有自动增量
【发布时间】:2013-03-17 09:26:09
【问题描述】:

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

【问题讨论】:

  • 在 MySQL 5.5(服务器)上,--no-data 默认会省略 auto_increment 值。
  • @JoeyAdams 你确定吗?这不是我所经历的行为
  • @JoeyAdams MySQL 5.7.* 的 mysqldump 在使用 --no-data 时不会省略 auto_increment。

标签: mysql export mysqldump database-schema auto-increment


【解决方案1】:

你可以这样做:

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

正如其他人所说,如果您希望sed 正常工作,请添加g(用于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

感谢 cmets 的新更新。

\b 没用,有时会破坏命令。有关说明,请参阅此 SO topic。 所以优化的答案是:

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

【讨论】:

  • 我不认为--skip-auto-increment 是一个真正的选择。我在documentation 中找不到它。这个问题的两个 MySQL 错误都没有提到它:2078630957。哪个版本的mysqldump有这个选项?
  • --skip-auto-increment 是 MySQL GUI 工具中添加的一个选项,如果没记错的话。 (不确定^^)所以实际上这并不是真正的解决方案!但是第二个内联命令是正确的,我在讨论autoincrement问题的地方创建了here,并提供了sed过滤的想法!
  • 如果您导出多个表,Sed 选项不会删除所有自动增量,仅删除最后一个。此外,--skip-auto-increment 不是现有选项。这个答案是如何获得如此高的评价的?
  • 你需要一个 g 在你的 sed 命令的末尾: sed 's/.../.../g' 来替换所有出现的地方。
  • 此命令不正确。 --skip-auto-increment 不存在。正则表达式不正确。正如 p91paul 所指出的,需要添加 g 修饰符以替换所有出现的情况。请改用@JohnW 解决方案。
【解决方案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

然后在我的 repo 中,我将结果 db_structure.sql 添加到 git 并且在将更改推送到 prod 之前,我总是检查是否有任何我忘记对所有 dbs 进行的结构更改。

【讨论】:

    【解决方案3】:

    它是 --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
    

    【讨论】:

    • 请注意,这也会删除任何自动递增字段、drop tables、字符集等。
    【解决方案4】:

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

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

    【讨论】:

    • 是的,我不确定\b 在 sed 语句中做了什么,但根据@JohnW 的建议,删除该开关也对我有用。
    【解决方案5】:

    mysqldump -u [USER] -p [PASSWORD] -d --skip-opt --single-transaction [DB_SCHEMA] > [FILE.ESTENSIONE]

    【讨论】:

    • 这还将删除启用它的字段上的 auto_increment 标志,而不仅仅是最后的 auto_increment 值。
    • --skip-opt 讨论了herehere.
    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    相关资源
    最近更新 更多