Archive for category 数据库应用

Solaris下安装Oracle 10 up 2

环境配置:SUN V245server,安装有最新版本的Solaris10update4 for SPARC,从www.oracle.com下载了最新版本的Oracle 10G update 2 — Linux windows已经可以下载到

11G,可不知道为什么作为“oralce的最佳平台”的solaris只有10up2

 

首先,在/etc/system的末尾添加,否则,在安装的过程中将会提示“out of memory”之类的错误:

set semsys:seminfo_semmni=100

set semsys:seminfo_semmns=1024

set semsys:seminfo_semmsl=256

set semsys:seminfo_semvmx=32767

set shmsys:shminfo_shmmax=4294967295

set shmsys:shminfo_shmmin=1

set shmsys:shminfo_shmmni=100

set shmsys:shminfo_shmseg=10

解压oracle:

gzcat 10gr2_db_sol.cpio.gz | cpio -icvd

添加dba组和属于dba组的oracle用户,并创建相关的权限的目录:/opt/oracle/ 10.2.0/Db_1 /oracdata

修改oracle用户目录下的.profile文件,添加如下内容:

umask 022

TEMP=/tmp;export TEMP

TMPDIR=/tmp;export TMPDIR

ORACLE_HOME=/opt/oracle/ 10.2.0/Db_1;export ORACLE_HOME

ORACLE_BASE=/opt/oracle;export ORACLE_BASE

PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/ucb:/etc:/usr/openwin/bin:/usr/ccs/bin

ORACLE_SID=HSDB;export ORACLE_SID #HSDB是我设置的数据库SID,可以根据需要设定相对应的SID

启动X界面(我的机器没有显卡,只能用Xmanger)启动安装程序:

Su oralce

,

1 Comment

mysql的“降级”移植

开发了一个项目,在部署时遇到了一点问题。

开发环境原本是mysql5.1,可实际部署的时候才发现服务器端的环境是mysql4.0。可mysqldump出来的数据无法直接倒入4.0,直接拷贝出来的数据,mysql4.0根本无法识别。

研究了一下mysqldump的文档,找到了一个选项“–compatible=name” 问题迎刃而解。而且这个选项竟然支持在多个环境中的平移。 选项支持mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb,格式的SQL语句。

No Comments

Oracle的101个漏洞

Oracle这次补丁升级一共修复了惊人的101个漏洞,覆盖范围包括数据库、企业应用、开发工具和中间设备,属于Oracle季度升级的一部分。

同时Oracle还提供了其他信息,例如判定一个漏洞是否能被用于远程攻击,这个系统有利于系统管理员发现危急问题。

最严重的是“base score”漏洞,被判定为7.0级,它会影响Oracle Application Express,而主要产品数据库被修复22处,大多数危险等级在4.2左右。这个分级是依照通用弱点评价体系来判定的,思科也使用了这个标准。

虽然规模较大,不过这次修补还没有涉及到Oracle数据库9.2.0.6和10.1.0.5版,他们的补丁要到这个月末出台。运行于Linux之上的Oracle 10.2.0.1和Windows下的Oracle 10.2.0.2也要到十月底才能得到修补。

详细漏洞列表在这里

No Comments

Mysql的存储引擎

mysql5.1里包含了好几种存储引擎(Storage Engine )。性能各有千秋,究竟哪个才是您需要的?

功能列表:


MyISAM BDB Memory InnoDB Archive NDB
最大数据 256TB No Yes 64TB No 384EB[4]
事务处理 No Yes No Yes No Yes
锁定级别 Table Page Table Row Row Row
读取快照 No No No Yes Yes No
特殊类型字段支持 Yes Yes[1] No Yes[1] Yes[1] Yes[1]
B-tree 索引 Yes Yes Yes Yes No Yes
哈西索引 No No Yes No No Yes
全文搜索 Yes No No No No No
集群索引 No Yes No Yes No No
数据缓存 No Yes N/A Yes No Yes
索引缓存 Yes Yes N/A Yes No Yes
压缩数据 Yes No No No Yes No
加密[2] Yes Yes Yes Yes Yes Yes
集群数据库 No No No No No Yes
复制支持[3] Yes Yes Yes Yes Yes Yes
外键支持 No No No Yes No No
热备份热恢复[3] Yes Yes Yes Yes Yes Yes
结果缓存支持 Yes Yes Yes Yes Yes Yes
字典更新统计 Yes Yes Yes Yes Yes Yes

注:

[1]支持特殊的数据类型,但不可作为索引
[2] 通过编程在服务器执行,效果远胜于在存储引擎中执行
[3] 在服务器内执行,远胜过在存储引擎中执行
[4] EB = 1024 * 1024TB

