Mysql:如果主服务器或从服务器发生磁盘已满且二进制日志没有剩余空间,该怎么办

Mysql:如果主服务器或从服务器发生磁盘已满且二进制日志没有剩余空间,该怎么办

最近,我为我的生产配置了主从复制,但没有考虑所有用户情况。我再次开始考虑硬件层面的所有可能用例,以确保我们准备好处理所有故障。

对于以下场景,我没有看到任何更好的方法。

There is no space left on master to write binary logs
There is no space left on slave to write really logs

非常感谢您在这方面提供的帮助。问候,Uday

答案1

基本上,您希望在事情发生之前就检测到它。

我用监控通过文件系统检查来发送电子邮件并尝试一些基本步骤,如下所示;

 check filesystem rootfs with path /dev/hda1
IF SPACE USAGE > 90 % THEN alert
IF SPACE USAGE > 95 % THEN 
EXEC '/run/script/with/logrotate/and/empty/tmp/dir/while/you/read/alert/email'

mysql 上磁盘满的情况的结果在很大程度上取决于你如何配置 MySQL 和底层分区结构。CentOS 软件包版本上的默认设置是写入以下内容

logs -> /var/log/mysqld.log
binlogs -> /var/lib/mysql/mysql-bin.00NNNN
data -> /var/lib/mysql/

然而,不幸的是,默认的文件系统布局是将 /var/ 放在单个分区上,如下所示;

/dev/cciss/c0d0p2 on /var type ext3 (rw)

因此磁盘已满的结果通常是数据丢失,并且结果非常糟糕。

MySQL 服务器处理磁盘已满情况的程序在手册中进行了描述;
http://dev.mysql.com/doc/refman/5.0/en/full-disk.html

根据文档,如果你释放足够的空间,它就可以继续;

当发生磁盘已满的情况时,MySQL 会执行以下操作:

It checks once every minute to see whether there is 

有足够的空间来写入当前行。如果有足够的空间,它会继续,就像什么都没发生过一样。

Every 10 minutes it writes an entry to the log file,

关于磁盘已满情况的警告。

为了缓解该问题,您可以采取下列措施:

To continue, you only have to free enough disk space to insert all records.

然而我的经验是,到那时,已经发生了太多崩溃的事情,并且 mysqld 需要重新启动,并且会丢失待处理的事务。

关于操作顺序,mysql 5.1 版手册有这是关于在写入事务或 binlog 失败期间事务发生的情况;

二进制日志记录在语句完成后立即执行,但在释放任何锁或执行任何提交之前执行。这可确保日志按执行顺序记录。

对非事务表的更新在执行后立即存储在二进制日志中。在 MySQL 5.1.22 和更早版本的 MySQL 5.1 中,如果使用存储函数修改非事务表的 UPDATE 语句失败,则不会记录该语句,如果遇到重复键约束但实际上未更改任何数据的 INSERT ... ON DUPLICATE KEY UPDATE 语句未记录该语句。从 MySQL 5.1.23 开始,这两个语句都写入二进制日志。(错误 #23333)

在未提交的事务中,所有更改事务表(如 InnoDB 表)的更新(UPDATE、DELETE 或 INSERT)都会被缓存,直到服务器收到 COMMIT 语句。此时,mysqld 会在执行 COMMIT 之前将整个事务写入二进制日志。

对非事务表的修改无法回滚。如果回滚的事务包括对非事务表的修改,则整个事务都会在末尾用 ROLLBACK 语句记录,以确保复制对这些表的修改。

相关内容