Oracle 表连接 筛选字段执行计划不正确

问题: 表SUMM_ADV_CONSUME是分区表,发出一个查询如下
select count(*) from  dates T434858, SUMM_ADV_CONSUME T434932 where  “T434858.DATE_ID” = T434932.DATE_ID and T434858.DATE_NAME = ‘20131202’

产生的执行计划扫描很多分区表,正常情况是一个分区表。使用同样的逻辑查询,用另个筛选条件date_name2

select count(*) from  dates T434858, SUMM_ADV_CONSUME T434932 where  “T434858.DATE_ID” = T434932.DATE_ID and T434858.DATE_NAME2 = to_date(‘20131105’, ‘yyyymmdd’)
只扫描一个分区表,执行计划正确。 分析两个字段发现date_name2上有建唯一索引。 对date_name创建唯一索引也能得出正确的执行计划。

数据仓库中从mysql导数据到oracle

在数据仓库etl过程会有许多不同的数据源从dw导数据, 以mysql数据源为例分几种方法来导入:

1. 借助etl工具本身来导入

优点: 开发效率高,直接表映射
缺点:etl工具本身license, 加载数据的效率低

2. 借助oracle gateway拉取mysql内的数据

优点:开发效率高,只需配置
缺点:如果数据量比较多的话拉取有瓶颈,不会使用谓语下推操作

3. 借助NFS将mysql数据导入,然后通过sqlldr加载NFS上的数据文件

优点:加载数据快, 直接使用原生态的导出和加载
缺点:配置麻烦

Oracle expdp导出多表或表中的部分数据

环境:Oracle database 11gR2,  RHEL 5.4
导出表中的部分(query):
expdp hmt/123456 dumpfile=hmtdb20130301_hmt_log.dmp directory=hmt_dir tables = fct_hmt_log query=fct_hmt_log:'”where show_date <= 20121010″‘
注意:有单引号包含双引号
导出多个表(tables):
expdp hmt/123456 dumpfile=hmtdb20130301.dmp directory=hmt_dir tables = DATES, DIM_CITY_PROVINCE, DIM_DOMAIN_TYPE, DIM_DOMAIN_TYPE_R, DURATIONS,HOURS

Oracle gateway的下推操作–dbms_hs_passthrough

环境: CentOS 5.7 64bit,  Oracle 11gR2,  Greenplum Database 4.2.1.0,  Oracle gateway 11g
场景:greenplum内有个表大概50多万条数据,通过dblink汇总此表需要1分钟的时候(语句:select count(*) from tab1 where “date_id” = 20130108),其中过程推测是—-解析sql成gp可以执行的语句,将50万数据传输到Oracle database服务器(通过sar -n dev 1 100可知),再到oracle database汇总数据。这也是造成查询奇慢的原因。
解决方法:Oracle gateway有个包dbms_hs_passthrough,它将语句直接推送到异构数据库内执行,然后把执行的结果通过gateway传输到oracle database展现。
例:
declare
c int;
nr int;
res int;
begin
c := dbms_hs_passthrough.open_cursor@gp3;
dbms_hs_passthrough.parse@gp(c, ‘select count(*) from tab1 where date_id = 20130108’);
nr := dbms_hs_passthrough.fetch_row@gp(c);
dbms_hs_passthrough.get_value@gp(c, 1, res);
dbms_hs_passthrough.close_cursor@gp(c);
dbms_output.put_line(res);
end;
执行只需要2秒而已

ORA-03113: 通信通道的文件结尾

环境:windows xp, oracle 11gR2
问题:由于启动日志归档,所以db_recovery_file_dest目录下文件超出设定值。致使数据库挂载住,无法进入操作。关闭oracle服务后,将db_recovery_file_dest的archivelog目录的比较旧的文件删除一部分。重新启动oracle时,报错:
ORACLE 例程已经启动
Total System Global Area 1636814848 bytes
Fixed Size                  2176248 bytes
Variable Size             956304136 bytes
Database Buffers          671088640 bytes
Redo Buffers                7245824 bytes
数据库装载完毕。
ORA-03113: 通信通道的文件结尾
进程 ID: 3812
会话 ID: 125 序列号: 5
汗。。。,数据库没有做备份。
解决方法:启动数据至mount状态,进入rman target sys,
执行:
crosscheck archivelog all;
delete expired archivelog all;
然后进入sqlplus, 执行:alter database open即可。看来得采用正确的方式才能删除日志归档。

安装pyodbc

