您的位置:首页 > 数据库 > MySQL

启动服务器一段时间后MySQL服务进程被关闭,无法重新启动

2015-01-04 15:05 363 查看
这个坑真的是太坑爹了,租用的服务器是阿里云的乞丐版(最低配置),单核,512M内存,1M带宽.

由于不甘心用阿里云的环境一键sh安装包,因为软件版本太低了,虽然稳定,但是满足不了我折腾的欲望.

So,格了硬盘,lnmp全部重新安装,先从MySQL装起.

起初一切很顺利,也就是编译和安装,不过自从MySQL5.5版本起,改用了CMAKE的编译方式,不再采用过去的configure –…..

1
wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.12.
tar
.gz
#从服务器上下载官方<a
title="查看与mysql5.6有关的文章" href="http://cuelog.com/tag/mysql5-6" target="_blank">mysql5.6</a>
第一步先安装cmake,建议直接 yum install cmake,或者从cmake上下载一个自己编译也行,很简单的事.

第二部就是用cmake来编译mysql5.6,这里贴上我用的参数:

01
cmake
02
-DCMAKE_INSTALL_PREFIX=/web/server/mysql/
\
03
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock
\
04
-DMYSQL_USER=mysql
\
05
-DDEFAULT_CHARSET=utf8
06
-DDEFAULT_COLLATION=utf8_general_ci
\
#记得加上这个参数,否则等下会遇到这个错误
: latin1_swedish_ci' is not valid for CHARACTER SET 'utf8'
07
-DWITH_INNOBASE_STORAGE_ENGINE=1
\
#INNODB数据库,如果不加,建表的时候可能会没有选项或报错
08
-DWITH_ARCHIVE_STORAGE_ENGINE=1
\
#同上
09
-DWITH_BLACKHOLE_STORAGE_ENGINE=1
\
#同上
10
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1
\
#同上
11
-DWITH_ZLIB=/usr/
local
/zlib/
\
12
-DWITH_SSL=/usr/
local
/openssl/
\
13
-DWITH_READLINE=1
\
14
-DWITH_DATADIR=/web/server/mysql/data/
\
#数据库目录
15
-DWITH-TCP_PORT=3306
\
16
-DENABLE_DOWNLOADS=1
#自动下载缺少的包(谷歌的安装框架),如果不加上,会提示googlemock
was not found
完整的参数配置可以参考官网的CMAKE详细介绍:http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html

中文对照:http://www.blogjava.net/kelly859/archive/2012/09/04/387005.html

OK,编译完成后,可能会提示你 googlemock was not found 或者 googlemock没有解压之类的,大致错误信息我忘了,

总之就是得你去软件的/source_downloads 中,unzip googlemock.zip,把它解压出来即可,不需要你安装.

然后回到第一步重新编译,如果最后没有提示warning之类的错误,就可以开始make && make install

看服务器性能吧,我的乞丐服务器花了25分钟左右安装完毕.

很好,如果你没有提示任何错误信息的话,说明安装成功了.

开始初始化数据库:

先创建一个用户组和用户:

1
groupadd
mysql
#添加组
2
useradd
-g
mysql mysql -d /home/mysql -s /sbin/nologin
#添加新用户,禁止登录shell
更改MySQL安装目录的所有者和所属组

1
chown
-R
mysql:mysql /web/server/mysql/
#这里是你自己的MYSQL安装路径
初始化MYSQL数据库

1
./scripts/mysql_install_db
--user=mysql --basedir=/web/server/mysql (安装目录路径,最后不要加斜杠) --datadir=/web/server/mysql/data (数据库文件路径,最后也不要加斜杠)
2
#具体参数可以查看help
./scripts/mysql_install_db -h
可以参考官网的步骤:http://dev.mysql.com/doc/refman/5.6/en/installing-source-distribution.html

如果初始化时出现

1
[Warning]
TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation
for
more
details).
在mysql的安装根目录下生成的my.cnf中加入:

1
explicit_defaults_for_timestamp
=
true
如果提示没有data目录,请先手动创建,并将data目录的所属组和所属用户改为mysql

1
mkdir
-P
/web/serber/mysql/data
2
chown
-R
mysql:mysql /web/server/mysql/data
初始化完毕后,可能会提示一大堆的[Note] InnoDB:xxxxxx的信息,这个暂时不管了,也是我后续要解决的问题

接着将整个mysql的安装目录所属用户改为:root,把data目录的所属组和所属用户改为mysql

1
chown
-R
root /web/server/mysql
2
chown
-R
mysql /web/server/mysql/data
好了,我遇到的坑来了,按mysql的说明,接下来是执行:

1
./bin/mysqld_safe
--user=mysql --explicit_defaults_for_timestamp=1 &
一般情况下,不会报错,但是我却一直卡在这,折腾了2天,提示:

1
130720
20:35:23 mysqld_safe Logging to
'/web/server/mysql/data/xxxxxxxxxxx.err'
.
2
130720
20:35:23 mysqld_safe Starting mysqlddaemon with databases from /web/server/mysql/data
3
130720
20:35:23 mysqld_safe mysqldfrom pid
file
/web/server/mysql/data/computername.pid
ended
看到第一条结尾的.err就知道不妙,启动不起来报了错,记录进日志了,刚开始看了日志左看又看愣了又愣,

