我有一个 MySQL 数据库,我正在尝试找到一种方法来仅导出其结构,而不导出自动增量值。
mysqldump --no-data
几乎可以完成这项工作,但它保留了 auto_increment 值。有没有办法在不使用 PHPMyAdmin 的情况下做到这一点(我知道它可以做到)?
你可以这样做:
mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql
正如其他人提到的,如果您希望
sed
正常工作,请添加 g
(用于 global replacement)参数,如下所示:
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
JoDev 的答案对我来说非常有效,只需对 sed 正则表达式进行一些小调整:
mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
它是--create-options,默认包含在--opt中,它生成AUTO_INCRMENT表定义。
如果您只想要基表,
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
感谢这篇文章,我能够回答我的问题:
如何对我的数据库进行版本控制?
然后我刚刚创建了这个脚本:
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 之前,我总是检查是否有任何我忘记在所有数据库上进行的结构更改。
mysqldump -u [用户] -p [密码] -d --skip-opt --single-transaction [DB_SCHEMA] > [FILE.ESTENSIONE]