环境:Centos 5, python 2.7, greenplum, Oracle database, Oracle gateway
有一个项目使用python来将数据日志导入gp,同时还得运行oracle和gp的存储过程,由于已经使用Oracle gateway配置好了ODBC连接,故而使用Python的ODBC连接。
$unzip pyodbc-3.0.6.zip
$cd pyodbc-3.0.6
$python setup.py build
$python setup.py install
running install
running build
running build_ext
running install_lib
copying build/lib.linux-x86_64-2.7/pyodbc.so -> /usr/local/lib/python2.7/site-packages
error: /usr/local/lib/python2.7/site-packages/pyodbc.so: Permission denied
可知用户权限问题,进而
$sudo python setup.py install
python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
只好将pyodbc.so拷贝到/usr/local/lib/python2.7/site-packages目录下
$sudo cp pyodbc.so /usr/local/lib/python2.7/site-packages/
$pythonPython 2.7.3 (default, Nov 14 2012, 21:35:04)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import pyodbc
>>>
目前至些安装成功

Oracle 11gR2 RAC SCAN ORA-12543: TNS:destination host unreachable

环境: Oracle 11gR2 RAC,  CentOS 5.6

通过SCAN访问RAC database, 不时出现ORA-12543: TNS:destination host unreachable,经查只有一个scan listener可以访问。
[oracle@rac7 ~]$ srvctl config scan
SCAN name: rac-scan, Network: 1/192.168.56.0/255.255.255.0/eth0
SCAN VIP name: scan1, IP: /192.168.56.10/192.168.56.10
然而
[root@rac7 ~]# vi /var/named/localdomain.zone

$TTL    86400
@       IN SOA  localhost root.localhost (
42              ; serial (d. adams)
3H              ; refresh
15M             ; retry
1W              ; expiry
1D )            ; minimum
IN NS           localhost
localhost       IN A            127.0.0.1
rac5            IN A    192.168.56.248
rac7            IN A    192.168.56.247
rac5-priv       IN A    192.168.56.5
rac7-priv       IN A    192.168.56.7
rac5-vip        IN A    192.168.56.105
rac7-vip        IN A    192.168.56.107
rac-scan        IN A    192.168.56.10
rac-scan        IN A    192.168.56.11
rac-scan        IN A    192.168.56.12
有三个scan ip地址

更改操作如下:

srvctl stop scan_listener
srvctl stop scan
切换到root用户
/u01/app/grid/bin/srvctl modify scan -n rac-scan
/u01/app/grid/bin/srvctl config scan 
/u01/app/grid/bin/srvctl modify scan_listener -u
/u01/app/grid/bin/srvctl config scan_listener
/u01/app/grid/bin/srvctl srvctl start scan_listener
再切换到oracle用户
srvctl status scan
srvctl status scan_listener

测试 sqlplus system/oracle@RAC-SCAN:1521/racdb.localdomain
然后多次查看select instance_name from v$instance;
可知instance_name会变化。

Oracle 无效的月份

环境:oracle 11g, Windows XP

在进行select to_date(‘2011-May-20’, ‘yyyy-mon-dd’) from dual查询时,系统提示not a valid month。由于系统是中文环境,因而在需要在命令环境中输入 alter session set  nls_date_language = ‘American’用于改变会话的日期格式。

Oracle exp只导出部分数据

环境: windows server 2008, Oracle 11g

从生产环境下导出一个用户下的所有表放置到另外一测试环境中,结果发现只能导出部分表,后来发现这些未能导出表为空表。原来oracle database 11g表中无数据不分配segment。只能为其分配空间, 执行如下:select ‘alter table ‘ || table_name || ‘ allocate extent (size 10k);’ from user_tables where row_nums = 0; 再将这些语句执行即可导出这些空表。

使用TPC-H生成大量数据

环境: REHL 5,  tpch

TPC-H 基准测试是由 TPC-D发展而来的。TPC-H 用 3NF 实现了一个数据仓库, 用于商业智能计算测试。可从http://www.tpc.org/tpch/中下载tpch_2_14_0.zip  ,放入Linux 环境目录下。解压缩unzip tpch_2_14_0.zip, 在生成的文件 cp makefile.suite makefile , 编辑vi makefile

################
CC      = gcc
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
#                                  SQLSERVER, SYBASE, ORACLE
# Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS,
#                                  SGI, SUN, U2200, VMS, LINUX, WIN32
# Current values for WORKLOAD are:  TPCH
DATABASE= ORACLE
MACHINE = LINUX
WORKLOAD = TPCH

注:这里要设置CC, DATABASE, MACHINE, WORKLOAD这四个变量

然后编译(make)并生成可执行文件(dbgen) 。

生成1G的数据:

./dbgen -vf -s 1

查看生成的数据: ls -l *tbl

还有表定义文件是该目录下的dss.dll文件