存档

‘MySQL’ 分类的存档

BBU电池电量的监控

2009年5月19日 谭俊青 2 条评论

Author: ivan@mysqlab.net

早上6点被电话叫醒,有应用报警,根据经验应该是raid卡电池没电了,一查果然有2台机器没电了,还有2台已经充电完成。

[root@userminfo2:2.20 ~]# MegaCli -AdpBbuCmd -GetBbuStatus -aALL

BBU status for Adapter: 0
BatteryType: TBBU
Voltage: 3858 mV
Current: 932 mA
Temperature: 24 C
Firmware Status: 00000008
Battery state: 
GasGuageStatus:
  Fully Discharged        : No
  Fully Charged           : No
  Discharging             : No
  Initialized             : Yes
  Remaining Time Alarm    : No
  Remaining Capacity Alarm: No
  Discharge Terminated    : No
  Over Temperature        : No
  Charging Terminated     : No
  Over Charged            : No

Relative State of Charge: 17 %
Charger Status: In Progress
Remaining Capacity: 253 mAh
Full Charge Capacity: 1502 mAh
isSOHGood: Yes


[root@user-stat1:2.31 ~]# MegaCli -AdpBbuCmd -GetBbuStatus -aALL
                                     
BBU status for Adapter: 0

BatteryType: TBBU
Voltage: 4065 mV
Current: 0 mA
Temperature: 22 C
Firmware Status: 00000000

Battery state:

GasGuageStatus:
  Fully Discharged        : No
  Fully Charged           : Yes
  Discharging             : Yes
  Initialized             : Yes
  Remaining Time Alarm    : No
  Remaining Capacity Alarm: No
  Discharge Terminated    : No
  Over Temperature        : No
  Charging Terminated     : Yes
  Over Charged            : No

Relative State of Charge: 100 %
Charger Status: Complete
Remaining Capacity: 1639 mAh
Full Charge Capacity: 1642 mAh
isSOHGood: Yes


其实这问题都遇上N次了,为啥都遇上问题才得以解决?就是因为对BBU电量比例并没有监控。

对于出现问题的机器,一般临时处理办法都是更改trx参数(这是个非常危险的操作,如果这段时间按掉电死机之类的就会造成数据丢失),而这些都是可以预警和自动完成的。

新的监控系统将加入Raid卡BBU电池电量的监控,实现预警。至于是否自动更改redo日志的写策略可以配置,根据不同业务需求而定。

ivan 于 2009-05-19 早上6点

分类: MySQL 标签:

mylab_sys_exec UDF调用mysql外部系统命令(For linux)

2009年5月13日 谭俊青 没有评论

有时候为了方便,利用event/trigger调用系统外部命令,可因为安全问题,mysql自身并没有提供相关命令,这里提供个调用系统命令的自定义函数mylab_sys_exec

so文件下载:mylab_sys_exec.so ( mysql5.1.34 测试通过)


加载:

CREATE FUNCTION mylab_sys_exec RETURNS INTEGER SONAME "mylab_sys_exec.so";



使用:

SELECT mylab_sys_exec (‘CMD’);



源码:

my_bool mylab_sys_exec_init (UDF_INIT *initid, UDF_ARGS *args, char *message );
void mylab_sys_exec_deinit (UDF_INIT *initid );
int mylab_sys_exec (UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error );

my_bool mylab_sys_exec_init( UDF_INIT *initid, UDF_ARGS *args, char *message )
{
    if(args->arg_count == 1  && args->arg_type[0]==STRING_RESULT)
    {
        return 0;
    } else {
        strcpy( message, "One string type parameter expected")
        return 1;
    }
}

void mylab_sys_exec_deinit ( UDF_INIT *initid ){}

int mylab_sys_exec( UDF_INIT *initid , UDF_ARGS *args , char *is_null , char *error )
{
    return system (args->args[0]);
}

文章链接地址:mylab_sys_exec UDF调用mysql外部系统命令(For linux)

分类: C, MySQL 标签:

主从数据库记录数直观校验工具Mylab.RecordChecker

2009年5月11日 谭俊青 2 条评论
主从数据库记录校验

主从数据库记录校验工具Mylab.RecordChecker截图

工具采用php+mysqli+extjs实现,要使用需要修改部分代码
暂时命名为:Mylab.RecordChecker v1.0 beta
等svn服务器搭建起来之后,我会继续完善代码,做成通用的工具。

下载链接:Mylab.RecordChecker

分类: MySQL Replication 标签:

发布自己的DbSession类(for php)

2009年5月11日 谭俊青 没有评论

