mysqldump 导出数据库不完整?

2015-04-08 16:17:55 +08:00
 killerv

今天导出一个数据库(挺大的)的时候使用mysqldump导出,几秒钟就完了,总感觉不对劲,下载到本地导入后发现少了很多表,楼主现在在用navicat dump sql file。。。

请问有什么好方法快速而又完整的导出数据库?

8161 次点击
所在节点    MySQL
23 条回复
march1993
2015-04-08 16:42:36 +08:00
你 mysqldump 命令怎么打的
killerv
2015-04-08 16:45:13 +08:00
@march1993 mysqldump -u username -p dbname > sqlfile
xiaowu365
2015-04-08 16:56:22 +08:00
这不科学
Mac
2015-04-08 17:14:43 +08:00
mysql 的用户权限?你用的是root帐号?
cst4you
2015-04-08 17:40:09 +08:00
大的还是直接拷data目录吧...
caixiexin
2015-04-08 17:42:36 +08:00
你是在sqlfile文件里发现少了表,还是把sqlfile文件恢复到数据库里少了表呢。
前者的话,检查mysqldump时的日志看看,有没有报错?

如果是后者的话,可能是你两个mysql数据库版本不一样,有些create table语句的语法不支持,从另一个库恢复的时候,create table语句失败了,这个问题手动改下导出的sqlfile文件的建表语句能解决。

这是我dump时候的语句,一般把该加的参数都加上。
mysqldump -h localhost -uusername -ppwssword -P端口号 --master-data=2 --single-transaction --opt --routines --events --triggers database_name
imydou
2015-04-08 17:43:03 +08:00
@cst4you data目录怎么还原数据?
bjzhush
2015-04-08 17:53:19 +08:00
有些特殊字符或者二进制的内容在数据库里面,即使导出了也不能正确导入
lincanbin
2015-04-08 17:54:12 +08:00
@imydou 复制粘贴data,适用于myisam。
你mysqldump前有没有关闭所有可能正在使用mysql的服务?
cst4you
2015-04-08 18:35:40 +08:00
@lincanbin 对...不适用于 innodb
kn007
2015-04-08 18:59:43 +08:00
@lincanbin
@cst4you
不对吧, innodb一样支持复制黏贴data目录,相同my.cnf(或者innodb段一致)就行了。。
我自己一直通过这种方式。
kn007
2015-04-08 19:02:09 +08:00
另外我完整备份数据库的语句:
mysqldump -h localhost -uroot -proot --lock-all-tables --all-databases > ALLDB.sql
killerv
2015-04-08 19:07:42 +08:00
@xiaowu365 我也感觉不科学,以前没问题的。
@Mac 不是root账号
@cst4you 感觉不太靠谱啊,很容易出问题吧=。=

@caixiexin 我也没注意,sql文件比较大,后来使用navicat导出的,速度很慢,不过很完整。非常感谢你的回复。^^
@bjzhush 应该是没有二进制内容的
@lincanbin 没有关闭,php还在使用mysql,难道是这个原因?
killerv
2015-04-08 19:13:50 +08:00
@kn007 你这么做很严谨,我写的时候太随意了,估计有可能是这个问题,备份的时候不锁定表的话,无法保证数据库完整性,但是不至于出错吧?
julyclyde
2015-04-08 19:17:11 +08:00
@kn007 那只是你以为可以。实际上不可以
kn007
2015-04-08 20:12:35 +08:00
@julyclyde 你是说innodb么?我换过几次VPS全部都是data直接过去,我不知道你怎么知道是我以为,而不是我去尝试后,得出来的结论。
我就是确认可以,才专门付费给dropbox去同步整个data目录到dropbox,每次我也是通过dropbox恢复下来的。
如果不行你首先要确认下你ibdata1等这些有没有复制到。
还有就是my.cnf的innodb_data_file_path要一致。我确实试了可以再说的。
我的mysql版本是5.6,从5.5到5.6我都是这样过来的。

如果是说这条语句:
mysqldump -h localhost -uroot -proot --lock-all-tables --all-databases > ALLDB.sql
我自己也是试了可以的。
kn007
2015-04-08 20:15:17 +08:00
@julyclyde 忘记说了,别忘了log file(ib_logfile),你可以自己去试一次。
kn007
2015-04-08 20:15:51 +08:00
@killerv 不锁定表,可能会不一致,或者被锁表可能不会被备份(这个我确实不知道,我每次都是锁表的)
cloudzhou
2015-04-08 21:11:23 +08:00
这样严谨的做法当然要 lock table 的,在 lock 之后以及进行 flush cache,之后就是文件直接 sync 都是可以的
caola
2015-04-08 21:29:15 +08:00
我一般使用:
mysqldump --host=localhost --user=root --password=root --add-locks --add-drop-table --lock-tables --database my_data > my_data.sql

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/182350

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX