2010年3月22日 谭俊青 1 条评论

近2个礼拜接触了不少公司,比如H3C、 东信、Thomson、索贝、 淘宝、 天会、19lou、 盒子世界等,大家都在用MySQL数据库,而且有些已经具有相当规模。大家需求各异,如功能、性能、高可用、可扩展、系统构架等。淘宝的江枫人很好,好沟通,也热情,还是老乡。
H3C的数据库应用竟然可以跟淘宝相提并论,很吃惊,不过这次去我想我应该可以打动他们用MySQL了,希望下一步能合作愉快。另外几家涉及到库表设计、数据库参数调整优化、高可用设计、缓存、及整个系统构架。另外发现也有少部分人已经在使用MySQL Cluster了,不过这东西最好在有基础和经验的技术人员指导下使用,不然后果很严重。
还有一点要提到的就是,在国付费服务意识还没有普及,希望接下来我的用心服务能够换来客户的认可。

顺便做个广告,以下情况需要提供帮助和支持的,可以联系我。
MySQL数据库硬件选型
MySQL数据库性能审核
MySQL数据库优化(参数调整,SQL优化,开发支持)
MySQL数据库升级
MySQL库表设计
MySQL高可用方案
MySQL Cluster支持
MySQL可扩展性方案
缓存和构架设计(系统级)
MySQL远程DBA(管理、维护)
紧急疑难解答

分类: MySQL, news / tools 标签:
2010年3月20日 谭俊青 没有评论

  3月19号,俄罗斯反垄断局(fas)周五表示,它已批准了sun微系统70亿元的甲骨文收购,条件是甲骨文公司继续开发新的mysql数据库。

  MOSCOW, March 19 (Reuters) – Russia’s anti-monopoly regulator (FAS) said on Friday it had approved a $7 billion takeover of Sun Microsystems JAVA.O by Oracle (ORCL.O) on condition that Oracle continues to develop Sun’s MySQL database.

消息来源:http://www.reuters.com/article/idUSLDE62I1GS20100319

分类: news / tools 标签:
2010年3月20日 谭俊青 没有评论

Two-phase commit(两阶段提交, 文中用2PC代替)是一种比较精简的一致性算法/协议。在事务处理、数据库和计算机网络中,两阶段提交协议提供了分布式设计中的数据一致性的保障,整个事务的参与者要么一致性全部提交成功,要么全部回滚。MySQL Cluster内部数据的同步就是用的2PC协议。 by ivan@mysqlab.net

故名思意,2PC算法包含两个阶段:commit-request 和 commit。

第一阶段(commit-request): 组织者(coordinator)负责询问事务的所有参与者(participants)是否可以提交或者取消事务(回滚)。 这就好比班长组织班级所有同学某时间参加班级大会一样,要么所有人都参加,要么取消会议。 … 【阅读全文·MySQL实验室】

2010年3月18日 谭俊青 没有评论

忽如一夜春风来,人人开口NoSQL。NoSQL现在是火了,可大家有想过没,其实NDB, InnoDB是很好的NoSQL数据库,InnoDB有double write buffer可以保证数据的安全性而且身经百战,NDB提供API可供直接调用。而且如果你愿意,你可以在InnoDB前面加上MySQL,它就变成了关系型数据库;NDB加上ndb引擎,结合MySQL摇身一变,也成了关系型数据库。

2010年3月17日 谭俊青 2 条评论

最近Twitter、DIGG等计划换用基于key-value的NoSQL数据库(e.g:Cassandra),之所以有如此动向是因为基于MySQL + sharding + cache的构架随着数据量爆炸式增长,重构的人力成本太高,换用扩展性更好的NoSQL数据库,以达到控制人力成本的目的,从而减少总体成本。

随着数据量和访问量的增长,网站构架大致有这么几个发展阶段(以PHP+MySQL+Memcached为例):

【阅读全文·MySQL实验室】

