背景:Mysql新版本的慢查询配置和旧的版本不太一样,为此,特转下这这篇文章,以备案。近来发现我们用程序写啥慢sql还不如包自己带呢,
MySQL分支 Percona 5.6.15 发布: http://www.open-open.com/news/view/18ed41c ,这自己带着杀sql的功能: Percona5.6自身已支持杀死慢SQL, http://hcymysql.blog.51cto.com/5223301/1621218

零、关闭mysql:

一、Mysql启动参数 -u root:


二、配置my.cnf如下:


mysql版本:
mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.13-log |
+------------+
1 row in set (0.00 sec)

[root@mysql_multi ~]# vi /etc/my.cnf
【mysqld3307】
long_query_time=1
#slow_query_log
slow_query_log=1
#slow_query_log_file=/data/mysql/mysqldata3307/log/slow-query.log
#以前版本的参数格式跟5.6的不一致
slow_query_log_file=/data/mysql/mysqldata3307/log/slow-query.log
#将所有没有使用带索引的查询语句全部写到慢查询日志中
log_queries_not_using_indexes=1

对 3307 端口的mysql:

[root@mysql_multi ~]# mysqld_multi start 3307
[root@mysql_multi ~]# netstat -nlp|grep mysql
tcp        0      0 :::3306                     :::*                        LISTEN      20211/mysqld        
tcp        0      0 :::3307                     :::*                        LISTEN      18693/mysqld        
unix  2      [ ACC ]     STREAM     LISTENING     42309  20211/mysqld        /data/mysql/mysqldata3306/sock/mysql.sock
unix  2      [ ACC ]     STREAM     LISTENING     69806  18693/mysqld        /data/mysql/mysqldata3307/sock/mysql.sock

root@localhost : mysql 01:00:16> show variables like '%slow%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: mysql

+---------------------------+----------------------------------------------+
| Variable_name             | Value                                        |
+---------------------------+----------------------------------------------+
| log_slow_admin_statements | OFF                                          |
| log_slow_slave_statements | OFF                                          |
| slow_launch_time          | 2                                            |
| slow_query_log            | ON                                           |
| slow_query_log_file       | /data/mysql/mysqldata3307/log/slow-query.log |
+---------------------------+----------------------------------------------+
5 rows in set (0.00 sec)


root@localhost : mysql 01:03:44> show variables like '%index%';
+----------------------------------------+-------+
| Variable_name                          | Value |
+----------------------------------------+-------+
| eq_range_index_dive_limit              | 10    |
| innodb_adaptive_hash_index             | ON    |
| innodb_cmp_per_index_enabled           | OFF   |
| log_bin_index                          |       |
| log_queries_not_using_indexes          | ON    |
| log_throttle_queries_not_using_indexes | 0     |
| relay_log_index                        |       |
+----------------------------------------+-------+
7 rows in set (0.00 sec)

然后运行一个需要长时间才能执行完毕的sql,
select sleep(2);
使用mysqldumpslow 查看日志:
/data/mysql/mysqldata3307/log/slow-query.log (直接使用cat 进行查看也可以)

转自:http://blog.itpub.net/29291882/viewspace-1064074

实践如下:
一、
vi /usr/local/mysql/conf/my.cnf

slow_query_log=1
long_query_time = 2
slow_query_log_file=/data/db/mysql/localhost-slow.log
#将所有没有使用带索引的查询语句全部写到慢查询日志中
log_queries_not_using_indexes=1
#如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。

二、
mysql> show variables like '%slow%';
+---------------------------+-----------------------------------+
| Variable_name             | Value                             |
+---------------------------+-----------------------------------+
| log_slow_admin_statements | OFF                               |
| log_slow_slave_statements | OFF                               |
| slow_launch_time          | 2                                 |
| slow_query_log            | ON                                |
| slow_query_log_file       | /data/db/mysql/localhost-slow.log |
+---------------------------+-----------------------------------+

三、
du -sh /data/db/mysql/localhost-slow.log
803M    /data/db/mysql/localhost-slow.log

四、
Mysql 测试配置文件是否正确 my.cnf,那个nginx 有-t,mysql呢?
一)这个没必要重启,直接 set @@global.slow_query_log=1;
二)起动一个新端口的副本测试,有道理。

