5月第三周关键词 慢语句处理

依稀记得是上周开始部署了mysql的节点监控程序到线上环境,设定的查询周期是90秒一次,超过10秒的查询和超过x个连接的时候就会发报警邮件给DBA

这个在镜像库部署的时候,会经常发现开发人员查一下没用索引的语句或者没有limit n的语句,这些没语句会对数据库造成很大的影响,例如一个几千万条记录的大表要全部扫描,或者是不停的做filesort,对数据库和服务器造成io影响等。这是镜像库上面的情况。

而到了线上库,除了出现没有索引的语句,没有用limit的语句,还多了一个情况,mysql连接数过多的问题。说到这里,先来看看以前我们的监控做法

1. 部署zabbix等开源分布式监控系统,获取每天的数据库的iocpu,连接数

2. 部署每周性能统计,包含数据增加量,iostatvmstatdatasize的情况

3. Mysql slowlog收集,列出top 10

以前以为做了这些监控已经是很完美了,现在部署了mysql节点进程监控之后,才发现很多弊端

第一种做法的弊端: zabbix太庞大,而且不是在mysql内部做的监控,很多数据不是非常准备,现在一般都是用来查阅历史的数据情况

第二种做法的弊端:因为是每周只跑一次,很多情况没法发现和报警

第三种做法的弊端: 当节点的slowlog非常多的时候,top10就变得没意义了,而且很多时候会给出那些是一定要跑的定期任务语句给你。。参考的价值不大

最后总结一下节点监控的好处

1. 轻量级的监控,而且是实时的,还可以根据实际的情况来定制和修改

2. 设置了过滤程序,可以对那些一定要跑的语句进行过滤

3. 及时发现那些没有用索引,或者是不合法的查询,虽然这很耗时去处理那些慢语句,但这样可以避免数据库挂掉,还是值得的

4.  在数据库出现连接数过多的时候,程序会自动保存当前数据库的processlist,DBA进行原因查找的时候这可是利器

5.  使用mysqlbinlog 来分析的时候,可以得到明确的数据库状态异常的时间段

python在windows服务器上面安装python-mysqldb

python在windows服务器上面安装python-mysqldb
刚才试验了一把在windows服务器上面使用python setup.py install来安装 python-mysqldb
发现很多编译错误的问题,其实最简单的方法是使用windows版本的exe点击安装
目前已经提供了pytho2.5,python2.6的版本哦
http://sourceforge.net/projects/mysql-python/files/mysql-python/

刚才试验了一把在windows服务器上面使用python setup.py install来安装 python-mysqldb

发现很多编译错误的问题,其实最简单的方法是使用windows版本的exe点击安装

目前已经提供了pytho2.5,python2.6的版本哦

http://sourceforge.net/projects/mysql-python/files/mysql-python/

MySQL5.5的亮点 和MySQL Cluster 7.1介绍

MySQL5.5亮点

InnoDB

  1. 多个缓冲池实例
  2. 多个回滚段
  3. 扩展变化和清除缓冲调度
  4. Improved Log Sys and Flush List mutex 改善日志系统
  5. 改进锁策略
  6. 改进InnoDB互斥,读写锁,线程和I/O操作的策略

改进win32,64平台下的性能/规模

扩展到32个内核

半同步复制

性能架构

SIGNAL/RESIGNAL (finally!)

新的增强分区

Configuring the heartbeat period

More than 10x improvement in recovery times

200% performance gain for MySQL 5.5 over 5.1.40

MySQL Cluster 7.1 (GA)

  • NDBINFO – improved real time status and usage statistics
  • MYSQL Cluster Manager (CGE only)
  • Sub-second failover and self healing recovery
  • Parallel multi-master architecture
  • Low latency – real time responsiveness

MySQL5.5.4InnoDB Plugin 新特性&改进

http://dev.mysql.com/doc/innodb-plugin/1.1/en/innodb-performance.html

mysql5.5.4的innodb增加了很多特性 希望在oracle里面,mysql可以继续走下去

DBA周总结模版

DBA周报模板
1.数据库维护操作
包含SQL审核,表模式设计,索引设置,慢语句分析等
2.数据库维护工具开发
可以提高工作效率,减少重复劳动,提高维护工作规范性,保证数据库健康运行的脚本,工具等
3.镜像库状态总结
包含镜像库落后情况,落后的原因分析,镜像库数据一致性检查等情况
4.数据库异常情况
包含线上库,镜像库,测试库的异常情况总结,描述异常的相关情况,引起的原因分析以及解决的方案
5. 数据库简单维护操作
如为开发人员增加ip访问权限,安排计划任务等
6. 调研工作
根据行业的热点话题进行调查研究,并应用到实际的工作当中
7 工作建议

