【MySQL】innobackupex 长时间hang
mysql 长时间
2023-09-14 08:57:29 时间
mysql show processlist;
+--------+-------------+--------------------+------+------------+---------+----------------------------------
| Id | User | Host | db | Command | Time |State
+--------+-------------+--------------------+------+------------+---------+----------------------------------
| 1 | system user | | NULL | Connect | 2684619 | Waiting for master to sendevent
| 2 | system user | | NULL | Connect | 31 | Waiting for release of readlock ......
4 rows in set (0.00 sec)
system用户显示 Waiting for release of readlock
执行备份的用户为Xtraback 对应的time 列则每4s 循环一次。system user 的状态表示 xtraback 进程已经执行了flush tables with read only,并等待xtrabackup进程释放read lock。我们首先来了解一下xtrabackup 大致过程:
backup()并记录XTRABACKUP_BINARY信息
mysql_open() 启动管道链接的子进程连接mysql
mysql_check() 检查连接mysql的子进程是否OK,发送一个虚拟查询,等待mysql_response_timeout超时退出
mysql_close() 关闭连接mysql子进程
start_ibbackup() 创建子进程运行ibbackup来备份innodb数据和索引
如果不是远程备份,不是stream模式,进入wait_for_ibbackup_suspend() 检查ibbackup子进程是否还活着
mysql_open()
如果指定–safe-slave-backup 进入wait_for_safe_slave() ,通过每隔3s启停sql thread来不断检查实例上打开临时表数目是否为0
mysql_check()
如果没有指定–no-lock,进入 mysql_lockall(),执行FLUSH TABLES WITH READ LOCK;
backup_files() 拷贝除ibd外所有的文件
mysql_unlockall() 执行UNLOCK TABLES
如果指定–safe-slave-backup START SLAVE SQL_THREAD
mysql_close()
问题出现在 发出flush tables with read lock 并获取了全局锁(systemuser 才在等待read lock) innodb 拷贝除ibd外所有的文件.
xtrabackup源码
# flush tables with read lock
mysql_check(); --没有问题
mysql_lockall() if !$option_no_lock;
# timeout in seconds for a reply from mysql
my $mysql_response_timeout = 900;
sub mysql_send {
my $request = shift;
$current_mysql_request = $request;
print MYSQL_WRITER "$request\n";
mysql_check();
$current_mysql_request = ;
sub mysql_lockall {
$now = current_time();
print STDERR "$now $prefix Starting to lock all tables...\n";=
mysql_send "USE mysql;";
mysql_send "SET AUTOCOMMIT=0;";
if (compare_versions($mysql_server_version, 4.0.22) == 0
|| compare_versions($mysql_server_version, 4.1.7) == 0) {
# MySQL server version is 4.0.22 or 4.1.7
mysql_send "COMMIT;";
mysql_send "FLUSH TABLES WITH READ LOCK;";
} else {
# MySQL server version is other than 4.0.22 or 4.1.7
mysql_send "FLUSH TABLES WITH READ LOCK;";
mysql_send "COMMIT;";
}
write_binlog_info;
write_slave_info if $option_slave_info;
$now = current_time();
print STDERR "$now $prefix All tables locked and flushed to disk\n";
--在执行flush tables with read lock时,mysql_send函数执行超时900S,备份失败。我的实例的备份却一直表现为log scanned up to (3015320266621)。
记录一个疑问在这里。
相关文章
- mysql handlersocket_HandlerSocket介绍[通俗易懂]
- mysql5.7 分区表_mysql分区表学习
- MySQL Error number: MY-010891; Symbol: ER_AUDIT_CANT_ABORT_COMMAND; SQLSTATE: HY000 报错 故障修复 远程处理
- 提升MySQL查询效率:七大备注技巧(mysql查询备注)
- MySQL Status Ndb_api_read_row_count_session 数据库状态作用意思及如何正确
- MySQL连接加密—安全保护你的数据(mysql连接加密)
- MySQL数据库恢复:轻松找回丢失的数据(mysql回档)
- Mysql表还原操作指南(mysql还原表)
- 状态MySQL 查询服务器运行状态(mysql查看服务)
- MySQL技术:深入使用关键字(mysql使用关键字)
- MySQL绝对路径之旅 一次完美体验(mysql绝对路径)
- 管理MySQL用户组:实现最佳安全性(mysql用户组)
- 数据MySQL:实现定时自动删除数据(mysql定时删除)
- 如何查找MySQL的安装路径(mysql安装路径)
- MySQL重新安装,让你的数据库运行更稳定(mysql重新安装)
- MySQL如何应对超大数据量的存储和管理?(mysql超大数据)
- MySQL存储文本:最佳实践(mysql存储文本)
- 如何在MySQL中正确显示日期?(mysql日期显示)
- MySQL客户端操作:创建新用户(mysql客户端新建用户)
- MySQL如何修改字符编码(mysql中修改字符编码)
- MySQL中如何管理会员信息(mysql中member)
- c语言操作MySQL数据库的快速入门(c mysql访问库)
- 掌握MySQL类,指尖C编程无忧(c mysql类使用方法)
- MySQL中使用CALL调用存储过程(mysql 中call)
- MySQL数据库快速创建指南(c mysql创建数据库)
- MySQL中的Bean注入技术简介(bean注入mysql)
- MySQL中的a代表什么(a在mysql中代表什么)
- 灵活且可靠ARM架构MySQL服务器实用指南(arm mysql服务器)
- MySQL实现不同库互相访问,实现多库数据共享(mysql不同库互相访问)
- 将MySQL轻松搬运至U盘简单下载操作指南(mysql下载到u盘)
- MySQL数据库在上位机的应用探究(mysql上位机)