innobackupex备份过程:
1、根据命令行参数给定的IP,用户名和密码,使用perl-DBI连接到MySQL中,并执行两次版本检查
2、读取配置文件,找到相应的数据和日志文件位置
3、start xtrabackup_log:创建xtrabackup_logfile文件,模拟mysql instance方式,以读写模式打开并读取redo log,
检查当前checkpoint点,从当前checkpoint点位置开始拷贝redo log,同时持续扫描redo log,有新产生的redo log
数据就拷贝到xtrabackup_logfile文件中
4、copy innodb tables .ibd、.ibdata1、undo logs
5、flush no_write_to _binlog tables、flush tables with read lock;
6、copy non-innodb tables .MYD、MYI、.frm、opt、misc files和innodb tables .frm、opt、misc files
7、get binary log file position 写到xtrabbackup_info文件中
8、flush no_write_to_binlog engine logs 在所有事务表和非事务表备份完成,获取全局读锁,且show master status获取binlog pos后,执行刷新redo log buffer中的日志到磁盘中,然后redo log copy线程拷贝最后的redo log日志数据
9、stopping log copying thread 拷贝完成后就停止copy线程并关闭xtrabackup_logfile文件,然后unlock tables释放全局读锁
10、unlock tables
11、备份收尾工作:生成backup-my.cnf、xtrabackup_info等文件,完成后退出innobackupex备份进程
innobackupex备份获得一个一致性备份,会使用flush tables(刷新表缓存),flush tables with read lock(加全局读锁):
1、如果会话中使用lock tables 对表加了表锁,在该锁未释放前,另外的会话执行flush tables和flush tables with read lock会被阻塞,如果数据库lock_wait_timeout参数时间太短,innobackupex会因执行flush tables with read lock获取全局读锁超时导致备份失败退出
2、如果会话在执行DDL语句,另一会话执行flush tables和flush tables with read lock会被阻塞,如果数据lock_wait_timeout参数时间太短,innobackupex会因执行flush tables with read lock获取全局读锁超时导致备份失败退出
3、如果会话正在执行DML大事务(不使用lock in share mode 和for update显式枷锁),另一会话执行flush tables 和flush tables with read lock会被阻塞,如果数据库lock_wait_timeout参数时间太短,innobackupex会因执行flush tables with read lock获取全局读锁超时导致备份失败退出
但是在执行备份中发现在flush no_write_to_binlog tables语句之前,会set session lock_wait_timeout=31536000,将锁超时时间修改,获取全局读锁等待时间太长,可以使用参数--kill-long-queries-timeout对获取flush tables with read lock全局读锁超过时间阈值的查询执行kill.
参数:--kill-long-query-type=all|select 哪些类型在指定时间之后未执行完时被kill掉
--kill-long-queries-timeout=seconds 默认0,不启用kill掉任何查询。否则到指定时间执行kill操作
详细请参考taobao内核月报:http://mysql.taobao.org/monthly/2016/03/07/