mysql: 数据库无法连接,日志太多。

自从上次因为系统盘的数据满了,导致mysql无法连接,所以就修改mysql数据库文件路径,转移到数据盘。结果这段时间mysql总是链接不上,所以只好一步一步找原因,来解决这个问题。

第一步: 查找链接不上的原因

1. 查看磁盘大小

发现数据盘也满了,不太可能啊,数据盘有50个G,咋就一下就满了呢?

20150303112754

2. 查看数据盘的文件大小

发现mysql/datadir文件夹占了46个G,这个文件夹不就是mysql数据库文件目录。

20150303112846

3. 查看数据库文件夹

全部都是日志文件,并且大部分都是日志文件占容量了。

20150303113119

20150303113231

4. 再次查看磁盘容量

20150303113741

第二步: 解决mysql连接不上的问题

1. 删除mysql-bin.000*日志文件

20150303113644

2. 修改mysql的配置文件my.cf

20150303113718

3. 注释mysql-bin日志

20150303115000

4. 重启mysqld服务

发现报错,原因是不仅要注释log-bin=mysql-bin,还要注释binlog_format=mixed.

20150303115736

5. 再次修改mysql配置文件

20150303115702

6. 重启成功。

20150303121505

CentOS 7.0 yum安装Apache + PHP + MySQL

1. 安装Apache, PHP, MySQL以及php连接mysql库组件。

yum -y install httpd php mysql mysql-server php-mysql

 2. 安装apache扩展

yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql

 3. 安装php的扩展

yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc

 4. 安装MySQL的扩展

yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql

 5. 配置开机启动服务

#/sbin/chkconfig httpd on             [设置apache服务器httpd服务开机启动]
#/sbin/service httpd start            [启动httpd服务,与开机启动无关]
#/sbin/service mysqld start           [启动mysqld服务,与开机启动无关]

apache的配置文件是/etc/httpd/conf下
modules放在/usr/lib/httpd下
php的配置文件在/etc/php.d/下 和/etc/php.ini
php的modules放在/usr/lib/php/modules下

6. 绑定域名

在/etc/httpd/conf/httpd.conf配置文件中,提供了范例:

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
#<VirtualHost *:80>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>

所以绑定域名可以跟着提供的范例来配置即可。

说明:

MySQL默认安装的后,root密码为空.

[window]在windows 2003中部署iis、ftp、php、mysql、zend环境

总是有很多人问,如何在windows 2003中去部署php、mysql、zend环境,让windows服务器既支持asp/asp.net,也支持php。其实只要配置好php环境就可以实现以上需求。而IIS就是微软提供出来支持asp和asp.net。如何部署?请看如下教程:

第一步: 安装IIS+FTP(前提是windows没有安装IIS)

开始—-控制面板—-添加或删除程序

27_253667_9cf6fd9ec3b12ee

 

出现如下界面点击“添加/删除windows组件(a)

27_253667_4d2ff5607cfdd7a

 

出现如下界面

27_253667_00463f0b5d479f1

 

选择“应用程序服务器”

27_253667_0f0962b297b171b

 

点击图片中的“详细信息”

27_253667_c9872ca9c6b5e50

 

出现上面的图片“选中internet 信息服务(iis)”,点击图片中的“详细信息”

27_253667_02fa6f300f2e774

 

选中图片中的“文件传输协议(ftp)服务”然后点击“确定”

T1Z4TkXlVuXXbW8b._-664-318

 

点击图片中的“浏览”选中“c:\win2003_sys\disc1\i386”如图

说明:如果没有此文件,请自行下载iis文件包

T1xlK1FahfXXXsK.j4-486-307

点击图片中的“打开”iis就开始安装了。如果系统是windows2003 64位的话该文件则位于“C:/win2003_sys/disc1/AMD64”下面

27_253667_bdaab867e75e81b

出现这个表示iis 和ftp 已经安装好了

第二步:  安装php

请点击查看 [windows]在windows系统中配置php环境

第三步: 安装mysql

请点击查看 [windows] 搭建mysql环境

第四步:  安装Zend环境

请点击查看 [windows] 部署zend环境

第五步:  安装ftp

请参照 [Windows]安装和使用FTP for Windows2008

第六步: 完毕!

亲们! 懂了么?快快留言吧!…

 

【mysql】group by排序

类如 有一个 帖子的回复表,posts( id , tid , subject , message , dateline ) ,

id为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复标题, message 为回复内容, dateline 为回复时间,用UNIX 时间戳表示,

