比尔盖子 博客

Tag: 数据库

“mysql-bin.000001″占用超大空间

最近几个月服务器总是频繁当机,导致比尔盖子的可用性得不到保证。但说也奇怪,当机的时候,服务器可以正常连接,Nginx也看似正常,但就是PHP-FPM失去响应。后来无意中df -h一下,发现:

rootfs 7.7G 7.7G 0 100% /

根目录满了!便认为是日志太多,清理了下日志。但基本每个一个星期日志就会满。弄得比尔盖子不得安宁。后来就把/var独立分区了,但依然不奏效,有多少占多少。也清理过/var/tmp和/var/cache,但效果依然有限。

今天,耐着性子du -ah,发现/var/lib/mysql占用空间异常,cd到这里ls -lh后发现:

 -rw-rw---- 1 mysql mysql 5242880 Feb 27 14:49 ib_logfile0
 -rw-rw---- 1 mysql mysql 5242880 Dec 27 17:55 ib_logfile1
 -rw-rw---- 1 mysql mysql 588M Mar 12 02:03 maria_log.00000003
 -rw-rw---- 1 mysql mysql 52 Mar 12 01:54 maria_log_control
 drwx------ 2 mysql root 4.0K Jan 15 14:28 mysql
 -rw-rw---- 1 mysql mysql 20K Dec 27 17:54 mysqld-bin.000001
 -rw-rw---- 1 mysql mysql 715K Dec 27 17:54 mysqld-bin.000002
 -rw-rw---- 1 mysql mysql 625 Dec 28 11:46 mysqld-bin.000003
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:20 mysqld-bin.000004
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:20 mysqld-bin.000005
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:21 mysqld-bin.000006
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:21 mysqld-bin.000007
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:22 mysqld-bin.000008
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:22 mysqld-bin.000009
 -rw-rw---- 1 mysql mysql 20K Dec 27 18:22 mysqld-bin.000010
 -rw-rw---- 1 mysql mysql 715K Dec 27 18:22 mysqld-bin.000011
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:24 mysqld-bin.000012
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:25 mysqld-bin.000013
 -rw-rw---- 1 mysql mysql 125 Dec 27 18:27 mysqld-bin.000014
 -rw-rw---- 1 mysql mysql 125 Dec 28 09:55 mysqld-bin.000015
 -rw-rw---- 1 mysql mysql 125 Dec 28 11:41 mysqld-bin.000016
 -rw-rw---- 1 mysql mysql 125 Dec 28 11:42 mysqld-bin.000017
 -rw-rw---- 1 mysql mysql 125 Dec 28 12:07 mysqld-bin.000018
 -rw-rw---- 1 mysql mysql 1.4K Dec 28 12:49 mysqld-bin.000019
 -rw-rw---- 1 mysql mysql 125 Dec 28 16:31 mysqld-bin.000020
 -rw-rw---- 1 mysql mysql 107M Dec 28 18:30 mysqld-bin.000021
 -rw-rw---- 1 mysql mysql 1.2M Dec 30 09:22 mysqld-bin.000022
 -rw-rw---- 1 mysql mysql 125 Dec 30 09:26 mysqld-bin.000023
 -rw-rw---- 1 mysql mysql 3.8K Dec 30 12:29 mysqld-bin.000024
 -rw-rw---- 1 mysql mysql 59M Jan 11 21:34 mysqld-bin.000025
 -rw-rw---- 1 mysql mysql 10M Jan 14 15:16 mysqld-bin.000026
 -rw-rw---- 1 mysql mysql 186K Jan 15 05:16 mysqld-bin.000027
 -rw-rw---- 1 mysql mysql 21K Jan 15 14:46 mysqld-bin.000028
 -rw-rw---- 1 mysql mysql 13K Jan 15 15:12 mysqld-bin.000029
 -rw-rw---- 1 mysql mysql 62M Jan 17 16:36 mysqld-bin.000030
 -rw-rw---- 1 mysql mysql 63M Jan 18 17:10 mysqld-bin.000031
 -rw-rw---- 1 mysql mysql 125 Jan 18 17:16 mysqld-bin.000032
 -rw-rw---- 1 mysql mysql 21K Jan 18 17:23 mysqld-bin.000033
 -rw-rw---- 1 mysql mysql 118M Jan 22 12:41 mysqld-bin.000034
 -rw-rw---- 1 mysql mysql 209K Jan 22 12:59 mysqld-bin.000035
 -rw-rw---- 1 mysql mysql 117M Jan 28 11:59 mysqld-bin.000036
 -rw-rw---- 1 mysql mysql 125 Jan 28 13:46 mysqld-bin.000037
 -rw-rw---- 1 mysql mysql 24M Jan 28 16:01 mysqld-bin.000038
 -rw-rw---- 1 mysql mysql 460K Jan 28 16:10 mysqld-bin.000039
 -rw-rw---- 1 mysql mysql 7.0M Jan 28 16:52 mysqld-bin.000040
 -rw-rw---- 1 mysql mysql 2.3M Jan 28 17:12 mysqld-bin.000041
 -rw-rw---- 1 mysql mysql 2.1M Jan 28 17:27 mysqld-bin.000042
 -rw-rw---- 1 mysql mysql 173K Jan 28 17:37 mysqld-bin.000043
 -rw-rw---- 1 mysql mysql 378K Jan 28 17:44 mysqld-bin.000044
 -rw-rw---- 1 mysql mysql 79K Jan 28 17:50 mysqld-bin.000045
 -rw-rw---- 1 mysql mysql 272K Jan 28 18:12 mysqld-bin.000046
 -rw-rw---- 1 mysql mysql 156K Jan 28 18:15 mysqld-bin.000047
 -rw-rw---- 1 mysql mysql 962K Jan 28 18:33 mysqld-bin.000048
 -rw-rw---- 1 mysql mysql 43K Jan 28 18:40 mysqld-bin.000049
 -rw-rw---- 1 mysql mysql 28M Jan 29 11:43 mysqld-bin.000050
 -rw-rw---- 1 mysql mysql 125 Jan 29 11:46 mysqld-bin.000051
 -rw-rw---- 1 mysql mysql 139K Jan 29 12:37 mysqld-bin.000052
 -rw-rw---- 1 mysql mysql 135K Jan 29 12:44 mysqld-bin.000053
 -rw-rw---- 1 mysql mysql 409M Feb 9 23:18 mysqld-bin.000054
 -rw-rw---- 1 mysql mysql 482M Feb 17 09:37 mysqld-bin.000055
 -rw-rw---- 1 mysql mysql 542M Feb 27 12:30 mysqld-bin.000056
 -rw-rw---- 1 mysql mysql 125 Feb 27 12:31 mysqld-bin.000057
 -rw-rw---- 1 mysql mysql 125 Feb 27 14:48 mysqld-bin.000058
 -rw-rw---- 1 mysql mysql 854M Mar 13 12:08 mysqld-bin.000059
 -rw-rw---- 1 mysql mysql 1.1K Feb 27 14:49 mysqld-bin.index