嗯,怎么说呢,自己几乎没用过php自带的session,都是基于这个类实现的。

【阅读全文·MySQL实验室】

分类: MySQL, php 标签: , , , ,

MySQL5.4引起的一些争议

2009年5月4日 谭俊青 1 条评论

Author: ivan@mysqlab.net/ 谭俊青

最近看到了一系列有关MySQL5.4 innodb性能比较和测试,如innodb plugin 1.03, xtradb5, mysql5.4(dirty_pages_pct=75), mysql5.4(dirty_pages_pct=15) 等等。不知道是那些人(包括peter等)为什么一直纠缠这些问题。

这些性能的差异是显而易见的,主要是因为5.4中增加的几个google补丁,对io和后台写脏数据到表空间进行的优化。剩下的影响最大的要数dirty_pages_pct了。原则上是越大性能越好,如果大部分是小记录的话,那么1个page的脏数据可涵盖很多个事务,这样ib_logfile中后面出现的数据被提前写入表空间的比率在dirty_pages_pct大的时候概率要大得多,这就是测试结果中显示,在脏数据比例设置较大的时候,高负载的情况下性能有明显提升的原因。

我不知道是他们不懂,还是故意去做些纠缠,吸引后来者的眼球。

再给下我之前在taobao dba team上有关这个参数设置的回复,看来很多人都没明白。

http://rdc.taobao.com/blog/dba/html/221_innodb_max_dirty_pages_pct_checkpoint.html

分类: MySQL 标签:

update更新数字主键的时候可能导致主从(master/slave)复制中断

2009年4月30日 谭俊青 1 条评论
– 准备工作
CREATE TABLE `t_ivan_innodb` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `f_c` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT charset=latin1;

CREATE TABLE `t_ivan_myisam` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `f_c` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=Myisam DEFAULT charset=latin1;

INSERT INTO t_ivan_innodb(f_c) VALUES();
INSERT INTO t_ivan_innodb(f_c) VALUES();
INSERT INTO t_ivan_innodb(f_c) VALUES();
DELETE FROM t_ivan_innodb WHERE id=1;

INSERT INTO t_ivan_myisam(f_c) VALUES();
INSERT INTO t_ivan_myisam(f_c) VALUES();
INSERT INTO t_ivan_myisam(f_c) VALUES();
DELETE FROM t_ivan_myisam WHERE id=1;

– ——————————————-

root:ivan> UPDATE t_ivan_innodb SET id=id-1 WHERE id>1;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

root:ivan> UPDATE t_ivan_myisam SET id=id-1 WHERE id>1;
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0

– 可见默认在物理记录数序没有打乱的时候,默认是asc的,更新都正常
– ——————————————–

DROP TABLE t_ivan_innodb;
DROP TABLE t_ivan_myisam;
– 重新创建和插入记录

root:ivan> UPDATE t_ivan_innodb SET id=id-1 WHERE id>1 ORDER BY id DESC;
ERROR 1062 (23000): Duplicate entry ’2′ FOR KEY ‘PRIMARY’

root:ivan> UPDATE t_ivan_myisam SET id=id-1 WHERE id>1 ORDER BY id DESC;
ERROR 1062 (23000): Duplicate entry ’2′ FOR KEY ‘PRIMARY’

– desc排序的时候肯定错误
– ———————————————

– 下面插入数据故意打乱

INSERT INTO t_ivan_innodb(id) VALUES(2);
INSERT INTO t_ivan_innodb(id) VALUES(3);
INSERT INTO t_ivan_innodb(id) VALUES(4);
INSERT INTO t_ivan_innodb(id) VALUES(7);
INSERT INTO t_ivan_innodb(id) VALUES(6);
INSERT INTO t_ivan_innodb(id) VALUES(5);

INSERT INTO t_ivan_myisam(id) VALUES(2);
INSERT INTO t_ivan_myisam(id) VALUES(3);
INSERT INTO t_ivan_myisam(id) VALUES(4);
INSERT INTO t_ivan_myisam(id) VALUES(7);
INSERT INTO t_ivan_myisam(id) VALUES(6);
INSERT INTO t_ivan_myisam(id) VALUES(5);

root:ivan> UPDATE t_ivan_innodb SET id=id-1 WHERE id>1;
Query OK, 6 rows affected (0.00 sec)
Rows matched: 6  Changed: 6  Warnings: 0

root:ivan> UPDATE t_ivan_myisam SET id=id-1 WHERE id>1;
ERROR 1062 (23000): Duplicate entry ’6′ FOR KEY ‘PRIMARY’
 


