AIX平台升级到Oracle10.2.0.4的几个问题
最近将AIX5306上一个Oracle从9.2.0.6升级到了10.2.0.4,虽然最终升级顺利完成,不过还是碰到了几个小问题,在这里记录一下。
1. plan_table的问题
如果在9i的sys用户下手动执行过$ORACLE_HOME/rdbms/admin/utlxplan.sql脚本建立plan_table,则升级前必须删除。否则执行完升级脚本catupgrd.sql会发现Oracle Database Packages and Types组件一直是invalid的,并且升级脚本的log中有如下错误:
遇到该错误后,删除plan_table重建也还来得及:
@?/rdbms/admin/prvtspao.plb
@?/rdbms/admin/utlrp
2.lock_sga的问题
Oracle10.2.0.4在AIX平台分配共享内存的机制有了一点变化。原来9i使用lock_sga=true是正常的,但是10.2.0.4则无法启动instance,报错:
ORA-27126: unable to lock shared memory segment in core
IBM AIX RISC System/6000 Error: 1: Not owner
看起来像是权限问题,但是即使给Oracle用户加system组也没有用。后来Oracle解释说需要给Oracle用户赋予两个capability:CAP_BYPASS_RAC_VMM和CAP_PROPAGATE,但这两个capabilities是采用大页内存时才需要设置的,这样说10.2.0.4如果lock_sga的话,默认是要采用大页内存的。当然,大页内存的使用还需要os上设置相关参数的,如果os没有设置,oracle应该还是要采用4k的内存页。
#lsuser -a capabilities oracle
oracle capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE
3.dba_segments和dba_free_space空间计算不一致的问题
SUM(BYTES)/1024/1024/1024
-------------------------
468.554688
select sum(bytes)/1024/1024/1024 from dba_free_space;
SUM(BYTES)/1024/1024/1024
-------------------------
63.3510742
select sum(bytes)/1024/1024/1024 from dba_segments;
SUM(BYTES)/1024/1024/1024
-------------------------
381.477112
显然,468.554688-63.3510742=405.203614,这比从dba_segments算出来的总占用空间381.477112大了20多G,并且这个差距在不断拉大,每天大概相差4G左右。这个问题还在跟Oracle扯皮,不知道他们是否会承认这个是bug。
MySQL命令行的几个用法
MySQL的客户端命令行工具,有很多方便使用者的特性,某些方面甚至可以说比Oracle的sqlplus更加人性化。当然从整体来说,还是sqlplus更加方便些,这么说或许是我对sqlplus更加熟悉吧。这里记录下MySQL命令行几个比较常用的特性。
1.使用\G按行垂直显示结果
如果一行很长,需要这行显示的话,看起结果来就非常的难受。在SQL语句或者命令后使用\G而不是分号结尾,可以将每一行的值垂直输出。这个可能也是大家对于MySQL最熟悉的区别于其他数据库工具的一个特性了。
*************************** 1. row ***************************
id: 1
check_day: 2008-06-26
db_name: TBDB1
arc_size: 137
arc_num: 166
per_second: 1.6
avg_time: 8.7
2.使用pager设置显示方式
如果select出来的结果集超过几个屏幕,那么前面的结果一晃而过无法看到。使用pager可以设置调用os的more或者less等显示查询结果,和在os中使用more或者less查看大文件的效果一样。
使用more
PAGER set to 'more'
mysql> \P more
PAGER set to 'more'
使用less
PAGER set to 'less'
mysql> \P less
PAGER set to 'less'
还原成stdout
PAGER set to stdout
3.使用tee保存运行结果到文件
这个类似于sqlplus的spool功能,可以将命令行中的结果保存到外部文件中。如果指定已经存在的文件,则结果会附加到文件中。
Logging to file 'output.txt'
或者
mysql> \T output.txt
Logging to file 'output.txt'
mysql> notee
Outfile disabled.
或者
mysql> \t
Outfile disabled.
4.执行OS命令
Linux
mysql> \! uname
Linux
5.执行SQL文件
+----------------+
| current_date() |
+----------------+
| 2008-06-28 |
+----------------+
1 row in set (0.00 sec)
或者
mysql> \. test.sql
+----------------+
| current_date() |
+----------------+
| 2008-06-28 |
+----------------+
1 row in set (0.00 sec)
其他还有一些功能,可以通过help或者?获得MySQL命令行支持的一些命令。
ASM如何识别磁盘
在ASM中,要创建diskgroup或者往已有的diskgroup里添加新的disk,则该disk必须已经识别,也就是要在v$asm_disk里有记录。ASM会根据asm_diskstring指定的路径去检查所有的磁盘。另外,查询v$asm_diskgroup和v$asm_disk也会导致这个识别磁盘动作的发生,所以平时最好查询v$asm_disk_stat来替代v$asm_disk。
Oracle也提供了一个工具来手工识别磁盘,就是KFOD,注意不是KFED哦。
_asm_a/llow_only_raw_disks KFOD allow only raw devices [_asm_allow_only_raw_disks=TRUE/(FALSE)]
_asm_l/ibraries ASM Libraries[_asm_libraries='lib1','lib2',...]
_asms/id ASM Instance[_asmsid=sid]
a/sm_diskstring ASM Diskstring [asm_diskstring='discoverystring', 'discoverystring' ...]
d/isks Disks to discover [disks=raw,asm,all]
g/roup Group discover [group=controlfile]
n/ohdr KFOD header suppression [nohdr=TRUE/(FALSE)]
o/p KFOD options type [OP=DISKS/GROUPS/ALL]
p/file ASM parameter file [pfile='parameterfile']
s/tatus Include disk header status [status=TRUE/(FALSE)]
v/erbose KFOD verbose errors [verbose=TRUE/(FALSE)]
可以看到KFOD使用起来还是比较简单的。一个实际执行的例子如下:
---------------------------------------------------------------
Disk Size Header Path
==========================================================
1: 1023 Mb FOREIGN /dev/raw/raw1
2: 273708 Mb MEMBER /dev/raw/raw10
3: 273708 Mb MEMBER /dev/raw/raw11
4: 273708 Mb MEMBER /dev/raw/raw12
...
--------------------------------------------------------------
ORACLE_SID ORACLE_HOME
=========================================================
+ASM4 /u01/oracle/product/10g/db
+ASM3 /u01/oracle/product/10g/db
+ASM2 /u01/oracle/product/10g/db
+ASM1 /u01/oracle/product/10g/db
Oracle数据库如何识别ASM磁盘组
假如使用ASM做为Oracle数据库的数据存储方式,那么Oracle数据库是怎么来识别ASM的diskgroup的呢,也就是数据库的instanc和ASM的instance之间是如何沟通的呢?简单的说,就是ocssd(Oracle Cluster Support Services daemon)。本文假设为Linux环境下的RAC+ASM系统。
对于ASM来说,ocssd是必须的,所以在使用dbca创建ASM Instance的时候,就会提示要先安装ocssd。如果是单机,执行$ORACLE_HOME/bin/localconfig add安装ocssd。ocssd通过inittab自动启动,在安装的时候就会在/etc/inittab中加入以下条目(rac环境):
其中,35表示在os的运行级别(runlevel)为3或者5的时候启动/etc/init.d/init.cssd
respawn表示init.cssd进程如果异常终止,则自动重新启动
ocssd进程启动后会打开一系列的文件(通过/proc/pid/fd或者lsof -a -p pid可以获得filedescriptor的信息):
消息文件
– $CRS_HOME/srvm/mesg/procus.msb
– $CRS_HOME/css/mesg/clssus.msb
– $CRS_HOME/has/mesg/clsdus.msb
日志文件
– $CRS_HOME/log/hostname/cssd/cssdOUT.log
– $CRS_HOME/log/hostname/cssd/ocssd.log
– $CRS_HOME/log/hostname/alertSID.log
OCR(Oracle Cluster Registry),本例中在裸设备上,如果是单机也可能在本地文件系统中,典型路径$ORACLE_HOME/cdata/localhost/local.ocr
– /dev/raw/raw1
– /dev/raw/raw2
以及一些socket端口
– socket:[578057]
– socket:[578062]
…
ASM instace启动以后,通过gmon进程和osccd通信,将ASM的一些信息告诉给ocssd,而数据库则从ocssd获得这些信息,也就是说,ocssd是ASM Instance和Database之间的纽带。
ASM/ocssd/database之间具体通信的步骤,可以参考这里。