OS:Rhel -5.8- 64bit
Oracle version: oracle 10g-64bit
#uname -a
Linux test 2.6.32-300.10.1.el5uek #1 SMPWed Feb 22 17:37:40 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
在使用dbca建库时包错
解决方法:注意用户为root
root@test ~]# id oracle10g
uid=610(oracle10g) gid=54321(oinstall)groups=54321(oinstall),54322(dba)
[root@test ~]# more/proc/sys/vm/hugetlb_shm_group
0
[root@test~]# echo 54322 > /proc/sys/vm/hugetlb_shm_group
[root@test ~]# more/proc/sys/vm/hugetlb_shm_group
54322
以下内容摘自:http://dotaddjj.itpub.net/post/43172/528658
ORA-27125: unable to create shared memory segment
无法分配创建共享内存段,这点开始以为是/etc/sysctl.conf中的设置问题,不过查看其实问题不在这儿。
正确的办法是修改/proc/sys/vm/hugetlb_shm_group中的记录
[root@server119 security]# id oracle
uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba)context=user_u:system_r:unconfined_t:s0
[root@server119 security]# more /proc/sys/vm/hugetlb_shm_group
0
[root@server119 security]# echo 501 > /proc/sys/vm/hugetlb_shm_group
[root@server119 security]# more /proc/sys/vm/hugetlb_shm_group
501
而后正常运行可以运行dbca建库。
摘要下Hugepage/Big page
系统进程是通过虚拟访问内存page table,那么cpu就需要将虚拟地址转换为物理内存地址ram+swap才能真正访问,cpu会缓存最近的虚拟内存地址和物理内存地址的映射关系(有点像lru list的管理),保存在由一个cpu维护的映射表中(linux在cpu申请固定大小buffer称为TLB用来管理page table),当然如果物理内存很大,越来越多的虚拟内存地址和物理地址被映射,当然对cpu检索还是会有一定的影响。
在linux环境下,内存都是以页 4kb的单位来定义的,如果要减少映射关系,需要使用大的内存页,相对来说hugepage也就是所谓的巨页内存,hugepage会一直keep在内存中,不会被交换出去,减少频繁的page in和page out,不能被其进程存占用,当使用大量物理内存的服务器时(8g下就建议使用hugepage),还是建议使用hugepage,对于oracle服务器来说,直接设置器hugepage pool等于sga即可。
可以通过如下方式查看Hugepage页的相关信息
[root@server119 security]# cat /proc/meminfo |grep Huge
HugePages_Total: 0 –Hugepage的页面数量
HugePages_Free: 0 --剩余的页面数量
HugePages_Rsvd: 0 --被分配预留但是没有使用的page数量
Hugepagesize: 2048 kB --Hugehuge的单个页面的大小
默认是没有开启Hugepage的。
Oracle 10g可以通过设置sysctl.conf的vm.nr_hugepages参数来启用hugepage,vm.nr_hugepages相当于普通页内存的参数kernel.shmall的功能。设置vm.nr_hugepages参数后重启系统。
[root@server119 security]# cat /proc/meminfo |grep Huge
HugePages_Total: 300 –Hugepage的页面数量
HugePages_Free: 20 --剩余的页面数量
HugePages_Rsvd: 0 --被分配预留但是没有使用的page数量
Hugepagesize: 2048 kB --Hugehuge的单个页面的大小
Oracle 11g由于启用amm管理,amm和hugepgae不兼容,需要先关闭
数据透视表是一个很灵活的工具,通过这个工具用户可以很容易的生成自己需要的报表。无论是对于专业的IT用户还是业务部门的用户,他们都很熟悉Excel这个工具,并且对于PowerPivot的使用方法也相当的"炉火纯青"。
传统透视表的数据来源可以是Excel工作表,也可以是分析服务中的多维数据集这两种主要的方式。相对前者由于数据是存储在Excel的工作表中,所以业务操作人员很容易上手,很适合小规模的数据统计分析。后者分析服务的多维数据集这种方式,由于数据是以一种特殊的方式聚合在独特的文件系统中,所以适合大规模的数据量分析,缺点是分析服务的开发对于IT的要求比较高,只能由IT人员完成,所以业务人员的一个需求往往会等待很长的时间才会得到响应。
那么,业务操作人员是否可以有一种高性能的去分析稍微大一点的规模的数据呢?PowerPivot就是微软提供的一个方案。在这个方案中,数据直接加载到内存当中,并且经过一定的优化,保证了通过透视表的统计有一个很高的性能。
首先,在Excel 2013之前的版本中,这个工具是需要单独下载的。如果你没有Office 2013,那么我建议你的版本不要低于2010,在这个版本之中PowerPivot的版本得以演化。
下载地址:
http://www.microsoft.com/en-us/download/details.aspx?id=29074
下载需要留意Excel对应的语言版本还有是32位版还是64位版。
还有需要注意的一个地方是,这个是PovitTable是针对 Excel 2010的第二个版本,之前还有一个版本,在微软目前的教程以及本文的介绍中缺失了部分功能。所以如果你已经先前安装了PowerPivot,请务必确认这个版本是否正确。
安装完毕后,打开Excel后,可以看到Ribbon菜单中多了一项:
使用这个工具前,需要先准备数据。你可以直接使用在 Excel工作表里面的数据,也可以使用SQLServer等其它数据源的数据。
这里假定一个销售部门的数据,已经在IT部门的数据仓库中存在了,而销售分析人员,只需要把相关的数据导入到PowerPivot中,然后通过简单的设置就可以生成自己的分析模型了。
在PowerPivot选项卡中单击PowerPoint Window,会打开PowerPivot工具:
假定IT部门已经授予了销售分析部门的数据仓库系统部分响应表的访问权限,那么这里分析人员需要做的就是把相应的表导入到PivotTable工具中。
点击上图工具栏中的From Database:
选择From SQL Server。从这里可以看到,PowerPivot支持的数据源很多,还有Access和SSAS等。
在弹出的表导入工具中,输入数据仓库所在的服务器名称和数据仓库的名称。
这里我们使用微软的示例数据库Adventure Works来做演示,关于如何获取和部署这些示例,可以参考我的这篇随笔。
设置好连接信息后,点击Next。
接下来的界面会指定如何导入数据,是通过选取表或者视图的方式,还是一个查询的方式。这里选择第一个,点Next。
在数据仓库下的所有表被列了出来。在这个界面中,可以通过Friendly Name来指定一个友好名称,然后通过Filter Details指定需要表里的哪些列。
这里假定销售人员要做Internet Sales分析,在列表里直接找到FactInternetSales表:
这张表是分析用的事实表,然后需要指定相关的维度表。
在PowerPivot有一个很赞的功能就是Selected Related Tables,选择相关表。假如在数据仓库中已经定义好了主外键关系(现在似乎很少有人愿意这么做,但我觉得定义好还是一个不错的习惯),那么在这里面会直接检测到,并且自动勾选上那些维表。点击这个按钮后,可以发现很多Dim开头的维表已经都被选中了。
实际的操作中,还是建议这里给每一个表都指定一个Friendly Name,并且做适应的Filter。但这里为了演示方便直接点Finish开始导入数据。
工具开始把数据仓库里的数据加载到PowerPivot中。完成后点击Close关闭这个界面。
然后就可以看到被导入进来的表。
在实际环境中,数据仓库里额数据是每天都在发生变化的,那么如何保持PowerPivot里的数据跟数据仓库的数据保持同步呢?
如图单击Refresh All,PowerPivot就会根据先前的连接设置重新加载这些数据。
导入完毕后,把界面切换到Diagram模式:
界面会从数据视图切换到Diagram模式(顺便说一下,Excel 的第一个PowerPivot版是没有这个Diagram功能的,这也就是为什么前边提到一定要确定是第二版):
在这个关系视图里继承了数据仓库中定义的主外键结构(熟悉SSAS的同学可以把这里理解为数据源视图的定义)。
假如实际环境中,数据仓库没有定义这部分内容,就需要自己来指定表之间的关系(这个过程对于开发SSAS的朋友来说,更像是在指定"维度用法")。而方法很简单,假如我要建立FactInternetSales表中ProductKey和DimProduct中的ProductKey列的主外键关系,只需拖拽FactInternetSales表中的ProductKey字段到DimProduct表中的ProductKey字段就可以了。
接下来指定一个层次结构。建立层次结构的好处在于,可以方便在后续的透视表操作中,方便维度属性的导航,比如对于区域维度的,从大洲到国家到省再到市,或者一个时间维度的从年到半年再到季度然后月份和天的导航。这里我们在DimDate表中定义一个年月日的层次结构导航关系。
右键DimDate表,选择Create Hierarchy:
然后,可以看到在表的后面加入了一个新"列"。
重命名这个Hierarchy的名称为DateHierarchy。
然后,一次拖拽表中的如下列到这个新建的层次中:
CalendarYear
EnglishMonthName
DayNumberOfMonth
为了显示的友好性,右键层次中的CalendarYear,选择Rename将其重命名为Year,然后依次命名其它层次为Month和Day。
基本的分析模型建立完毕之后,就可以在透视表中浏览这些数据了。
如图,在PivotTable界面中Home标签点击PivotTable然后选择其下的PivotTable。
系统会提示问透视表在新建一个工作表中还是在现有工作表的一个区域,这里选择新建。
然后,可以看到熟悉的透视表,并且这个透视表自动连接到了PowerPivot里的数据。
实际上这种模式中还有一个PowerPivot Filed List,点击上图中的Filed List:
可以看到PowerPivot的Filed List要比传统的透视表Filed List多了两个切片器。通过它们可以更明了的进行数据切片分析。
比如,要分析销售出去的产品中,各个颜色的数据以分析用户对于颜色的偏好:
拖拽DimProduct的Color到Slicers Vertial,DimDate的DateHierarchy到Ro
观察Oracle数据库性能,Oracle自带的awr 功能为我们提供了一个近乎完美的解决方案,通过awr特性我们可以随时从数据库提取awr报告。不过awrrpt.sql脚本执行时需要我们提供一些交互信息,因此可以将其整合到shell脚本中来实现自动产生指定时段的awr报告并发送给相关人员。本文即是描述linux shell脚本来实现此功能。
1、shell脚本
robin@SZDB:~/dba_scripts/custom/awr> more autoawr.sh #!/bin/bash # --------------------------------------------------------------------------+ # CHECK ALERT LOG FILE | # Filename: autoawr.sh | # Desc: | # The script use to generate AWR report and send mail automatic. | # The sql script autoawr.sql call by this shell script. | # Default, the whole day AWR report will be gathered. | # Deploy it to crontab at 23:30 | # If you want to change the snap interval,please change autoawr.sql | # and crontab configuration | # Usage: | # ./autoawr.sh $ORACLE_SID | # | # Author : Robinson | # Blog : http://blog.csdn.net/robinson_0612 | # --------------------------------------------------------------------------+ # # -------------------------- # Check SID # -------------------------- if [ -z "${1}" ];then echo "Usage: " echo " `basename $0` ORACLE_SID" exit 1 fi # ------------------------------- # Set environment here # ------------------------------ if [ -f ~/.bash_profile ]; then . ~/.bash_profile fi export ORACLE_SID=$1 export MACHINE=`hostname` export MAIL_DIR=/users/robin/dba_scripts/sendEmail-v1.56 export MAIL_LIST='Robinson.cheng@12306.com' export AWR_CMD=/users/robin/dba_scripts/custom/awr export AWR_DIR=/users/robin/dba_scripts/custom/awr/report export MAIL_FM='oracle@szdb.com' RETENTION=31 # ---------------------------------------------- # check if the database is running, if not exit # ---------------------------------------------- db_stat=`ps -ef | grep pmon_$ORACLE_SID | grep -v grep| cut -f3 -d_` if [ -z "$db_stat" ]; then #date >/tmp/db_${ORACLE_SID}_stauts.log echo " $ORACLE_SID is not available on ${MACHINE} !!!" # >>/tmp/db_${ORACLE_SID}_stauts.log MAIL_SUB=" $ORACLE_SID is not available on ${MACHINE} !!!" MAIL_BODY=" $ORACLE_SID is not available on ${MACHINE} at `date` when try to generate AWR." $MAIL_DIR/sendEmail -u $MAIL_SUB -f $MAIL_FM -t $MAIL_LIST -m $MAIL_BODY exit 1 fi; # ---------------------------------------------- # Generate awr report # ---------------------------------------------- $ORACLE_HOME/bin/sqlplus /nolog<<EOF connect / as sysdba; @${AWR_CMD}/autoawr.sql; exit; EOF status=$? if [ $status != 0 ];then echo " $ORACLE_SID is not available on ${MACHINE} !!!" # >>/tmp/db_${ORACLE_SID}_stauts.log MAIL_SUB=" Occurred error while generate AWR for ${ORACLE_SID} !!!" MAIL_BODY=" Some exceptions encountered during generate AWR report for $ORACLE_SID on `hostname`." $MAIL_DIR/sendEmail -u $MAIL_SUB -f $MAIL_FM -t $MAIL_LIST -m $MAIL_BODY exit fi # ------------------------------------------------ # Send email with AWR report # ------------------------------------------------ dt=`date -d yesterday +%Y%m%d` filename=`ls ${AWR_DIR}/${ORACLE_SID}_awrrpt_?_${dt}*` if [ -e "${filename}" ];then MAIL_SUB="AWR report from ${ORACLE_SID} on `hostname`." MAIL_BODY="This is an AWR report from ${ORACLE_SID} on `hostname`." $MAIL_DIR/sendEmail -u $MAIL_SUB -f $MAIL_FM -t $MAIL_LIST -m $MAIL_BODY -a ${filename} echo ${filename} fi # ------------------------------------------------ # Removing files older than $RETENTION parameter # ------------------------------------------------ find ${AWR_DIR} -name "*awrrpt*" -mtime +$RETENTION -exec rm {} \; exit
2、产生awr report 的sql脚本
robin@SZDB:~/dba_scripts/custom/awr> more autoawr.sql SET ECHO OFF; SET VERI OFF; SET FEEDBACK OFF; SET TERMOUT ON; SET HEADING OFF; VARIABLE rpt_options NUMBER; DEFINE no_options = 0; define ENABLE_ADDM = 8; REM according to your needs, the value can be 'text' or 'html' DEFINE report_type='html'; BEGIN :rpt_options := &no_options; END; / VARIABLE dbid NUMBER; VARIABLE inst_num NUMBER; VARIABLE bid NUMBER; VARIABLE eid NUMBER; BEGIN SELECT MIN (snap_id) INTO :bid FROM dba_hist_snapshot WHERE TO_CHAR (end_interval_time, 'yyyymmdd') = TO_CHAR (SYSDATE, 'yyyymmdd'); SELECT MAX (snap_id) INTO :eid FROM dba_hist_snapshot; SELECT dbid INTO :dbid FROM v$database; SELECT instance_number INTO :inst_num FROM v$instance; END; / COLUMN ext NEW_VALUE ext NOPRINT COLUMN fn_name NEW_VALUE fn_name NOPRINT; COLUMN lnsz NEW_VALUE lnsz NOPRINT; SELECT 'txt' ext FROM DUAL WHERE LOWER ('&report_type') = 'text'; SELECT 'html' ext FROM DUAL WHERE LOWER ('&report_type') = 'html'; SELECT 'awr_report_text' fn_name FROM DUAL WHERE LOWER ('&report_type') = 'text'; SELECT 'awr_report_html' fn_name FROM DUAL WHERE LOWER ('&report_type') = 'html'; SELECT '80' lnsz FROM DUAL WHERE LOWER ('&report_type') = 'text'; SELECT '1500' lnsz FROM DUAL WHERE LOWER ('&report_type') = 'html'; set linesize &lnsz; COLUMN report_name NEW_VALUE report_name NOPRINT; SELECT instance_name || '_awrrpt_' || instance_number || '_' || b.timestamp || '.' || '&ext' report_name FROM v$instance a, (SELECT TO_CHAR (begin_interval_time, 'yyyymmdd') timestamp FROM dba_hist_snapshot WHERE snap_id = :bid) b; SET TERMOUT OFF; SPOOL $AWR_DIR/&report_name; SELECT output FROM TABLE (DBMS_WORKLOAD_REPOSITORY.&fn_name (:dbid, :inst_num, :bid, :eid, :rpt_options)); SPOOL OFF; SET TERMOUT ON; CLEAR COLUMNS SQL; TTITLE OFF; BTITLE OFF; REPFOOTER OFF; UNDEFINE report_name UNDEFINE report_type UNDEFINE fn_name UNDEFINE lnsz UNDEFINE no_options
3、补充说明
a、shell脚本中首先判断指定的实例是否处于available,如果不可用则退出
b、接下来调用autoawr.sql脚本来产生awr report
c、产生awr report后,如果文件存在则自动发送邮件
d、autoawr.sql脚本中是产生awr report的主要部分,主要是调用了DBMS_WORKLOAD_REPOSITORY.&fn_name过程
e、该脚本是生成一整天awr report,即从当天的零点至第二天零点
f、sql脚本的几个参数需要确定的是dbid,实例号,以及snap的开始与结束id,rpt_options用于确定报告是否带addm项
g、可以根据需要定制所需的snap的起止id,需修改SQL来获取正确的snap id,来生成所需的报告
h、根据需要修改fn_name定制生成awr报告为txt或html类型,report_name则是确定最终文件名
i、AWR 报告的两个snap 之间不能有重启DB的操作,否则有可能错误(未测试过)
j、该脚本支持Oracle 10g/11g,有关详细的产生awr report脚本说明请参考oracle自带的awrrpt.sql,awrrpti.sql
更多参考:
有关Oracle RAC请参考
使用crs_setperm修改RAC资源的所有者及权限
使用crs_profile管理RAC资源配置文件
RAC 数据库的启动与关闭
再说 Oracle RAC services
Services in Oracle Database 10g
Migrate datbase from single instance to Oracle RAC
Oracle RAC 连接到指定实例
Oracle RAC 负载均衡测试(