标签归档:mysql

windows创建软连接附加mysql数据库

mysql数据库MyISAM引擎数据库表有三个文件,分别是*.frm、*.MYD、*.MYI,只要备份这三个文件也就完全备份了数据库,非常方便,有时候会遇到临时读取备份数据库的情况,全部拷贝到开发环境未免太过繁琐,其实合理利用windows系统的软连接即可解决问题,即把移动硬盘(或其他目录)的数据库文件夹软连接到mysql的数据库文件夹即可,命令如下:
mklink /J linkname dstdir
例如:mklink /J mydata D:\mydata\
重启mysql服务后,即可在数据库里正常使用D:\mydata\目录下的数据库了。

Linux(ubuntu)开机启动脚本遇到的坑

使用python制作了一个脚本,想法是每6小时重新执行一次,而脚本是重复循环的也就是6小时里它是不会自动结束运行,所以单纯使用crontab定制定时任务不能直接达到目的,需要使用脚本检查PID,太麻烦!于是想到是使用crontab定制每6小时重启一次主机,然后脚本放在/etc/rc.local里达到开机启动的目的,坑也在这里挖好了,其实还是自己技术不精导致的!!!
1、crontab脚本是在root下编辑的,如下:

0 */6 * * * reboot

这里是第一个坑,到时间主机就是不重启?!原来reboot需要root权限所以脚本要写成如下形式,改完立即好用:

0 */6 * * * sudo reboot

2、rc.local中脚本是这样写的:

/usr/bin/python3 /root/dl.py

这里是第二大坑,问题不在语法,而是dl.py文件没有可执行权限!使用命令chmod 111 dl.py解决
第三大坑是脚本执行了,却提示mysql错误没有conn对象,原来是脚本启动时mysql还没有准备好所以连接失败解决方法很多,异常判断等待几秒重连mysql数据库,我索性脚本运行开始先等10s后再连接数据库,问题解决。

mysql实现计算两点(经纬度)间的距离

LBS应用中常常需要计算两点之间的距离,以实现查看某点附近的地点、人、事、物,虽然mysql支持空间查询,但对于一些规模较小的应用还是用简单的处理办法比较快捷,这个方法改自一个js脚本,原脚本是:

var EARTH_RADIUS = 6378137.0; //单位米
var PI = Math.PI;
function getRad(d){
return d*PI/180.0;
}
function getGreatCircleDistance(lat1,lng1,lat2,lng2){
var radLat1 = getRad(lat1);
var radLat2 = getRad(lat2);
var a = radLat1 - radLat2;
var b = getRad(lng1) - getRad(lng2);
var s = 2*Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) + Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s*EARTH_RADIUS;
s = Math.round(s*10000)/10000.0;
return s;
}
继续阅读

mysql 字段别名不能用于where子句的解决方法

mysql 字段别名不能用于where子句,会报”ERROR 1054 (42S22): Unknown column ‘xxxxxx’ in ‘where clause’
“错误,这个很多人都有遇到,却不知道是为什么,搜索了很多答案都觉得不靠谱。倒是找到了一个比较靠谱的解决方法:
“select name as alias from table where alias=’xxxx’;”这样的错误语句改为”select name as alias from table having(alias=’xxxx’);”即可解决问题。

Mysql 使用Insert into select where not exists语句避免插入重复记录

往生产环境更新数据时,往往会有一些重复的记录存在,为了避免插入重复记录,我常常使用的语句是“insert into select where not exists”,一般是先把需要更新的数据导入tmp临时数据库,然后再插入线上数据库,这样可以最大程度避免影响业务系统的正常运转,并顺利使用以上语句。
这里举例的线上数据表是oming,临时数据表是oming_tmp(创建该表时使用语句“create table oming_tmp like oming;”)
字段有:id(自增),addr,lng,lat,time(update时自动更新时间)
1.多条记录导入:
insert into oming(addr,lng,lat) select addr,lng,lat from oming_tmp where not exists(select * from oming where oming.lng=oming_tmp.lng and oming.lat=oming_tmp.lat);
通过lng,lat字段验证是否重复。
2.单条记录导入:
insert into oming(addr,lng,lat) select ‘辽宁省沈阳市青年大街华润中心’,’123.441919′,’41.7809′ from oming_tmp where not exists(select * from oming where oming.lng=’123.441919′ and oming.lat=’41.7809′);

php5提示PHP Fatal error: Call to undefined function mysql_connect() in…的解决

Debian搭建的apache2+php5平台没有安装mysql数据库,今天弄个小应用要连接远程的mysql数据库,提示PHP Fatal error: Call to undefined function mysql_connect() in…这个错误,一下子懵了,没遇到过这样的问题啊,哎呀我去弄了老半天才想起来这茬事儿,没有安装mysql也没有安装php对mysql的支持,怎么可能好用呢,在不想安装mysql的情况下只需要一条命令:”sudo apt-get install php5-mysql” 搞定,mark一下,执行这条命令前别忘了先更新系统”sudo apt-get update”和”sudo apt-get upgrade”,至此问题解决,有时候也需要重启apache2的,执行命令 “sudo /ect/init.d/apache2 restart”。

用大数据来看看我们的百家姓

大数据不解释了,解释我也解(bu)释(dong)不明白,我的理解就是数据量够大,现在我收集了3亿这样一个量级的人名、所在地等字段的数据,听起来还算是比较大了吧,今天只拿来验证一下我们举全国之力人口普查得来的百家姓排名结果,或者说拿人口普查的结果验证一下我收集的数据是不是全面吧。
全国最近一次人口大普查2010年11月1日凌晨结束,据官方公开数据显示:全国总人口13亿7千万,百家姓前十就占了5.5亿人口,前十分别是:李,9530万,占总人口7.94%;王,8899万,占总人口7.41%;张,8480万,占总人口7.07%;刘,6460万,占总人口5.38%;陈,5440万,占总人口4.53%;杨,3700万,占总人口3.07%;赵,2750万,占总人口2.29%;黄,2680万,占总人口2.23%;周,2540万,占总人口的2.12%;吴,2460万,占总人口2.05%。
使用的mysql语句“select left(name,1) as xing,count(left(name,1)) as num from xxx where length(name)<5 group by xing order by num desc limit 100;”,下面是前十的结果:
排序 姓氏 人数 比例
1 王 11700000 3.34%
2 李 11100000 3.17%
3 张 10000000 2.88%
4 刘 7480000 2.13%
5 陈 5810000 1.66%
6 杨 4690000 1.34%
7 赵 2660000 0.76%
8 周 2530000 0.72%
9 黄 2300000 0.65%
10 吴 2200000 0.62%
为避免过于精确带来不必要的问题,对人数已经进行了简单加工,只保留约数,发现百家姓排名中李和王、周和黄排序存在颠倒的问题,姓氏比例也不对,其他都是准确的,说明我的样本还是比较大的,但是还不够大,否则排序基本跟全国人口普查结果一致。分析不完全一致的原因那就是我收集的数据片面的体现中国劳动力人口的状况(能上网的大部分都是有劳动能力的吧),而没有老人、幼儿及文盲等,总结经验那就是在用大数据解决问题的时候要保证数据足够全面,多少是全面,那要有专门的算法师时刻监控结果的准确性随时给出结果,不能盲目地相信结果,如果样本足够全面到极限接近全量数据时,结果将可以用精确来说了。 继续阅读