分类: MySQL 标签:
2010年3月3日 谭俊青 没有评论

  去年做过MySQL HA高可用方案,就是利用了Google的半同步补丁来加以实现的。而现在MySQL5.5中已经集成了semi-sync replication的功能,那么我们可以放心用它和其他组件及服务判断程序来实现我们的高可用解决方案。但是这里还存在一点瑕疵,需要注意。 By ivan@mysqlab.net

MySQL半同步流程设计图

MySQL半同步流程设计图


【阅读全文·MySQL实验室】

分类: MySQL 标签:
2010年3月2日 谭俊青 没有评论

  之前的MySQL版本在多核处理器的服务器上,处理器的性能并不能得以充分发挥,而Google发布了针对MySQL的SMP补丁,从而改变了这一现状。我们来看看MySQL5.5在采用了Google的补丁之后性能在多核CPU上的伸缩性。 By ivan@mysqlab.net

下面的测试结果基于的硬件条件很环境:
1千万记录(约2.5GB数据)
DELL R900(16核,32GB内存, FusionIO+Raid10)

sysbench-oltp-mysql55-m2

【阅读全文·MySQL实验室】

分类: MySQL 标签:
2010年3月1日 谭俊青 2 条评论

  相信很多开发人员接触过memcached,而且我认识的朋友当中有的是经常使用。那么在结合数据库,在对数据库内容做缓存的时候什么情况下使用memcached却不甚了解。有些朋友问到MySQL有自己的Query cache,为什么还要用memcached? –by ivan@mysqlab.net

【阅读全文·MySQL实验室】

分类: MySQL 标签:
2010年2月14日 谭俊青 4 条评论

  今天是2010大年初一,祝兄弟朋友们在新年里健康快乐、美满幸福、万事如意、心想事成。
  也祝愿自己能多交几个好朋友。

吉祥如意

分类: 未分类 标签:
2010年2月6日 谭俊青 1 条评论

  细心的朋友可能会发现有时候在某些库目录下有个 db.opt 文件,那这个文件是干什么用的呢?如果你用vi等编辑器打开看的话,内容很简单,是用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。

/*
  Set table default charset, if not set

  SYNOPSIS
    set_table_default_charset()
    create_info        Table create information

  DESCRIPTION
    If the table character set was not given explicitely,
    let’s fetch the database default character set and
    apply it to the table.
*/

static void set_table_default_charset(THD *thd,
                                      HA_CREATE_INFO *create_info, char *db)
{
  /*
    If the table character set was not given explicitly,
    let’s fetch the database default character set and
    apply it to the table.
  */

  if (!create_info->default_table_charset)
  {
    HA_CREATE_INFO db_info;

    load_db_opt_by_name(thd, db, &db_info);

    create_info->default_table_charset= db_info.default_table_charset;
  }
}

另外要说明的是,如果你是通过alter databases(schema) 命令更改的数据库默认属性,那么现有的表的默认字符集和排序规则不受影响。

通过创建数据库指定数据库的默认字符集和排序规则:

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
    [create_specification]

create_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name

也可以通过alter database修改

ALTER {DATABASE | SCHEMA} [db_name]
    alter_specification …
ALTER {DATABASE | SCHEMA} db_name
    UPGRADE DATA DIRECTORY NAME

alter_specification:
    [DEFAULT] CHARACTER SET [=] charset_name
  | [DEFAULT] COLLATE [=] collation_name

分类: MySQL 标签:
2010年2月3日 谭俊青 1 条评论

  MySQL Cluster ndb 引擎每行存储的实际长度最大为8052个字节。Blob和Text字段在ndb engine中只存储前面的256个字节。超过256自己部分存储在另外的隐藏表里面。根据字段类型,隐藏表分3种大小(chunk size)。

  • Blob/Text 2000B
  • MediumBlob/MediumText 4000B
  • LongBlob/LongText 8000B

  假如一个LongBlob字段是10,000个字节,那么需要2个chunk,第一个存储8000字节,另外一个存储剩下的2000字节。
  因此为了提高效率,如果我们存储的字段在8k(约)以内,那么在不超过8052字节限制的情况下,可以考虑用varbinary存储。比如比较典型的应用 session 管理。