从事DBA的工作已有接近10个月,每周的结束都需要用周报的形式向上级汇报工作进度 ,如果有一个固定的模版来写周报,可以让写周报的事情事半功倍。

这里贴一下我个人的周报模版

1.数据库维护操作

包含SQL审核,表模式设计,索引设置,慢语句分析,分析数据库日志信息等

例如拿到了一部分慢语句,根据表的查询条件设计索引

2.数据库维护工具开发

可以提高工作效率,减少重复劳动,提高维护工作规范性,保证数据库健康运行的脚本,工具等

例如对重复的,可自动化的工作进行自动化处理

3.镜像库状态总结

包含镜像库落后情况,落后的原因分析,镜像库数据一致性检查等情况

4.数据库异常情况

包含线上库,镜像库,测试库的异常情况总结,描述异常的相关情况,引起的原因分析以及解决的方案

例如io异常提升,找出原因;开发人员遇到之前没出现过的问题,找出根源

5. 数据库简单维护操作

如为开发人员增加ip访问权限,安排计划任务等

6. 调研工作

根据行业的热点话题进行调查研究,并应用到实际的工作当中

如当前比较hit的nosql相关的开源技术

7 工作建议

对部分现有的数据库管理工作流程提出意见和接近方案

Java和Python的语法比较

Java Python
编译 编译:

javac MyClass.java

java MyClass

解释:

python MyProgram.py

变量 必须声明的变量(静态类型) 没有声明(动态类型)
代码风格 代码风格:鼓励缩进 代码风格:必须缩进
备注 备注:使用  // 使用#号
文件名 文件名: 必须与类的名字一致 没有要求
语句结尾 所有的语句后面需要以 分号结束 不需要分号
程序与类 程序必须要嵌入到类里面 不需要
打印字符串

System.out.printf(“Student: %s ~ ID: %d%n”, name, id);
或者
System.out.println(“Student: ” + name + ” ~ ID: ” + id);

Student: Arthur ~ ID: 731137

print “Student: %s ~ ID: %d” %(name, id)

or

print “Student:”, name, “~ ID:”, id

If语句

if (cond) {

a = a + 1;

cond = false;

}

else if (!cond) {

a = a – 1;

}

q = 17;

if cond:

a = a + 1

cond = 0

elif not cond:

a = a – 1

q = 17

代码环绕

使用进行{ }进行环绕

if (cond) {

a = a + 1;

cond = false;

}

使用:

if cond:

a = a + 1

cond = 0

elif not cond:

a = a – 1

q = 17

条件内容 使用()来围住  if (cond) no
布尔值 true , false True,False
逻辑操作符&&, || ,!的使用 if (a<b) && (b<c) {..}

if (a==2) || (a==3) {..}

if (!found_item) {..}

if a==2 or a==3:

..

if not found_item:

While语句

s = “”;

while (counter > 0) {

s = s + “O”;

counter–;

}

mystring = s;

s = “”

while counter > 0:

s = s + “O”

counter -= 1

mystring = s

NB: a string with 5 O’s can be created with

5 * “O”

For语句

int s = 0

for (int i=0; i<10; i++) {

s = s + i;

}

s = 0

for i in range(10):

s += i

NB: can’t use ++ , use += 1 instead

类和对象

public class DNA {

public static int dna_objects; //class var.

private int length;            //object var.

public DNA() {                 //constructor

length = 0;

}

..

public int getLength() {

return length;

}

}

DNA dna = new DNA();

class DNA:

dna_objects = 0        # class variable

def __init__(self):    # constructor

self.length = 0     # object variable

..

def getLength(self):

return self.length

dna = DNA()

私有,公共属性和方法 private, public fields and methods everything is public
类的类型 class variables declared static object variables must be prefixed with self. and should be initialized in constructor,

class variables do not have prefix and are initialized in class definition

This&Self 关键字this是指类本身 Self必须是所有函数的第一个参数,外部调用函数时候不需要写self
构造器 构造器与类同名 __init__等价于构造器
如何构建对象 使用new DB = new DB() DB = db()

CouchDB介绍

什么是CouchDB

  • 文档数据库服务器,可通过RESTful JSON API访问
  • 点对点,模式自由
  • 分布式,强大的增量复制、双向冲突检测和管理
  • 具备查询,建立索引的功能,提供面向表的报告引擎,并可以使用Javascript来查询

