使用Oracle9i的新特性Flashback Query恢復誤刪除數據
作者:
eygle |
English Version
鏈接:
http://www.eygle.com/archives/2005/06/eoaoracle9iaeai.html
下午接到研發工程師的電話,說誤刪除了部分重要數據,并且已經提交,需要恢復。
登陸到數據庫上查看,由于是Oracle9iR2,首先嘗試使用flashback query閃回數據。
首先確認數據庫的SCN變化:
SQL> col fscn for 9999999999999999999
SQL> col nscn for 9999999999999999999
SQL> select name,FIRST_CHANGE# fscn,NEXT_CHANGE# nscn,FIRST_TIME from v$archived_log;
...................
NAME FSCN NSCN FIRST_TIME
------------------------------ -------------------- -------------------- -------------------
/mwarch/oracle/1_52413.dbf 12929941968 12929942881 2005-06-22 14:38:28
/mwarch/oracle/1_52414.dbf 12929942881 12929943706 2005-06-22 14:38:32
/mwarch/oracle/1_52415.dbf 12929943706 12929944623 2005-06-22 14:38:35
/mwarch/oracle/1_52416.dbf 12929944623 12929945392 2005-06-22 14:38:38
/mwarch/oracle/1_52417.dbf 12929945392 12929945888 2005-06-22 14:38:41
/mwarch/oracle/1_52418.dbf 12929945888 12929945965 2005-06-22 14:38:44
/mwarch/oracle/1_52419.dbf 12929945965 12929948945 2005-06-22 14:38:45
/mwarch/oracle/1_52420.dbf 12929948945 12929949904 2005-06-22 14:46:05
/mwarch/oracle/1_52421.dbf 12929949904 12929950854 2005-06-22 14:46:08
/mwarch/oracle/1_52422.dbf 12929950854 12929951751 2005-06-22 14:46:11
/mwarch/oracle/1_52423.dbf 12929951751 12929952587 2005-06-22 14:46:14
...................
/mwarch/oracle/1_52498.dbf 12930138975 12930139212 2005-06-22 15:55:57
/mwarch/oracle/1_52499.dbf 12930139212 12930139446 2005-06-22 15:55:59
/mwarch/oracle/1_52500.dbf 12930139446 12930139682 2005-06-22 15:56:00
NAME FSCN NSCN FIRST_TIME
------------------------------ -------------------- -------------------- -------------------
/mwarch/oracle/1_52501.dbf 12930139682 12930139915 2005-06-22 15:56:02
/mwarch/oracle/1_52502.dbf 12930139915 12930140149 2005-06-22 15:56:03
/mwarch/oracle/1_52503.dbf 12930140149 12930140379 2005-06-22 15:56:05
/mwarch/oracle/1_52504.dbf 12930140379 12930140610 2005-06-22 15:56:05
/mwarch/oracle/1_52505.dbf 12930140610 12930140845 2005-06-22 15:56:07
14811 rows selected.
|
當前的SCN為:
SQL> select dbms_flashback.get_system_change_number fscn from dual;
FSCN
--------------------
12930142214
|
使用應用用戶嘗試閃回
SQL> connect username/password
Connected.
|
現有數據:
SQL> select count(*) from hs_passport;
COUNT(*)
----------
851998
|
創建恢復表
SQL> create table hs_passport_recov as select * from hs_passport where 1=0;
Table created.
|
選擇SCN向前恢復
SQL> select count(*) from hs_passport as of scn 12929970422;
COUNT(*)
----------
861686
|
嘗試多個SCN,獲取最佳值(如果能得知具體時間,那么可以獲得準確的數據閃回)
SQL> select count(*) from hs_passport as of scn &scn;
Enter value for scn: 12929941968
old 1: select count(*) from hs_passport as of scn &scn
new 1: select count(*) from hs_passport as of scn 12929941968
COUNT(*)
----------
861684
SQL> /
Enter value for scn: 12927633776
old 1: select count(*) from hs_passport as of scn &scn
new 1: select count(*) from hs_passport as of scn 12927633776
select count(*) from hs_passport as of scn 12927633776
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
SQL> /
Enter value for scn: 12929928784
old 1: select count(*) from hs_passport as of scn &scn
new 1: select count(*) from hs_passport as of scn 12929928784
COUNT(*)
----------
825110
SQL> /
Enter value for scn: 12928000000
old 1: select count(*) from hs_passport as of scn &scn
new 1: select count(*) from hs_passport as of scn 12928000000
select count(*) from hs_passport as of scn 12928000000
*
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
|
最后選擇恢復到SCN為12929941968的時間點
SQL> insert into hs_passport_recov select * from hs_passport as of scn 12929941968;
861684 rows created.
SQL> commit;
Commit complete.
|
研發人員確認,已經可以滿足需要,找回誤刪除部分數據,至此閃回恢復成功完成。
自定義file類型input框樣式的方法 |
在WEB上傳文件時,要用到上傳框:
<input type="file" id="f" name="f">
這東東在IE(其他偶沒經過測試)中是一個非常特殊的對象。
如果是您手動寫入的或其他對象經過某些事件觸發填入的值
由于安全問題,在進行提交表單時,往往會被清空,所以上傳失敗。
簡單點說,除非你的鼠標親自點到了上傳框f上,IE才會給你上傳文件!
哪怕你將 f 的onclick句柄賦給某個對象,如:
<input type="file" id="f" name="f">
<input onclick="f.click()" value="點擊">
你 “點擊” 后,同樣會彈出文件選擇對話框,可惜失望地:你照樣不能上傳文件!
怎么辦呢?
看下這段:
<BODY onmousemove="f.style.pixelLeft=event.x-200;f.style.pixelTop=event.y-10;">
<input type="text"><input type="button" onmousemove="">
<input type="file" id="f" name="f" style="position:absolute;">
</BODY>
隨便點擊鼠標,看到效果了吧?
基于上面的思路,偶們就可以把它弄到一個button下面就OK了!!
<style>
input{border:1px solid green;}
</style>
<BODY>
<BR><BR><BR>
<form method="post" action="" enctype="multipart/form-data">
<input type="text" id="txt" name="txt">
<input type="button" onmousemove="f.style.pixelLeft=event.x-60;f.style.pixelTop=this.offsetTop;" value="請選擇文件" size="30">
<input type="file" id="f" name="f" style="position:absolute;" size="1" onChange="txt.value=this.value"><BR>
<INPUT TYPE="submit">
</form>
</BODY>
為了達到真正模擬的效果,還得要把f給隱藏,加個不透明的alpha 濾鏡即可,再加上 hidefocus 屬性,隱藏f的虛線:
<style>
input{border:1px solid green;}
</style>
<BODY>
<BR><BR><BR>
<form method="post" action="" enctype="multipart/form-data">
<input type="text" id="txt" name="txt">
<input type="button" onmousemove="f.style.pixelLeft=event.x-60;f.style.pixelTop=this.offsetTop;" value="請選擇文件" size="30" onclick="f.click()">
<input type="file" id="f" onchange="txt.value=this.value" name="f" style="position:absolute;filter:alpha(opacity=0);" size="1" hidefocus><BR>
<INPUT TYPE="submit">
</form>
</BODY>
可以看下opacity=0改為稍大些的效果。
OK了,現在你就可以控制它們的樣式、位置了。。。
|
商業智能平臺研究 (十) ETL 選型
ETL (Extract-Transform-Load的縮寫,即數據抽取、轉換、裝載的過程)作為BI/DW(Business Intelligence)的核心和靈魂,能夠按照統一的規則集成并提高數據的價值,是負責完成數據從數據源向目標數據倉庫轉化的過程,是實施數據倉庫的重要步驟。如果說數據倉庫的模型設計是一座大廈的設計藍圖,數據是磚瓦的話,那么ETL就是建設大廈的過程。在整個項目中最難部分是用戶需求分析和模型設計,而ETL規則設計和實施則是工作量最大的,約占整個項目的60%~80%,這是國內外從眾多實踐中得到的普遍共識。
ETL工具從廠商來分為兩種,一種是數據庫廠商自帶的ETL工具,Oracle warehouse builder 就是這種,另外一種是第三方工具提供商.開源世界也有一大票的ETL工具,功能各異,強弱不一,你可以從一下地址找到開源ETL工具的列表 http://www.manageability.org/blog/stuff/open-source-etl/view , 提醒一句,選用工具的時候要慎重,真的,千萬要慎重,不管你是選用商業的ETL工具(一般比較貴),還是開源的工具,都要在你充分了解產品的特性才去選擇,千萬不要聽某某人說什么這個工具好,就購買了那個工具,一定要自己了解產品.
開源的ETL工具的列表 (排名是亂排的)
kettle http://kettle.pentaho.org/ ,pentaho官方的ETL工具,是一個metadata-driven 的ETL工具,不需要自己寫code .
talend http://www.talend.com/ talend是talend自己公司的產品,宣傳的是全功能的Data Integration 解決方案,基于eclipse 平臺,包括很多的模塊來實現商業流程建模,數據流程建模,最后輸出的是perl 和 Java code
jasperETL http://www.jaspersoft.com/ JasperETL是基于talend的平臺,不太清楚有什么區別,jaspersoft開發的ETL產品.
Octopus http://www.enhydra.org/tech/octopus/index.html octopuc是enhydra 的一個ETL工具,enhydra是一個產品跨度非常大的開源站點,它有個開源的Workflow ,Shark ,pentaho就是使用的這個Workflow ,這個組織從workflow 到application server , 從ETL工具到application framework ,還有一些其他的中間件,octopus非常的原始,支持任何的JDBC數據源,用XML語言來定義的.也支持JDBC-DOBC ,和excel 和 access ,csv-files, XML files ,用Ant 和 JUnit 來創建表和測試.
CloverETL http://cloveretl.berlios.de/ CloverETL是提供給你一組API,用XML來定義ETL過程,同樣支持JDBC數據源, CloverETL是開源的,但是它是沒有圖形界面的,它提供一個有圖形界面的CloverGUI 來進行ETL的圖形化開發過程,但是不是開源的,需要購買商業許可證.
KETL http://www.ketl.org/ 聽說是幾個前IBM員工做出來的ETL產品,
另外還有很多.不一一寫介紹了,只列個表吧,
Joost http://joost.sourceforge.net/ 最近有個web2.0 網站也叫Joost,名字相同而已.
Xineo http://software.xineo.net/xil.jspx
BabelDoc http://sourceforge.net/projects/babeldoc
CB2XML http://sourceforge.net/projects/cb2xml
mec-eagle http://sourceforge.net/projects/mec-eagle/
Transmorpher http://transmorpher.inrialpes.fr/
XPipe http://xpipe.sourceforge.net/Articles/Miscellaneous/fog0000000018.html
DataSift http://www.datasift.org/
Xephyrus Flume http://www.xephyrus.com/flume/flume-intro.Prlx
Smallx https://smallx.dev.java.net/
Nux http://dsd.lbl.gov/nux/index.html
Netflux http://www.netflux.org/
OpenDigger https://opendigger.dev.java.net/
ServingXML http://servingxml.sourceforge.net/
Scriptella http://scriptella.javaforge.com/
ETL Integrator http://www.glassfishwiki.org/jbiwiki/Wiki.jsp?page=ETLSE
Jitterbit http://www.jitterbit.com/
Apatar http://www.apatar.com/
Spring Batch http://static.springframework.org/spring-batch/
大多數站點都是在sf.net上的.其中最后一個是Spring的,大名鼎鼎的Spring 也往ETL插一腳.實在是..........
根據talend官方介紹的數據,ETL工具的市場份額在2006好像是有160多億美元.由于BI項目的成功,ETL的這一市場份額還會擴大,這也不難理解,為什么這么多的公司都在做ETL工具了.開源世界也免不了想要分一杯羹.再次廢話一句,開源的東西你可以免費得到和使用,但是當你想應用到企業級開發的時候,省錢可不是唯一應該考慮的因素.還是那句話,慎重呀慎重.
下一篇介紹BI的基本概念.
開源BI系統簡述
1. 概述
開源的BI項目在在2005年之前并沒有太大的發展,到了2005年才開始呈現繁榮之勢,并在2006年蓬勃發展。這些眾多的BI項目從規模和對BI系統支撐的完善程度上來說,大體可以分為Framework、Stand-alone Tools和BI Suit三種類型。
l Framework
開源框架,這是在商業BI系統中所沒有的。我們可以使用它們來構建自己的BI工具,或者增強和擴展我們的BI解決方案。
l Stand-alone Tools
獨立的BI工具,這是開源項目中數量最多的一類。很多工具只側重BI系統中的某個環節和方面,如ETL、Report、OLAP和Database等等。
l BI Suit
在統一的架構下提供了多種BI系統的特性的工具集合。就目前的情況看,不管是商業軟件還是開源軟件,還沒有任何一個套件提供了完整的端到端的BI解決方案。這些開源的BI Suit是通過連接多個其他的組件和工具的方式形成套件的,由于BI系統涉及到的工具是非常多的,所以整合一套完整的BI解決方案是很困難的。
一個完整的BI解決方案中有多種工具來完成BI系統中各個階段的工作。
數據抽取、轉換和加載工具。優秀的ETL工具應該具有以下特性:
1、 Workflow Management, Job Execution and Scheduling Manager。能方便地定義流程并自動化執行ETL任務。
2、 Centralized Metadata Repository and Management。集中存儲和管理符合業界標準的元數據。
3、 Data Profile and Validation。可以檢驗數據的質量。
4、 High Performance。在大負荷的任務執行中仍然有良好的性能。
5、 Scalable, Platform Independent。具有良好的彈性,支持多種操作系統和數據庫系統,能操作多種異構的數據源。
6、 Open Architecture and API。具有開放的架構和易于使用的二次開發接口。
目前較為知名的開源ETL工具有:
1、 KETL,由具有IBM和KPMG背景的Kinetic Networks公司開發,現在已經有三年多的產品應用歷史,成功應用于一些產品中,在點擊流(ClickStream)分析應用中表現出色。KETL采用Plug-in的架構,使用Java開發。
2、 KETTLE,為一個元數據驅動的ETL工具。已經加入Pentaho。
3、 Clover ETL,為一個基于Java的ETL Framework,可以用來開發自己的ETL應用。
4、 Enhydra Octopus,為一個基于Java的ETL工具,使用JDBC來連接各種數據源,易于使用和部署。曾有人應用于電信網絡資源分析系統中。
優秀的報表工具通常具有以下特性:
1、 支持多種數據源。
2、 直觀的可視化設計器,簡單易用的報表定制功能。
3、 方便的數據訪問和格式化,豐富的數據呈現方式。
4、 符合數據呈現的通用標準,能和應用程序很好地進行結合。
5、 易于擴展和部署。
目前較為知名的開源報表工具有:
1、 JasperReports,一個優秀的Java報表工具,始于2001,現在JasperSoft公司持續開發和支持該工具。該工具類似于商業軟件Crystal Report,支持PDF、HTML、XLS、CSV和XML文件輸出格式,現在是Java開發者最常用的報表工具。
2、 OpenReports,提供基于web的靈活報表解決方案,通過瀏覽器自動生成動態PDF,XLS,HTMLCSV 和Chart報表,它是用Java開發的,使用JasperReports 作為報表引擎,利用到的開源技術有Hibernate,Veloctiy,Webwork。
3、 JFreeReport,現在是Pentaho的一部分,它是一個優秀的用來生成報表的Java類庫。它為Java應用程序提供一個靈活的打印 功能并支持輸出到打印機和PDF, Excel, HTML和XHTML, PlainText, XML和CSV文件中。
4、 Eclipse BIRT,是Eclipse下面的一個企業智能和報表 工具,能為J2EE的WEB應用程序創建漂亮醒目的PDF或者HTML格式的報表,它提供了核心的報表功能。
聯機分析處理工具。目前開源的OLAP工具也分為MOLAP、ROLAP和HOLAP,優秀的OLAP工具通常有以下特性:
1、 良好的執行性能,能快速地進行分析處理工作。
2、 良好的適用性和可伸縮性。
3、 開放式接口和豐富的API。
目前較為知名的開源OLAP工具有:
1、 Mondrian,是Pentaho的一部分,為一個用Java開發的OLAP服務器,實現了MDX語言、XML解析和JOLAP規范,可以不寫SQL就能分析存儲于SQL 數據庫的龐大數據集,可以封裝JDBC數據源并把數據以多維的方式展現出來。
2、 JPivot,是一個JSP 自定制的標簽庫,可以繪制一個OLAP表格和圖表。用戶可以執行 典型的OLAP導航,如下鉆,切片和方塊。它使用Mondrian 作為其OLAP服務器。它使用WCF (Web Component Framework) ,基于XML/XSLT來渲染Web UI組件。JPivot在元數據緩存方面的過于簡化的整體性初始化裝載的做法將限制它只能處理很小的立方體(Cube)。
開源的數據庫也有很多,大多數為關系型數據庫,少數為應用于數據倉庫環境做了專門的優化工作。Bizgres以PostgreSQL為基礎進行了數據倉庫環境下的優化,提高了分析查詢性能。
下面列出相對成熟和完整,并且有借鑒意義的開源BI套件。
為GreenPlum公司主導的開源項目,和Sun公司達成合作關系。Bizgres為BI應用而對PostgreSQL做了優化,提高了大負荷的并行計算能力,在BI環境中,相對于普通的關系型數據庫具有卓越的數據處理性能。Bizgres的數據庫平臺可以和KETL和JasperReports進行整合,從而形成一個BI套件:
1、 數據庫:BI專業數據庫Bizgres,或者大型應用中的高性能服務器Bizgres MPP,能比普通關系數據庫快20倍
2、 ETL工具:KETL
3、 報表工具:JasperReports
是一個Java開發的Web應用,能對OLAP服務器、關系數據庫和數據挖掘服務器進行分析和報表展示,非常易于使用和部署,界面美觀友好,后續還將支持數據挖掘和ETL等。Openi主要包括:
1、 OLAP展示:JPivot
2、 報表工具:JFreeChart
3、 分析數據源連接器
是一個以工作流為核心的、強調面向解決方案而非工具組件的BI套件,整合了多個開源項目,目標是和商業BI相抗衡。它包括:
1、 工作流引擎:Shark and JaWE
2、 數據庫:Firebird RDBMS
3、 集成管理和開發環境:Eclipse
4、 報表工具:Eclipse BIRT
5、 ETL工具:Enhydra/Kettle
6、 OLAP Server:Mondrian
7、 OLAP展示:JPivot
8、 數據挖掘組件:Weka
9、 應用服務器和Portal服務器:JBoss
10、 單點登陸服務及LDap認證:JOSSO
11、 自定義腳本支持:Mozilla Rhino Javascript腳本處理器
由上可見Pentaho是一個很完善的BI解決方案。Pentaho偏向于與業務流程相結合的BI解決方案,側重于大中型企業應用。
SpagoBI 集成了Mondrain和JProvit,能夠通過OpenLaszlo產生實時報表。SpagoBI使用java開發,不依賴于具體的操作系統,有很強的擴展能力。它主要包括:
1、 報表工具:JasperReports /Eclipse BIRT/ iReport
2、 OLAP Server:Mondrian
3、 OLAP展示:JPivot
4、 數據挖掘組件:Weka
5、 Map引擎:Geo
6、 ETL:BIE
7、 搜索引擎:Lucene
8、 Dashboard:OpenLaszlo
9、 Portal Server:JBoss/ Tomcat/ JOnAS
根據其Roadmap可以看出,SpagoBI將融入更多的BI功能,甚至BI之外的功能。
如何收縮數據文件的大小?
下面這個實驗用于描述如何通過move tablespace來完成resize datafile。
HWM的概念就不在此闡述了。
測試環境為Oracle10g for Linux,其它版本的一樣。
我們先創建兩個表空間,分別為t_tbs和t_tbs1,分別有一個數據文件,大小都是5M
再創建一個test_user用戶,給這個用戶上述兩個表空間的無限限額,并且設置默認表空間是t_tbs。
[zhangleyi@as zhangleyi]$ sqlplus / as sysdba
SQL*Plus: Release 10.1.0.2.0 - Production on Tue Apr 13 21:01:25 2004
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
SYS at orcl10>alter user test_user default tablespace t_tbs;
User altered.
SYS at orcl10>alter user test_user quota unlimited on t_tbs;
User altered.
SYS at orcl10>alter user test_user quota unlimited on t_tbs1;
User altered
用test_user登錄,創建表
TEST_USER at orcl10>create table t_obj as select * from dba_objects where rownum<10000;
Table created.
TEST_USER at orcl10>insert into t_obj select * from t_obj;
9999 rows created.
TEST_USER at orcl10>/
19998 rows created.
TEST_USER at orcl10>/
insert into t_obj select * from t_obj
*
ERROR at line 1:
ORA-01653: unable to extend table TEST_USER.T_OBJ by 128 in tablespace T_TBS
TEST_USER at orcl10>commit;
Commit complete.
TEST_USER at orcl10>select sum(blocks) "Total Blocks",sum(bytes) "Total Size" from dba_extents where owner='TEST_USER' and segment_name='T_OBJ';
Total Blocks Total Size
------------ ----------
512 4194304
好,上面我們創建了一個表,并且插入了很多數據,通過dba_extents視圖我們可以看到總共用的block熟和總共的大小。
下面我們用delete刪除全部數據,并且插入新的9999條數據
TEST_USER at orcl10>delete from t_obj;
39996 rows deleted.
TEST_USER at orcl10>insert into t_obj select * from dba_objects where rownum<10000;
9999 rows created.
TEST_USER at orcl10>commit;
Commit complete.
TEST_USER at orcl10>select sum(blocks) "Total Blocks",sum(bytes) "Total Size" from dba_extents
2 where owner='TEST_USER' and segment_name='T_OBJ';
Total Blocks Total Size
------------ ----------
512 4194304
再次查看dba_extents視圖,發現占用的空間并沒有減少。
我們嘗試resize這個數據文件,file#為6的是t_tbs表空間下面的數據文件
SYS at orcl10>alter database datafile 6 resize 4M;
alter database datafile 6 resize 4M
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
SYS at orcl10>alter database datafile 6 resize 4500000;
Database altered.
我們發現想resize到4M不可以,但是resize到4500000就可以了,因為上面查看出來的Total Size是4194304,這個值大于4M而小于4500000。
然后我們move這張表到t_tbs1表空間,這個表空間下面的數據文件file#是8
EST_USER at orcl10>alter table t_obj move tablespace t_tbs1;
Table altered.
TEST_USER at orcl10>select sum(blocks) "Total Blocks",sum(bytes) "Total Size" from dba_extents
2 where owner='TEST_USER' and segment_name='T_OBJ';
Total Blocks Total Size
------------ ----------
128 1048576
我們檢查dba_extents視圖,發現Total Size已經變化了,此時已經可以說明move表是會重新進行block的整理的,同時也重置了HWM。
下面我們resize這個數據文件。
SYS at orcl10>alter database datafile 8 resize 2M;
Database altered.
SYS at orcl10>host
[zhangleyi@as ORCL10]$ cd /oracle/oradata/ORCL10/datafile/
[zhangleyi@as datafile]$ ls -l
總用量 1419076
-rw-r----- 1 zhangleyi dba 20979712 4月 13 21:17 cattbs01.dbf
-rw-r----- 1 zhangleyi dba 157294592 4月 13 21:17 o1_mf_example_02p0gpoj_.dbf
-rw-r----- 1 zhangleyi dba 419438592 4月 13 21:20 o1_mf_sysaux_02p09kny_.dbf
-rw-r----- 1 zhangleyi dba 555753472 4月 13 21:17 o1_mf_system_02p09kno_.dbf
-rw-r----- 1 zhangleyi dba 20979712 4月 13 21:02 o1_mf_temp_02p0fzsd_.tmp
-rw-r----- 1 zhangleyi dba 62922752 4月 13 21:20 o1_mf_undotbs1_02p09kog_.dbf
-rw-r----- 1 zhangleyi dba 209723392 4月 13 21:17 o1_mf_users_02p09kqv_.dbf
-rw-r----- 1 zhangleyi dba 2105344 4月 13 21:21 TEST01.DBF(這是file#8)
-rw-r----- 1 zhangleyi dba 4513792 4月 13 21:20 test.dbf(這是file#6)
可以看到我們的目的已經達到了。
在真實應用中,我們可以將一個表空間中的所有object,全部move到一個新的表空間中,然后drop掉原來的表空間,再從磁盤上刪除原來表空間中的數據文件。
至于如何得知HWM,我們可以通過analyze之后的數據字典得到,那么如果不進行analyze的話,我們也可以運行下面這個腳本。
這個腳本可以用于檢查一個object占有的總共block數和處于HWM之上的block數,這當然也就知道了HWM是在什么位置。
DECLARE
v_total_blocks NUMBER;
v_total_bytes NUMBER;
v_unused_blocks NUMBER;
v_unused_bytes NUMBER;
v_last_used_extent_file_id NUMBER;
v_last_used_extent_block_id NUMBER;
v_last_used_block NUMBER;
BEGIN
dbms_space.unused_space('SCOTT','BIGEMP','TABLE',v_total_blocks,v_total_bytes,v_unused_blocks,v_unused_bytes,v_last_used_extent_file_id,v_last_used_extent_block_id,v_last_used_block);
dbms_output.put_line('Total Blocks: '||TO_CHAR(v_total_blocks));
dbms_output.put_line('Blocks above HWM: '||TO_CHAR(v_unused_blocks));
END;
/
Total Blocks: 256
Blocks above HWM: 0
PL/SQL procedure successfully completed
Executed in 0.01 seconds
我們都知道“瞎子摸象”的故事。不同的瞎子對大象的認識不同,因為他們只認識了自己摸到的地方。而企業如果要避免重犯這樣的錯誤,那就離不開商務智能(BI)。專家認為,BI對于企業的重要性就像聰明才智對于個人的重要性。歐美企業的經驗也證明,企業避免無知和一知半解危險的有效手段就是商務智能。商務智能旨在充分利用企業在日常經營過程中收集的大量數據和資料,并將它們轉化為信息和知識來免除各種無知狀態和瞎猜行為。
支持BI的開源工具數量眾多,但是大多數的工具都是偏重某方面的。例如,CloverETL偏重ETL,JPivot偏重多維分析展現,Mondrian是OLAP服務器。而Bee、Pentaho和SpagoBI等項目則針對商務智能問題提供了完整的解決方案。
ETL 工具
ETL開源工具主要包括CloverETL和Octupus等。
(1)CloverETL是一個Java的ETL框架,用來轉換結構化的數據,支持多種字符集之間的轉換(如ASCII、UTF-8和ISO-8859-1等);支持JDBC,同時支持dBase和FoxPro數據文件;支持基于XML的轉換描述。
(2)Octupus是一個基于Java的ETL工具,它也支持JDBC數據源和基于XML的轉換定義。Octupus提供通用的方法進行數據轉換,用戶可以通過實現轉換接口或者使用Jscript代碼來定義轉換流程。
OLAP服務器
(1)Lemur主要面向HOLAP,雖然采用C++編寫,但是可以被其他語言的程序所調用。Lemur支持基本的操作,如切片、切塊和旋轉等基本操作。
(2)Mondrian面向ROLAP包含4層:表示層、計算層、聚集層、存儲層。
● 表示層:指最終呈現在用戶顯示器上的以及與用戶之間的交互,有許多方法來展現多維數據,包括數據透視表、餅、柱、線狀圖。
● 計算層:分析、驗證、執行MDX查詢。
● 聚集層:一個聚集指內存中一組計算值(cell),這些值通過維列來限制。計算層發送單元請求,如果請求不在緩存中,或者不能通過旋轉聚集導出的話,那么聚集層向存儲層發送請求。聚合層是一個數據緩沖層,從數據庫來的單元數據,聚合后提供給計算層。聚合層的主要作用是提高系統的性能。
● 存儲層:提供聚集單元數據和維表的成員。包括三種需要存儲的數據,分別是事實數據、聚集和維。
OLAP客戶端
JPivot是JSP風格的標簽庫,用來支持OLAP表,使用戶可以執行典型的OLAP操作,如切片、切塊、上鉆、下鉆等。JPivot使用Mondrian服務器,分析結果可以導出為Excel或PDF文件格式。
數據庫管理系統
主要的開源工具包括MonetDB、MySQL、MaxDB和PostgreSQL等。這些數據庫都被設計用來支持BI環境。MySQL、MaxDB和PostgreSQL均支持單向的數據復制。BizGres項目的目的在于使PostgreSQL成為數據倉庫和 BI的開源標準。BizGres為BI環境構建專用的完整數據庫平臺。
完整的BI開源解決方案
1.Pentaho 公司的Pentaho BI 平臺
它是一個以流程為中心的、面向解決方案的框架,具有商務智能組件。BI 平臺是以流程為中心的,其中樞控制器是一個工作流引擎。工作流引擎使用流程定義來定義在 BI 平臺上執行的商務智能流程。流程可以很容易被定制,也可以添加新的流程。BI 平臺包含組件和報表,用以分析這些流程的性能。BI 平臺是面向解決方案的,平臺的操作是定義在流程定義和指定每個活動的 action 文檔里。這些流程和操作共同定義了一個商務智能問題的解決方案。這個 BI 解決方案可以很容易地集成到平臺外部的商業流程。一個解決方案的定義可以包含任意數量的流程和操作。
BI平臺包括一個 BI 框架、BI 組件、一個 BI 工作臺和桌面收件箱。BI 工作臺是一套設計和管理工具,集成到Eclipse環境。這些工具允許商業分析人員或開發人員創建報表、儀表盤、分析模型、商業規則和 BI 流程。Pentaho BI 平臺構建于服務器、引擎和組件的基礎之上,包括J2EE 服務器、安全與權限控制、portal、工作流、規則引擎、圖表、協作、內容管理、數據集成、多維分析和系統建模等功能。這些組件的大部分是基于標準的,可使用其他產品替換之。
2.ObjectWeb
該項目近日發布了SpagoBi 1.8版本。SpagoBi 是一款基于Mondrain+JProvit的BI方案,能夠通過OpenLaszlo產生實時報表,為商務智能項目提供了一個完整開源的解決方案,它涵蓋了一個BI系統所有方面的功能,包括:數據挖掘、查詢、分析、報告、Dashboard儀表板等等。SpagoBI使用核心系統與功能模塊集成的架構,這樣在確保平臺穩定性與協調性的基礎上又保證了系統具有很強的擴展能力。用戶無需使用SpagoBI的所有模塊,而是可以只利用其中的一些模塊。
SpagoBI使用了許多已有的開源軟件,如Spago和Spagosi等。因此,SpagoBI集成了 Spago的特征和技術特點,使用它們管理商務智能對象,如報表、OLAP分析、儀表盤、記分卡以及數據挖掘模型等。SpagoBI支持BI系統的監控管理,包括商務智能對象的控制、校驗、認證和分配流程。SpagoBI采用Portalet技術將所有的BI對象發布到終端用戶,因此BI對象就可以集成到為特定的企業需求而已經選擇好的Portal系統中去。
3.Bee項目
該項目是一套支持商務智能項目實施的工具套件,包括ETL工具和OLAP 服務器。Bee的ETL工具使用基于Perl的BEI,通過界面描述流程,以XML形式進行存儲。用戶必須對轉換過程進行編碼。Bee的ROLAP 服務器保證多通SQL 生成和強有力的高速緩存管理(使用MySQL數據庫管理系統)。ROLAP服務器通過SOAP應用接口提供豐富的客戶應用。Web Portal作為主要的用戶接口,通過Web瀏覽器進行報表設計、展示和管理控制,分析結果可以以Excel、PDF、PNG、PowerPoint、 text和XML等多種形式導出。
Bee項目的特點在于:
● 簡單快捷的數據訪問;
● 支持預先定義報表和實時查詢;
● 通過拖拽方式輕松實現報表定制;
● 完整報表的輕松控制;
● 以表和圖進行高質量的數據展示。
/*
*標 題: Sybase IQ for Data Warehouse 培訓總結(二)
*作 者: xuwedo
*文章屬性: 原創
*時 間: 2007-03-11
*來 源: http://blog.csdn.net/xuwedo2003/
*鏈 接: http://blog.csdn.net/xuwedo2003/
* Copyright (c) 2007
* All rights reserved.
* 如有轉載,請注明作者及本信息
* 文件名稱:
* 文件標識:
* 摘??? 要: Sybase IQ, Data Warehouse
* 開始時間: 2007-03-11
*
* 當前版本: 1.0
* 作??? 者: xuwedo2001@sohu.com
* 相關信息:
* 完成日期: 2007年3月11日
*/
正文:?
?
(一)?
怎樣創建數據庫
1
、DBspace是分配到IQ數據庫的驅動空間的邏輯名
2
、一個新IQ數據庫最多可以有2047個DBspace。
3
、Sybase的各種類型DBspace的限制:
(1)、Catalog Store最大為1TB。
(2)、IQ Store 和IQ temp Store 在裸設備上沒有大小限制,在文件系統中為4TB。
4
、IQ Store 和IQ temp Store可以擴大或從數據庫刪除。
5
、創建數據庫:
CREATE DATABASE full_path db_name[[TRANSACTION] {LOG ON [log_file_name][MIRROR mirror_file_name]}]
IQ PATH iq_file_anem
[IQ SIZE iq_file_size]
[IQ RESERVE sizeMb]
TEMPORARY PATH temp_file_name
[TEMPORARY SIZE temp_db_szie]
[TEMPORARY RESERVE sizeMB]
[MESSAGE PATH message_file_name]
例子1:
CREATE DATABASE
‘
d:\\mydb\\mydb.db
’
IQ PATH
‘
d:\\iqmain\\mydb01.iq
’
IQ SIZE 200
TEMPORARY PATH
‘
e:\\iqtem\\mydb01.iqtmp
’
TEMPORARY SIZE 200
IP PAGE SIZE 65536
6
、可以用Sybase Central創建數據庫(在圖形環境下)。
7
、可以用sp_iqstatus來查看當前數據庫的詳細信息。
8
、刪除一個DBspace
(1)、一個IQ store如果存有數據的話,則不能被刪除。(可以使用Utility數據庫將一個DBspace的數據移動到另一個DBspace中去,再刪除)。
(2)、一個IQ temporary Store僅在為空時才可以被刪除。
9
、刪除一個數據庫的語法:
DROP DATABASE db_filename
例子:DROP DATABASE ‘d:\\mydb\\mydb.db
’
10
、怎樣才能看到所有的DBspace的物理文件名?
用以下命令:Select * from sysqifile
(二)?
設置服務器和數據選項
1、????????
數據庫的啟動參數均可以寫在“.cfg”文件中。
2、????????
啟動服務器的語法:
start_asiq server-switchs database_file
其中:“server-switchs”可以為:
-c
:緩存大小,默認windows為32M,Unix為48M。
-gp:Catalog store
頁大小。
-gm
:服務器允許的連接數。
-n
:IQ server的名字。如果有兩個“-n”選項,則第一個是IQ server的名字,第二個“-n”為IQ 數據庫的名字。
-gc
:checkpoint時間間隔。默認為20,推薦為6000。
-gr
:最大的恢復時間。默認為2。
-ti
:客戶端超時時間。默認為4400分鐘。
-tl
:默認網絡超時時間。默認120秒。
-iqmc
:主緩存大小,單位:M。
-iqtc
:臨時緩存大小,單位:M。
注:主緩存:臨時緩存=2:3
在默認情況下,Sybase IQ server使用2338端口。
3、????????
使用SET OPTION命令更變數據庫的配置:
(1)、語法:
SET [TEMPORARY] OPTION ?
[user_id. | PUBLIC.]option_name = [option_value]
其中的“option_name”可以是:
Force_No_Scroll_Cursors=‘on’(默認為“off”)禁止緩存用戶的查詢結果。
Query_Temp_Space_Limit=0(默認為2000M),設置臨時緩存的最大值。0表示不限制。
Public.Query_Plan=‘off’(默認為“on”)禁止將用戶的查詢計劃打印到IQ Message File中,因為查詢計劃可以會使之大小迅速增加。
例子:
SET OPTION public.Force_NO_Scroll_Cursors=
’
no
’
4、????????
查看數據庫的所有被改動過的(即非默認值)選項,用存儲過程:sp_iqcheckoptions。
(三)?
Sybase IQ
索引和數據類型
1
、Sybase IQ的9種索引類型:
(1)、FP(Fast Projection)此索引為默認的索引形式,在創建表時系統自動設置此索引。
特點:用于SELECT、LIKE ‘%sys%’、SUM(A+B)、JOIN操作等語句。
此類型索引也是唯一可用于BIT數據類型的索引。
?? ?FP
索引可以優化索引,將小于255的唯一值的索引壓縮到1字節中,將小于65537的唯一值索引壓縮到2字節中。
(2)、LF(Low Fast)基于平衡樹的結構,存儲唯一值小于1500個的索引,是最快的索引類型。可以用作唯一索引。
?? ?
特點:用于=、 !=、IN、NOT IN查詢參數。
?? ?MIN
()、MAX()、COUNT()、Group By、JOIN等。
(3)、HNG(High Nongroup)基于位的優化索引,適合于數字索引。用于范圍查找和求合計算。
?? ?
特點:Rangs、Between、MIN()、MAX()、SUM()、AVG()等。
(4)、HG(High Group) 基于平衡樹的結構,存儲唯一值大于1500個的索引,是最快的索引類型。可以用作唯一索引。
?? ?
特點:同LF索引的特點。
(5)、CMP(compare)僅用于比較一個表中的兩個列的比較。
?? ?
特點:<、 =、 >、 <= 、>=
(6)、WD(Word),僅用于索引數據類型為WORD的列。
?? ?特點:‘CONTAINS’、LIKE操作(但沒有‘%’)。
例子:
Select count(*) from Customer where address contains(
‘Main’)
(7)、DATE(date)僅用于日期類型的列。
(8)、DTTM(Datetime)僅用于日期時間類型的列。
(9)、TIME(Time)僅用于時間類型的列。
例子:
Select * from sales where DATAPART(YEAR,dales_dt) = 2007
Select * from sales where sales_dt>=‘2003-01-01 08:00:00’
(四)?
創建表和索引
1
、創建表:
例子1:
CREATE TABLE employee(
Emp_id int NOT NULL
,lname varchar(30) NULL
,fname varchar(30) NULL
,salary money NULL)
例子2:
CREATE TABLE stores(
Store_id char(4) NOT NULL
,store_name varchar(20) NOT NULL
,store_address varchar(40) NOT NULL
,UNIQUE(store_id))
例子3:
CREATE TABLE products(
Product_code char(5) NOT NULL
,product varchar(40) NOT NULL
,price money NULL
PRIMARY KEY (products_code))
例子4:
CREATE TABLE sales(
Sales_code char(10) PRIMARY KEY
,sales_date DATE NOT NULL
,product_code char(5) NOT NULL
,FOREIGN KEY fk1(product_code) REFERENCES product (product_code))
例子5:
SELECT * INTO co_residential_customer from customer where 1=2
2
、用Sybase Central 可以在圖形界面下創建表。
3
、刪除表:DROP TABLE tablename
4
、刪除表中的所有內容:TRUNCATE TABLE [owner.]table_name
5
、創建視圖,語法:
CREATE VIEW [owner.]view_name[(column-name[,
…
])]
AS select-without-order-by
[WITH CHECK OPTION]
例子1:
CREATE VIEW sd_customer AS SELECT * FROM customer
WHERE sheng =
‘
SD
’
例子2:
CREATE VIEW emp_dept
AS SELECT emp_home,emp_fname,dept_name
From Employee,Department
WHERE Employee.dept_id = Department.dept_id
5
、用Sybase Central 可以在圖形界面下創建視圖。
6
、創建索引:
CREATE [UNIQUE] [index-type] INDEX
Index_name ON
[owner.]table_name (column_name[,
…
])
[{IN | ON} DBSpace_name]
[NOTIFY integer]
[DELIMITED BY
‘
separators-string
’
]
[LIMIT maxwordsize-integer]
例子1:
CREATE HG INDEX
Cust_customer_id ON
Cutomer(customer_id)
例子2:
CREATE CMP INDEX price_compare
ON orders(purchase_price,list_cost)
7
、刪除索引:
DROP INDEX [[owner.]tablename.]index_name
例子:
DROP INDEX cust_customer_id
(五)?
Sybase IQ
內存配置
1、????????
IQ
從單一的一個內存池中分配內存。
2、????????
從操作系統層面來看,IQ Server的內存是由堆組成。
3、????????
Buffer
:內存中的一塊區域,它存儲了寫入數據庫或從數據庫中讀取的未解壓的數據。
4、????????
IQ Page Size
:IQ Server中每一個內存頁的大小。
5、????????
IQ Page Size/16=BLOCK SIZE
6、????????
在啟動服務器時,可以用參數-c來指定服務器緩存的初始大小。在所有平臺中,這個值最大為256M。
7、????????
IQ Buffer
有兩種類型:
(1)、主Buffer緩存:IQ Store的Buffer。(占總大小的40%)
(2)、臨時Buffer:IQ temporary Buffer。(占總大小的60%)
8、????????
在Sybase IQ server中一個活動的用戶大約占用10M內存,一個非活動用戶大約占5M內存。
使用sys,以sysdba權限登錄:
c:\sqlplus /nolog
SQL>conn / as sysdba
SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 1
processes integer 150
SQL> alter system set processes=300 scope = spfile;
系統已更改。
SQL> show parameter processes;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 10
log_archive_max_processes integer 1
processes integer 150
SQL> create pfile from spfile;
文件已創建。
重啟數據庫,OK!
因為前些日子在一個項目中用到了iText,稍有收獲,便總結于此,以供他人所需。
iText是一個比較底層的pdf庫,很多項目的pdf操作都是以它為基礎的。像spring,以及另一個比較有名的報表工具jasperreports。簡單的pdf報表輸出用它比較合適,比較復雜的話使用起來就比較困難了,你要手工編寫太多的代碼。
比較好的是iText網站上提供相當多的示例代碼,比較容易入門。我這里只說一些在它的文檔里并沒有直接講到的東西。
1 關于Document
Document的幾種構造函數:
public Document();
public Document(Rectangle pageSize);
public Document(Rectangle pageSize,
int marginLeft,
int marginRight,
int marginTop,
int marginBottom);
下面兩種比較有用,如果是你想定義紙張大小和邊緣的時候。對于Margin,iText上提到“You can also change the margins while you are adding content. Note that the changes will only be noticed on the NEXT page. If you want the margins mirrored (odd and even pages), you can do this with this method: setMarginMirroring(true). ”不過,對于table似乎并不好使。table并不會了理會你設定的margin,如果想改變它的magin還是需要去改變它的寬度(setWidth)。
2 pdf表單
使用PdfStamper是可以填充pdf表單的,這樣就給出了一種很好的報表生成思路。
word制作報表樣式-->acrobat轉pdf-->itext填充數據-->輸出pdf
這做非常簡單,因為可以比較容易的控制pdf的樣式。我對于Java的報表工具了解的并不多,不過在jasperreports,即使用GUI工具做一個樣式比較復雜的報表也不是怎么容易。比如有那種斜線的表頭,比較花哨的嵌套表格。這樣的情況還是比較多見的,客戶不會關系你實現起來是否困難。不過想要使用這種方式也有不足的地方。首先是acrobat把word轉化成pdf的時候,格式總是保持不好,特別的是字體。然后是文件的體積這樣生成的pdf會比直接用iText生成的pdf文件大很多,acrobat在pdf里加入了太多無用的信息。初次使用iText填充Adobe Designer生成的pdf表單時會有點小麻煩。在Designer中設計了一個name的text文本框的綁定名為name。照著iText中例子使用使用PdfStamper的setField方法去這樣寫form.setField("name", "XXXX");并不會成功。原因是Adobe Designer生成的表單名都是具有層次的,它可能是這個樣子form1[0].#subform[0].name[0]。不過我們可以用一個方法把它們列出來,只要做一次就知道結構了,可以使用類似下面的代碼:
PdfReader reader = new PdfReader("form.pdf");
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream("registered_flat.pdf"));
AcroFields form = stamp.getAcroFields();
for (Iterator it = form.getFields().keySet().iterator(); it
.hasNext();) {
System.out.println(it.next());
}
如果直接用iText編程生成的表單就不會有這樣的問題,設定的什么名字就是什么名字。
3 表單元素
pdf并不像html那樣具有良好清晰的結構,而是一個有層次的文檔類型。在它的maillist里,作者說明了iText雖然可以操作現存的pdf文件但是沒辦法去還原它的結構的。沒辦法像html一樣,能從一個pdf文件獲得一個清晰的“源文件”的。關于層次,可以從iText上得到詳細的講述,獲取去看看pdf規范。表單和普通文本是不在一個層上的。沒辦法適用對待文本表各一樣把它們簡單的add進Document對象。獲取一個cb直接去用絕對定位的方法可以加入表單元素,不過很多的時候因為排版并不能那么簡單的去做。就是在html中布局一樣可以使用表格定位。想把一個表單元素加入cell,要借助cell的setCellEvent方法。以一個checkbox為例。新建一個類CheckBoxForm,實現PdfPCellEvent接口。需要實現一個cellLayout的方法。
? public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases)
position可以好好利用,它包含當前cell的位置信息,你可以用它來確定自己checkbox的位置。
position.top()-position.bottom()就能得到高position.right()-position.left()可以得到長,如果需要這兩個值得花可以如此計算。下面的代碼就是定義一個寬度為a的checkbox的rectangle 。它在cell中水平居中,垂直也居中。
? ? float bo = (position.top()-position.bottom()-a)/2;
? ? float ao = (position.right()-position.left()-a)/2; ? ?
? ? Rectangle rectangle = new Rectangle(position.left() + ao, position
? ? ? ? ? .bottom() + bo, position.left() +ao+ a, position.bottom()+ bo + a);
然后把它加入Document
? ? RadioCheckField tf = new RadioCheckField(writer, rectangle, fieldname,
? ? ? ? ? "f");
? ? tf.setCheckType(RadioCheckField.TYPE_SQUARE);
? ? tf.setBorderWidth(1);
? ? tf.setBorderColor(Color.black);
? ? tf.setBackgroundColor(Color.white); ? ? ?
? ? try {
? ? ? ? PdfFormField field = tf.getCheckField(); ? ? ? ?
? ? ? ? writer.addAnnotation(field);
? ? } catch (IOException e) {
? ? ? ? e.printStackTrace();
? ? } catch (DocumentException e) {
? ? ? ? e.printStackTrace();
? ? }
其它的元素與此類似。
4 PdfPTable和Table
說不上哪種更好用,有時候不能不使用PdfPTable。可惜它只有setColspan方法,沒有setRowspan。嵌套的時候也有區別,PdfPTable是用addcell()加入嵌套表的,table則有一個更明了的方法insertTable()。PdfPTable想進行設置border之類的操作要先獲得一個默認cell,
pdfPTableName.getDefaultCell().setBorder(Rectangle.NO_BORDER);//設置無框的表
另外在PdfPTable中,一些修飾屬性會因為設置的時機不正確而沒有效果。如,適用cell的構造函數加入了文本,在cell的setVerticalAlignment()fangfa去設定垂直對齊方式就不會有效。還有一個有意思的不同是table默認外邊框是加粗的,而PdfPTable則一樣粗細。
5 字體
iText的例子有很多足夠用,給出一些pdf的字體名稱和編碼,如果想使用內嵌字體的話。
語言 PDF 字體名
簡體中文 STSong-Light
繁體中文 MHei-Medium
MSung-Light
日語 HeiseiKakuGo-W5
HeiseiMin-W3
韓語 HYGoThic-Medium
HYSMyeongJo-Medium
字符集 編碼
簡體中文 UniGB-UCS2-H
UniGB-UCS2-V
繁體中文 UniCNS-UCS2-H
UniCNS-UCS2-V
日語 UniJIS-UCS2-H
UniJIS-UCS2-V
UniJIS-UCS2-HW-H
UniJIS-UCS2-HW-V
韓語 UniKS-UCS2-H
UniKS-UCS2-H
必須要有Asian的包才可以用,也可以使用TrueType字體。
ps:因為隔了一段時間了,所以有些現在一時也想不起來了,也可能會有理解的錯誤。另外,適用iText的時候自己最好抽象一下,可能會省不少力氣。