最近遇到一台mysql机器,空间不足,查看后发现是slow log文件占了大量空间(ext4),果断rm掉,然后再flush logs。flush logs的时候发现mysql会hang住。翻了一下flush logs的逻辑,执行flush logs的时候,mysql会执行reopen_file操作,reopen_file()先closeslow log file,再open,而这个过程是持有LOCK_log锁。目前mysql server层日志(slow/general/binary log)的写操作是都需要持有这个锁的。
这样,问题就来了。前面执行rm操作的时候,mysqld还在写对应的slow log,因此系统不会真正的删除这个文件,而执行flush logs操作的时候,mysql会去调用close()操作。close的manual是这么写的:
NAME close - close a file descriptor DESCRIPTION close() closes a file descriptor, so that it no longer refers to any file and may be reused. Any record locks (see fcntl(2)) held on the file it was associ- ated with, and owned by the process, are removed (regardless of the file descriptor that was used to obtain the lock). If fd is the last copy of a particular file descriptor the resources associated with it are freed; if the descriptor was the last reference to a file which has been removed using unlink(2) the file is deleted.
linux删除文件的机制再加上mysql的LOCK_log这把大锁就会引起mysql hang住。类似的general log也会有这个问题。正确的做法是,将slow/general log mv成另外一个名字,再执行flush log操作,然后再去rm对应的文件。
链接:
http://www.mysqlperformanceblog.com/2007/12/09/be-careful-rotating-mysql-logs/
http://digital-forensics.sans.org/blog/2010/12/20/digital-forensics-understanding-ext4-part-1-extents
http://digital-forensics.sans.org/blog/2011/03/28/digital-forensics-understanding-ext4-part-3-extent-trees
http://digital-forensics.sans.org/blog/2011/04/08/understanding-ext4-part-4-demolition-derby
相关推荐
MySQL Flush 命令用法详解 MySQL Flush 命令是 MySQL 中的一种非常重要的命令,它可以用于清除或重新加载各种高速缓存、表或者获取锁等。执行 Flush 命令必须要有 reload 权限。今天,我们将详细介绍 MySQL Flush ...
- 过期日志的删除会在每次执行 `FLUSH LOGS` 或者 MySQL 服务重启时触发。 #### 方法四:通过配置文件设置 可以在 MySQL 的配置文件 `my.cnf` 或 `my.ini` 中设置 `expire_logs_days` 参数,从而实现自动清理日志...
- `flush logs`:手动切换到新的binlog文件。 - `show master status`:查看当前binlog的状态,包括文件名和位置。 - `reset master`:清空所有binlog日志。 - `mysqlbinlog`:这是一个工具,用于查看binlog的内容,...
在主从配置中,文章详细解释了 mysqldump 命令的选项和参数,包括 opt、master-data、single-transaction、flush-logs、extended-insert 等,帮助读者更好地理解 mysqldump 命令的使用方法。 此外,文章还介绍了从...
4. **刷新日志**:使用`Flush logs`命令生成新的binlog文件,模拟数据丢失的情况,如删除某些记录。 5. **查看binlog事件并恢复数据**:通过`show binlog events in 'mysql-bin.000002'`查看binlog文件中的事件,...
- `mkdir /usr/local/mysql/logs`:创建用于存放日志文件的目录。 - `chown -R mysql:mysql /usr/local/mysql`:将 `/usr/local/mysql` 及其子目录的所有权更改给 `mysql` 用户和组。 ##### 2.5 初始化数据库 - `....
mysql> flush privileges; ``` - **创建测试数据库**:用于测试同步复制功能。 ```sql mysql> create database testdb; mysql> use testdb; mysql> create table testuser (id int(4), name varchar(20)); mysql> ...
2. 创建日志文件目录:使用命令 `mkdir -p /var/log/mysql3306/logs` 创建日志文件目录。 三、授权文件 在升级之前,需要授权文件: 1. 授权数据文件目录:使用命令 `chown -R mysql:mysql /data/mysql3306` 授权...
### MySQL 8.0.11 多实例安装详解 #### 一、概述 随着业务需求的增长和技术架构的复杂化,数据库系统面临着更多的挑战。为了提高数据库系统的可用性、扩展性和容错能力,多实例部署成为了许多企业的首选方案。本文...
- 再次应用权限更改: `mysql> flush privileges;` #### 六、配置Binlog 1. **修改MySQL配置文件**: - 在`my.cnf`文件中添加以下内容: ```ini log_bin = /opt/mysql/log/xxx.log binlog_format=ROW expire_...
mkdir /usr/local/mysql/logs && touch /usr/local/mysql/logs/mysqld.log chown -R mysql.mysql /usr/local/mysql && chmod -R 777 /usr/local/mysql chown -R mysql.mysql /data/mysql && chmod -R 777 /data/...
- 使用 `FLUSH LOGS` 时会创建一个新的 bin-log 文件。 - `SHOW MASTER STATUS` 可以显示当前 bin-log 文件的信息。 - `RESET MASTER` 会清除所有的 bin-log 文件。 - 使用 `mysqlbinlog` 工具时,可以通过 `--start...
3. `flush logs;`:创建新的binlog日志文件,旧的文件会被保留。 4. `reset master;`:清除所有binlog日志,通常在重置数据库状态时使用。 要读取binlog日志内容,可以使用`mysqlbinlog`工具。在命令行中输入`...
query_cache_size、query_cache_type、innodb_buffer_pool_size、innodb_log_file_size、innodb_log_buffer_size、innodb_flush_logs_at_trx_commit、transaction_isolation、innodb_file_per_table、innodb_open_...
`flush logs`命令将创建新的binlog文件,这通常在MySQL服务重启或使用`mysqldump`备份数据时自动执行。`reset master`命令用于清除所有binlog日志,但请注意,这将丢失所有binlog信息,可能会导致无法进行历史数据...
/usr/local/mysql/bin/mysqladmin -uroot -p123456 flush-logs # 用于产生新的mysql-bin.00000*文件 Counter=`wc -l $BinFile | awk '{print $1}'` NextNum=0 for file in `cat $BinFile` do base=`basename ...