背景:博客下面要写XXXX-Now Year,有点像公司成立多少年,以前估计的是2007年写在博客底部了,但估计不是很真实,今天突然想起 ,可以从那博客的最早的一篇博客是什么时候写的哩?于是查了一下,那个时候我也就开始用回忆未来这人名了,进入新浪后,偶听到后来在中南大学毕业的张宴和我是同事,也叫回忆未来(中间不知有多少兄弟说我是山寨的,呵呵,但我一直坚持未修改网名,,中间辗转换了好几个域名:xiangdong.org,happycun.com,3gpnet.com,jackxiang.com ,后直接托管给bo-blog的作者bob帮我打理了好几年,一直没有动,中间还换成vps了,后又让bob打理了两年,现在一直还在打理,中间也提醒过安全及升级,后主机由国内转到国外,出现偶连接不上美国的服务器,在这中间多少次想换wordpress但都没有换成,几经评估,博客数量都快上7千了,大多数是copy过来的,这些年没事就copy也不少了,看着wordpress长起来的,也从中想换bo-blog成wordpress,但一直也没有换,把它当笔记本使,主要是还是它运行相对快一些(快就是用户体验),就这样用bo-blog用了八年,用回忆未来的网名也用了八年,从北京到深圳,再回北京,转战南北,要是在当年抗日战争时期,打日本鬼子都胜利了,真是个值得值得纪念的日子。),可转眼八年过去了,时光荏苒,岁月如梭啊。
select count(*) from boblog_blogs;
+-----+
6882
+-----+
select blogid,title,pubtime from boblog_blogs order by  pubtime asc limit 10;
blogid                       title                                                             pubtime  
2                             群殴时总结的技巧                                           1155018983
3                             大学打架手册                                                 1155049193
4                             给大学生的忠告,不是真理,但是足够你用四年    1155049223
6                             黄家驹的歌曲片段                                           1155259448
7                             勤奋不是成功的根本原因                                  1155307410
8                             少走弯路的十大忠告                                        1155307458
9                             如果你是男人,请记住这二十二条忠告                1155307569
10                            华为的笑话:老实人在华为                               1155307651
11                            手表的等级分类                                              1155307701
12                            子网掩码计算方法                                           1155307744
mysql> SELECT FROM_UNIXTIME(1155018983);
+---------------------------+
| FROM_UNIXTIME(1155018983) |
+---------------------------+
| 2006-08-08 14:36:23       |
+---------------------------+
1 row in set (0.01 sec)
感慨良久:2006年8月8日,我的个天,那时还上大学,那时我还上大三,对技术涉及还很少,都是些心灵鸡汤的事,还在考虑是否跨个专业考研还是工作,到现在都8年了,时间真是快啊,但那又怎样,生活还得继续,人生的路还得狂奔不止一路走下去,fight ,come on,加油。阅读全文
基于统计的冗余设计
如:
count(*)操作。
需要不精准结果,可以直接show table status like …获得。
需要精准结果,可以在缓存层增加key-value对,实时更新该key-value。同时异步更新到数据库中冗余字段,或冗余表中。

查询数据表有多少行,多少容量
不要使用select count(*)
使用show table status like ‘table_name’  但是innodb的话会有50%左右的浮动,是个预估值
阅读全文
http://www.linuxidc.com/Linux/2013-02/79561.htm

mysql_get_host_info
mysql_get_host_info
(PHP 4 >= 4.0.5, PHP 5)
mysql_get_host_info -- 取得 MySQL 主机信息
1说明