其中最常用的非MyISAM莫数。也是mysql下功夫最多的一个引擎了,几乎所有的参数都可以调节。速度超快,适合存储网页数据。类似的还有一个ISAM引擎,但就我看来,它不过是MyISAM的前身为了保证兼容性保留下来的。

Memory首次接触是将php的seesion保存在数据库中,Memory顾名思义,将所有数据保存在内存中,访问速度有所提高,当然关机后数据消失。感觉这个引擎更加体现了mysql的“裸奔原则”,为了速度,能丢弃的全部丢弃。

InnoDB因为有了事务处理和外键支持,很适合做企业数据库。但说老实话,他的速度实在叫人提不起兴趣。支持COMMIT, ROLLBACK, 和 savepoints.

BDB,很接近于InnoDB,支持
RCOMMITROLLBACK 操作

NDB,如果你的mysql不得不作集群,这也是不得不选择的引擎。

一个数据库中每个表都可以用不同的引擎,你可以使用“CREATE TABLE engineTest (id INT) ENGINE = MyISAM;” 的方式来创建一个表,同时也可以使用“ALTER TABLE engineTest ENGINE = ARCHIVE;”的方式改变一个表的属性。

No Comments

细解mysqldump

mysqldump是mysql自带的一个强大的备份工具。如果您像装载整个数据库mydb的内容到一个文件中,可以使用下面的命令:

  #mysqldump –-database mydb –user=username –password=password > mydb.sql
  
  这个语句也允许您指定一个表进行dump(备份/导出/装载?)。如果您只是希望把数据库db中的表table中的整个内容导出到一个文件,可以使用下面的命令:

  #mysqldump –database db table >db_table.sql
  
  这个非常的灵活,您甚至可以使用WHERE从句来选择您需要的记录导出到文件中。看过mysql官方手册中就介绍了这样一个实现mysql增量备份的例子:
      
        #mysqldump –where=“ last_modified < NOW() – INTERVAL 1 MONTH”  >backup.sql
    
  mysqldump工具有大量的选项,部分选项如下表:

  选项/Option 作用/Action Performed

  –add-drop-table

  这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除

  –add-locks

  这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作
  
  -c or – complete_insert

  这个选项使得mysqldump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。

  –delayed-insert 在INSERT命令中加入DELAY选项

  -F or -flush-logs 使用这个选项,在执行导出之前将会刷新MySQL服务器的log.

  -f or -force 使用这个选项,即使有错误发生,仍然继续导出

  –full 这个选项把附加信息也加到CREATE TABLE的语句中

  -l or -lock-tables 使用这个选项,导出表的时候服务器将会给表加锁。

  -t or -no-create- info

  这个选项使的mysqldump命令不创建CREATE TABLE语句,这个选项在您只需要数据而不需要DDL(数据库定义语句)时很方便。
  
  -d or -no-data 这个选项使的mysqldump命令不创建INSERT语句。

        –opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。

  -q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。

   -T path or -tab = path 这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命 名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。
  
  -w "WHERE Clause" or -where = "Where clause "

  如前面所讲的,您可以使用这一选项来过筛选将要放到 导出文件的数据。
  

PS: 如果你的mysql是运行在*nix平台上的,可以利用其强大的pipe连接一下,输出压缩后的数据:mysqldump -A | bzip2 -9 -f > db_backup.sql.bz2。直接从一个服务器备份到另一服务器:mysqldump –opt database | mysql –host=remote-host -C database  。

No Comments

数据库系统升级

根据PostgresSQL8.1的手册所描述,8.1新增了诸如数据库自动清理和自动备份等新功能。在本地测试了大约3周,确实如实。故今天上午9:00~11:00升级了网站的数据库至8.1的版本,同时连带升级还有PHP5的pgsql模块和perl。

整体性能有了一定提高,首页的平均载入时间减少了百分之三秒且还有潜力可挖。升级过程中可能部分用户会注册失败,还请重新注册。

No Comments

优化你的PgSQl(FreeBSD)

本文根据Pgsql手册的内容整理而来。
一直在用Pgsql,这些天有种想要将其优化到底的想法,对其做了如下改动:

FreeBSD内核的修改

首先,察看几个内核数值 :
#sysctl -a | grep shmall
#sysctl -a | grep shmmax
#sysctl -a | grep semmni
# sysctl -a | grep semmns

shmall 为可用共享内存大小,以 4KB 页为单位计算,即最终的结果*4才是你共享内存的大小数。系统默认为8192,32M。怎么也要128以上吧?如果你收到来自shmget的类似Invalid argument这样的错误信息,那么很有可能是你已经超过这个限制了。
shmmax为最大共享内存大小,这个值至少应该大于 250kB + 8.2 kB * shared buffers + 14.2 kB *max connections