上帝老天爷,这些log和bin都是什么玩意儿?!最后找到资料:

mysql-bin.000001、mysql-bin.000002等文件是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的。这主要是用于操作审查和多数据库同步的。ib_logfile则是用来记录InnoDB的表一致性的,只有在当机后才能发挥作用。maria_log.00000003则是比尔盖子使用的MariaDB特有的文件,作用也差不多。

但是对比尔盖子来说,没有主从数据库,也不用审查操作,这些文件完全没有任何用处!因此,首先清理一下这些文件。然后编辑mysql配置文件,组织其再记录这些日志,铲草除根。Gentoo的MySQL日志在/etc/mysql/my.cnf。把里面的log-bin这一行注释掉。

然后重启MySQL服务器,问题搞定!可用空间瞬间增加数GB!

自动优化及备份网站数据的解决方案(解决了一个困扰我8个月的问题)

2011/05/09日再次更新,脚本还是有变量问题,已修正!

以前,比尔盖子写了一篇关于应用Shell Script和Cron Job来自动备份和优化数据库(远程数据库)的方法,如果想查看比尔盖子写这个脚本的原因和和文章,请猛击这里

两大问题

不过,这段脚本其实是不能用的,因为在语法上出现了一点小小的问题,对,就是那个$stamp变量的写法问题。