string mysql_get_host_info ( [resource link_identifier] )
mysql_get_host_info() 返回一个字符串说明了连接 link_identifier 所使用的连接方式,包括服务器的主机名。如果省略 link_identifier,则使用上一个打开的连接。
2例子:
[codes=php]
<?php
mysql_connect("localhost", "mysql_user", "mysql_password") or
die("Could not connect: " . mysql_error());
printf ("MySQL host info: %s\n", mysql_get_host_info());
?>
[/code]
以上例子将产生如下输出:
MySQL host info: Localhost via UNIX socket
来自:http://baike.baidu.com/link?url=-PyG2pRJ0GvzZAaMq7OYAoxSg5R-BvGkVz6s6_3FC1PxwJzziga80uKOesZXmZDA4n0_nzEAIuAj5DeUngNmdq
http://linuxnx.blog.51cto.com/6676498/1209443
http://database.51cto.com/art/201304/387688.htm
阅读全文
http://www.oschina.net/translate/mysql-5-7-innodb-memcached-plugins
Percona公司真是勤勉上进的时代好青年,他将两套老掉牙的工具整理、合并、修订,发布了Percona Toolkit。这是一个非常好用的工具集,学好用好这个工具集,肯定会对你以后DBA的工作生涯中有所帮助。

这些工具大部分是用shell和perl编写的,提供YUM软件源,安装非常简单,但还有一种更简单的办法,比如我想用pt-mysql-summary这个工具,只需要:

#wget percona.com/get/pt-mysql-summary

然后

#chmod +x pt-mysql-summary

就可以使用了,像不像Windows中的“绿色免安装软件”?

官方的文档可以参见:

http://www.percona.com/doc/percona-toolkit/

这个工具集内容非常丰富,其中pt-summary, pt-mysql-summary, pt-show-grants, pt-slave-delay 是我最常用的工具,建议大家有空多研究尝试一下,磨刀不误砍柴工。

来自:http://www.zeuux.com/group/himysql/bbs/content/55142/
如何捕获MySQL数据库中的低效SQL语句:
面对业务的迅猛发展,DBA的一项重要工作就是及时发现数据库中的低效SQL语句,有的可以立刻着手解决(比如缺少合适的索引),有的需要尽快反馈给开发人员进行修改。

MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句:

1,slow_query_log

这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句。

2,long_query_time

当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短。

3,slow_query_log_file

记录日志的文件名。

4,log_queries_not_using_indexes

这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快。

配置好上述几个参数后,我们就可以监视日志,然后着手进行解决了。

来自:http://www.zeuux.com/group/himysql/bbs/content/55137/


中小型MySQL数据库集群方案:
对于中小型MySQL数据库集群,有以下几个特点或需求:

1,数据库写入操作并不密集,单台服务器足以支持。

2,数据库读取操作频繁,需要能够轻松扩展。

3,业务对数据库依赖性强,对于数据库的可用性有较高的要求。

4,应用普遍已经支持数据库读写分离。

5,要求架构简单,不能引入复杂或者不可靠的技术组件。

针对这些特点和需求,我认为合适的架构如下:

1,数据库主库采用DRBD磁盘复制方案,并配合Heartbeat来达到HA的效果。

2,多台数据库辅库使用DR模式的LVS来达到负载均衡和HA的效果。

这样的架构简单且可靠,我认为是中小型MySQL数据库集群比较理想的方案。

你觉得呢?

来自:http://www.zeuux.com/group/himysql/bbs/content/55127/
STRICT_TRANS_TABLES:https://www.cnblogs.com/lxwphp/p/9054971.html
#sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION



背景:线上数据库报:mysql STRICT_TRANS_TABLES严格模式下提示Field 'ip' doesn't have a default value,线下测试机没有报错,外包开发时代码没法保证SQL全写运行无问题。
failed to execute the SQL statement:
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect
datetime value: '0000-00-00 00:00:00' for column 'updated_at' at row 1
如果想宽松模式,则注意一下修改一下sql_mode,如下:


这样干的问题:


INNODB加入后,还是不行:
innodb_strict_mode = 1
mysql> show variables  like "%str%";
+--------------------+----------------+
| Variable_name      | Value   |
+--------------------+----------------+
| innodb_strict_mode | ON    |
+--------------------+----------------+
1 row in set (0.00 sec)