CouchDB不是什么?

  • 关系型数据库
  • 关系型数据库的替代方案
  • 面向对象的数据库,或者更具体地说,这意味着要作为一个面向对象编程语言的一个无缝的持久层。

主要特征

文档型

一个CouchDB文档是包含命名字段的对象,字段的值可以是字符,数字,日期或者列表或者是Map。举个例子

"Subject": "这是一个CouchDB"
"Author": "couchdb.apache.org"
"PostedDate": "5/23/2006"
"Tags": ["Documents", "Views", "Distributed"]
"Intro": "分布式,文档结构的数据库服务器."

在这个例子当中,Subject包含”这是一个CounchDB”的字段。Tags是包含”Documents”,”Views”,”Distributed”的列表

一个CounchDB 数据库相当于这些文档的集合,每一个文档通过唯一ID来标识

视图

为了解决这一结构添加到半结构化数据的问题,CouchDB通过Javascrip集成浏览模式来描述。视图是在数据库里面进行集成和描述文档,是建立在需求聚集,合并和描述数据库文档的一种方法。视图是动态建立,不影响原始文件,在相同的数据基础上,你可以根据自己的需求建立各种不同的视图形式

自由模式

CouchDB不像SQL数据库那样用来存储结构严密,相互关联的数据;CounchDB的设计目的是存储大量的半结构化,面向文档的数据。CouchDB 极大的简化了面向文档的应用程序开发工作.

分布式

CouchDB是一个同等访问的分布式数据库系统,任何数量的CouchDB主机(服务器或离线客户端)都可以有独立的”同一个数据库副本的副本”,应用程序可以有完整的数据库交互(查询,添加,编辑,删除).当重新联机或按照日程安排,数据库的更改会被复制双向定向。

CouchDB具有内置的冲突检测和管理,以及快速的增量复制进度,只复制文件和自上次复制后改变的字段。大多数应用程序不需要特别的计划采取分布式的更新和复制的优势。

不同于传统的数据库试图去集成多繁杂的分布式数据库特性,CouchDB是经过精心慎重的设计,建造和集成。文档,视图,安全和复制模型,特殊目的的查询语句,高效率和强大的磁盘布局都是经过精心整合为一个可靠和有效率的系统

CouchDB 应用

CouchDB适合于邮件系统,文档系统,CMS,地址本,电话本等

查询MySQL已有的用户的三种方法

查询MySQL已有的用户的方法
mysql -h ip -uroot -p123 -e ” 放以下的查询”
select * from mysql.User \G
select distinct(User) from mysql.user;

select db,host,user from mysql.User

对于MySQL DBA 来说,查阅mysql的用户信息是最平常不过的操作了,这里提供几种方法查看

mysql -h ip -uroot -p123 -e ” 放以下的查询”

select * from mysql.User \G

select distinct(User) from mysql.user;

select db,host,user from mysql.User

python 使用OptionParser的时候使用中文出错的解决过程

今天在使用OptionParser的时候,在填写帮助信息的时候使用了中文,却发现报了一系列的错误
代码如下
#!/usr/bin/env python
#coding:UTF-8
import ConfigParser,sys
try:
from optparse import OptionParser
except ImportError:
try:
from optik import OptionParser
except ImportError:
raise ImportError, ‘Requires Python 2.3 or the Optik option parsing library.’
parser = OptionParser()
parser.add_option(“-f”,”–file”,dest=”name”,
help=”帮助信息”,metavar=”FILE”)
parser.add_option(“-q”,”–quit”,
action =”store_false”,dest=”verbose”,default=”True”,
help=”帮助信息”)
(options,args) = parser.parse_args()
错误信息
File “get-parser-cn.py”, line 23, in <module>
(options,args) = parser.parse_args()
File “/usr/lib/python2.5/optparse.py”, line 1387, in parse_args
stop = self._process_args(largs, rargs, values)
File “/usr/lib/python2.5/optparse.py”, line 1431, in _process_args
self._process_short_opts(rargs, values)
File “/usr/lib/python2.5/optparse.py”, line 1538, in _process_short_opts
option.process(opt, value, values, self)
File “/usr/lib/python2.5/optparse.py”, line 774, in process
self.action, self.dest, opt, value, values, parser)
File “/usr/lib/python2.5/optparse.py”, line 796, in take_action
parser.print_help()
File “/usr/lib/python2.5/optparse.py”, line 1657, in print_help
file.write(self.format_help().encode(encoding, “replace”))
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 124: ordinal not in range(128)
和 @smallfish9 同学 讨论了一番,并搜索了一些资料后,找到了解决方案如下
import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 ,可以注释掉来试试,会提示没有这个setdefaultencoding方法的
#!/usr/bin/env python
#coding:UTF-8
import ConfigParser,sys
reload(sys)
print sys.getdefaultencoding()
sys.setdefaultencoding(‘utf-8′)
try:
from optparse import OptionParser
except ImportError:
try:
from optik import OptionParser
except ImportError:
raise ImportError, ‘Requires Python 2.3 or the Optik option parsing library.’
parser = OptionParser()
parser.add_option(“-f”,”–file”,dest=”name”,
help=”帮助信息”,metavar=”FILE”)
parser.add_option(“-q”,”–quit”,
action =”store_false”,dest=”verbose”,default=”True”,
help=”帮助信息”)
(options,args) = parser.parse_args()
再进行 python  get-parser-cn.py -h 的时候,可爱的中文就出来了