semmni知该怎么翻译好,应该是“信号灯标示符的最小值”之类的意思。由于pgsql每16个连接占据一个“信号灯”且每16个连接之后还会有一个备用的连接,故理论上这个值应该且必须大于max_connections / 16 ,系统默认非常保守,只有10。

semmns,原理同上,这个值应该设置为大于(max_connections / 16) *17+10,经过测试,这个值减去15,基本上就是max_connctions能设置的最大数值。

我的设置为(注:服务器内存256M)


kern.ipc.shmall=32768kern.ipc.shmmax=134217728kern.ipc.semmap=256kern.ipc.semmni=256kern.ipc.semmns=512kern.ipc.semmnu=256 

需要注意的是,semmni和semmns两个参数不可通过sysctl设置,只能选择编进内核或者修改/boot/loader.conf。对于其他参数可以直接修改/etc/sysctl.conf文件或者内核配置文件中添加options的方法,考虑到日后调整方便,建议采用前一方法。修改成功后重启机器(不嫌麻烦可以手动添加)。
#reboot

以上几个数值解决了很多BSD用户碰到的修改了Pg配置而无法启动pg的尴尬

修改postgresql.conf

这里修改起来就比较直观了。
一般情况下设置maintenance_work_mem和checkpoint_segments会有不错的性能提升,但对于高负荷情况下主要就是shared buffers和max connections。这里默认的配置文件中也有比较详细的介绍。

重启pgsql:
#/usr/local/etc/rc.d/010.pgsql.sh restart

如果你还有足够的勇气时间以及金钱

  1. 使用64位的操作系统、更大的内存、更快的硬盘——废话!
  2. 将数据文件和系统文件放置在两个卷上(可以使用ln作连接)。
  3. 开启内核的MD,将一部分内存模拟成磁盘存放数据文件。这在少量数据的情况下可以尝试,但可靠性下降,适合只读不写的数据库。
  4. 适当调高WAL预写缓冲,但这意味着系统可靠性下降。
  5. 修改make.conf ,添加-O3编译参数,重新编译PGSQL和kernel,当然这是在连使用-O2和所有优化参数之后仍无济于事之后。效率提升<1%

2 Comments

Oracle DB 10g 中文乱码问题的解决

不少兄弟反映在rhel3下安装oracle10g时出现乱码, 其实在安装和使用时出现乱码的地方有多个, 可以分为三类:
1. 安装时的乱码
2. 一些应用程序的乱码, 比如 dbca, netca
3. 一些基于oc4j的web应用的乱码, 比如 isqlplus, em

造成这些问题的原因都是一个, 就是这些程序都使用jdk, 相应的jdk(或jre) 使用的字体配置文件 font.properties 中的字体和操作系统的字体或者字体配置文件不匹配. 解决的办法是把两者改成一致.
1. 下载, 解包 ship.db.cpio.gz, 生成目录 Disk1
2. cd Disk1/stage/Components/oracle.swd.jre/1.4.2.0.0/1/DataFiles/
unzip all_except_bin.jar
(这时生成一个 jre 的目录)
cd jre/1.4.2/lib/
mv font.properties font.properties.bak
cp font.properties.zh_CN.Redhat8.0 font.properties
cd ../../../
zip -r all_except_bin.jar.new jre/
mv all_except_bin.jar.new all_except_bin.jar
(这么累啊, 其实就是把 font.properties 文件换掉. 这样安装时汉字显示就没有问题了)

3. 如法炮制, 把Disk1/stage/Components/oracle.jdk/1.4.2.0.0/1/DataFiles/sol_bin.1.1.jar

文件里面的font.properties 文件换掉, 创建数据库和执行网络配置时的乱码就没有了. isqlplus 和em 的乱码也解决了.


No Comments

Samba 3.0.10 的 MySQL 用户表验证

Samba 让 Linux 的灵活性表露无遗。在公司的局域网内部,我十分喜欢 Samba 的自由自在。

  安装和编译的步骤并不复杂,但是需要了解为了支持 MySQL 认证,编译时需要的参数,以及配置时采用正确的参数。

编译命令:

$ ./configure –with-expsam=mysql –with-mysql-prefix=/opt/mysql

如果以上命令成功的话,然后就是 make ; make install 了。
然后拷贝一个 examples 下的 smb.conf 到 /usr/local/samba/lib 。
用 /usr/local/samba/sbin/smbd -D 即可启动。
用 smbstatus 命令可以查看 Samba 服务器的状态。

