看percona博客上说,Percona-XtraDB-9.1添加了对不同page size的支持,于是就测试了一个innodb不同page size 对性能的影响,
因为Percona-XtraDB-9.1 只支持4, 8 , 16 大小的page size ,因为page size 太小的话也没有意义,于是就测了一下pagesize=8K 和16K 的时候性能表现。 下面有对page 为4k , 8k , 16k的测试。
Percona-XtraDB-9.1 请点击这里下载:
修改page size 很简单,只需要在配置文件指定大小就行了,如果是8K,就在配置文件里面写上
innodb_page_size =8K 就OK了。
需要注意的是,Percona-XtraDB 不支持比16K大的,如果定义了32K,那么还是会使用默认的16K。
mysqld.log里面有这么一段记录:
120517 10:03:31 [Warning] option ‘innodb-page-size’: unsigned value 32768 adjusted to 16384
120517 10:03:31 [Note] Plugin ‘FEDERATED’ is disabled.
120517 10:03:31 InnoDB: The InnoDB memory heap is disabled
当然你可以修改下源码重新编译下,看这里。
在Mysql里面有数据的时候不能设定pagesize, 只能在初始化Mysql时设定。因为page大小不同,会导致数据记录不兼容。
在innodb中每个page 最少存2条记录,因为只存一条的话,整个索引树就成一个链表了,失去了意义,所以每条记录最多8K,大于8K的会出现行溢出,大字段会溢出到别的page.
即使当page size为8K的时候,每条记录依然最大为4K,同理。
阅读全文…
java.sql.SQLException: Incorrect string value:
mysql字符的问题很多,上面这个算是一个非常经典的问题,我自己可以遇到很多次,
出现Incorrect string value 错误的原因也有很多,下面主要说一下最常有问题的地方。
1. 第一种情况就是把unicode 转成utf8的时候长度出现了问题。
UTF8 编码的长度如下所示:
1
2
3
4
| | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 | |
你会看到utf8 编码的长度为3 byte , 所以有的字符在转换成utf8后会超过这个限制,导致出错,因为正常的字符是不会出错的,所以出现这种情况的概率很小,当出现这种情况是我们只能调节字段的大小。
2. 第二中情况就是字符集和校验规则不匹配造成的。
那么什么是校验规则呢:
我认为他就不同字符集之间比较的一种转义规则,详细介绍
平时在数据库中是不需要校验规则的,但是当charset搞不定的时候,就需要他了。
查看转义规则可以如下查看:
mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
也可以这么查看:
mysql> show collation ;
阅读全文...
mysql的备份住要分为两种
1. 主要采用mysql自带的备份工具(mysqldump)来进行备份,恢复的时候也很简单直接一个load data命令就能搞定,类似于excl里面的东西。
2. 还有一种就是通过第三方工具来进行备份,比如 xtrabackup,innodbackup等
顺便贴一些load data的备份命令:
#mysqldump
mysqldump –defaults-file=yxp-1-1.cnf –default-character-set=utf8 –hex-blob -uroot -p123 –databases db0 –tables TB_Storage_ProductInfo > 1
#load data
LOAD DATA INFILE ‘/tmp/PRIS_Author.txt’ INTO TABLE PRIS_Author CHARACTER SET gbk FIELDS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’
mysqldump是一个非常简单的备份工具,他能把每一行的记录都写入一个文件,然后load data的时候把文件里面的记录插入到Mysql中,但是他又一个致命的弱点,为了保证备份期间的数据一致性,Mysqldump会在备份期间一直保持对整个库的X锁,当然对于Myisam来说是无所谓的,但是对于Innodb确实不能忍受的。
能提供在线备份的工具主要有两种:innodbackup是官方提供的备份工具,但是他是收费的,xtrabackup是percona提供的一个免费的备份工具 ,其原理和innodbackup差不多,当然用起来也差不多。
innodb上的在线备份工具大致思路都很简单,就是一个thread会在要备份Mysql实例上以页的单位copy数据,另外还有一个thread会收集copy过程中的redo log , 这样恢复的时候就需要在物理数据上面apply-log就能达到在线备份的目的。
innodbackup 和xtrabackup 这两个工具也算个有千秋,个有特色,小的功能上有部分不同。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中xtrabackup只能备份InnoDB和XtraDB两种数据表,innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表。
下面简单的介绍Xtrabackup的用法,其实你在Xtrabackup –help里面也能看到完整的说明
1. 备份命令
nohup ./innobackupex-1.5.1 –ibbackup=./xtrabackup –user=root –password=123 –defaults-file=/home/ddb/mirror-print/yxp-1-1/yxp-1-1.cnf /home/ddb/blogdb-backups.d/2012-05-15/yxp-1-1/yxp-1-1/ >> /home/ddb/var/mysql_backup_yxp-1-1.log 2>&1 &
注意记得要指定 –ibbackup=./xtrabackup
不然会报出如下错误
297799
297800 sh: xtrabackup: command not found
297801 innobackupex-1.5.1: fatal error: no ‘mysqld’ group in MySQL options
297802 innobackupex-1.5.1: fatal error: OR no ‘datadir’ option in group ‘mysqld’ in MySQL options
备份出来的大致就是这么一段
阅读全文…
一、显示字符集相关的变量值
mysql> show variables like ‘chara%’;
+————————–+——————————————-+
| Variable_name | Value |
+————————–+——————————————-+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | d:/mysql-5.0.9-beta-win32/share/charsets/ |
+————————–+——————————————-+
7 rows in set (0.02 sec)
mysql> show variables like ‘collation%’;
+———————-+——————-+
| Variable_name | Value |
+———————-+——————-+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+———————-+——————-+
3 rows in set (0.00 sec)
需要说明的是: collation是与排序相关的字符集变量, 上述变量值是mysql中缺省的字符集变量。
二、字符集相关各变量的意义
character_set_client: 客户端字符集(应用程序客户端使用的字符集),实际上它与当前会话相关。
character_set_connection: 连接字符集,指的是mysql网络传输中使用的字符集,也与会话相关。
character_set_database: 指的数据库表中物理存储使用的字符集。
character_set_results: 指的是使用sql查询处理以后返回结果使用的字符集。
character_set_server:指的是mysql数据库服务器端使用的字符集。
character_set_system:指的是数据库中存储元信息使用的字符集。
collation_connection:意义可以类推
阅读全文…
general_log 和 binlog
什么是general_log?
general_log 就是记录所有执行的SQL , 开启这个功能很简单,如下:
mysql>
mysql> show variables like ‘%gen%’
-> ;
+——————+————————————————–+
| Variable_name | Value |
+——————+————————————————–+
| general_log | OFF |
| general_log_file | /home/ddb/mirror-om/om-6-1/mirror/mysqld_gen.log |
+——————+————————————————–+
2 rows in set (0.00 sec)
你之需要指定一个general_log_file位置就行了,但是有一点需要注意,开启general_log的时候一定要保证mysql.general_log存在,不然会报:
cant’t stat the ./mysql/general_log.CSV
这个表示一个CSV类型的表。
解决也很简单,删掉重建就行了。
mysql> show create table general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT=’General log’
1 row in set (0.00 sec)
以前我一直binlog 是Mysql解析处理过的SQL, 一般情况下是和general_log相同可能在极个别的情况下有点区别,但是最近发现general_log和binlog里面的东西完全相同,即使general_log有时候是不正确的。
举个例子
mysql> show create table t;
+-------+--------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------+
| t | CREATE TABLE `t` (
`a` tinyint(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
这个表很简单,只有一个字段tinyint,这时候我向表里面插入一个明显会越界的数字。
insert into t values (11111111111111111111111111111111111111111111111111111111111);
阅读全文...
先发一张图, 来自 (Oreilly.Understanding.Mysql.Internals.Apr.2007):
喜欢的朋友可以在这里下载:
[深入理解MySQL核心技术].Oreilly.Understanding.Mysql.Internals.Apr.2007

由上面这张图可以清楚的看到Mysql各个模块的工作流程。
其中上述图中最重要的,算是Mysql server端的 Thread Manager 、command dispacher 、 parse
和存储引擎端的 myisam 、 innodb . (其实有很多engine,这里就列举最重要的两个,我们也可以编写自己的engine)
其实Mysql parse机制和innodb的checkpoint机制还有很多需要改进的地方,在日常的使用中会经常遇到执行计划不准确,统计信息收集不详细,和Mysql性能有时候忽然间下降的很大,主要就和这两部分相关。
mysql server 和 client的通信,简单如下图所示:

建立连接的方式也类似TCP的”三次握手“。
下面我们就来看看一个select背后, Mysql进行了做了什么事情 :)
假设我们的语句是 SQL : select * from t; (myisam)
首先 从Mysql的启动流程看起:
阅读全文...
很早之前学习Oracle 入门看过的视频,很不错,有点长,共70讲(基本包含Oracle的各个方面)。
播布客Oracle.9i.DBA.Fundamentals.I

虽然是9I的,但是9I作为Oracle跨时代的一个版本,还是非常值得学习的。
发个种子给大家:
oracle
master thread 所在的函数为:
innobase/srv/srv0srv.c: srv_master_thread
从注释上来看就知道这个是一个相当重量级的函数。
/*************************************************************************
The master thread controlling the server. */
os_thread_ret_t srv_master_thread(
下面看看 master thread做了什么事情。
当database可用的时候master thread 就是一个大大的loop , 并且里面嵌套了几层 循环.
类似于如下:
Loop :
for (i = 0; i < 10; i++) {
//每秒要做的事情
}
//每十秒要做的事情 *****..
background_loop:
//空闲或者关闭的时候跳入这个循环。
下面看看每秒要做什么事情:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| (1) srv_main_thread_op_info = "doing background drop tables";
row_drop_tables_for_mysql_in_background();
(2) srv_main_thread_op_info = "flushing log";
log_buffer_flush_to_disk();
(3) srv_main_thread_op_info = "making checkpoint";
log_free_check();
(4) if (n_pend_ios < 3 && (n_ios - n_ios_old < 5)) { srv_main_thread_op_info = "doing insert buffer merge"; ibuf_contract_for_n_pages( TRUE, srv_insert_buffer_batch_size / 4); srv_main_thread_op_info = "flushing log"; log_buffer_flush_to_disk(); } (5) if (UNIV_UNLIKELY(buf_get_modified_ratio_pct() > srv_max_buf_pool_modified_pct)) {
/* Try to keep the number of modified pages in the
buffer pool under the limit wished by the user */
// flush 100 page once when the buffer > 90%
n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, 100,
ut_dulint_max);
/* If we had to do the flush, it may have taken
even more than 1 second, and also, there may be more
to flush. Do not sleep 1 second during the next
iteration of this loop. */
skip_sleep = TRUE;
} |
阅读全文…
简单的调研了一下Percona的 xtradb-cluster, 感觉蛮有意思的,简单的介绍一下吧,系统很复杂, 很多东西我自己也都没有搞明白,见谅。
官网的地址为: http://www.percona.com/software/percona-xtradb-cluster/
1. 什么是xtradb-cluster.
既然percona敢把他叫做cluster,肯定有他的理由的,先来看一张图 :

从这张图里可以直观看到,其实xtradb-cluster就是无单点故障的DB。
如果仅仅是为了防止单点故障,真么就不需要他了,我们有很多措施可以防止一台数据库节点的挂掉,xtradb-cluster优势在哪里?
xtradb-cluster相比master-slave最大的优势在于数据一致性, master-slave本身就是异步的操作,master-slave上数据不一致是常有的事,虽然说master或者slave 挂掉并不影响服务,但是对于一些对数据一致性要求高的应用这个是绝对不能出现的,所以就出现了xtradb-cluster.
我对xtradb-cluster的理解就是他不记录binlog ,通过消息队列传向目的节点。 不记录binlog怎么复制到别的节点?
xtradb-cluster 把每次操作投向一个类似于消息队列的东西,然后发向其他节点进行同步,如果有的节点不能进行相应,这些消息就堆积在该节点所在的操作系统的内存里,最大能占用1/2 (RAM+SWAP) . 在数据目录下你也会看到有个叫做General.cache的文件,应该就是这个作用。等实例响应开始处理操作后,数据就会同步。
这个就是设计图:

那么xtradb-cluster是如何实现数据一致性的呢?
2pc 事务很了解吧。其实和他一样的,当client对一个node进行DML/DDL 操作的时候,请求会分发到各个节点,当所有节点都OK的时候,开始执行,如果有一个执行失败就失败。这个是真的会等待别的节点回复才确认操作是否成功(这个等待的不是无限等待,会定义一个时间,超过这个时间会报错),所以这个性能肯定不会高,但是对读比较多的应用还是非常好的。
阅读全文…
必备软件:VS , Bison , Cmake,当然还要有Mysql source。
对于熟悉eclipse的同学来说,使用VS估计有一个适应过程(我就是),不过目前还真没找到如何在window上使用eclispe部署Mysql开发环境的办法,最近在使用VS也发现VS其实也是蛮好用的。网上虽有很多资料介绍,但是在我的部署过程中总是没有找到一个能用的,也遇到各种各样的问题,总结一下,让大家更快的进入Mysql源码的世界
解释一下:
VS: IDE工具.
Bison:语法解析器
Cmake: 编译器, 记得Linux下的 make么, 没错这个就是他哥,进阶版。
1. 安装Bison, Cmake , 设置必要的环境变量。(地址上不要有空格,不然以后编译的时候有可能会出错)
2. 以管理员权限输入cmd, 到Mysql Source目录下(如果你用的是别的用户,建议使用管理员权限,不然也可能会出错):
执行这个操作
1
| wscript win\configure.js WITH_INNOBASE_STORAGE_ENGINE WITH_PARTITION_STORAGE_ENGINE MYSQL_SERVER_SUFFIX=-pro |
这个脚本的一些参数;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| WITH_INNOBASE_STORAGE_ENGINE Enable particular storage engines
WITH_PARTITION_STORAGE_ENGINE
WITH_ARCHIVE_STORAGE_ENGINE
WITH_BLACKHOLE_STORAGE_ENGINE
WITH_EXAMPLE_STORAGE_ENGINE
WITH_FEDERATED_STORAGE_ENGINE
__NT__ Enable named pipe support
MYSQL_SERVER_SUFFIX=<http://www.independence-mo.info/guanyuwomen/628.html;suffix> Server suffix, default none
COMPILATION_COMMENT=<comment> Server comment, default "Source distribution"
MYSQL_TCP_PORT=<port> Server port, default 3306
CYBOZU Default character set is UTF8
EMBED_MANIFESTS Embed custom manifests into final exes, otherwise VS
default will be used. (Note - This option should only be
used by MySQL AB.)
WITH_EMBEDDED_SERVER Configure solution to produce libmysqld.dll
and the static mysqlserver.lib
</port></comment> |
上述步骤如果执行成功,会弹出done! 的对话框。
3. 使用cmake 编译。根据你vs的版本的不同选择不同的编译器。具体请看:
cmake –help
cmake -G “verson”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| 执行结果如下:
D:\code\mysql-5.5.2\mysql-5.1.61\mysql-5.1.61>cmake -G "Visual Studio 10"
-- Check for working C compiler using: Visual Studio 10
-- Check for working C compiler using: Visual Studio 10 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Visual Studio 10
-- Check for working CXX compiler using: Visual Studio 10 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
build CSV as static library
build HEAP as static library
build INNOBASE as static library
build MYISAM as static library
build MYISAMMRG as static library
build ARCHIVE as DLL
build BLACKHOLE as DLL
build EXAMPLE as DLL
build FEDERATED as DLL
build INNODB_PLUGIN as DLL
-- Configuring done
-- Generating done
-- Build files have been written to: D:/code/mysql-5.5.2/mysql-5.1.61/mysql-5.1.61 |
阅读全文…