如何对表的一部分使用mysqldump?


68

所以我只能导出这样的表:

mysqldump -u root -p db_name table_name > table_name.sql

有什么办法可以用mysqldump导出表的一部分?例如,0-1,000,000行,1,000,000-2,000,000行,等等。

我应该使用mysqldump还是查询来执行此操作?

Answers:


137
mysqldump -uroot -p db_name table_name --where='id<1000000'

或者你可以使用

SELECT * INTO OUTFILE 'data_path.sql' from table where id<100000

6
如果将其用于任何形式的增量备份,请确保包括在内,--skip-create-options并且可能--skip-add-drop-table只是为了安全起见。否则,您将从所有现有表中删除所有行。
ebyrob

2
您忘记提及-t> dump_file_name.dump,所以它应该像;mysqldump -t -uroot -p db_name table_name -w"id<1000000" > file_name.dump
阿努姆·谢拉兹

第一个解决方案似乎不允许联接表,而只转储特定的表?第二个使用联接表和转储特定表。但是输出不能直接转回到SQL。反正到处走走?谢谢。
HCSF

如果您需要在where子句中使用引号,只需使用双引号:--where='name="foo"'
Daan

4
mysqldump --skip-triggers --compact --no-create-info --user=USER --password=PASSWORD -B DATABASE --tables MY_TABLE --where='SOME_COLUMN>=xxxx' > out.sql

2

转储的文件与您使用SQL选择的文件不同。对于第二种方法,您不能简单地使用:mysql database <table将表转储到数据库中。


0

就我而言,我已经执行了:

SELECT * 
  INTO OUTFILE 'C:\Documents and Settings\Anton.Zarkov\Desktop\joomla_export\data_AZ.sql'
  FROM `jos_glossary`
 WHERE id>6000
  • 没有语法错误-查询通过。
    1. 结果是NULL-没有写入行。(我确定-最后的ID是6458)
    2. 如果我重复查询n error occurs => #1086 - File 'C:Documents and SettingsAnton.ZarkovDesktopjoomla_exportdata_AZ.sql' already exists
    3. 不幸的是,我在磁盘C的任何位置都找不到“现有”文件。它在哪里?

条件是: phpMyAdmin SQL Dump;版本3.4.5; 主机:localhost; 服务器版本:5.5.16; PHP版本:5.3.8


这是因为你需要用双斜线写路径: 'C:\ Documents和Settings \\ \\ Anton.Zarkov桌面\\ \\ joomla_export data_AZ.sql'
阿列克^ h

0
mysqldump -uroot -p db_name table_name --where'id<1000000' > yourdumpname.sql

回滚您更改为接受的答案,因为:文档使用=where选项dev.mysql.com/doc/refman/8.0/en/…(与5.7 dev.mysql.com/doc/refman/5.7/en相同)/…)。替代方法是--where 'condition'--w'condition'但您当前的版本--where'condition'提供mysqldump: unkown option '--wherecondition'。如果特定版本存在差异,请指定条件。
弗雷德里克·克莱恩

0

下面的查询是从ID范围中选择,您可以使用date_created或任何代替ID

mysqldump --opt --host=dns --user=user_name --password=your_passwd db_name --tables table_name  --where "id > 1 and id < 100 " > /file_name.sql

例如:--where="date_created > '2019-01-18' "->插入ID


0

这个问题一如既往地是当前的,大多数人会发现这类问题,因为它们受到mysql和mysqldump的单线程设计的困扰。
如果您有数百万或数十亿的行,则导出可能需要几天(甚至几周)的时间,因此最终只能导出部分数据。

解决此问题的快速方法是导出部分数据,如果您拥有数字键(例如自动增量ID),这将是最好的选择。
下面是一个关于如何以比正常情况下快20到100倍的速度导出表的linux / unix示例。

Assumed column "id" is from 1 to 10000000
Assumed cpu has 16 threads
Assumed disk is an ssd or nvme
seq 0 1000 | xargs -n1 -P16 -I{} | mysqldump -h localhost --password=PASSWORD --single-transaction DATABASE TABLE --where "id > {}*10000 AND id < {}*10000+10000" -r output.{}

上面的代码将运行16个线程,大约可以减少导出到正常线程的1/10的时间。它创建16个文件,这些文件也可以并行加载,最多可以加载10次。
在强大的服务器上,我最多使用150个并行线程,这取决于您正在运行的磁盘和cpu的类型。
这种方法经过一些改进,可以将1周出口的负载或出口减少到几个小时。

通过网络执行--compress可以有很大帮助,忽略插入语句也将有助于处理错误的mysql索引,这对于大数据是无法避免的。使用“ mysql -f”加载数据进一步有助于避免在这种情况下停止。

PS绝不使用mysql选项在大型表的末尾添加索引和键。

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.