小结:更新数字主键+ – 的时候需要注意逻辑顺序,如果物理上的数据跟逻辑不匹配会导致sql语句出错
这样如果master是innodb,而slave是myisam引擎的时候,会导致复制中断。

分类: MySQL 标签:

Innodb由idb数据文件恢复数据

2009年4月28日 谭俊青 2 条评论

这里提供一个简单的办法:

1:在新的实例中创建相同的表结构
2:修改/etc/my.cnf,在mysqld段加入 innodb_force_recovery=6 #具体选择多少请参考手册
3:关闭mysqld
4:覆盖备份的idb文件
5:启动mysqld
 

这时候你会发现数据已经可以读取了。

这里有个技巧,在正常关机的情况下备份idb文件,这种方法可以做到直接copy实现数据迁移,不推荐使用。

分类: MySQL 标签:

Innodb如何查看剩余表空间?

2009年4月27日 谭俊青 3 条评论

在 Myisam 和 Innodb Innodb_file_per_table 独立表空间的情况下,只需要查看磁盘剩余空间,再配合统计出来的数据增长速率就可以对磁盘空间进行预警,提前解决隐患。
那么在预分配共享表空间的情况下查看剩余表空间:

USE test
CREATE TABLE ivan(i int NOT NULL) engine=innodb;
SHOW TABLE STATUS LIKE ‘ivan’;
 

结果类似:

root:test> show table status like ‘ivan’\G
*************************** 1. row ***************************
           Name: ivan
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 514817261568
 Auto_increment: NULL
    Create_time: 2009-04-27 13:32:02
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)
 

由Data_free可以看到剩余的表空间,转载请注明出处和链接地址。

分类: MySQL 标签:

[MySQL5.1] Master上批量将Myisam引擎转Innodb

2009年4月24日 谭俊青 1 条评论


Author:ivan@mysqlab.net

\! rm -f /tmp/ivan_alter.sql #预删除临时文件,方式下面的语句无法写入

SELECT concat(‘alter table `’, TABLE_SCHEMA, ‘`.`’, TABLE_NAME, ‘` engine=innodb;’)
FROM information_schema.TABLES
WHERE ENGINE=‘Myisam’ AND
      TABLE_SCHEMA<>‘mysql’ AND
      TABLE_SCHEMA<>‘information_schema’
INTO OUTFILE ‘/tmp/ivan_alter.sql’ ;

source /tmp/ivan_alter.sql

\! rm -f /tmp/ivan_alter.sql #执行完后删除临时文件
 

分类: MySQL 标签:

MySQL 5.4的新特性解析

2009年4月23日 谭俊青 4 条评论

Author: Ivan@mysqlab.net/谭俊青 转载请注明来源URI链接:

http://www.mysqlab.net/blog/2009/04/mysql-54的新特性解析/

MySQL 5.4 之所以命名为5.4,而不是5.2 是因为之前的5.2版本被命名为6.0了(这个应该是商业上的原因,就像java1.6被命名为6.0)。现在的5.4 preview release 是在当前MySQL5.1的基础上,对 Innodb 进行了一些优化,这些补丁来自google,包括:InnodbIoTuning, InnodbAsyncIo, InnodbStatus , NewShowInnodbStatus , SmpPerformance 等。

从所打的那些补丁,我们可以看出,对innodb做了很多优化,特别是io的优化和smp多核cpu的优化。

下面就一些新增参数和默认值的更改做些说明:

innodb_io_capacity

这个在之前的innodb版本中是被写死的,默认值是100,在5.4中默认值已经改成200。

innodb_extra_dirty_writes

这个是非常有用的一个特性,当服务器资源idle的时候,会做checkpoint,将脏数据页写入表空间,及时没有到达设置的比例(innodb_dirty_pages_pct,innodb_max_dirty_pages_pct)。

innodb_buffer_pool_size

默认值由原来的8M改为1G,其实在大些的db中,这个还是远远不够的。可以将1半,甚至2/3的内存用在这上面。

innodb_log_file_size

默认值增至128M 在磁盘性能好些的机器上,应该还要增加,配合innodb_dirty_pages_pct, 以实现更加好的性能。

innodb_thread_concurrency

Innodb中的并发控制参数,默认值由8改0,这个都得以于google的smpperformance补丁,以前并发超过8时,性能基本上会下降。

另外需要提醒的是:目前MySQL5.4还是preview release,不建议用于生产环境。

分类: MySQL, MySQL HA 标签:

事务隔离级别导致锁级别的不同

