查看: 9788|回复: 8

mysqldump 同时导出myisam和innodb的问题

[复制链接]
wxy0327 该用户已被删除
跳转到指定楼层
1#
发表于 2012-11-15 17:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
请问mysql高手:为了获得数据一致性,myisam使用lock-table,innodb使用single-transaction,而这两个参数是互斥的,如果一个库里面这两种表都有,怎么一致的导出呢?还有个问题,为了方便增量备份,要执行flush logs生成新日志文件。那么是在锁表后备份前做呢,还是在备份后解锁前做呢?抑或是两者一样效果?
论坛徽章:
1
紫蛋头
日期:2013-01-10 11:05:26
9#
发表于 2012-12-3 13:54 | 只看该作者
只要在楼主的带领下,社区就有希望了。

使用道具 举报

回复
论坛徽章:
3
迷宫蛋
日期:2013-01-18 08:52:192013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-09-05 06:00:03
8#
发表于 2012-11-21 08:56 | 只看该作者
基于你描述的情况:‘一个mysql应用中有多个库,在这多个库里既有myisam表也有innodb表’
为了了到有效的备份,你可以这样做:
  1、flush tables;             --确保备份过程中不会被后台进程再修改   
  2、两种方案可选择:
     1)执行 mysqldump --lock-all-tables  --flush-logs --master-data=2 --all-databases > backup.sql          (get a full backup)
        2)执行  mysqldump --single-transaction   --flush-logs --master-data=2  --databases db1 db2 db3  > backup.sql

3. over!
                  

使用道具 举报

回复
招聘 : 其它语言研发
论坛徽章:
7
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:222012新春纪念徽章
日期:2012-01-04 11:55:05ITPUB 11周年纪念徽章
日期:2012-10-09 18:13:33蛋疼蛋
日期:2013-02-18 16:32:512013年新春福章
日期:2013-02-25 14:51:242014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09
7#
发表于 2012-11-20 19:54 | 只看该作者
直接用xtrabackup 或者ibbackup得了~

使用道具 举报

回复
wxy0327 该用户已被删除
6#
 楼主| 发表于 2012-11-17 16:11 | 只看该作者
感谢楼上的回复,还是阿里系的大牛们给力。结论就是mysqldump --lock-all-table可以一致性导出,无论什么存储引擎。其实从lock-all-table参数会自动turn off   --lock-table 和 --single-transaction就可以看出些端倪。至于flush-log,两种不同顺序的写法是没有太大区别。

使用道具 举报

回复
论坛徽章:
0
5#
发表于 2012-11-17 10:46 | 只看该作者
lock-all-table 表示把所有的库,表都锁住了,此时不允许写入,MyISAM和InnoDB肯定是一致的。

flush tables with read lock;flush logs;cp.....;unlock table;还是flush tables with read lock;cp......;flush logs;unlock table;
这两种方式都没有问题。重要的是,你恢复数据库以后,从备份库的哪个位置开始应用binlog。

具体一点来说。备份是做什么用的列?它是为了恢复用的,首先,将所有的数据逻辑导入。这里并没有完,你保证了MyISAM和InnoDB或者其他引擎的一致性,没问题。因为备份完成后,你就解锁了,数据又有变更。你如果先把后面的这些变更赶上,那么就必须从备份库的某一个位置开始应用binlog。这个位置必须在lock table 和unlock table之间记录,只有在这段时间内,binlog是不变的,也正是在这段时间内,你把所有的数据拷贝出去了。所以,flush logs在你说的这两种情况下,并没有太大的区别。它只是在当前binlog最末尾的位置上加上Rotate Event,提示下一个binlog文件是谁。而你恢复的时候是从文件的末尾开始恢复,还是从下一个文件的开头位置恢复都没有问题。因为这里的binlog并不设计到业务数据的变化。
这里应该没有必要看MySQL的源码,你直接试试在lock和unlock之间,flush logs,然后用mysqlbinlog看看它做了什么事情就好了

使用道具 举报

回复
wxy0327 该用户已被删除
4#
 楼主| 发表于 2012-11-17 08:08 | 只看该作者
