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

时间:2022-11-18 16:59:33

这个坑真的是太坑爹了,租用的服务器是阿里云的乞丐版(最低配置),单核,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 mysqld daemon with databases from /web/server/mysql/data
3 130720 20:35:23 mysqld_safe mysqld from 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 formore 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 mysqld on

把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 mysqld start

看看有木有让人激动的 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