2009年4月22日 谭俊青 1 条评论



Author: ivan@mysqlab.net
MySQL支持4种事务隔离级别,他们分别是:

READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
 



如没有指定,MySQL默认采用的是REPEATABLE-READ
ORACLE默认的是READ-COMMITTED

MySQL在REPEATABLE-READ和READ-COMMITTED在某些情况下会表现出不同的锁级别,下面举例说明。

首先创建测试表

CREATE TABLE ivan(
  f_id int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  f_content varchar(32) NOT NULL DEFAULT
) engine=innodb DEFAULT charset=latin1;

INSERT INTO ivan(f_id, f_content) VALUES(1, ‘http://www.mysqlab.net’);
INSERT INTO ivan(f_id, f_content) VALUES(1, ‘http://www.mysqlab.net/blog/’);
INSERT INTO ivan(f_id, f_content) VALUES(1, ‘http://www.mysqlab.net/bbs/’);
 

#session 1

SET tx_isolation=‘REPEATABLE-READ’;
SET auto_commit=0;
UPDATE ivan SET f_content= WHERE f_content=‘http://www.mysqlab.net’;
 

#session 2

SET tx_isolation=‘REPEATABLE-READ’;
UPDATE ivan SET f_content= WHERE f_content=‘http://www.mysqlab.net/blog/’;
 

这时候你会发现,#session2 一直等待,直到#session1 commit之后,#session2才会返回,但是如果f_content存在索引,则会立即返回结果。这些是基于REPEATABLE-READ的测试,在READ-COMMITTED的情况下则表现和oracle一样,update会立即完成并返回结果。



#session 1

SET tx_isolation=‘READ-COMMITTED’;
SET auto_commit=0;
UPDATE ivan SET f_content= WHERE f_content=‘http://www.mysqlab.net’;
 

#session 2

SET tx_isolation=‘READ-COMMITTED’;
UPDATE ivan SET f_content= WHERE f_content=‘http://www.mysqlab.net/bbs/’;
 



总结:MySQL 在innodb等事务引擎的情况下,如果没有特殊要求,可以将默认的事务隔离级别设置为 READ-COMMITTED
或者开启 innodb_locks_unsafe_for_binlog

transaction_isolation = READ-COMMITTED
innodb_locks_unsafe_for_binlog=On
 

另外,涉及到的条件更新尽量建索引,这样一来对主键的选择就要严格控制,以便充分利用好宝贵的内存资源,因为innodb采用的是cluster index,其他索引都会带上它。

分类: MySQL 标签:

Drizzle Client & Protocol Library

2009年4月20日 谭俊青 没有评论

之所以我比较关注libdrizzle是因为其兼容mysql协议,并且支持非堵塞执行sql,我的mystate.monitor正好需要。

另外它是BSD协议的,支持多server并发处理等

原文:http://www.oddments.org/?p=38

目前是0.2版本,下载地址:https://launchpad.net/libdrizzle/+download

编译:http://drizzle.org/wiki/Compiling#libdrizzle

api调用在源码里面有examples,非常cool!

分类: MySQL, MySQL HA 标签:

DBOA数据库自动化管理系统

2009年4月14日 谭俊青 没有评论

这次在chinaunix上看大家对这个系统中的备份部分表现出很大的兴趣。

dboa数据库自动化系统截图

dboa数据库自动化系统截图

更多图片及讨论至: http://www.mysqlab.net/bbs/viewthread.php?tid=2

分类: MySQL 标签:

OnlineDataDrift 主从数据一致性校验

2009年4月14日 谭俊青 2 条评论

对于mysql主从数据一致性一直是大家所关注的,但是苦于没有很好的解决办法,google提供了一个非常好的补丁 OnlineDataDrift

这个补丁的原理:

针对每张表会产生一个checksum的校验sql序列,然后执行它们,并将结果插入到特定表中。

同时这些执行的sql语句会被写入到binlog,从而会在所有slave的同一个status点上执行,也将结果插入到特定表中

当这些sql执行完之后,会比较这些特定的记录,从而找出不一致的数据。

reference:  http://code.google.com/p/google-mysql-tools/wiki/OnlineDataDrift

分类: MySQL HA, MySQL Replication 标签:

MySQL5.1中惊现ibm db2引擎

2009年4月9日 谭俊青 1 条评论

从官方网站http://dev.mysql.com/downloads/mysql/5.1.html#downloads 下载源码

解压后你会发现 strorage 目录下有 个 ibmdb2i 目录

ibmdb2i引擎

ibmdb2i引擎

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