本帖最后由 wxy0327 于 2012-11-17 08:15 编辑

先谢谢楼上的回复,原理都对,但并没有回答我的问题。我就是想知道,在一个应用中既使用了myisam表又使用了innodb表,使用mysqldump得到一个同时保证myisam和innodb一致性的逻辑导出,这个怎么写。换句话说,lock-all-table能否确保innodb的一致性。其次指出一点与楼上不同的理解:“它的含义是在备份结束后会结束当前的binlog,生成一个新的binlog”,而mysql手册中的描述是:

?--flush-logs, -F
Flush the MySQL server log files before starting the dump. This option requires the RELOAD privilege. If you use this option in combination with the --all-databases option, the logs are flushed for each database dumped. The exception is when using --lock-all-tables or --master-data: In this case, the logs are flushed only once, corresponding to the moment that all tables are locked. If you want your dump and the log flush to happen at exactly the same moment, you should use --flush-logs together with either --lock-all-tables or --master-data.

写的是在dump前flush log,这也正是我的问题:在自己写脚本的时候,是flush tables with read lock;flush logs;cp.....;unlock table;还是flush tables with read lock;cp......;flush logs;unlock table;还是两者一样没有区别呢?楼上同样没有回答。还是用实际可行的代码更有说服力。

使用道具 举报

回复
wxy0327 该用户已被删除
3#
 楼主| 发表于 2012-11-17 07:55 | 只看该作者
先谢谢楼上的回答,我的问题就是在一个mysql应用中有多个库,在这多个库里既有myisam表也有innodb表,这时要用mysqldump得到一个一致性的逻辑导出应该怎么写?换句话说,就是lock-all-table能否确保innodb表的一致性,楼上的回答并没有说明。再有指出与楼上的一点不同理解:“它的含义是在备份结束后会结束当前的binlog,生成一个新的binlog”,而mysql手册上对于这个参数的描述是这样的:
•--flush-logs, -F
Flush the MySQL server log files before starting the dump. This option requires the RELOAD privilege. If you use this option in combination with the --all-databases option, the logs are flushed for each database dumped. The exception is when using --lock-all-tables or --master-data: In this case, the logs are flushed only once, corresponding to the moment that all tables are locked. If you want your dump and the log flush to happen at exactly the same moment, you should use --flush-logs together with either --lock-all-tables or --master-data.

写的是在dump前flush log,这也就是我的问题,自己写脚本时,是flush table with read lock; flush logs;cp.........;unlock table;还是 flush table with read lock; cp.........;flush logs;unlock table;还是说两者效果一样?楼上的回答同样没有说明。最好给个实际可行的代码更有说服力。

使用道具 举报

回复
论坛徽章:
3
迷宫蛋
日期:2013-01-18 08:52:192013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-09-05 06:00:03
2#
发表于 2012-11-16 09:32 | 只看该作者
首先你对lock-table和single-transaction这两个参数的理解不对,lock-table有两个参数--lock-tables和--lock-all-tables,--lock-tables是锁定某个库的所有表,如果你只备份一个库,如mysql库,使用,--lock-tables就是锁定mysql中的所有表,而不会锁定其他库的表。而如果你的备份会涉及多个库,为了获得备份数据的一致性,你得用刚才指出的--lock-all-tables来锁定所有库的表。

其次,要说明一点,mysqldump这个工具,其备份方式是逻辑备份,对存储引擎无选择性,也就是说,不管是什么引擎都通吃。


再者就是single-transaction,它的含义是以事务的方式来做你所指定的备份,和锁表的方式相比,它的优点在于不一次锁定所有所需的表,而且能够保证所得到的备份时一致的,因为这个备份是在一个事务内完成的。但其不便就是,当备份对象很大的时候,其事务也会变得很大,对涉及到事务的相应对象,比如回退段影响大。


最后说明一下flush logs,在mysqldump的时候指定--flush-logs选项,它的含义是在备份结束后会结束当前的binlog,生成一个新的binlog,而这个新的binlog,就是你所谓的增量。

使用道具 举报

回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表