今天在使用OptionParser的时候,在填写帮助信息的时候使用了中文,却发现报了一系列的错误

代码如下

#!/usr/bin/env python

#coding:UTF-8

import sys

from optparse import OptionParser

parser = OptionParser()

parser.add_option(“-f”,”–file”,dest=”name”,help=”帮助信息”,metavar=”FILE”)

(options,args) = parser.parse_args()

错误信息

File “get-parser-cn.py”, line 23, in <module>

(options,args) = parser.parse_args()

File “/usr/lib/python2.5/optparse.py”, line 1387, in parse_args

stop = self._process_args(largs, rargs, values)

File “/usr/lib/python2.5/optparse.py”, line 1431, in _process_args

self._process_short_opts(rargs, values)

File “/usr/lib/python2.5/optparse.py”, line 1538, in _process_short_opts

option.process(opt, value, values, self)

File “/usr/lib/python2.5/optparse.py”, line 774, in process

self.action, self.dest, opt, value, values, parser)

File “/usr/lib/python2.5/optparse.py”, line 796, in take_action

parser.print_help()

File “/usr/lib/python2.5/optparse.py”, line 1657, in print_help

file.write(self.format_help().encode(encoding, “replace”))

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 124: ordinal not in range(128)

和 @smallfish9 同学 讨论了一番,并搜索了一些资料后,找到了解决方案如下

import sys

reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 ,可以注释掉来试试,会提示没有这个setdefaultencoding方法的

完整的代码

#!/usr/bin/env python

#coding:UTF-8

import sys

from optparse import OptionParser

reload(sys)

print sys.getdefaultencoding()

sys.setdefaultencoding(‘utf-8′)

parser = OptionParser()

parser.add_option(“-f”,”–file”,dest=”name”,

help=”帮助信息”,metavar=”FILE”)

(options,args) = parser.parse_args()

再进行 python  get-parser-cn.py -h 的时候,可爱的中文就出来了

Slave落后于Master的检查步骤

前两天一直好好的master-slave,突然出现了几个slave复制严重落后于master的情况,在CU的论坛发了个帖子问大伙slave落后于master的原因分析,一哥们给的答复很专业
“落后的原因一般是master的写压力比较大,因为mysql的同步使用两个线程,一个读取bin-log,一个应用这些log,但是master上一般是多个线程写,所以压力大的时候,会造成从服务器一个线程写入不能及时完成,就会造成落后master了
再后来和公司的前辈讨论了下,总结了如下几个检查步骤
1. 在slave 执行show full processlist ,这个是最直接的方法,发现了Master端对一个大表的某个字段执行了update操作
2. 使用iostat来检查slave的io负载情况(也就是上面那哥们所说的写操作的检查了)

前两天一直好好的master-slave,突然出现了几个slave复制严重落后于master的情况,在CU的论坛发了个帖子问大伙slave落后于master的原因分析,一哥们给的答复很专业

“落后的原因一般是master的写压力比较大,因为mysql的同步使用两个线程,一个读取bin-log,一个应用这些log,但是master上一般是多个线程写,所以压力大的时候,会造成从服务器一个线程写入不能及时完成,就会造成落后master了

再后来和公司的前辈讨论了下,总结了如下几个检查步骤

1. 在slave 执行show full processlist ,这个是最直接的方法,发现了Master端对一个大表的某个字段执行了update操作

2. 使用iostat来检查slave的io负载情况(也就是上面那哥们所说的写操作的检查了)