分类 数据库 下的文章

解决Firebird性能问题

原文为FDD2012上的演讲英文ppt,现翻译为中文,原始链接为:http://www.slideshare.net/ibsurgeon/resolving-firebird-performance-problems

解决Firebird性能问题

Alexey Kovyazin, IBSurgeon

FDD 2012, Brazil


议程

  • 理解Firebird内存模型



    • 内存消耗方式
    • 内存使用调优
  • 冻结问题



    • IO问题 - (RAID)
    • 多余的垃圾回收 - 如何用IBTM和IBAnalyst检查数据库事务的状态和gstat
    • 锁冲突 - 如何检查系统锁表(lock table)状态
  • 缓慢的查询和错误索引



    • 通过MON$和FBScanner定位缓慢的查询
    • 通过FBScanner跟踪查询过程
    • 通过TRACE API插件(需2.5.x之后的版本)来跟踪查询过程


Firebird的内存消耗

Firebird内存消耗

- 阅读剩余部分 -

PostgreSQL数据库的帐号及库维护

PostgreSQL是一个成熟稳定功能全面的开源数据库。大多数情况下,我们都是使用一引起维护工具,比如pgadmin之类的进行维护,或者某些应用系统会自带一些简单的维护功能。有时没有这些工具或应用系统的维护功能无法实现我们的地些目的,那就得直接使用pg的命令行维护工具。

帐号维护

创建用户命令:

su - postgres

createuser --createdb --no-createrole --pwprompt demo

系统会询问数据库帐号的密码:

Enter password for new role:

在输入两次密码后,会提示:

Shall the new role be a superuser? (y/n)

这是询问这个用户是否是超级用户,一般选择n。因为创建帐号时我们已经指定了这个用户可以创建数据,但不能创建新的数据库帐号,如果是超级用户,这些设置就无效了。

删除用户命令:

dropuser demo

如果这个用户demo已经创建了数据库,那就得先使用psql,通过drop database删除这个用户创建的所有数据库之后才能删除demo用户。

当然,增加/删除用户都可以进行psql,使用DML来进行维护。具体的DML细节就得查PG的手册了。

数据库管理

数据库管理就得进入psql了。

su - postgres

psql

会出现:

psql (9.1.4)

Type "help" for help.

postgres=#

这就是psql的提示符。输入help可以查看简要操作说明。

查看数据库用户:

\du

查看所有数据库:

\l

创建一个数据库:

create database demodb;

注意,这是一条DML,后面得加上分号作为结束符。

删除一个数据库:

drop database demodb;

维护用户

同样,也得先进入psql。

修改用户密码:

alter user demo with password '123456';

密码使用单引号括起来。

创建用户:

create user demo;

删除用户:

drop user demo;

大致就这样常用操作。

psql的退出是使用命令:

\q

MySQL 严重 Bug - 用户登陆漏洞

Security vulnerability in MySQL/MariaDB 在知道用户名的情况下(如root),直接反复重试(大约1/256的机率)即可登入。

受影响的版本:

All MariaDB and MySQL versions up to 5.1.61, 5.2.11, 5.3.5, 5.5.22 are vulnerable.
MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.
MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.

详情在这里

相关补丁看这里

这个 Bug 在官方编译的版本中没有发现。如果你是下载的源码,然后自己编译的就有可能遇到这个问题。

这个问题和 memcmp() 这个函数的返回值有关系。目前知道的情况来看,gcc 自带的 memcmp 是安全的,BSD libc 的 memcmp 是安全的。Linux glibc sse 优化过的 memcmp 会有这个问题。

应该是把返回值int转换成char,但某些情况下转换结果有一定随机性。

其实数据库不能暴露在外网,这是基本的常识,但很多人没当回事。估计很多公司的库就是这么被拖了。

[翻译]DSQL/BLR实现内幕

这是Adriano dos Santos Fernandes写在自己博客的一篇关于Firebird 的DSQL/BLR重构/重写的一些背景和实现内幕。

原文为:DSQL/BLR compilers internals

这个贴子的内容是一些原始笔记,没有研究过这些代码的人不太好理解。

说实话,以前DSQL/BLR的实现是如此恶心,以至于要实现改进对我也不是件容易的事(我一直从事这个事)。这需要多次的尝试和重新来过,但还好结果总是非常好。可以说,这是个花费许多时间的大工程,我也是现在才在这写些笔记。

回想2006,我刚被邀请从事DSQL方面工作时,我开始思考我们应该做些什么来改进DSQL和BLR的内部编译。我开始从

src/dsql/pass1.cpp

src/jrd/cmp.cpp

进行研究。那之前,增加一个简单的函数功能也是一个噩梦。下面的对话是Nickolay Samofatov 和我在2004年9月进行的:

Adriano: 我增加了“Lower”函数,我没想到这活这么麻烦。“Length”函数也要通过BLR加进来么?
Nickolay: 怎么会麻烦呢?
Nickolay: 只是调整15个左右的文件 :-) 

从那后我好几年都在调整“15个左右的文件”来增加每个功能,这过程非常烦人。在2.5版,为了实现 ALTER CHARACTER SET 和 AUTONOMOUS TRANSACTIONS 语句语法,我增加了“兼容层”来以更加面象对象的方式来实现这些语句语法。我在这个贴子中描述了DDL是如何工作的。

如我在那贴子中承诺的那样,这个功能将实现子函数,以及包(packages)功能。

在Firebird V3开发过程后,很显然,不仅是语句需要这个“兼容层”,表达式也是一样。而且表达式相比语句而言对于“兼容层”更加“感兴趣”。Firebird中有许多类型表达式,它们都错落地分布在dsqlnod/jrdnod结构和各类算法中(现在这个现象不存在了)。这些类型是:record sources, values, booleans, aggregate values, windowed values 和 lists。

表达式兼容层设计成实现window函数(更多信息请查看这里这里这里),但同时它产生了更多糟糕的内部接口代码。

完整地移除jrdnod很容易,并在很早以前就完成了。但dsqlnod还留着。它有许多代码需要完全重构(或重写),现在这些工作都完成了。

下面是Node类的继承关系。除了列表中的,每个都有自己的继承类(这里忽略了)。

Node
--- DdlNode
--- DmlNode
------ StmtNode
------ ExprNode
--------- BoolExprNode
--------- ValueExprNode
------------ AggNode
--------------- WinFuncNode
--------- RecordSourceNode
--------- ListExprNode
------------ ValueListExprNode
------------ RecSourceListExprNode

正如我所说过的,这里花费了大量的时间,但如果没有花费这些时间许多其它功能就不可能实现或无实现价值了。

现在可以轻松地说老代码是垃圾(这是事实,真的!),但许多事都是相关并逐渐演进的(C和C++,bison和btyacc)。重要的是返工的时机到了,所以这项工作就被完成了。