这个坑真的是太坑爹了,租用的服务器是阿里云的乞丐版(最低配置),单核,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 #从服务器上下载官方mysql5.6 |
第一步先安装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://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