摘自: http://www.itpub.net/thread-1739304-1-1.html
请问
mysql高
手:为了获得数据一致性,myisam使用lock-table,innodb使用single-transaction,而这两个参数是互斥的,如果一
个库里面这两种表都有,怎么一致的导出呢?还有个问题,为了方便增量备份,要执行flush
logs生成新日志文件。那么是在锁表后备份前做呢,还是在备份后解锁前做呢?抑或是两者一样效果?
首先你对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,就是你所谓的增量。
先谢谢楼上的回答,我的问题就是在一个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;还是说两者效果一样?楼上的回答同样没有说明。最好给个实际可行的代码更有说服力。
阅读(1391) | 评论(0) | 转发(0) |