MySQL的存储引擎

MySQL的存储引擎

MySQL服务器采用了模块化风格,各部分之间保持相对独立,尤其体现在存储架构上。存储引擎负责管理数据存储,以及MySQL的索引管理。通过定义的API,MySQL服务器能够与存储引擎进行通信。目前使用最多的是MyISAM和InnoDB。InnoDB被Oracle收购后,MySQL自行开发的新存储引擎Falcon将在MySQL6.0版本引进。

MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用。MyISAM中,一个table实际保存为三个文件,.frm存储表定义,.MYD存储数据,.MYI存储索引。

InnoDB 则是一种支持事务的引擎。所以的数据存储在一个或者多个数据文件中,支持类似于Oracle的锁机制。一般在OLTP应用中使用较广泛。如果没有指定InnoDB配置选项,MySQL将在MySQL数据目录下创建一个名为ibdata1的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的日志文件。

创建table时可以通过engine关键字指定使用的存储引擎,如果省略则使用系统默认的存储引擎:

CREATE TABLE t (i INT) ENGINE = MYISAM;

[继续阅读全文]

DBA备忘录:Data Guard之添加数据文件

一般情况下,如果数据文件采用的是裸设备,为了便于管理,会在裸设备上创建soft link,这样在data guard环境中就有个问题,必须在主备库同时执行创建相同的link,否则备库是auto standby file management的话,会导致数据文件创建失败(前提是去掉了文件系统的写权限,否则会加到文件系统中去,这样麻烦更麻烦了)。

加入在主库创建了soft link,添加了datafile,而备库没有创建对应的link多话,则会遇到以下错误:

Errors in file /u01/oracle/admin/comm/bdump/comm_mrp0_2380526.trc:
ORA-01274: cannot add datafile '/u01/oracle/oradata/comm/test.dbf' - file could not be created
ORA-01119: error in creating database file '/u01/oracle/oradata/comm/test_66.dbf'
ORA-27040: skgfrcre: create error, unable to create file
IBM AIX RISC System/6000 Error: 13: Permission denied
Some recovered datafiles maybe left media fuzzy
Media recovery may continue but open resetlogs may fail
MRP0: Background Media Recovery process shutdown

[继续阅读全文]

AIX下遭遇TNS-12531

上周做HACMP的时候,由于修改了/etc/hosts中的内容,将原来的IP变成了HA的service IP,后面的名字也就从原来的hostname改成了hostname_SVC,也就是/etc/hosts中没有了IP和hostname的对应记录,然后启动监听的时候发现监听无法起来,一直挂起在那里:

$lsnrctl start

LSNRCTL for IBM/AIX RISC System/6000: Version 9.2.0.6.0 - Production on 24-NOV-2007 17:45:25

Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.

Starting /u01/oracle/product/9.2/bin/tnslsnr: please wait…

TNSLSNR for IBM/AIX RISC System/6000: Version 9.2.0.6.0 - Production
System parameter file is /u01/oracle/product/9.2/network/admin/listener.ora
Log messages written to /u01/oracle/product/9.2/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.168.168)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC)))

查看 /u01/oracle/product/9.2/network/log/listener.log,发现全是TNS-12531错误,并且在不停的增加中:

TNS-12531: TNS:cannot allocate memory
24-NOV-2007 17:53:10 * 12531
TNS-12531: TNS:cannot allocate memory
24-NOV-2007 17:53:10 * 12531
TNS-12531: TNS:cannot allocate memory
24-NOV-2007 17:53:10 * 12531
TNS-12531: TNS:cannot allocate memory
24-NOV-2007 17:53:10 * 12531
TNS-12531: TNS:cannot allocate memory

开玩笑,系统已经切换到备库,怎么可能连起监听的内存都没有了,显然不是内存不足的问题。后来还是piner想起以前也出现过相同的状况,就是/etc/hosts中缺乏hostname的记录引起的,果然一加上就正常了。注意到listener.ora中用的是IP,不是hostname。

今天又测试了一把,在AIX5.3和Oracle9206中该问题是可以重现的,在Redhat Linux Enterprise 4中没有问题。查metalink,Note:219206.1上说Unix平台都有这个问题,另外还有一个可能的原因就是oracle用户没有权限读取/etc/hosts文件。有其他平台如HP-UX,Solaris的朋友可以帮忙测试一下^_^

Oracle10gR2 Streams(五)全库复制之三

在《Oracle10gR2 Streams(四)全库复制之二》中利用maintain_global配置了一个downstream的全库复制,本例将在该试验的基础上修改成real-time downstream的全库复制。

所谓实时异地捕获,其实和普通的异地捕获基本上是一致的,所不同的,就是传递到捕获进程所在库的不再是归档日志,而是通过lgwr进程直接传送当前redo。这和data guard中使用arch还是lgwr来传送日志的机制是一样的。

一、在捕获进程所在库创建standby redo logfile

STRMADM@dest>alter database add standby logfile
  2  'F:\oracle\oradata\dest\stdbyredo01.log' size 5m;

Database altered.

STRMADM@dest>alter database add standby logfile
  2  'F:\oracle\oradata\dest\stdbyredo02.log' size 5m;

Database altered.

STRMADM@dest>alter database add standby logfile
  2  'F:\oracle\oradata\dest\stdbyredo03.log' size 5m;

Database altered.

STRMADM@dest>alter database add standby logfile
  2  'F:\oracle\oradata\dest\stdbyredo04.log' size 5m;

Database altered.

[继续阅读全文]