Posted: 16th 十二月 2010 by fire9 in Database
Tags: MySQL,InnoDB,Performance Schema
伴随着北京OOW会议最后一天,凌晨通过Twitter发现MySQL5.5GA了,这真实个令人振奋的消息。也说明Oracle没有让我们失望,至少现在没有。虽然北京OOW会议关于MySQL方面的内容不是很给力,但是,可以看出在Oracle工作的MySQL Team还是棒的。
前天在OOW会议上,飞利浦先生分享了MySQL5.5的功能和扩展性,这不会是就是要发布的前兆吧。让我们在一起回顾和了解一下MySQL5.5都带来什么?
改善性能和扩展性
InnoDB成为默认的存储引擎
更好的元数据事务锁
改善性能和扩展 win32和win64
提高高可用性
半同步复制
复制心跳
提高可用性
信号/反信号
更多的分区选项
性能架构
在MySQL5.5中默认的InnoDB存储引擎,使用了最新的1.1.2版本,在这个版本中,很多特性对于我们现在来说是非常有用而且是急需的。
性能改进
性能改进主要体现在MySQL崩溃后数据恢复能力,通过算法的改变又较长的几十分钟变成十几分钟甚至几分钟恢复完成;InnoDB Buffer Pool由默认的一个扩展到了64个,现在可以成倍的增加InnoDB Buffer Pool;支持多个回滚段,通过建立多个独立的回滚段,在使用时InnoDB可以做到并发还原数据,无需让对方等待;支持异步IO操作,这个功能可以更好的配合Linux系统的I/O请求,提高并发性能。通过添加innodb_use_native_aio参数开启关闭。该参数不支持动态调整。。这四个功能将大大提高MySQL数据库的可用性,高性能性。
扩展性改进
在可扩展性改进方面,主要改善了Log Sys Mutex,独立了Flush List Mutex以及改善了InnoDB的清除调度,提高并发性。
通过Performance Schema可以分析和诊断InnoDB的状态,了解InnoDB-specific mutexe,读写锁和I/O操作。Performance Schema中的表位你完全展示数据库的性能和负载情况,并且可以通过它发现和诊断问题。
更详细的内容请参下面文档吧,我听课题去了。
本文参考:http://dev.mysql.com/tech-resources/articles/introduction-to-mysql-55.html
Posted: 18th 十一月 2010 by fire9 in Enjoylife
Tags: ios, ipad
感谢孔老师让我有机会给ipad安装上ios4.2。我经过一周试用体验如下:
1.没感觉系统在速度上有多大提升
2.wifi出现问题,有时候状态标显示不出来但是还能上网;有时候干脆就上不了网;需要关机重启后恢复
3.锁屏钮变成了音量开关
4.自己不能完全关闭屏幕,可以看出屏幕还是黑亮的
除了多任务和game center,没啥亮点。
Posted: 18th 九月 2010 by fire9 in Enjoylife
今天冒着小雨到豆瓣去参加bpug组织的活动,由于堵车严重,我到的时候清风老师都快讲完了,听了个尾巴,主要是鼓动大家去听听Python用户大会。不过明年是在日本举行,看来只有清风老师比较合适。接下来听了4sq方面的技术,我对这个不感冒。强宁的主题比较吸引我,“《利用PasteScript简化基于Thrift的服务框架开发》”,感觉他们做的这个框架跟Ruby的Rails的性质差不多啦。相比之下rails功能更强大,独领风骚,也希望他们的服务框架能更适合自己产品的需求。另外,强宁爆料,他们将开源一个OneRing的桌面应用项目,主要是用html5来实现,有兴趣的同学可以跟他们沟通。最后一个话题是关于python在虚拟化中的应用,没怎么听,有事先离开了。流水账完毕!!!Good Night!
Posted: 2nd 九月 2010 by fire9 in OpenSource
Tags: libevent, memcached
今天帮忙安装几台memcached,在安装完成后通过telnet链接测试是否正常。可惜,每次都是失败,memcache服务也随即关闭。通过-vvv参数启动,在次通过telnet连接,出现段错误,系统messages里面也是这样的错误。怀疑是libevent和memcached之间关系问题。
通过ldd /usr/local/bin/memcached
libevent-1.1a.so.1 => /usr/lib64/libevent-1.1a.so.1 (0x00002ba2a931e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000039b3800000)
libc.so.6 => /lib64/libc.so.6 (0x00000039b2c00000)
/lib64/ld-linux-x86-64.so.2 (0x00000039b1c00000)
可以看到libevent版本并不是我今天新装的1.4.x的版本,估计问题就出现在这里。
使用软连接让memcached使用刚装好的libevent库
# ln -sf /usr/local/lib/libevent-1.4.so.2.1.3 /usr/lib64/libevent-1.1a.so.1
再看# ldd /usr/local/bin/memcached
libevent-1.1a.so.1 => /usr/lib64/libevent-1.1a.so.1 (0x00002b4a6e3cf000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00000039b3800000)
libc.so.6 => /lib64/libc.so.6 (0x00000039b2c00000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00000039b9800000)
librt.so.1 => /lib64/librt.so.1 (0x00000039b7000000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00000039bc600000)
/lib64/ld-linux-x86-64.so.2 (0x00000039b1c00000)
然后在重新启动memcached服务,在telnet连接就不会出现问题了。
其实,在安装libevent的时候可以指定libdir目录,这样就不需要上面的做法了。:)
Posted: 22nd 八月 2010 by fire9 in Database
Tags: MySQL, password, Security
这里我来介绍几种常见的修改MySQL密码的方法仅供参考!
如果不是通过.EXE/MSI文件来装MYSQL的话,安装的MYSQL密码都是空的我们可以通过mysqladmin命令来设置root密码
Mysqladmin –uroot –p newpassword
如果你有密码了那么P后面就需要跟着旧密码,如果是UNIX系列平台你还可以省略-u root
通常我会使用这种方法
mysql> USE mysql;
mysql> SET PASSWORD FOR root@”localhost” = PASSWORD(’123456′);
这里你也必须使用PASSWORD()函数,但是不需要使用FLUSH PRIVILEGES来执行确认。
我们也可以通过DML语句来修改密码
mysql> USE mysql;
mysql> INSERT INTO mysql.user (Host,User,Password) VALUES (‘localhost’,'fire9′,PASSWORD(’123456′));
mysql> FLUSH PRIVILEGES;
插入一条语句来设置用户的密码,然后刷新权限。
同样,通过REPLACE语句也可以修改密码
Mysql>USE mysql;
mysql> REPLACE INTO user (Host,User,Password) VALUES(‘%’,'fire9′,PASSWORD(’123456′));
mysql> FLUSH PRIVILEGES;
效果跟INSERT是一样的,但是道理不一样,REPALCE是替换掉重复的行。
使用DCL语句GRANT来进行授权
mysql> GRANT ALL ON *.* TO root@”localhost” IDENTIFIED BY ’123456′;
此方法也可以用于添加新用户。
以上都是使用SQL语句来修改密码,也可以使用相关的MySQL管理工具来实现。比如说,PHPMYSQLADMIN,EMS MANAGER,MYSQL-GUI-ADMINISTRATOR等等就不一一列举了。
改了这么多次密码如果忘记了怎么办?
终极必杀技
首先停止掉数据库(这个就不用我多说了吧)
然后启动MYSQL服务添加这个参数—skip-grant-table,接着登入到习惯用上面的方法设置密码就OK了。最后在重启一下MySQL到此完成。
1. 关闭 SElinux
SElinux是主动式保护Linux服务器在公共互联网上这样的Web服务器。它提供了一个额外的安全层,这对后端的数据库来说不是必须的。我们可以把它关闭掉。确认/etc/sysconfig/selinux文件里 SELINUX=Disabled。
2. Swappiness设置
降低Swappiness值,避免没必要的页切换。echo “7″ > /proc/sys/wm/swappiness
3. 文件系统
确保CacheFolder在本地磁盘最快速的位置,例如扇区的最外层。修改/etc/rc.local/添加 blockdev –extra 2048 /dev/sd #x代表分区号,这个分区将挂载到CacheFolder上。
4. 数据目录使用XFS文件系统
由于linux内核本身不支持XFS文件系统,你需要通过编译模块增加XFS文件系统功能。然后使用 mkfs.xfs -b size=4096 /dev/sd创建XFS文件系统分区,并在/etc/fstab里面添加 /dev/sd /data xfs noatime,nodiratime 1 2
5. noatime,nodirtime
使用noatime,nodirtime选项在挂载数据库和缓存卷,否则,它们将频繁更新文件和目录的时间属性,降低磁盘性能。
6. deadline IO调度器
linux kernel2.6默认使用的是CFQ IO调度器,对于单用户来说,它的速度还是不错的,但是在多用户下使用deadline IO调度器将有20%的性能提升。从deadline IO调度器的机制来看更适合数据库使用。通过修改/etc/rc.local添加 echo “deadline” >/sys/block/sd/queue/scheduler。
7. 增加ulimit值支持大数据量和用户数
Ulimit限制了一个用户能打开最大文件的数量。这不会对性能有什么影响,但是可以避免错误。增加ulimit为无限大,或者设置一个更大一些的值。因为默认的文件限制是1024.这对于大数据库来说是不够用的。
使用下面命令修改该值:
# ulimit -a #查看当前值
设置文件打开连接数
# ulimit -n 8800
# ulimit -n -1 #无限大; 对于单独的DB服务器来说,推荐使用这个值。
另外,你如果想永久保存该值,就需要修改/etc/security/limit.conf文件,添加
root soft nofile 16000
root hard nofile 20000
保存文件,然后重启用root帐户登陆立即生效。
Posted: 29th 七月 2010 by fire9 in Database
Tags: INNODB, MySQL, REDO LOG
INNODB存储引擎带有redo log文件,该文件可以让数据排序,以便顺序写入到的数据文件里,减少对数据文件的逻辑写。这个文件的大小是有限制的,每组文件的大小总和不能超过4G。这里我主要想谈谈设置redo log的大小。设置过大的redo log文件可以提高数据库的性能,但是也带来了一个潜在的危险,就是对数据库宕机时所造成的影响。我曾经遇到一个案例,恢复2G大小的redo log文件时耗时2小时30分钟,这种影响我们是无法接受的,尤其是你使用共享磁盘的时候(比如DRDB)简直就是个灾难。
好在今年4月份INNODB存储引擎更到innodb plugin 1.0.7版本,通过一些算法修改了redo log文件缓冲机制,可以快速的恢复数据,这样数据库就可以更快的重新启动,大大地节约了更多地时间。当然,你的redo log问价可能也可以设置的更大。但是除了升级,老版本怎么办呢?
我认为redo log文件跟dirty page的多少有着很大的关系,当然还有一些其它的参数。dirty page越多恢复时间就越长,因为首先要把dirty page数据写入到redo log里面,然后redo log才能到innodb_buffer_pool_size里重放,在准备把数据写入到的数据文件。影响diry page的变量是innodb_max_dirty_pages_pct, 降低该值,可以减少dirty page,这将会增加磁盘io的压力。
如果你的业务是读多写少,redo log大小没必要设置的太大;如果是写多读少,就要在允许范围内,设置的稍微大些。最好通过压力测试观察redo log相关状态,来合理的设置redo log大小。
Posted: 22nd 七月 2010 by fire9 in Database
Tags: binlog, MySQL
我们在使用binlog日志恢复数据的时候由于binlog日志处于开启状态,那么在你恢复数据的同时数据又被写到了binlog日志里面。其实,这样写进去没啥太大意义。
要不把恢复的数据再次写入到binlog日志里面该如何做呢?
如果要是老版本你还真得修改配置参数关闭掉binlog日志,等数据都恢复完了在开启,这样做真是费力不讨好。但是在MySQL4.1版本以上,提供了一个可以在恢复数据时候临时关闭掉的binlog日志的写入的参数。
在mysqlbinlog后添加–disable-log-bin参数,就相当于在恢复数据之前添加了一行set session sql_log_bin=0,这样恢复的数据就不会写入到binlog日志里面了。