傻傻的重新编译安装了N次,服务器清空了N次,还是照旧报错,后来定下神,看了下,大致错误:

01
2013-07-20
20:35:23 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation
for
more
details).
02
2013-07-20
20:35:23 2451 [Note] Plugin
'FEDERATED'
is
disabled.
03
2013-07-20
20:35:23 2451 [Note] InnoDB: The InnoDB memory heap is disabled
04
2013-07-20
20:35:23 2451 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
05
2013-07-20
20:35:23 2451 [Note] InnoDB: Compressed tables use zlib 1.2.3
06
2013-07-20
20:35:23 2451 [Note] InnoDB: Using CPU crc32 instructions
07
2013-07-20
20:35:23 2451 [Note] InnoDB: Initializing buffer pool, size = 128.0M
08
InnoDB:
mmap(137363456 bytes) failed; errno 12
09
2013-07-20
20:35:23 2451 [ERROR] InnoDB: Cannot allocate memory
for
the
buffer pool
10
2013-07-20
20:35:23 2451 [ERROR] Plugin
'InnoDB'
init
function
returned
error.
11
2013-07-20
20:35:23 2451 [ERROR] Plugin
'InnoDB'
registration
as a STORAGE ENGINE failed.
12
2013-07-20
20:35:23 2451 [ERROR] Unknown/unsupported storage engine: InnoDB
13
2013-07-20
20:35:23 2451 [ERROR] Aborting.......
其中 Please use –explicit_defaults_for_timestamp 上面说了,也可以在my.cnf中加入:explicit_defaults_for_timestamp = true

重点在这段:

1
[Note]
InnoDB: Initializing buffer pool, size = 128.0M
2
InnoDB:
mmap(137363456 bytes) failed; errno 12
他喵的,内存不够,无法分配,我去,就这坑,没认真看,搞了我2天时间,

mysql的配置太高,服务器硬件配置又那么低,可怜的乞丐版配置,内存也才512M.

解决办法就是修改或减少my.cnf中的 innodb_buffer_pool_size

官网推荐是 cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.

结果我当时设置了 1G,肯定爆了,后来设置成100M,还是不够,最后设置成80M,最后泪流满面的启动成功了..

如果命令行提示 The server quit without updating PID file 请检查data目录的所属组和所属用户是不是mysql,也请看清楚日志,是不是因为配置过高,导致无法启动.

好吧,坑踩完了,咱们继续…

修改完my.cnf后,重新启动:

1
./bin/mysqld_safe
--user=mysql --explicit_defaults_for_timestamp=1 &
这次没有问题了,剩下的耍起来就游刃有余..

如果/etc目录下没有my.cnf的话,默认是读取mysql安装目录中的my.cnf,

也可以在./bin/mysqld_safe 中定义,具体查看 mysqld_safe -h

启动mysql前,请先配置好基础变量,basedir , datadir, port , sock 等

复制./support-files/mysql.server 到 /etc/init.d/mysqld

1
cp
./support-files/mysql.server
/etc/init.d/mysqld
2
chmod
755
/etc/init.d/mysqld
#权限设置为755
如果你要添加进系统自启服务中的话:

1
chkconfig
--add mysqld
2
chkconfig
--level 35 mysqldon
把mysql/bin/添加进环境变量

1
echo
"export
PATH=$PATH:/usr/local/bin"
>>/etc/profile
2
source
/etc/profile
#使环境变量立即生效
试一下吧:

先看下进程有没有存在mysql

1
ps
aux
|
grep
mysqld
#如果有,killall
mysqld
如果没有的,

1
service
mysqldstart
看看有木有让人激动的 Starting MySQL SUCCESS!

好吧,启动成功后,初始化root用户:

1
mysql
-u root password
'你的密码'
然后再尝试下登录吧

1
mysql
-u root -p
OK,到这基本就安装完成了,但不代表这就完事了,还有my.cnf等你去配置,以及数据库各种优化,

如果my.cnf没配置好的话,/data目录下还是会产生关于InnoDB的错误日志,这里我就不再阐述,

附上my.cnf的配置详解:

http://www.ha97.com/4110.html



http://database.51cto.com/art/201108/285365.htm

最后总结下这个过程,我只想说,看错误日志,是解决问题的根本所在

over

后记,今天又突然发现mysqld_safe –user=mysql –explicit_defaults_for_timestamp & 初始化启动不了,老是报错:

1
Starting
MySQL. ERROR! The server quit without updating PID
file
于是找到了这个有趣的提问:http://forum.directadmin.com/showthread.php?t=43650

出去会个朋友后回家,重新初始化启动,居然success了,匪夷所思,我猜估计真的和服务器的内存有关..

实际证明:服务器内存不够会导致无法启动mysql,并只会报错:Starting MySQL. ERROR! The server quit without updating PID file /xxxxxx.pid
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat mysql
相关文章推荐