外网的SQL有问题,内网的测试机db无问题,如下:
REPLACE INTO `app_play_8` (`user_id`, `video_id`, `video_name`, `video_img`, `video_url`, `playtime`, `source`, `source_url`, `clienttype`, `position`) VALUES ('21240168', '112c9654-52ed-11e1-b091-a4badb4696b6', '《2012春节动画狂欢曲》', 'http://p1.img.cctvpic.com/fmspic/2012/02/06/becd73c6cc3f43c59add0f42787400ae-180.jpg', 'http://jackxiang.com/v-112c9654-52ed-11e1-b091-a4badb4696b6.html', 1388978166, '哈妮哈妮', 'http://my.jackxiang.com/31759585/index.html', '1', '99')

ERROR 1364 (HY000): Field 'ip' doesn't have a default value


看似找到了,其实不然,和版本无关---另一台测试的db是13的,也是同样ip不能为空,但也不提示:Field 'ip' doesn't have a default value。
找到了:
这个我在我的虚拟机mysql5.6.12 上分别把线上的sql给建立和线下也建立,同时这个+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_strict_mode | OFF   |
+--------------------+-------+,
虚拟机是会报没有ip的,所以,得出是mysql的版本造成的。5.6.11(测试),5.6.12(我的虚拟机),5.6.13线上。 12,13是一样的结果,得证。
我这个关系不大:innodb_strict_mode
尽管线上打开了,但是我的虚拟机配置没打开这个,依旧能提示:Field 'ip' doesn't have a default value。

______后来,1)打开my.ini,加入:
#Add Mysql's Innodb strict sql insert mode by:jackxiang date:2013-01-06

2)重启:
[root@localhost mysql]# ./bin/mysqld_safe --defaults-file=conf/my.cnf &
3)再插入OK有提示了:
mysql> REPLACE INTO `app_play_8` (`user_id`, `video_id`, `video_name`, `video_img`, `video_url`, `playtime`, `source`, `source_url`, `clienttype`, `position`) VALUES ('21240168', '112c9654-52ed-11e1-b091-a4badb4696b6', '《2012春节动画狂欢曲》', 'http://p1.img.cctvpic.com/fmspic/2012/02/06/becd73c6cc3f43c59add0f42787400ae-180.jpg', 'http://jackxiang.com/v-112c9654-52ed-11e1-b091-a4badb4696b6.html', 1388978166, '哈妮哈妮', 'http://my.jackxiang.com/31759585/index.html', '1', '99');
ERROR 1364 (HY000): Field 'ip' doesn't have a default value
mysql> quit


实践参考两篇文章:
mysql STRICT_TRANS_TABLES严格模式下提示Field 'id' doesn't have a default value:
http://www.zui88.com/blog/view-411.html
Mysql Field * doesn't have a default value解决方法:
http://blog.sina.com.cn/s/blog_43ed7f260100fk6h.html

