Tag Archives: MySQL

MySQL恢复中的几个问题

事情是这样的: 我有个BuyVM的VPS,结果人家机器挂了,然后新开了一个给我,我要求给我导出备份,人家还真抢救出来大部分数据.然后就是一个恢复的过程.Web恢复没有任何难度.问题就出在MySQL的恢复上,记一笔.
1. data目录完整,但是无法读出任意一个表,show tables显示为空.
起先是怀疑data目录有问题,尝试修复,提示不存在表. 经光总提醒说是不是用户组问题.指定用户组为mysql,解决.

chown -R mysql /var/lib/mysql

2.接着修复,出现

warning : Table is marked as crashed and last repair failed
warning : 1 client is using or hasn’t closed the table properly
warning : Size of datafile is: 32453700 Should be: 32376944
error : Wrong bytesec: 0-0-0 at linkstart: 32453660

根据提示,是data文件owner问题,一看果然是root,给他mysql,解决.

chown -R mysql.mysql /var/lib/mysql

3.运行完修复,提示有个表Error: Incorrect information in file: ‘./aaa/bbb.frm’.
尝试各种修复方式均未成功.Google了一下,发现.frm存储的只是表结构.表结构?那尝试一下用相同表结构的文件覆盖.删掉bbb.frm,随便复制一个库下的ccc.frm,改名为bbb.frm.一看,搞定!

一句话,多备份才是王道,mysql的磁盘转移总会遇到各种各样问题.

Debian 6 VPS安装新版本php-fpm+MySQL+Nginx

一个小小的VPS,根本用不到企业级的CentOS,况且VPS本来资源就有限.centos+apache2真的太奢侈了.我现在的VPS标配都是php5,mysql 5和nginx 1.下面的方法恨简单,本着简单,高效原则,全部apt-get来安装,不用15分钟.如果超过30分钟,这个VPS就不能用:如果不是钻石硬盘那就是网络有问题.
拿到VPS,装debian 6 32位的.
嗯,先更新一下

apt-get update
apt-get upgrade

除去除去一些不需要的东西和apache2这样耗资源的.

apt-get -y purge apache2-* bind9-* xinetd samba-* portmap sendmail-* sasl2-bin

(如果不需要sendmail发邮件,还可以加上sendmail-*)
你硬盘小咋办?删除一些不必要的组件

apt-get -y purge lynx memtester python-* odbcinst-* sudo ttf-*

(也可以再加上unixodbc等)
可以打扫一下

apt-get autoremove
apt-get clean

接下来装php,mysql和nginx了.
debian官方源的软件版本太老了,太老太老了…那么换个非官方的吧.Dotdeb是个不错的源.
打开/etc/apt/sources.list,添加下面两行之后保存上传

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

然后增加新源的证书

wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add –

增加了新源当然要更新一下

apt-get update
apt-get upgrade

接着就可以装了,根据自己需要来安装相应的东西,比如gd等组件.比如我基本上用到这些:

apt-get install php5-cli php5-fpm php5-curl php5-mysql nginx mysql-server

大概110M左右东西,在安装过程中需要输入mysql的root密码.其他就是等待.
安装完毕就根据自己VPS的配置进行设置.配置文件都在/etc下.
建议配置:
/etc/nginx/nginx.conf


worker_processes 2;

别的基本不用改,但是我把gzip_开头的选项都打开.
/etc/php5/fpm/pool.d/www.conf (我用的完整版本www.conf)

[www]
listen = /tmp/php-www.sock
listen.mode = 0666
user = www-data
group = www-data
pm = static
pm.max_children = 8
pm.max_requests = 5000
rlimit_files = 512000
request_slowlog_timeout = 10s
request_terminate_timeout = 30s
slowlog = /var/log/php-fpm.slow.log
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/fpm-php.www.log
;php_admin_flag[log_errors] = off
php_admin_value[memory_limit] = 24M
php_admin_value[open_basedir] = /var/www/:/tmp/:/var/tmp/

这是256M OpenVZ的标准配置,根据内存大小调整pm.max_children和php_admin_value[memory_limit]的值

mysql 5.5默认就用Innodb了,又不是浩大工程,根本用不到,还占那么多资源,增加下面两项即可
/etc/mysql/my.cnf

[mysqld]
default-storage-engine = MyISAM

skip-innodb

然后重启服务

/etc/init.d/nginx restart
/etc/init.d/php5-fpm restart
/etc/init.d/mysql restart

基本上这个很节约资源也够处理你的请求了.
题外话,别老觉得nginx会导致502, 好刀在好刀客手里才能发挥最大作用.根本不需要把nginx做后端,前面在加个apache.我们单台服务器用nginx+php跑日2000万动态PV不出问题.

小内存VPS使用MySQL 5.5占用内存大的原因

昨晚购一个小内存VPS,256M保证内存,384M突发内存.VPS商的默认模版不太好,小内存不太适合用LAMP,所以卸载了apache和一些不必要的东西.然后装上LNMP(用dotdeb的源).一切和以前一样配置.结果MySQL一起动就占300都M内存,甚至导致不够内存使用任何命令.非常不解.
然后找一个正常的小内存VPS来比较,最后发现dotdeb的MySQL更新到5.5 Final了,而之前装的全是5.1的.再一查,5.5 开始默认使用InnoDB引擎,我光用了一句skip-innodb没效果.所以最后在[mysqld]里加了一句:default-storage-engine = MyISAM, 轻质默认使用MyISAM引擎来存储.这样的小内存VPS本来就不做大用处,不需要InnoDB.

[mysqld]
default-storage-engine = MyISAM

skip-innodb

然后重启mysql服务,mysql果然降到了只有50M,这下就可以了.

MySQL目录占用极大空间并且起不来

一个VPS,只有20G空间, 用

du /usr/local/mysql –max-depth=1 -h

看占掉了其中12G,看到目录里有很多mysql-bin.00000x这种有些一个就要超过1G.
我尝试重启了MySQL,结果显示

MySQL manager or server PID file could not be found! failed!
Starting MySQL.Manager of pid-file quit without updating file. failed!

Google了一下,发现开了log-bin.进入/etc/my.cnf,把其中的log-bin和binlog_format注释掉,然后胆大的删除了bin.00000x.
然后重启就正常了.
看了一下log-bin的功能,如果有备份好习惯的,完全可以不用.况且真出问题了它也未必有效.

MySQL服务无法正常启动的解决方法(1053错误)

有位广告客户需要用我们服务器,而我们也没有义务对他们代码审计,所以不会给我们自己的核心服务器他们用.于是找了台Windows的,IIS用fastcgi跑PHP,装好MySQL,用的还挺顺利.突然前天晚上在客户更新他们代码之后,这台服务器奇慢无比,访问网站会出现500,我重启MySQL服务,这下杯具了.他一直报1053错误:服务没有及时响应启动或控制请求.我用结束进城和重启服务器方法都无法正常启动.重装MySQL服务重启之后依然无法启动.

我查了一些资料,用管理员帐号权限来启动看是否可以解决(此时helvin也说是不是权限问题).开始->输入services.msc,找到MySQL服务,右键属性,登录,选择此帐户,然后选择Administrator和相应密码,确定.结果服务就神奇的起来了.

教训:以后前晚别用Windows来跑PHP+MySQL了.