mysql>  show variables like '%slow%';
+---------------------------+--------------------------------------------+
| Variable_name             | Value                                      |
+---------------------------+--------------------------------------------+
| log_slow_admin_statements | OFF                                        |
| log_slow_slave_statements | OFF                                        |
| slow_launch_time          | 2                                          |
| slow_query_log            | ON                                         |
| slow_query_log_file       | /data/db/mysql/localhost-xiyou-slowsql.log |
+---------------------------+--------------------------------------------
__________________________________________
mysql5.6和5.5中打开slow_query_log的方式有所改变:

mysql5.6.10关于慢查询的设置slow-query-log
前两天,刚把开发用的环境升级为2008R2,,所以想试试5.6.10的64位的数据库,是在mysql的官方下载的win32x64版本,一共有200多M。发现里面只有一个默认的my.ini文件,想进行优化试试,结果发现老是启动不了。后来发现,主要是这个关于慢查询的设置变了,之前是:
slow_query_log
long_query_time = 5
log-slow-queries=slow.log
现在必须要这种设置才行
slow_query_log=1
slow_query_log_file=slow.log
看来从5.6.* 可能已经全面取消了
log_slow_queries=slow.log这种写法了
来自:http://www.2cto.com/database/201304/203100.html
背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.19 了,所以,一些小的应用可以用它做全文搜索了,像sphinx和Lucene这样偏重的、需要配置或开发的,节省了成本。

这儿有一个原创的Mysql全文搜索的文章, mysql的全文搜索功能:
http://blog.csdn.net/bravekingzhang/article/details/6727541

基于mysql全文索引的深入理解:
http://www.jb51.net/article/37738.htm

为什么要设置 Mysql 的 ft_min_word_len=1:
http://blog.csdn.net/shilian_h/article/details/6215537


MySQL 全文搜索支持简述:
从MySQL 4.0以上 myisam引擎就支持了full text search 全文搜索,在一般的小网站或者blog上可以使用这个特性支持搜索。
那么怎么使用了,简单看看:
1.创建一个表,指定支持fulltext的列
  CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
    title VARCHAR(200),
    body TEXT,
    FULLTEXT (title,body)
  );
2.插入一些数据作为测试
  INSERT INTO articles (title,body) VALUES
    ('MySQL Tutorial','DBMS stands for DataBase ...'),
    ('How To Use MySQL Well','After you went through a ...'),
    ('Optimizing MySQL','In this tutorial we will show ...'),
    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
    ('MySQL vs. YourSQL','In the following database comparison ...'),
    ('MySQL Security','When configured properly, MySQL ...');
3.select查询fulltext的列
  SELECT * FROM articles
    WHERE MATCH (title,body) AGAINST ('database');
查询结果:
  5        MySQL vs. YourSQL        In the following database comparison ...    
  1        MySQL Tutorial               DBMS stands for DataBase ...  
全文查询中的boolean语句, + -跟普通的搜索引擎语法一样
  SELECT * FROM articles WHERE MATCH (title,body)
     AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
innodb不支持fulltext,当然可以使用http://sphinxsearch.com/ sphinx来dump数据库数据支持全文搜索。
原文地址:http://www.javaarch.net/jiagoushi/700.htm

后记,MySQL 5.6.4里才添加了InnoDB引擎的Full-Text索引支持,或用张宴兄弟的基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计: http://blog.s135.com/post/360/
Q:
我想在查询时使用MATCH(...) AGAINST(...)语法,但是我的数据表引擎是Innodb,当我CREATE FULLTEXT INDEX的时候,返回提示The used table type doesn't support FULLTEXT indexes。
我想问的是在innodb引擎中是否不能使用FULLTEXT引擎?有什么替代品吗?可以使用MATCH(...) AGAINST(...)语法吗?
A:
MySQL 5.6.4里才添加了InnoDB引擎的Full-Text索引支持。
不能升级MySQL版本的话:
推荐用Lucene(ElasticSearch比较容易部署)或Sphinx这样的第三方解决方案。
innodb 不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
sphinx 是一个开源软件,提供多种语言的API接口,可以优化mysql的各种查询。
如果这个表更新不频繁,查询量不大,又赶时间,可以用触发器、定时任务或者其他类似的DBA技巧创建支持全文索引的镜像表(如MyISAM类型的),代码改动会小一些。
MySQL5.6 InnoDB FULLTEXTIndexes研究测试:
http://blog.csdn.net/zyz511919766/article/details/12780173