EOF Add:2014-01-06
——————————————————————————————————————————————————————————————
虽然说我们尽量在写程序的时候控制插入到数据库的数据,而不要用数据库去判断数据的对错,但是有时候为了方便还是需要数据库自身的容错能力来帮助我们达到目的的。举例说明:
创建如下数据表
[sql] view plaincopy
    CREATE TABLE `book` (  
      `id` int(11) default NULL,  
      `num` int(11) unsigned default NULL  
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk  
    insert into bookvalues(1,0),(2,0)  
执行update book set num='abc',竟然不报错,原因是没有启用严格模式。所以
先执行set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",
然后执行update book set num='abc',数据库就报错了
如果想一劳永逸,那就直接把数据库配置文件my.ini中的相关参数设置为
# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
——————————————————————————————————————————————————————————————

解决办法:关闭MySQL的strict mode。具体做法:找到MySQL目录下的my.ini,
将其中的sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
修改为sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",重新启动 Mysql服务。


  MySQL 严格模式 sql_mode 收藏
虽然说我们尽量在写程序的时候控制插入到数据库的数据,而不要用数据库去判断数据的对错,但是有时候为了方便还是需要数据库自身的容错能力来帮助我们达到目的的。举例说明:
创建如下数据表
CREATE TABLE `book` (
  `id` int(11) default NULL,
  `num` int(11) unsigned default NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
insert into bookvalues(1,0),(2,0)
执行update book set num='abc',竟然不报错,原因是没有启用严格模式。所以
先执行set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",
然后执行update book set num='abc',数据库就报错了


非严格模式:会对语法的限制降到最低,导致很多不规范的语句都可以执行,会导致歧义.
严格模式:可以实现严格校检,使错误数据不能插入,从而保证数据准确性.

来自:http://blog.sina.com.cn/s/blog_505d197c0100l1bs.html
来自:http://blog.csdn.net/ldb2741/article/details/5317803
官网:http://forums.mysql.com/read.php?11,581356,581356#msg-581356
less中百分比和数字计算:
我用的格式如下,可能还有其他格式,欢迎补充

注意:括号中间的运算符两边必须有空格,否则结果不对,亲测坑爹啊

margin-left:calc(~"(100% - 225px)");

阅读全文
背景:其实ttserver一直没有实践过,昨天有同事问怎么样清空,我查了下好像和memcache一样的协议,用telnet上其端口用:flush_all 就能清空。
通过memcache协议使用ttserver
通过telnet 127.0.0.1 1978 telnet连接到到我们第一节的启动实例。
以下我们通过add增加key为key1和value为value1的数据。
通过get key1获取数据,如果你看不明白,可以搜索下memcache协议的东西看下。
add key1 1 0 6
value1
STORED
get key1
VALUE key1 0 6
value1
END

通过php使用

运行后输出:

value2 a:1:{s:6:"value3";s:14:"this is value3";}

来自:http://www.cnblogs.com/sunli/archive/2009/03/18/1415168.html
用Nginx作反向代理 :http://blog.csdn.net/starxu85/article/details/5247491
摘录:
2.利用nginx实现http协议的高可用性
2.1为什么要把nginx扯进来?
ttserver提供了http接口
ttserver没有提供安全 保证
nginx在处理http请求和反向代理的性能 非常好

nginx的反向代理具有负载均衡和健康检查功能
当然,也可参考:http://www.s135.com/post/384/


启动ttserver的示例:


ttserve安装及测试:
概述
编辑

Tokyo Cabinet 是一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几倍。利用Tokyo Tyrant构建兼容Memcached协议、支持故障转移、高并发的分布式key-value持久存储系统。key-value分布式存储系统查询速度快、存放数据量大、支持高并发,非常适合通过主键进行查询,但不能进行复杂的条件查询。
Tokyo Tyrant 是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有Memcached兼容协议,也可以通过HTTP协议进行数据交换。Tokyo Tyrant 加上 Tokyo Cabinet,构成了一款支持高并发的分布式持久存储系统,对任何原有Memcached客户端来讲,可以将Tokyo Tyrant看成是一个Memcached,但是,它的数据是可以持久存储的。
2ttserve安装
编辑

下载zlib和bzip并进行安装,因为我使用的是ubuntu系统,所以直接apt-get install libbz2-dev就 ok了。
安装tokyo cabinet
下载 tokyocabinet-1.4.41.tar.gz
tar zxvf tokyocabinet-1.4.41.tar.gz
cd tokyocabinet-1.4.41/
64位系统安装方法
./configure
make
make install
32位系统安装方法
./configure --enable-off64 #启动64位偏移,因为本机是32位,如果不加此参数,数据库文件超过2G就会崩溃
make
make install
因为我的机器是32位,所以选择第二种方法
安装tokyo tyrant
tar zxvf tokyotyrant-1.1.40.tar.gz
cd tokyotyrant-1.1.40
./configure
make
make install
创建tokyo tyrant数据文件存放的目录
mkdir -p /ser/ttserver
ttserver相关参数
ttserver [-host name] [-port num] [-thnum num] [-tout num] [-dmn] [-pid path] [-log path] [-ld|-le] [-ulog path] [-ulim num] [-uas] [-sid num] [-mhost name] [-mport num] [-rts path] [-ext path] [-mask expr] [-unmask expr] [dbname]
-host name : 指定需要绑定的服务器域名或IP地址。默认绑定这台服务器上的所有IP地址。
-port num : 指定需要绑定的端口号。默认端口号为1978
-thnum num : 指定线程数。默认为8个线程。
-tout num : 指定每个会话的超时时间(单位为秒)。默认永不超时。
-dmn : 以守护进程方式运行。
-pid path : 输出进程ID到指定文件(这里指定文件名)。
-log path : 输出日志信息到指定文件(这里指定文件名)。
-ld : 在日志文件中还记录DEBUG调试信息。
-le : 在日志文件中仅记录错误信息。
-ulog path : 指定同步日志文件存放路径(这里指定目录名)。
-ulim num : 指定每个同步日志文件的大小(例如128m)。
-uas : 使用异步IO记录更新日志(使用此项会减少磁盘IO消耗,但是数据会先放在内存中,不会立即写入磁盘,如果重启服务器或ttserver进程被kill掉,将导致部分数据丢失。一般情况下不建议使用)。
-sid num : 指定服务器ID号(当使用主辅模式时,每台ttserver需要不同的ID号)
-mhost name : 指定主辅同步模式下,主服务器的域名或IP地址。
-mport num : 指定主辅同步模式下,主服务器的端口号。
-rts path : 指定用来存放同步时间戳的文件名。
-ext path : 扩展的脚本文件
-mask expr : 需要禁止的命令,多个命名用","隔开
-unmaks expr : 允许的命令
单机模式启动
ttserver -host 127.0.0.1 -port 11211 -thnum 8 -dmn -pid /ser/ttserver/ttserver.pid -log /ser/ttserver/ttserver.log -le -ulog /ser/ttserver/ -ulim 128m -sid 1 -rts /ser/ttserver.rts /ser/ttserver/database.tch
启动的时候,根据参数database名来确定使用的TC数据库类型。如果为"*",则使用内存hash表,如果为"+",则使用内存B+库,如果后缀为".tch",则使用hash表,如果后缀为".tcb",则使用B+树数据库,如果后缀为".tcf",则使用定长数组。如果dbname参数被省略,则采用内存hash数据库。
如果使用的是哈希数据库,可以指定参数“#bnum=xxx”来提高性能。它可以指定bucket存储桶的数量。例如指定“#bnum=1000000”,就可以将最新最热的100万条记录缓存在内存中。
ttserver -host 127.0.0.1 -port 11211 -thnum 8 -dmn -pid /ser/ttserver/ttserver.pid -log /ser/ttserver/ttserver.log -le -ulog /ser/ttserver/ -ulim 128m -sid 1 -rts /ser/ttserver.rts /ser/ttserver/database.tch#bnum=1000000
如果大量的客户端访问ttserver,请确保文件描述符够用。许多服务器的默认文件描述符为1024,可以在启动ttserver前使用ulimit命令提高这项值。例如:ulimit -SHn 51200
关闭服务
cat /ser/ttserver/ttserver.pid或者ps -ef|grep ttserver
kill -TERM 10095
调用
写入
curl -X PUT http://127.0.0.1:11211/key -d "ttserver"
读取
curl http://127.0.0.1:11211/key
删除
curl -X DELETE http://127.0.0.1:11211/key
测试写入和读取1000条数据
starttime=`date "+%s"`;for((i=1;i<1001;i++)); do curl http://127.0.0.1:11211/key_$i; done;endtime=`date "+%s"`;echo $(($endtime-$starttime));

摘自:http://baike.baidu.com/view/3551871.htm?fr=aladdin

附录:CURL -X参数说明
-X/--request <command> Specify request command to use
写入
curl -X PUT http://127.0.0.1:11211/key -d "ttserver"
读取
curl http://127.0.0.1:11211/key
删除
curl -X DELETE http://127.0.0.1:11211/key
测试写入和读取1000条数据
starttime=`date "+%s"`;for((i=1;i<1001;i++)); do curl http://127.0.0.1:11211/key_$i; done;endtime=`date "+%s"`;echo $(($endtime-$starttime));

可以用fiddler2加上curl的代理了解这个-X:
curl -x 10.0.0.172:80 www.wo.com.cn 此命令使用10.0.0.172:80这个代理服务器IP和端口访问站点www.wo.com.cn

fiddler2 提供的 8888 端口(ttserver:21211,21213):
curl -x 127.0.0.1:8888 -X PUT http://192.168.109.7:21211/key -d "ttserver"
读取:
curl -x 127.0.0.1:8888 http://192.168.109.7:21211/key
删除
curl -x 127.0.0.1:8888  -X DELETE http://192.168.109.7:21211/key

上面的写入读取及删除,实践如下:

单独对写入作fiddler2下的http请求头分析:
一)C:\Users\admin>curl -x 127.0.0.1:8888 http://192.168.109.7:21211/key
ttserver

POST参数,fiddler2的右侧webform:


http请求返回:
HTTP/1.1 201 Created
Content-Type: text/plain
Content-Length: 8
Created
[/codes]

二)C:\Users\admin>curl -x 127.0.0.1:8888 http://192.168.109.7:21211/key
ttserver