但是,困住比尔盖子的并不是这个问题,而是这段脚本根本就无法执行!

PS:如果您不想看比尔盖子解决问题的过程,只想得到一个能用的Script,请直接看“新的解决方案“部分!

(1)执行问题

一执行就会出现Mysql Server Access Denied的提示,一开始是怀疑Godaddy禁止连接,后来发现我将此脚本中的命令一行一行的输入到Shell里面,执行是成功的。

(2)计划任务执行问题

而到了计划任务的时间,比尔盖子就会收到root寄来的邮件,说什么Permissions Denied——还是权限不足。难道是Godaddy还限制了Cron Job计划任务的权限?
就这样,比尔盖子也懒得管它了,一直过了八个月,现在我的邮箱里已经有800多封root寄来的“权限不足报错”的邮件了。

以为问题解决

最近读到了《鸟哥的Linux私房菜》,看到了《Linux文件权限概念》这一章,里面说:“Windows下,一个文件可不可执行要看扩展名,而Linux下文件可不可执行完全看有没有x权限。”

于是马上想到我的Script权限不足的原因可能就在这里!果然如此:只有我自己有rw权限,其它的权限什么都没有,赶紧将权限设置为770!

第二天,我收到了root寄来的邮件。这回Script终于可以执行了,但是执行的结果和我在Shell里面的一样,报错Mysql Server Access Denied。

问题终于解决

今天在学校机房弄了半天,终于发现了这个$stamp变量的问题,于是重写了一个变量,但是依旧Mysql Server Access Denied。有将脚本分行写成Script,一行一行测试,结果发现我新建的脚本上的命令没有任何修改,但是却能执行;而原来脚本上一模一样的内容居然报错!

不但这样,而且当我在服务器上尝试压缩一个文件的时候,明明这个文件在SFTP的列表上是存在的,但是就是提示“No such file or directory”!于是使用ls -l查看一下,发现文件名由“database_backup”变成了”database?_backup”,原来是该死的中文字符编码问题!

回家之后用Linux上的vim重写了(准确的说是重新抄写)了这个Script,上传到服务器,并赋予其“rwxrwx—“的权限,尝试使用Bash执行,成功!

结论

引起比尔盖子困扰的是一下三大问题:

一.文件格式问题

因为Windows下的换行符就和Linux不一样,而且也很难保证这是字符编码没有问题,所以说bash读取到有Windows换行符的文件(脚本)就会误判,导致无法识别真正的命令!

二.变量语法问题

这里面的$stamp变量的语法不正确,导致了备份文件名不正确!

三.权限问题

没有赋予文件(脚本)x权限从而导致脚本没有权限被计划任务执行。

新的解决方案

这回比尔盖子重写了脚本,脚本更加规范,另外,还要强调一次:因为Windows下的换行符就和Linux不一样,所以最好使用Linux编写此脚本,否则请连接到主机远程编写脚本!

#!/bin/bash
# Program:
#   This script can backup Biergaizi's website data!
cd /home/content/44/6531044/backup #切换到备份目录,请按实际情况修改
mysqlcheck -hdiscuzmaogou.db.6531044.hostedresource.com -o discuzmaogou -udiscuzmaogou -pAmaogou4260 >>log #将这里的“数据库地址“等替换成自己的!输出信息保存在log文件
export today=`date '+%Y-%m-%d'` #获得当前日期并写入$today变量
mysqldump -hdiscuzmaogou.db.6531044.hostedresource.com -udiscuzmaogou -pAmaogou4260 discuzmaogou>db_backup_$today.sql #将这里的“数据库地址“等替换成自己的!   将数据库内容转存为SQL文件,文件名为“db_backup_日期.sql 
bzip2 -z -9 -f db_backup_$today.sql #压缩SQL文件并删除原SQL文件,压缩后文件名为“db_backup_日期.bz2

这样,只要将脚本加入Corn Job,定期下载储存备份文件的那个目录就行了,备份的文件名会自己变哦!

Copyright © 2022 比尔盖子 博客

Theme by Anders NorenUp ↑