这个坑真的是太坑爹了,租用的服务器是阿里云的乞丐版(最低配置),单核,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 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 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://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