分类: MySQL 标签:
2010年1月31日 谭俊青 没有评论

  MySQL5.1开始支持表分区,但是是水平分区,包括hash, list, range 等。
例如分区前:

| id | title   | description | author           |
+—-+———+————-+——————+
|  1 | title01 | desc01      | ivan             |
|  2 | title02 | desc02      | ivan             |
|  3 | title03 | desc03      | ivan             |
|  4 | title04 | desc04      | ivan             |
|  5 | title05 | desc05      | ivan@mysqlab.net |
|  6 | title06 | desc06      | ivan@mysqlab.net |
|  7 | title07 | desc07      | ivan@mysqlab.net |
|  8 | title08 | desc08      | ivan@mysqlab.net |
+—-+———+————-+——————+
 

分区后:

+—-+———+————-+——–+
| id | title   | description | author |
+—-+———+————-+——–+
|  1 | title01 | desc01      | ivan   |
|  2 | title02 | desc02      | ivan   |
|  3 | title03 | desc03      | ivan   |
|  4 | title04 | desc04      | ivan   |
+—-+———+————-+——–+

+—-+———+————-+——————+
| id | title   | description | author           |
+—-+———+————-+——————+
|  5 | title05 | desc05      | ivan@mysqlab.net |
|  6 | title06 | desc06      | ivan@mysqlab.net |
|  7 | title07 | desc07      | ivan@mysqlab.net |
|  8 | title08 | desc08      | ivan@mysqlab.net |
+—-+———+————-+——————+
 

VP存储引擎(vertical partitioning storage engine)支持垂直分区,将不同的表根据主键作join,而且还支持不同存储引擎的表,甚至原有的表还可以带有水平分区。

详情请参考:https://launchpad.net/vpformysql

分类: MySQL 标签:
2010年1月28日 谭俊青 2 条评论

  这几天在中国移动音乐基地(四川成都)这儿培训MySQL Developer课程,当中萌生了个想法,采用提问的方式,然后筛选出合适的命题做介绍。
  比如:MySQL是如何使用内存和磁盘的?

mysql disk memory

  呵呵,被骗进来的朋友别生气,今天实在是太晚了,明早还要去上课,明后天补上。

  这篇是普及MySQL基本知识的,介绍MySQL是如何使用磁盘和内存的,从手册上可以找到。

  磁盘空间的占用:

  • 每个数据库对应MySQL数据目录下的一个目录,不管你是采用什么存储引擎。
  • 每张数据表都在其对应的数据库目录下有一个table_name.frm文件,存储的是表定义信息,有64KB的限制。
  • MyISAM引擎表在其数据库目录下对应3个文件,包括上面的frm文件,还有数据文件和目录索引文件。
  • Innodb有自己的表空间和redo日志文件。
  • MySQL还有自己的日志文件,包括error log, binary log, general log等。
  • 触发器存储在对应的数据库目录下。
  • 认证信息存储在MySQL系统表里,在mysql库下。
  • 另外mysqld服务器程序和其他一些客户端管理工具等也需要占用一定的磁盘空间。

  内存的占用:

  • 线程管理,服务器程序为了提高效率,会将一些信息存储于buffer(cache)。
  • Memory(HEAP)引擎将数据存储在那种中内存中。
  • 临时表如果没有超过设定的限制会存储在内存中。
  • 每个客户端连接都会使用一定的buffer空间
  • 全局的Buffer和Cache(比如MyISAM的keybuffer,InnoDB的buffer pool, Query cache等 )
分类: MySQL 标签:
2010年1月19日 谭俊青 1 条评论