返回:


三)C:\Users\admin>curl -x 127.0.0.1:8888  -X DELETE http://192.168.109.7:21211/key
OK
请求头:


返回:


最后,
发现这个curl的 -X参数有点意思,也就是在http的头里加上PUT,GET,DELETE:
PUT http://192.168.109.7:21211/key
GET http://192.168.109.7:21211/key
DELETE http://192.168.109.7:21211/key
key就是键值,而这个传入PUT时的form有键无值,这个键就是存入ttserver的值,通过GET及DELETE能够对这个存入的ttserver值进行各种操作。
背景:PHP出现,array (
  ':error' => 'Lock wait timeout exceeded; try restarting transaction',

mysql提示 Lock wait timeout exceeded解决办法:
利用 SHOW PROCESSLIST来查看问题
原因:原因是你使用的InnoDB   表类型的时候,
默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,
因为有的锁等待超过了这个时间,所以抱错.
你可以把这个时间加长,或者优化存储过程,事务避免过长时间的等待.
解决的办法有两个:
第一:innodb_lock_wait_timeout 锁定等待时间改大
my.ini文件:
代码如下:



来自:http://www.111cn.net/database/mysql/45809.htm
版本:MySQL5.5.8 GA
症状:无法启动mysql,在“mysql数据库目录/主机名.err”日志文件中报错 Unknown/unsupported storage engine: InnoDB
原因:MySQL5.5.8 GA默认引擎为InnoDB,而配置文件(my.cnf)中设置了skip-innodb
解决:在配置文件(my.cnf)中设置default-storage-engine=MyISAM

Error:
2013-08-18 21:08:37 21440 [Note] Plugin 'FEDERATED' is disabled.
2013-08-18 21:08:37 21440 [Note] Plugin 'InnoDB' is disabled.
2013-08-18 21:08:37 21440 [ERROR] Unknown/unsupported storage engine: InnoDB

My.cnf修改成这样就Ok了:
#loose-skip-innodb            
default-storage-engine = MyISAM

加上#号后启动Ok:
mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.13 Source distribution


参考:http://www.kilobug.com/archives/630
http://www.cnblogs.com/panfeng412/archive/2012/03/04/data-recorvery-of-mysql-innodb.html                
分页: 4/6 第一页 上页 1 2 3 4 5 6 下页 最后页 [ 显示模式: 摘要 | 列表 ]