下面配置 MySQL 的支持。 和 MYSQL 相关的配置有以下几行:

[global]

# passdb backend = plugin:/usr/local/samba/lib/pdb/mysql.so:mysql
passdb backend = mysql:mysql
mysql:mysql host = localhost #主机名
mysql:mysql port = nnnn #端口号,默认3306
mysql:mysql user = samba #mysql用户
mysql:mysql password = password #mysql密码
mysql:mysql database = smb_user #数据库名
mysql:mysql table = user #数据表,似乎没有用处

……
  建立 smb_user.user 表的脚本可以从 examples/pdb/mysql 目录下的 mysql.dump 导入,如果使用的版本是samba3,还需要单独手工增加“logon_hours"键值,这个目录下的 smb.conf 是一个最简单的配置,可以供参考。但是这个文件有几个地方是错的。

  最主要的就是上面注释掉的那行,我发现根据这个 sample 不能使用,后来修改为简单的
mysql:mysql 后就能使用了。

  具体的调试还是必须看相关的日志文件,如果是数据库连接错误,相关的日志文件会报告数据库不能连接的错误。

  这样,一个基于 MySQL 用户的 Samba 系统建立了起来。
       如果安装了swat,可以运行一下,重新格式化一下配置文件,这样看起来更方便一些。

   但是,目前没有现成的完全基于 PHP 的针对 Samba 口令的修改程序。因为 user 表中的 lm_pw 和 nt_pw 分别代表口令的散列,其算法相对比较复杂, 远远不是 PHP 和 MySQL 提供的 encrypt() md5() 之类的函数能解决的。

  如果有读者已经发现或者已经研发出纯 PHP 的修改 lm_pw 和 nt_[pw 字段的程序,欢迎一起交流。

,

No Comments

mysql在不同操作系统下的性能

网上有很多关于硬件的测评,前不久,我找到了不同操作系统下Mysql的测评,比较有趣。不过讲老实话,由于我刚刚经历了数月的mysql折磨—传说中mysql的极限竟然被我遇上了(话外音:应该买彩票)。我现在似乎已经不太敢用mysql做项目了。

操作系统:
    gentoo (kernel 2.4.28)
    gentoo (kernel 2.6.10)
    NetBSD 2.0
    FreeBSD 5.3 KSE
    FreeBSD 5.3 LT
    FreeBSD 4.11 (libc_r)
    FreeBSD 4.11 LT
    OpenBSD 3.6
    Solaris 10 (b69)

Super Smack 1.2测试1,2cpu下的SELECT-KEY和UPDATE-KEY的效能:

命令:
super-smack /usr/share/smacks/select-key.smack 10 10000

super-smack /usr/share/smacks/update-select.smack 10 10000

v2graphs_1-CPU-select-key.gif
v2graphs_2-CPU-select-key.gif
v2graphs_1-CPU-update-select.gif
v2graphs_2-CPU-update-select.gif

SysBench 0.3.1 1M 的数据Rows测试数据库性能,同样也是1,2CPU的资料:

命令:
To setup:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=1000000 prepare

To run:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=1000000 run

To cleanup:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=1000000 cleanup

10M Rows:

To setup:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=10000000 prepare

To run:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=10000000 run

To cleanup:

sysbench –num-threads=10 –test=oltp –mysql-host=172.16.3.7 –mysql-user=root –mysql-password=mysql –oltp-table-size=10000000 cleanup


v2graphs_1-CPU-1M-rows.gif
v2graphs_2-CPU-1M-Rows.gif

同上,只是 10M 的Row

v2graphs_1-CPU-10M-Rows.gif
v2graphs_2-CPU-10M-Rows.gif

Super Smack的综合

v2graphs-Delta-Super-Smack.gif

SysBench 的综合:


v2graphs_Delta-1M-Rows.gif
v2graphs_Detla-10M-Rows.gif

该测评的最终结论:
Linux2.4 2.6 以及Solaris比较适合运行mysql, FreeBSD 5.3 (KSE and linuxthreads), and FreeBSD 4.11 表现一般,而其余的很不适合多处理器,而个别案例说明他对于单个处理器还是有优势可言的。

后面的还有很多评语,苦于本人的英语水平有限,只等说看出大概。(原文在 http://www.newsforge.com/article.pl?sid=04/12/27/1243207)

其实本人对某些测试结果持怀疑态度:
    1.其实操作系统内核是可以根据需要进行优化和重编的,
    2.而且对于FreeBSD的测试都是基于Linux模拟方式进行的,对于FreeBSD评价有失公平。
    3.Solaris的磁盘格式非常适合数据库存储,本人就有采用Solairs的磁盘格式优化linux下mysql的经历。

No Comments