死于Order By Rand()
我的某个项目里有需求从N个项目里随机抽取M个,这里我用到了Order By Rand()。
开始运作的挺好,工作表的记录数在几千左右,响应时间都马马虎虎过得去。
后来我们添加了一个功能,建了一个新表,这个表的记录会持续增加。累积了一段时间灾难爆发了,应用连接不上数据库,用mysql console,show processlist看到这种查询竟然要几秒钟。Order By Rand()用在大量记录的表上真是个灾难,而且会越来越慢。
网上搜索了一下方法,在min(id) max(id)之间生成一个随机数,然后选择大于等于这个id的M个记录即可。
SELECT * FROM `centences` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `centences`)-(SELECT MIN(id) FROM `centences`))+(SELECT MIN(id) FROM `centences`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id LIMIT 1;
经过修改,问题解决。不过这个解决方案有个缺陷,假设不是LIMIT 1,会有几率导致结果比预想的少一点,这种时候就需要靠程序判断去弥补了。
另外一个问题,就是取到的是连续的记录,这个不满足我们的应用。这里依然采用循环M次的方法,每次取1。虽然执行的语句多了,但是总体执行时间还是比Order By Rand要节省很多。
将LAMPP中的BIN目录加入PATH
临时设置:
export PATH=$PATH:/opt/lampp/bin/
永久设置:
1.打开/root/.bash_profile
2.输入
PATH=$PATH:/opt/lampp/bin
export PATH
3.保存、退出
:wq
开机自动运行LAMPP
為了让LAMPP在每次开机时自动执行,可以将启动的 scripts 加入你的 /etc/rc.d/rc.local 中:
1.编辑rc.local文件
# vi /etc/rc.d/rc.local
2.加入启动的 scripts
/opt/lampp/lampp start
3.保存并退出vi
:wq
SSH反向连接管理内网Linux
/root/script/pssh
killall ssh
ssh -f -N -R 8822:localhost:22 root@xxx.xxx.xxx.xxx -p xxxx
ssh -f -N -R 7722:localhost:22 root@yyy.yyy.yyy.yyy
On xxx.xxx.xxx.xxx
ssh root@localhost -p 8822
On yyy.yyy.yyy.yyy
ssh root@localhost -p 7722
要在远程主机上建立本地主机的信任关系:
参考http://www.yuyangblog.com/2010/09/ssh下rsync备份不输密码/
自动备份MYSQL数据库
#!/bin/sh db_user="dbuser" db_passwd="dbpass" db_host="localhost" # the directory for story your backup file. backup_dir="/var/www/sqlbak" # date format for backup file (dd-mm-yyyy) time="$(date +"%d-%m-%Y")" # mysql, mysqldump and some other bin's path MYSQL="/usr/bin/mysql" MYSQLDUMP="/usr/bin/mysqldump" MKDIR="/bin/mkdir" RM="/bin/rm" MV="/bin/mv" GZIP="/bin/gzip" # check the directory for store backup is writeable test ! -w $backup_dir && echo "Error: $backup_dir is un-writeable." && exit 0 # the directory for story the newest backup test ! -d "$backup_dir/backup.0/" && $MKDIR "$backup_dir/backup.0/" # get all databases all_db="$($MYSQL -u $db_user -h $db_host -p$db_passwd -Bse 'show databases')" for db in $all_db do $MYSQLDUMP -u $db_user -h $db_host -p$db_passwd $db | $GZIP -9 > "$backup_dir/backup.0/$time.$db.gz" done # delete the oldest backup test -d "$backup_dir/backup.5/" && $RM -rf "$backup_dir/backup.5" # rotate backup directory for int in 4 3 2 1 0 do if(test -d "$backup_dir"/backup."$int") then next_int=`expr $int + 1` $MV "$backup_dir"/backup."$int" "$backup_dir"/backup."$next_int" fi done exit 0;
忘记Kloxo的admin登录密码怎么恢复密码
忘记Kloxo的admin登录密码怎么恢复密码?只能重装吗?太痛苦了。
别急,有办法,root用户ssh登录,运行下面的命令即可重置admin密码:
cd /usr/local/lxlabs/kloxo/httpdocs
php ../bin/common/resetpassword.php master yuyangblog
上面的命令把kloxo新密码重新设置为了yuyangblog
然后,您的kloxo后台就可以登录了。登录后,请修改密码。
Apache Nginx并存
因为多店铺批量做SEO,服务器不堪蜘蛛爬虫反向链接检查集中到来重负,现使用方案Linux CentOS服务器负载过高时自动重启Apache服务,虽然整体服务器不会死的很尴尬,但是技术人员后台操作的时候间歇遇到Apache重启,工作效率受到影响。
因此为服务器额外安装了Nginx,和Apache使用同个document root访问magento后台,服务器有多个IP,只需要配置Apache和Nginx使用不同的IP即可。
由于不同的IP,后台打开变快很多,如果能用不同的物理网卡,效果应该更好。
Linux CentOS服务器负载过高时自动重启Apache服务
最近在进行Magento的多店铺实践,200+产品,100+店铺,已经考虑到多店铺里的各种表可能会变得庞大,单页面的负载会比单店铺下要高,因此服务器配置比平时的配置多加了2G内存,此配置为:
Intel Quad Core Xeon X3220
Memory: 8 GB
网站域名解析并提交搜索引擎后,间或发现服务器无法响应,网站无法打开,只能提交主机商客服重启处理,重启后人工盯了一段时间TOP命令监测CPU Average平时为2左右,比单店铺的0.5-0.7要高许多,多店铺对资源的要求还是很高。观察一夜之后发现,CPU Average会偶然飙高到20+以上,对于4核CPU来说,这个数值意味着系统很难再为其他进程服务,这也就不难解释为什么SSH无法登录了。也观察了Apache Log发现这种情况发生的时候,有一些非蜘蛛亦非客户的请求过来,并发并不高,但是持续访问最终拖死了Apache。尝试将mod_php修改为fast_cgi后情况稍有改善,但是没有治本,服务器依然会死去。
经历了连续3次刚睡下被喊起来处理的痛苦后决定采用以下解决方案,在负载过高的时候杀死Apache,丢弃一部分访问换取服务器的长久运作,在进程杀死服务器之前,先杀死进程。
#!/bin/sh
TOP_SYS_LOAD_NUM=20
SYS_LOAD_NUM=`uptime | awk '{print $(NF-2)}' | sed 's/,//'`
echo $(date +"%y-%m-%d") `uptime`
if [ `echo "$TOP_SYS_LOAD_NUM < $SYS_LOAD_NUM"|bc` -eq 1 ]
then
echo "##" $(date +"%y-%m-%d %H:%M:%S") "pkill httpd" `ps -ef | grep httpd | wc -l`
pkill httpd
sleep 10
for i in 1 2 3
do
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
done
else
if [ `pgrep httpd | wc -l` -le 0 ]
then
/usr/sbin/apachectl start
sleep 30
echo "##" $(date +"%y-%m-%d %H:%M:%S") "start httpd" `ps -ef | grep httpd | wc -l`
fi
fi
Crontab增加如下调用,2分钟执行一次
*/2 * * * * /root/checkload.sh >>/root/checkload.log
先观察一下,下一步把对内存的监测也放上去。
Error: Please check for sufficient write file permissions
find . -type d -exec chmod 777 {} \;
find . -type f -exec chmod 644 {} \;