mysql cluster components
  最近一直在学习研究MySQL Cluster,今天正好也看到消息说支付宝在测试IBM DB2 Cluster,16个数据居节点,1个管理节点,采用万兆网卡连接。DB2 Cluster跟MySQL Cluster采用同样的share-nothing构架,网络对它来说至关重要。

  但是我这里要说的是,虽然MySQL Cluster发展到今天已经取得很大的成就,性能翻了好几倍,也开始支持磁盘存储(非主键、索引),但是它有致命的弱点:不支持真正的ACID(整个机群down掉的时候,最新GCP之后提交的事务丢失).

  话说回来,虽然缺点还不止上面提到的这些,在很多情景下不适合使用,但是不可否定它的高明。在高可用和写负载均衡上它的确是性价比很高的解决方案,比如session管理、用户管理等。

MySQL Cluster DBA 证书

分类: MySQL, MySQL Cluster, MySQL HA 标签:
2009年12月26日 谭俊青 2 条评论

MySQL5.1 引入表分区功能,使得MySQL在处理大表的能力上得到增强。使用过表分区功能的朋友应该知道,MySQL5.1中使用表分区的时候,对字段是有要求的,那就是必须是整数型,或者可以将其他类型的字段通过函数转换成整数型才可以。

/* with MySQL 5.1  ivan @ MySQL实验室(mysqlab.net/blog/) */
CREATE TABLE mysqlab_net
(
  ivan DATE
)
PARTITION BY RANGE (TO_DAYS(ivan))
(
  PARTITION p01 VALUES LESS THAN (TO_DAYS(’2007-08-08′)),
  PARTITION p02 VALUES LESS THAN (TO_DAYS(’2008-08-08′)),
  PARTITION p03 VALUES LESS THAN (TO_DAYS(’2009-08-08′)),
  PARTITION p04 VALUES LESS THAN (MAXVALUE));

SHOW CREATE TABLE mysqlab_net\G
*************************** 1. row ***************************
       TABLE: mysqlab_net
CREATE TABLE: CREATE TABLE `mysqlab_net` (
  `ivan` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (TO_DAYS(ivan))
(PARTITION p01 VALUES LESS THAN (733261) ENGINE = InnoDB,
 PARTITION p02 VALUES LESS THAN (733627) ENGINE = InnoDB,
 PARTITION p03 VALUES LESS THAN (733992) ENGINE = InnoDB,
 PARTITION p04 VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */

怎么样?读取的时候谁知道那个数字是多少?(不过也可以通过自定义函数实现还原)
MySQL5.5中加入了columns关键字,使得可读性好多了。看例子

/* with MySQL 5.5   ivan @ MySQL实验室(mysqlab.net/blog/) */
CREATE TABLE `mysqlab.net`
(
  ivan DATE
)
PARTITION BY RANGE  COLUMNS(ivan)
(
  PARTITION p01 VALUES LESS THAN (’2007-08-08′),
  PARTITION p02 VALUES LESS THAN (’2008-08-08′),
  PARTITION p03 VALUES LESS THAN (’2009-08-08′),
  PARTITION p04 VALUES LESS THAN (MAXVALUE);

SHOW CREATE TABLE `mysqlab.net`\G
*************************** 1. row ***************************
       TABLE: mysqlab.net
CREATE TABLE: CREATE TABLE `mysqlab.net` (
  `ivan` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50500 PARTITION BY RANGE  COLUMNS(ivan)
(PARTITION p01 VALUES LESS THAN (’2007-08-08′) ENGINE = InnoDB,
 PARTITION p02 VALUES LESS THAN (’2008-08-08′) ENGINE = InnoDB,
 PARTITION p03 VALUES LESS THAN (’2009-08-08′) ENGINE = InnoDB,
 PARTITION p04 VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB) */

另外MySQL5.5表分区(partition) columns关键字还支持多字段,比如 partition by range columns(a,b);将支持清空指定的分区TRUNCATE PARTITION。MySQL5.5有望在明年(2010)夏季GA。另外MySQL5.5支持的半同步功能在高可用上的使用,让人非常期待!

Reference: MySQL 5.5 partitioning enhancements

Note:在使用表分区的时候,并不是分区越多越好,要根据情况而定,因为会出现意想不到的问题

分类: MySQL Partition 标签:
Pages: Prev 1 2 3 4 5 6 7 Next