几个月前,我将 MySQL 设置从 5.5 更新到 5.6。从那时起,我在使用一个脚本来转储各种数据库以便备份它们时遇到了问题。
该脚本是一小段 perl,它获取所有数据库的列表,然后mysqldump
按如下方式调用每个数据库:
mysqldump -udb_account -pdb_pw -hserver.com --single-transaction --flush-logs
--routines --triggers --quick $fn 2> $fn.err | gzip > $fn.mysql.gz
问题:许多这些数据库都有数百个表(不断增加)。对于这些较大的数据库,mysqldump
命令通常只在一个表后退出。如果我从终端会话运行命令,它会正确执行。(通常它作为 cron 作业运行 1x/wk)
该.err
文件不包含任何消息。server.err
MySQL 根目录中的文件也没有。
注意:这个脚本已经在 MySQL 5.5 上运行良好好几年了。当我升级到 5.6 时,这个问题开始发生。
另外:该--flush-logs
部分不起作用。自本系统上线以来,mysql_bin文件夹从未被清空过。
我还没有控制的一个变量:当作为 CRON 作业运行时,脚本一次分叉 3 个进程。当我在学期会议中测试命令时,我一次只做一个。
有问题的系统:
- 中央操作系统 6.4
- x64
- 64Gb 内存
这里的问题只是一个误会
将--flush-logs与 mysqldump 一起使用可以简单地关闭和打开针对以下内容的所有文件句柄:
在二进制日志的情况下,关闭当前二进制日志并打开一个新的二进制日志。本质上,它是唯一按数字旋转的日志文件。例如,假设您运行
SHOW MASTER STATUS;
并看到二进制日志文件名mysql-bin.000027
。运行FLUSH LOGS;
或FLUSH BINARY LOGS;
将关闭mysql-bin.000027
(停止向该文件记录事务)和打开mysql-bin.000028
(现在记录传入事务)。但是,轮换并不意味着自动删除。
清理二进制日志有两种方法
删除所有二进制日志
如果数据库服务器未用作 MySQL Replication Master,则运行
启用二进制日志记录
这将清除所有二进制日志并从第一个开始(如
mysql-bin.000001
)二进制日志未启用
只需转到操作系统并运行删除命令(
rm
适用于 Linux,del
适用于 Windows)清除二进制日志
如果你想保留最近 48 小时的二进制日志,你运行
mysqld 将清除所有超过 48 小时的二进制日志。
自动清洗
只需在 my.cnf(或 my.ini)中设置以下内容
然后,重新启动 mysqld 或运行以下命令
root
这样,每次手动或自动刷新二进制日志都会删除超过 2 天的日志。
一旦设置了 expire_logs_days,mysqldump 将在每次 --flush-logs时清理旧日志。