V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
killerv
V2EX  ›  MySQL

mysqldump 导出数据库不完整?

  •  
  •   killerv · 2015-04-08 16:17:55 +08:00 · 8340 次点击
    这是一个创建于 3508 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    23 条回复    2015-04-09 20:01:27 +08:00
    march1993
        1
    march1993  
       2015-04-08 16:42:36 +08:00
    你 mysqldump 命令怎么打的
    killerv
        2
    killerv  
    OP
       2015-04-08 16:45:13 +08:00
    @march1993 mysqldump -u username -p dbname > sqlfile
    xiaowu365
        3
    xiaowu365  
       2015-04-08 16:56:22 +08:00
    这不科学
    Mac
        4
    Mac  
       2015-04-08 17:14:43 +08:00
    mysql 的用户权限?你用的是root帐号?
    cst4you
        5
    cst4you  
       2015-04-08 17:40:09 +08:00
    大的还是直接拷data目录吧...
    caixiexin
        6
    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
        7
    imydou  
       2015-04-08 17:43:03 +08:00 via iPhone
    @cst4you data目录怎么还原数据?
    bjzhush
        8
    bjzhush  
       2015-04-08 17:53:19 +08:00
    有些特殊字符或者二进制的内容在数据库里面,即使导出了也不能正确导入
    lincanbin
        9
    lincanbin  
       2015-04-08 17:54:12 +08:00
    @imydou 复制粘贴data,适用于myisam。
    你mysqldump前有没有关闭所有可能正在使用mysql的服务?
    cst4you
        10
    cst4you  
       2015-04-08 18:35:40 +08:00
    @lincanbin 对...不适用于 innodb
    kn007
        11
    kn007  
       2015-04-08 18:59:43 +08:00
    @lincanbin
    @cst4you
    不对吧, innodb一样支持复制黏贴data目录,相同my.cnf(或者innodb段一致)就行了。。
    我自己一直通过这种方式。
    kn007
        12
    kn007  
       2015-04-08 19:02:09 +08:00
    另外我完整备份数据库的语句:
    mysqldump -h localhost -uroot -proot --lock-all-tables --all-databases > ALLDB.sql
    killerv
        13
    killerv  
    OP
       2015-04-08 19:07:42 +08:00
    @xiaowu365 我也感觉不科学,以前没问题的。
    @Mac 不是root账号
    @cst4you 感觉不太靠谱啊,很容易出问题吧=。=

    @caixiexin 我也没注意,sql文件比较大,后来使用navicat导出的,速度很慢,不过很完整。非常感谢你的回复。^^
    @bjzhush 应该是没有二进制内容的
    @lincanbin 没有关闭,php还在使用mysql,难道是这个原因?
    killerv
        14
    killerv  
    OP
       2015-04-08 19:13:50 +08:00
    @kn007 你这么做很严谨,我写的时候太随意了,估计有可能是这个问题,备份的时候不锁定表的话,无法保证数据库完整性,但是不至于出错吧?
    julyclyde
        15
    julyclyde  
       2015-04-08 19:17:11 +08:00
    @kn007 那只是你以为可以。实际上不可以
    kn007
        16
    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
        17
    kn007  
       2015-04-08 20:15:17 +08:00
    @julyclyde 忘记说了,别忘了log file(ib_logfile),你可以自己去试一次。
    kn007
        18
    kn007  
       2015-04-08 20:15:51 +08:00
    @killerv 不锁定表,可能会不一致,或者被锁表可能不会被备份(这个我确实不知道,我每次都是锁表的)
    cloudzhou
        19
    cloudzhou  
       2015-04-08 21:11:23 +08:00
    这样严谨的做法当然要 lock table 的,在 lock 之后以及进行 flush cache,之后就是文件直接 sync 都是可以的
    caola
        20
    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
    julyclyde
        21
    julyclyde  
       2015-04-08 21:30:01 +08:00
    @kn007 关闭服务之后自然是可以。不过……关闭服务的备份还有意义吗?只有可活体拷贝的数据才是可运维的
    kn007
        22
    kn007  
       2015-04-09 07:36:26 +08:00
    @julyclyde 我备份还锁表呢。
    关闭服务对于我的项目没有问题,前面有mc存储了数据,无法提交的问题,我早就发好公告。而且也选择了尽量少人的时间去做。
    当然可能这些对于你和楼主无法接受吧。看大家跑的东东吧。
    julyclyde
        23
    julyclyde  
       2015-04-09 20:01:27 +08:00
    @kn007 innodb可以不锁,用特殊工具可以拷贝出来。myisam锁全局之后可以直接拷贝文件。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1055 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:23 · PVG 06:23 · LAX 14:23 · JFK 17:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.