mysqldump entire structure but only data from selected tables in a single command

穿精又带淫゛_ 提交于 2019-12-20 08:09:40

问题


My database has 3 tables: table1, table2 and table3

I would like to do a mysqldump on this database with the following conditions:

  • Dump structure for all tables
  • Only dump data for table1 and table2, ignore data in table3

Currently, I do this with 2 mysqldump statements

mysqldump -u user -p -d db > db_structure.sql
mysqldump -u user -p db --ignore-table=db.table3 > table1_and_table2_data.sql

Import them in the same order they were dumped (structure, then data from table1 and table2)

Is there a way to combine this into a single mysqldump command?


回答1:


You can't combine them in one command but you can execute both commands at the same time and output to the same file.

mysqldump -u user -p --no-data db > structure.sql; mysqldump -u user -p db table1 table2 >> structure.sql

to avoid having to enter the password twice you can do -ppassword (note the lack of space!). Also use --no-data in the first command or you end up with the data as well. -d isn't needed when you're doing just one database.




回答2:


Given you may want to pipe the output to another command, as I did, instead of just redirecting to a file and appending to that file in the next command, you could try (modified from the example of stask):

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
your_command

... in my case:

(mysqldump -u $1 -p$2 -d db && mysqldump -u $1 -p$2 db --ignore-table=db.table3) |\
gzip -9 > filename.sql.gz

Enclosing the two mysqldump commands in parentheses creates a subshell whose output we pipe into gzip and then redirect that into a file.

PS: I've also been unable to combine it into one single mysqldump invocation, though.




回答3:


I don't think you can do it in one command. But you definitely can merge the output to one file. Why not to wrap it in some shell script that does following:

mysqldump -u $1 -p$2 -d db > dump.sql && mysqldump -u $1 -p$2 db --ignore-table=db.table3 >> dump.sql

You will run this script with two parameters: username and password.




回答4:


It's actually pretty simple, use --where clauses on the tables where you don't want data and give it an always false condition. For instance, load data on foo and gah and only schema on bar:

mysqldump -u ... -p... myDatabase foo bar --where='1=2' gah > myfile.sql

So YES you can do this on one line.




回答5:


You can remove the INSERT INTO ... part:

mysqldump \
  --opt \
  -u ${DB_USER} -p${DB_PASS} \
  ${DB_NAME} \
  | grep -v 'INSERT INTO `table3`' \
  | grep -v 'INSERT INTO `table4`'


来源:https://stackoverflow.com/questions/1764387/mysqldump-entire-structure-but-only-data-from-selected-tables-in-a-single-comman

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!