变化莫测的mysqldump

mysqldump是mysql官方机型逻辑备份的工具,作用非常多,可以进行全量备份,结合binlog还以做增量备份,也是做从库的利器,正确理解它非常有用。
今天列举我目前比较关心的几个点。
1:是否要锁表
默认的情况下它是锁表的,相当于调用—add-locks参数,在每个表备份前后增加LOCK TABLES和UNLOCK TABLES语句,这样数据库表就只读了。
去年我做副库的时候,以防万一,喜欢调用FLUSH TABLES WITH READ LOCK语句,让全库只读,实际上增加—lock-all-tables即可。
难道mysqldump备份的时候,数据库就不能DDL了?锁表是为了避免数据一致性的问题,尤其影响事务,比如东西卖出去了,钱没收到。
其实对于InnoDB来说,完全可以使用—single-transaction参数,这样能够进行一致性读,这样整个库就不会阻塞读写了。
2:做从库
结合—single-transaction,完全可以在主库上进行备份,备份后如何记录pos点呢?总不能手动记录,其实可以使用—master-data选项。
这样导出的sql语句中,会记录CHANGE MASTER TO语句,这样副库导入数据的时候就非常方便了。
3:基于从库备份
主库比较重要,尽量少的影响它,可以基于从库备份,—dump-slave类似于—master-data,也可以记录副库的pos点。
再结合—apply-slave-statements选项,这样连 STOP SLAVE 和START SLAVE 语句也记录到sql文件中了。
4:如何做增量备份
全量备份和增量备份很重要,在做完备份后,如果能够重新刷新二进制文件,这样将来出问题后,先全量恢复,然后基于新的二进制文件进行增量备份,为了达到这个目的,可以使用—flush-logs刷新二进制文件。
当然现实中没有那么完美,避免影响线上服务,以及避免导致数据完整性和一致性很重要。