最近遇到一台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
相关推荐
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_...
mv hostname.err hostname.err.old mysqladmin flush-logs ② 查询⽇志:查询⽇志在 MySQL 中被称为 general log(通⽤⽇志),查询⽇志⾥的内容不要被“查询⽇志”误导,认为⾥⾯只存储 select 语句,其实不然,查询...
# 0:如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作(执行是由mysql的master thread线程来执行的。 # 主线程中每秒会将重做日志缓冲写入磁盘的...
reset master 删除所有的二进制日志flush logs 产生一个新的binlog日志文件 show master logs; 或者 show binary logs; 查看二进制文件列表和文件大小 代码如下:./mysqlbinlog –start-datetime=”2012-05-21 15:30...
MySQL有以下几种日志: ...当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,出现日志刷新 1. 错误日志 用–log- error[=file_name]选项来指定mysqld保存错误日志文件的位置。
1、本地备份编写自动备份脚本:vim /var/lib/mysql/autobak内容如下: 代码如下:cd /data/home/mysqlbakrq=` date +%Y%m%d `/usr/local/mysql/bin/mysqldump sqldb –flush-logs -uroot -p123456 –opt > 777city_$...
1、查看是否启用了日志:show variables like ‘log_bin’; 2、查看当前日志文件名:show master status;... 代码如下:方法一:[root@bogon mysql]# mysqladmin -uroot -p flush-logs方法二:mysql
遇到这样的错误如:“Last_IO_Error: Got fatal error 1236 from master when ... 再去master中执行:”flush logs;”来清空日志; 然后在master中执行:”show master status;”查看下主库的状态,主要是日志的文件和po
代码如下:mysqldump database –flush-logs -uroot -p –opt > database_20020601.sql 按照日期规则执行。 如果想恢复到今早10点的数据库,那么:1、完整备份整个当前数据库 代码如下:cd /var/lib/mysqlmysqldump -...
flush binary logs 然后整个主从环境大量延迟。 二、朋友的测试 下面是另外一个朋友@徐晨亮的测试: master上: (root:db1@xucl:10:30:22)[(none)]> show binary logs; +---------------------+-----------+ | Log...
FLUSH PRIVILEGES; (3)导入数据 use azkaban; source /opt/azkaban-3.38.0/azkaban-db/create-all-sql-0.1.0-SNAPSHOT.sql 2. ssl配置 cd /opt/azkaban-3.38.0\azkaban-web-server keytool -keystore keystore -...
mysqldump在mysql中用于逻辑备份,虽然速度不快,但非常...mysqldump --host= --user= --password= --single-transaction --master-data=1 --flush-logs --databases >~/db.log —single-transaction 参数能够报纸一
~$ docker-compose exec web python manage.py flush --no-input@dev:~$ docker-compose exec web python manage.py migrate检查日志中的错误@dev:~$ docker-compose logs -f停止容器并使用-v标志绑定卷@dev:~$ ...
当想要进行增量备份时(包含上一次完全备份或增量备份之后的所有更改),应使用FLUSH LOGS回滚二进制日志。然后,你需要将从最后的完全或增量备份的某个时刻到最后某个点的所有二进制日志复制到备份位置。这些二进制...
;;;;;;;;... 1.... 2.... 3.... 4.... 5.... 6.... The syntax of the file is extremely simple.... Section headers (e.g.... at runtime.... There is no name validation.... (e.g.... previously set variable or directive (e.g....