现在要求 选出 前十个来自不同主题的最新回复

posts GROUP BY tid LIMIT 10

这样一个sql语句选出来的并非你想要的 最新的回复,而是最早的回复,实际上是某篇主题的第一条回复记录!

也就是说 GROUP BY 语句没有排序,那么怎么才能让 GROUP 按照 dateline 倒序排列呢?加上 order by 子句?

看下面:

posts GROUP BY tid ORDER BY dateline DESC LIMIT 10

这条语句选出来的结果和上面的完全一样,不过把结果倒序排列了,而选择出来的每一条记录仍然是上面的记录,原因是 group by 会比 order by 先执行,这样也就没有办法将 group by 之前,也就是在分组之前进行排序了, 有网友会写出下面的sql 语句:

posts GROUP BY tid DESC ORDER BY dateline DESC LIMIT 10

也就是说 在 GROUP BY 的字段 tid 后面加上递减顺序,这样不就可以取得分组时的最后回复了吗?这个语句执行结果会和上面的一模一样,这里加上 DESC 和ASC对执行结果没有任何影响!其实这是一个错误的语句,原因是GROUP BY 之前并没有排序功能,mysql 手册上面说,GROUP BY 时是按照某种顺序排序的,某种顺序到底是什么顺序?其实根本没有顺序,因为按照tid分组,其实也就是说,把tid相等的归纳到一个组,这样想的话,GROUP BY tid DESC 可以认为是在按照 tid 分组的时候,按照tid进行倒序排列,这不扯吗,既然是按照tid分组,当然是tid相等的归到一组,而这时候按照tid倒叙还是升序有个P用!

于是有网友发明下面的语句:

posts GROUP BY tid , dateline DESC ORDER BY dateline DESC LIMIT 10

心想这样我就可以在分组前按照 dateline 倒序排列了,其实这个语句并没有起到按照tid分组的作用,原因还是上面的,在group by 字段后加 desc 还是 asc 是错误的写法,而这种写法 网友本意是想 按照 tid 分组,并且在分组的时候按照 dateline排倒序!而实际这句相当于下面的写法:(去掉 GROUP BY 字段后面的 DESC)

posts GROUP BY tid , dateline ORDER BY dateline DESC LIMIT 10

也就是说,按照 tid 和 dateline 联合分组,只有在记录tid和dateline 同时相等的时候才归纳到一组,这显然不可能, 因为 dateline 时间线基本上是唯一的!

有人写出下面的语句:

GROUP BY tid ORDER BY dateline DESC LIMIT 10

这条语句的没错是选出了最大发布时间,但是你可以对比一下 dateline 和 max_dateline 并不相等!(可能有相当的情况,就是分组的目标记录只有一条的时候!)

为什么呢?原因很简单,这条语句相当于是 在group by 以后选出 本组的最大的 发布时间!对分组没有起到任何影响!因为SELECT子句是最后执行的!

后来更有网友发明了下面的写法!

GROUP BY tid HAVING dateline=max(dateline)

ORDER BY dateline DESC LIMIT 10

这条语句的预期结果和想象中的并不相同!因为你会发现,分组的结果中大量的记录没有了!为什么?因为 HAVING 是在分组的时候执行的,也就说:在分组的时候加上一个这样的条件:选择出来的 dateline 要和 本组最大的dateline 相等,执行的结果和下面的语句相同:

GROUP BY tid HAVING count(*)=1

ORDER BY dateline DESC LIMIT 10

看了这条sql语句是不是明白了呢?

dateline=max(dateline) 只有在分组中的记录只有一条的时候才成立,原因很明白吧!只有一条他才会和本组的最大发布时间相等阿,(默认dateline为不重复的值)

原因还是因为 group by 并没有排序功能,所有的这些排序功能只是错觉,所以你最终选出的 dateline 和max(dateline) 永远不可能相等,除非本组的记录只有一条!GROUP BY 在分组的时候,可能是一个一个来找的,发现有相等的tid,去掉,保留第一个发现的那一条记录,所以找出来的 记录永远只是按照默认索引顺序排列的!

那么说了这么多,到底有没有办法让 group by 执行前分组阿?有的 ,子查询阿!

最简单的 :

GROUP BY tid ORDER BY dateline DESC LIMIT 10

也有网友利用自连接实现的 ,这样的效率应该比上面的子查询效率高,不过,为了简单明了,就只用这样一种了,GROUP BY没有排序功能,可能是mysql弱智的地方,也许是我还没有发现,