mysql 5.6.4支持nosql:
在最新的 mysql-5.6.4-labs-innodb-memcached 中,实现了简单的给予 key/value的nosql功能,其主要原理
就是mysqld除了监听3306端口之外,同时监听11211端口。使mysqld和memcached服务处在同一进程中。通过
数据库、表与字段的映射,将缓存在memcache的数据插入到映射的表中。安装包中提供了三张表:containers
cache_policies和config_options,表containers就提供了映射关系,表cache_policies提供了三种存储方式(
innodb_only数据只插入表,cache_only只缓存数据,caching即缓存数据又插入表),表config_options中提供
了一个默认分隔符“|”,就是说如果在表containers的values字段中定义了col1,col2...字段,那在设置缓存值时就
可以用val1|val2的形式,这样将会把val1插入到col1,val2插入到col2。

来自:http://blog.csdn.net/sunny5211/article/details/7357893






这个不能算是全文搜索, 只是传统的全表搜索。如果使用mysql的全文检查,在200万数据集上,不可能用那么长的时间的。
使用mysql全文检索的方法如下:
1. 配置mysql参数ft_min_word_len=1
在数据表的文本字段中创建fulltext索引。
2.将原始文本进行分词(处理成按空格分隔的字符串),可使用一些开源的分词模块实现。 再导入到mysql数据表中
3. 使用mysq select * from tb1 where title match'词语' 进行检索。
来自:http://www.oschina.net/question/123890_133459
背景:博客下面要写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/
背景:线上数据库报:mysql STRICT_TRANS_TABLES严格模式下提示Field 'ip' doesn't have a default value,线下测试机没有报错,外包开发时代码没法保证SQL全写运行无问题。
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
背景:其实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/jlzhou/archive/2013/03/22/2975913.html

相关知识:
http://hcymysql.blog.51cto.com/5223301/962712  //注意版本号my.cnf里不同变量也有不一样的情况发生。
http://hickey.in/?p=78


注:MySQL5.6.10以后,disable-gtid-unsafe-statements参数
变更为enforce-gtid-consistency = ON
CHANGE MASTER TO MASTER_HOST = '192.168.137.129', MASTER_PORT = 3306, MASTER_USER = 'rel', MASTER_PASSWORD = '123', MASTER_AUTO_POSITION = 1, MASTER_DELAY=30;

导入SQL情况:
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.137.129', MASTER_PORT = 3306, MASTER_USER = 'rel', MASTER_PASSWORD = '123', MASTER_AUTO_POSITION = 1, MASTER_DELAY=30;
Query OK, 0 rows affected, 2 warnings (0.03 sec)


mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
......
| Connecting to master | 192.168.137.129 | rel         |        3306 |            60 |                 |                   4 | jackxiang-relay-bin.000001 |             4 |                       | Connecting       | Yes               |                 |                     |                    |                        |        
......


继5.5半同步复制后,MySQL 5.6又对其进行了优化与改进,其中有两个地方较为重要:

1、对运维人员来说应该是一件大喜的事情,在主从切换后,在传统的方式里,你需要找到binlog和POS点,然后change master to指向,而不是很有经验的运维,往往会将其找错,造成主从同步复制报错,在mysql5.6里,你无须再知道binlog和POS点,你只需要知道master的IP、端口,账号密码即可,因为同步复制是自动的,mysql通过内部机制GTID自动找点同步。

2、多线程复制基于库。之前的版本,同步复制是单线程的,队列的,只能一个一个执行,在5.6里,可以做到多个库之间的多线程复制,例如yourDB库里,存放着用户表,商品表,价格表,订单表,那么将每个业务表单独放在一个库里,这时就可以做到多线程复制,但一个库里的表,多线程复制是无效的。
摘录来自:http://www.linuxidc.com/Linux/2012-08/68135.htm
阅读全文
http://www.cnblogs.com/panfeng412/archive/2012/03/04/data-recorvery-of-mysql-innodb.html                
分页: 3/4 第一页 上页 1 2 3 4 下页 最后页 [ 显示模式: 摘要 | 列表 ]