sed -e ‘s/[ ]*$//g’ 文件名
1. Sed簡介
文章作者:孫劍和
本文地址:http://www.sunjianhe.com/?p=342
版權所有 © 轉載時必須以鏈接形式注明作者和原始出處!
一、ORACLE10g自動收集統計信息--自動analyze
從Oracle Database 10g開始,Oracle在建庫后就默認創建了一個名為GATHER_STATS_JOB的定時任務,用于自動收集CBO的統計信息。
這個自動任務默認情況下在工作日晚上10:00-6:00和周末全天開啟。調用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集統計信息。該過程首先檢測統計信息缺失和陳舊的對象。然后確定優先級,再開始進行統計信息。
可以通過以下查詢這個JOB的運行情況:
select * from Dba_Scheduler_Jobs where JOB_NAME ='GATHER_STATS_JOB'
其實同在10點運行的Job還有一個AUTO_SPACE_ADVISOR_JOB:
SQL> select JOB_NAME,LAST_START_DATE from dba_scheduler_jobs;JOB_NAME LAST_START_DATE
------------------------------ --------------------------------------
AUTO_SPACE_ADVISOR_JOB 04-DEC-07 10.00.00.692269 PM +08:00
GATHER_STATS_JOB 04-DEC-07 10.00.00.701152 PM +08:00
FGR$AUTOPURGE_JOB
PURGE_LOG 05-DEC-07 03.00.00.169059 AM PRC
然而這個自動化功能已經影響了很多系統的正常運行,晚上10點對于大部分生產系統也并非空閑時段。
而自動分析可能導致極為嚴重的閂鎖競爭,進而可能導致數據庫Hang或者Crash。
所以建議最好關閉這個自動統計信息收集功能:
exec DBMS_SCHEDULER.DISABLE('GATHER_STATS_JOB');
自動化永遠而嚴重的隱患相伴隨!
關閉及開啟自動搜集功能,有兩種方法,分別如下:
方法一:
exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');
exec dbms_scheduler.enable('SYS.GATHER_STATS_JOB');
方法二:
alter system set "_optimizer_autostats_job"=false scope=spfile;
alter system set "_optimizer_autostats_job"=true scope=spfile;
Pfile可以直接修改初始化參數文件,重新啟動數據庫。
二、AWR默認通過MMON及MMNL進程來每小自動運行一次,為了節省空間,采集的數據在 7 天后自動清除。
快照頻率和保留時間都可以由用戶修改。要查看當前的設置,您可以使用下面的語句:
select snap_interval, retention
from dba_hist_wr_control;
SNAP_INTERVAL RETENTION
------------------- -------------------
+00000 01:00:00.0 +00007 00:00:00.0
這些 SQL 語句顯示快照每小時采集一次,采集的數據保留 7 天。要修改設置 — 例如,快照時間間隔為 20 分鐘,保留時間為兩天 — 您可以發出以下命令。參數以分鐘為單位。
begin
dbms_workload_repository.modify_snapshot_settings (
interval => 20,
retention => 2*24*60
);end;
AWR 使用幾個表來存儲采集的統計數據,所有的表都存儲在新的名稱為 SYSAUX 的特定表空間中的 SYS 模式下,并且以 WRM$_* 和 WRH$_* 的格式命名。前一種類型存儲元數據信息(如檢查的數據庫和采集的快照),后一種類型保存實際采集的統計數據。(您可能已經猜到,H 代表“歷史數據 (historical)”而 M 代表“元數據 (metadata)”。)在這些表上構建了幾種帶前綴 DBA_HIST_ 的視圖,這些視圖可以用來編寫您自己的性能診斷工具。視圖的名稱直接與表相關;例如,視圖 DBA_HIST_SYSMETRIC_SUMMARY 是在WRH$_SYSMETRIC_SUMMARY 表上構建的。
您的處理計劃一般是有規律的,并且通常基于您對各種事件的了解和您處理它們的經驗。現在設想相同的事情由一個引擎來完成,這個引擎采集量度并根據預先確定的邏輯來推出可能的計劃。您的工作不就變得更輕松了嗎? 現在在 Oracle Database 10g 中推出的這個引擎稱為自動數據庫診斷監控程序 (ADDM)。為了作出決策,ADDM 使用了由 AWR 采集的數據。
在 AWR 進行的每一次快照采集之后,調用 ADDM 來檢查量度并生成建議。因此,實際上您擁有了一個一天二十四小時工作的自動數據庫管理員,它主動地分析數據并生成建議,從而把您解放出來,使您能夠關注更具有戰略意義的問題。
快照默認是自動采集的,但您也可以按需要采集它們。所有的 AWR 功能都在程序包 DBMS_WORKLOAD_REPOSITORY 中實施。要采集一次快照,只需發出下面的命令:
execute dbms_workload_repository.create_snapshot它立即采集一次快照,快照被記錄在表 WRM$_SNAPSHOT 中。采集的量度是針對 TYPICAL 級別的。如果您想采集更詳細的統計數據,您可以在上面的過程中將參數 FLUSH_LEVEL 設置為 ALL。統計數據自動刪除,但也可以通過調用過程 drop_snapshot_range() 來手動刪除。
a.數據庫運行在非歸檔模式下:
SQL> archive log list;
Database log mode
Automatic archival
Archive destination
Oldest online log sequence
Current log sequence
SQL> @redo
SQL> create table test as select * from dba_objects where 1=0;
Table created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL> select (1152368 -1150988) redo_append,(1150988 -63392) redo from dual;
REDO_APPEND
----------- ----------
SQL> drop table test;
Table dropped.
我們看到在Noarchivelog模式下,對于常規表的insert append只產生少量redo
b.在歸檔模式下
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area
Fixed Size
Variable Size
Database Buffers
Redo Buffers
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> @redo
SQL> create table test as select * from dba_objects where 1=0;
Table created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL> select (2227712 -1143948) redo_append,(1143948 -56288) redo from dual;
REDO_APPEND
----------- ----------
SQL> drop table test;
Table dropped.
我們看到在歸檔模式下,對于常規表的insert append產生和insert同樣的redo
此時的insert append實際上并不會有性能提高.
但是此時的append是生效了的
通過Logmnr分析日志得到以下結果:
SQL> select operation,count(*)
OPERATION
-------------------------------- ----------
COMMIT
DIRECT INSERT
INTERNAL
START
我們注意到這里是DIRECT INSERT,而且是10470條記錄,也就是每條記錄都記錄了redo.
2.對于Nologging的table的處理
a. 在歸檔模式下:
SQL> create table test nologging as select * from dba_objects where 1=0;
Table created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL> select (3359024 -3357644) redo_append,(3357644 - 2270284) redo from dual;
REDO_APPEND
----------- ----------
SQL> drop table test;
Table dropped.
我們注意到,只有append才能減少redo
b.在非歸檔模式下:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area
Fixed Size
Variable Size
Database Buffers
Redo Buffers
Database mounted.
SQL> alter database noarchivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> @redo
SQL> create table test nologging as select * from dba_objects where 1=0;
Table created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL>
SQL> insert into test select * from dba_objects;
10470 rows created.
SQL> select * from redo_size;
----------
SQL> select (1145528 -1144148) redo_append,(1144148 -56580) redo from dual;
REDO_APPEND
----------- ----------
SQL>
oracle 10g for hp HP-UX Itanium 11.31 installation
標簽:hp-ux上安裝oracle10g
1,硬件信息檢驗:
/usr/sbin/dmesg | grep "Physical:" 確定物理RAM高于1000M
/usr/sbin/swapinfo -a 確定交換分區有沒有空間
bdf /tmp 確定tmp的空閑空間,要保障在400M以上
(擴展/tmp要到init 1但用戶狀態去umount掉,
lvextend -L 800 /dev/vg00/lvol5(/tmp所在的lv) /dev/dsk/盤號)
extendfs -F vxfs /dev/vg00/lvol5)
bdf 確定磁盤大小,需要2個大于4.7G的磁盤系統
# /bin/getconf KERNEL_BITS 確定系統是否64位
2,檢查軟件需求:
uname -a 檢查操作系統版本:必須是hp-ux 11i v3
show_patches|grep PHKL_40240
show_patches|grep PHKL_39624
show_patches|grep PHKL_39625
注:hp Unix patch 每個季度都會有更新
確定hp 系統patch已經打上,如果沒有,到itrc找到patch打上。
(swinstall -s 完全路徑。先解析,再install)
3,java -version 查看java版本。必須安裝Java版本SDK1.4.2。
(如果不能直接打出,把/opt/java1.4/bin/:加入 /.profile的PATH=中,再加入
export JAVA_HOME=/opt/java1.4)
4,創建需要的UNIX組和用戶
#/usr/sbin/groupadd oinstall
#/usr/sbin/groupadd dba
創建oracle用戶:
#/usr/sbin/useradd -g oinstall -G dba –m oracle
passwd oracle
5,創建必需目錄:
mkdir /orabin
mkdir -p /orabin/oracle
mkdir /archive
chmod -R 775 /orabin /archive
chown oracle:dba /orabin
chown oracle:dba /archive
6,配置內核參數:
6.1 Kernel需求表:
Parameter Recommended Formula or Value
ksi_alloc_max (nproc*8) --32768
max_thread_proc 256
maxdsiz 1073741824 (1 GB)
maxdsiz_64bit 2147483648 (2 GB)
Oracle Database 21
maxssiz 134217728 (128 MB)
maxssiz_64bit 1073741824 (1 GB)
maxswapchunks 16384 --
maxuprc ((nproc*9)/10) --3687
msgmap (2+msgmni)
msgmni 4096
msgseg 32767
msgtql 4096
ncsize (ninode+vx_ncsize) 34816
nfile (15*nproc+2048) 61664
nflocks 4096
ninode (8*nproc+2048) 34816
nkthread (((nproc*7)/4)+16) 7184
nproc 4096
semmap (semmni+2)
semmni 4096
semmns (semmni*2)
semmnu (nproc-4)
semvmx 32767
shmmax The size of physical memory (0X40000000) or
1073741824, whichever is greater.
shmmni 512
shmseg 120
vps_ceiling 64
(參數含義請看參數說明)
#調整內核參數
6.2 #kctune 查內核參數
kctune -h -B nproc="4200"
kctune -h -B ksi_alloc_max="33600"
kctune -h -B max_thread_proc="1100"
kctune -h -B maxdsiz="1073741824"
kctune -h -B maxdsiz_64bit="4294967296"
kctune -h -B maxssiz="134217728"
kctune -h -B maxssiz_64bit="1073741824"
kctune -h -B maxuprc="3688"
kctune -h -B msgmni="4096"
kctune -h -B msgtql="4096"
kctune -h -B ncsize="35840"
kctune -h -B nflocks="4096"
kctune -h -B ninode="34816"
kctune -h -B nkthread="8416"
kctune -h -B semmni="8192"
kctune -h -B semmns="16384"
kctune -h -B semmnu="4092"
kctune -h -B semvmx="32767"
kctune -h -B shmmax="34359738368"
kctune -h -B shmmni="512"
kctune -h -B shmseg="300"
kctune -h -B vps_ceiling="64"
如果更改了制定的static參數。需重建kernel和重起系統。
重起系統,用root登錄
7,把安裝盤mount上(把安裝介質傳上去)
用oracle用戶登錄,并修改oracle用戶的環境(shell)
7.1、打開另一個會話終端
7.2、輸入命令并確定是否可以用在終端輸出圖形化界面:
$ xhost +
7.3、完成一下步驟:
在這里安裝oracle,切換到oracle用戶。$ su - oracle
7.4、輸入命令確定oracle的默認SHELL
#echo $SHELL
/sbin/sh(每個用戶所使用的sh都不一樣)
8,更改環境變量:
$ vi .profile
加入以下行:
export ORACLE_BASE=/orabin/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0.1/db_1
export PATH=:$ORACLE_HOME/bin:$PATH:$ORACLE_HOME/OPatch
export NLS_LANG=american_america.zhs16gbk
export ORACLE_SID=oracle
9,編輯好之后logout再 su – oracle
$echo $ORACLE_HOME
輸出ORACLE_HOME的路徑
安裝ORACLE軟件:
拷貝文件到一個文件系統下,例如:/file/database
注意到用戶和組為oracle:dba
如果不是執行:
chown –R oracle:dba database 把他所屬用戶為oracle所屬組為dba
chmod –R 775 databse 更改他的執行權限為755
export DISPLAY= 192.168.61.222:0.0
xhost +
su – oracle 切換到oracle用戶
echo $DISPLAY 查看輸出目錄
如果不是本機的IP地址,執行:
export DISPLAY=LOCALHOST_IP:0.0
然后進入oracle_databse所在目錄,進行安裝oracle
cd /file/databse
./ runInstaller -ignoreSysPreReqs
10,如果提示swap分區不夠大,做如下操作:
vgdisplay –v 看看哪個disk上還有空余的空間。(free要*pe值)
lvcreate –L xxx(需要臨時swap分區的大小) –n myswap(lv名字) vg00(所在的vg名)
newfs -F vxfs -o largefiles /dev/vg01/rmyswap(注意lv名前有r)
swapon /dev/vg00 /myswap
11,安裝完成之后,需要用root用戶run兩個腳本
再打開一個會話窗口,執行:
/orabin/oracle/oraInventory/orainstRoot.sh
/orabin/oracle/product/10.2.0.1/root.sh
12,上傳 oracle 10.2.0.4補丁
以同樣的方法安裝oracle 10.2.0.4 補丁
13,配置監聽:
netca
14, 建庫
dbca
使用裸設備
14.1 先創建裸設備
lvcreate -L 6000 -n system01.dbf vg00
lvcreate -L 5000 -n users01.dbf vg00
lvcreate -L 5000 -n temp01.dbf vg00
lvcreate -L 2000 -n undotbs01.dbf vg00
lvcreate -L 2000 -n undotbs02.dbf vg00
lvcreate -L 50 -n control01.ctl vg00
lvcreate -L 50 -n control02.ctl vg00
lvcreate -L50 -n control03.ctl vg00
lvcreate -L 500 -n redo01.log vg00
lvcreate -L 500 -n redo02.log vg00
lvcreate -L 500 -n redo03.log vg00
lvcreate -L 5000 -n sysaux01.dbf vg00
lvcreate -L 50 -n spfileoracle.ora vg00
14.2 改變裸設備的權限為oracle:dba
chown oracle:dba /dev/vg00/rsystem01.dbf
chown oracle:dba /dev/vg00/rusers01.dbf
chown oracle:dba /dev/vg00/rtemp01.dbf
chown oracle:dba /dev/vg00/rundotbs01.dbf
chown oracle:dba /dev/vg00/rcontrol01.ctl
chown oracle:dba /dev/vg00/rcontrol02.ctl
chown oracle:dba /dev/vg00/rcontrol03.ctl
chown oracle:dba /dev/vg00/rredo01.log
chown oracle:dba /dev/vg00/rredo02.log
chown oracle:dba /dev/vg00/rredo03.log
chown oracle:dba /dev/vg00/rsysaux01.dbf
chown oracle:dba /dev/vg00/rspfileoracle.ora
14.3 創建軟連接
ln -s /dev/vg00/rspfileoracle.ora /orabin/product/10.2.0.1/db_1/dbs/spfileoracle .ora
ln -s /dev/vg00/rsystem01.dbf /orabin/oradata/oracle/system01.dbf
ln -s /dev/vg00/rusers01.dbf /orabin/oradata/oracle/users01.dbf
ln -s /dev/vg00/rtemp01.dbf /orabin/oradata/oracle/temp01.dbf
ln -s /dev/vg00/rundotbs01.dbf /orabin/oradata/oracle/undotbs01.dbf
ln -s /dev/vg00/rundotbs02.dbf /orabin/oradata/oracle/undotbs02.dbf
ln -s /dev/vg00/rcontrol01.ctl /orabin/oradata/oracle/control01.ctl
ln -s /dev/vg00/rcontrol02.ctl /orabin/oradata/oracle/control02.ctl
ln -s /dev/vg00/rcontrol03.ctl /orabin/oradata/oracle/control03.ctl
ln -s /dev/vg00/rredo01.log /orabin/oradata/oracle/redo01.log
ln -s /dev/vg00/rredo02.log /orabin/oradata/oracle/redo02.log
ln -s /dev/vg00/rredo03.log /orabin/oradata/oracle/redo03.log
ln -s /dev/vg00/rsysaux01.dbf /orabin/oradata/oracle/sysaux01.dbf
14.4 查看裸設備的權限和屬組
# ll /dev/vg00/r*
crw-r----- 1 root sys 64 0x000017 Dec 3 15:26 /dev/vg00/rarchive
crw-r----- 1 oracle dba 64 0x00000f Dec 3 15:10 /dev/vg00/rcontrol01.ctl
crw-r----- 1 oracle dba 64 0x000010 Dec 3 15:10 /dev/vg00/rcontrol02.ctl
crw-r----- 1 oracle dba 64 0x000011 Dec 3 15:10 /dev/vg00/rcontrol03.ctl
brw-r----- 1 oracle dba 64 0x000012 Dec 3 15:10 /dev/vg00/redo01.log
brw-r----- 1 oracle dba 64 0x000013 Dec 3 15:10 /dev/vg00/redo02.log
brw-r----- 1 oracle dba 64 0x000014 Dec 3 15:10 /dev/vg00/redo03.log
crw-r----- 1 root sys 64 0x000001 Dec 3 11:44 /dev/vg00/rlvol1
crw-r----- 1 root sys 64 0x000002 Dec 3 11:44 /dev/vg00/rlvol2
crw-r----- 1 root sys 64 0x000003 Dec 3 11:44 /dev/vg00/rlvol3
crw-r----- 1 root sys 64 0x000004 Dec 3 11:44 /dev/vg00/rlvol4
crw-r----- 1 root sys 64 0x000005 Dec 3 11:44 /dev/vg00/rlvol5
crw-r----- 1 root sys 64 0x000006 Dec 3 11:44 /dev/vg00/rlvol6
crw-r----- 1 root sys 64 0x000007 Dec 3 11:44 /dev/vg00/rlvol7
crw-r----- 1 root sys 64 0x000008 Dec 3 11:44 /dev/vg00/rlvol8
crw-r----- 1 root sys 64 0x000009 Dec 3 15:10 /dev/vg00/roraclebin
crw-r----- 1 oracle dba 64 0x000012 Dec 3 15:10 /dev/vg00/rredo01.log
crw-r----- 1 oracle dba 64 0x000013 Dec 3 15:10 /dev/vg00/rredo02.log
crw-r----- 1 oracle dba 64 0x000014 Dec 3 15:10 /dev/vg00/rredo03.log
crw-r----- 1 oracle dba 64 0x000016 Dec 3 15:10 /dev/vg00/rspfileoracle.ora
crw-r----- 1 oracle dba 64 0x000015 Dec 3 15:10 /dev/vg00/rsysaux01.dbf
crw-r----- 1 oracle dba 64 0x00000a Dec 3 15:10 /dev/vg00/rsystem01.dbf
crw-r----- 1 oracle dba 64 0x00000c Dec 3 15:10 /dev/vg00/rtemp01.dbf
crw-r----- 1 oracle dba 64 0x00000d Dec 3 15:10 /dev/vg00/rundotbs01.dbf
crw-r----- 1 oracle dba 64 0x00000e Dec 3 15:10 /dev/vg00/rundotbs02.dbf
crw-r----- 1 oracle dba 64 0x00000b Dec 3 15:10 /dev/vg00/rusers01.dbf
14.5 查看鏈接文件的權限和屬組
/orabin/oradata/oracle
# ll
total 0
lrwxrwxrwx 1 oracle oinstall 24 Dec 4 11:09 control01.ctl -> /dev/vg00/rcontrol01.ctl
lrwxrwxrwx 1 oracle oinstall 24 Dec 4 11:09 control02.ctl -> /dev/vg00/rcontrol02.ctl
lrwxrwxrwx 1 oracle oinstall 24 Dec 4 11:09 control03.ctl -> /dev/vg00/rcontrol03.ctl
lrwxrwxrwx 1 oracle oinstall 21 Dec 4 11:09 redo01.log -> /dev/vg00/rredo01.log
lrwxrwxrwx 1 oracle oinstall 21 Dec 4 11:09 redo02.log -> /dev/vg00/rredo02.log
lrwxrwxrwx 1 oracle oinstall 21 Dec 4 11:09 redo03.log -> /dev/vg00/rredo03.log
lrwxrwxrwx 1 oracle oinstall 23 Dec 4 11:09 sysaux01.dbf -> /dev/vg00/rsysaux01.dbf
lrwxrwxrwx 1 oracle oinstall 23 Dec 4 11:09 system01.dbf -> /dev/vg00/rsystem01.dbf
lrwxrwxrwx 1 oracle oinstall 21 Dec 4 11:09 temp01.dbf -> /dev/vg00/rtemp01.dbf
lrwxrwxrwx 1 oracle oinstall 24 Dec 4 11:09 undotbs01.dbf -> /dev/vg00/rundotbs01.dbf
lrwxrwxrwx 1 oracle oinstall 24 Dec 4 11:09 undotbs02.dbf -> /dev/vg00/rundotbs02.dbf
lrwxrwxrwx 1 oracle oinstall 22 Dec 4 11:09 users01.dbf -> /dev/vg00/rusers01.dbf
根據提示選擇數據庫名(oracle),sys密碼(和主機名一樣),選擇control,datafile,redofile以及spfile的路徑
15 把數據庫變為歸檔模式
sqlplus 下執行:
alter system set log_archive_start= TRUE scope=spfile;
alter system set log_archive_dest_1="LOCATION=/archive" scope=spfile;
shutdown immediate;
alter database archivelog;
alter database open ;
show parameter archive;
測試:
alter system switch logfile;
/
/
/
到/archive 目錄下查看是否已經歸檔
16 用客戶端和網頁或者第三方軟件連接oracle
測試成功!
finish!
archive log list;
shutdown immediate;
startup mount;
alter database archivelog;
alter database open
alter system set LOG_ARCHIVE_DEST_1='LOCATION=/oracle/oradata/express/archive';
shutdown immediate;
startup
如果是oracle9i,還需要更改如下參數:
alter system set log_archive_start=true scope=spfile;
但是如果在10g中也更改這些參數,數據庫重啟時會有如下提示:
ORA-32004: obsolete and/or deprecated parameter(s) specified
alter system set log_archive_format='%t_%s.dbf' scope=spfile;
但是如果在10g中也更改這些參數,數據庫會不能啟動,如下提示:
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORA-19905: log_archive_format must contain %s, %t and %r
HP--UX查看內存、CPU的使用率
1. 以root用戶修改/etc/lvmrc文件
對應需要做成共享的VG,先要求關閉其開機自動active的設置。
你必須保證這些VG在SG啟動的時候激活。
備份/etc/lvmrc文件
# cp /etc/lvmrc /etc/lvmrc_orig
修改/etc/lvmrc文件
From:
AUTO_VG_ACTIVATE=1
To:
AUTO_VG_ACTIVATE=0
2.創建共享邏輯卷組
主節點上:
# 初始化PV
pvcreate -f /dev/rdsk/c0t12d0
# 在/dev目錄添加用于VG的目錄
mkdir /dev/vg_ops
# Major number必須為64,minor number是2為16進制數字,作為唯一標識
mknod /dev/vg_ops/group c 64 0x060000
# 創建VG
vgcreate /dev/vg_ops /dev/dsk/c0t12d0
# 激活VG
vgchange -a y vg_ops
# 創建LV
lvcreate -n P901_control_01.ctl -L 110 /dev/vg_ops
lvcreate -n P901_control_02.ctl -L 110 /dev/vg_ops
lvcreate -n P901_control_03.ctl -L 110 /dev/vg_ops
lvcreate -n P901_system_01.dbf -L 400 /dev/vg_ops
lvcreate -n P901_log1_01.log -L 120 /dev/vg_ops
lvcreate -n P901_log1_02.log -L 120 /dev/vg_ops
lvcreate -n P901_log1_03.log -L 120 /dev/vg_ops
lvcreate -n P901_log2_01.log -L 120 /dev/vg_ops
lvcreate -n P901_log2_02.log -L 120 /dev/vg_ops
lvcreate -n P901_log2_03.log -L 120 /dev/vg_ops
lvcreate -n P901_spfile1.dbf -L 5 /dev/vg_ops
lvcreate -n P901_users_01.dbf -L 120 /dev/vg_ops
lvcreate -n P901_temp_01.dbf -L 100 /dev/vg_ops
lvcreate -n P901_undotbs_01.dbf -L 312 /dev/vg_ops
lvcreate -n P901_undotbs_02.dbf -L 312 /dev/vg_ops
lvcreate -n P901_example_01.dbf -L 160 /dev/vg_ops
lvcreate -n P901_cwmlite_01.dbf -L 100 /dev/vg_ops
lvcreate -n P901_indx_01.dbf -L 70 /dev/vg_ops
lvcreate -n P901_tools_01.dbf -L 20 /dev/vg_ops
lvcreate -n P901_drsys_01.dbf -L 90 /dev/vg_ops
# 解除VG的active狀態
vgchange -a n vg_ops
# 創建LV的map文件
vgexport -v -s -p -m /tmp/vg_ops.map /dev/vg_ops
# 復制map文件到其它節點
rcp /tmp/vg_ops.map opcbhp2:/tmp/vg_ops.mapOn the other nodes:
mkdir /dev/vg_ops
mknod /dev/vg_ops/group c 64 0x060000
# 在其它節點創建VG和LV
vgimport -v -s -m /tmp/vg_ops.map /dev/vg_ops
# 在所有節點配置相應VG和LV的權限和屬主
# chown oracle:dba /dev/vg_ops/r*
# remsh nodehp2 chown oracle:dba /dev/vg_ops/r*
# chmod 777 /dev/vg_ops
# remsh nodehp2 chmod 777 /dev/vg_ops
# chmod 660 /dev/vg_ops/r*
# remsh nodehp2 chmod 660 /dev/vg_ops/r*
Note: 在創建VG的時候,要注意minor number的唯一性,常用以下命令:
# find /dev -name group -exec ls -l {} ;
crw------- 1 root sys 64 0x060000 May 6 07:52 /dev/vg_ops/group
在該例子中"vg_ops"為"0x060000",所以"0x060000"不能用于創建其它VG,合法的minor numbers的范圍是從"0x010000"到"0xFF0000"。
3.集群軟件ServiceGuard的安裝
由供應商安裝,Oracle 10gR2的RAC要求Serviceguard Extension for RAC的版本必須A.11.16.00以上,也包含A.11.16.00版本。
4.規劃集群環境
1)配置集群:
使用cmquerycl去創建一個集群配置文件
Cmquerycl命令必須在主節點上進行
# cmquerycl -v -C /etc/cmcluster/cmclconf.ascii -n nodehp1 -n nodehp2
2)修改集群配置文件
CLUSTER_NAME # example nodehp
FIRST_CLUSTER_LOCK # /dev/vg_ops
FIRST_CLUSTER_PV # /dev/dsk/c0t12d0
OPS_VOLUME_GROUP # /dev/vg_ops
DLM_ENABLED # NO
GMS_ENABLED # NO
FIRST_CLUSTER_LOCK, FIRST_CLUSTER_PV = 集群lock卷組和磁盤作為表決用途。表決VG和磁盤必須能被所有節點訪問(用共享VG就可以)。一個節點倒掉,會要求表決VG的處理。
OPS_VOLUME_GROUP = 所有共享VG
DLM_ENABLED and GMS_ENABLED = NO (8.1.7版本以后均設為NO)
3)使用cmcheckconf命令驗證集群配置文件
# cmcheckconf -v -C /etc/cmcluster/cmclconf.ascii
4)使用vgchange來激活lock卷組
# vgchange -a y vg_ops
5)使用cmapplyconf復制集群配置文件到所有節點
# cmapplyconf -v -C /etc/cmcluster/cmclconf.ascii
6)使用vgchange解除lock卷組的激活狀態
# vgchange -a n vg_ops
5.基本集群管理
1)啟動集群:
# cmruncl
2)使用vgchange在主節點設置共享VG
# vgchange -S y -c y vg_ops
3)使用vgchange在每個節點激活共享VG
# vgchange -a s vg_ops
# remsh nodehp2 /usr/sbin/vgchange -a s vg_ops
4)使用cmhaltcl關閉集群或者使用cmhaltnode從集群移除節點
# cmhaltnode
5)使用cmrunnode添加節點到集群
# cmrunnode
6)使用cmhaltpkg,cmrunpkg及cmmodpkg管理集群的pkg,也可用于集群節點的恢復,可參照在線手冊使用。
6.Log Files for Cluster
/var/adm/syslog/syslog.log包含HP Serviceguard Extension for RAC的系統信息
“SQL TRACE”是Oracle提供的用于進行SQL跟蹤的手段,是強有力的輔助診斷工具。在日常的數據庫問題診斷和解決中,“SQL TRACE”是非常常用的方法。
一般,一次跟蹤可以分為以下幾步:
1、界定需要跟蹤的目標范圍,并使用適當的命令啟用所需跟蹤。
2、經過一段時間后,停止跟蹤。此時應該產生了一個跟蹤結果文件。
3、找到跟蹤文件,并對其進行格式化,然后閱讀或分析。
本文就“SQL TRACE”的這些使用作簡單探討,并通過具體案例對SQL_TRACE的使用進行說明。
一、“SQL TRACE”的啟用。
(A)SQL_TRACE說明
SQL_TRACE可以作為初始化參數在全局啟用,也可以通過命令行方式在具體session啟用。
1.在全局啟用
在參數文件(pfile/spfile)中指定:
提示: 通過在全局啟用SQL_TRACE,我們可以跟蹤到所有后臺進程的活動,很多在文檔中的抽象說明,通過跟蹤文件的實時變化,我們可以清晰的看到各個進程之間的緊密協調。
2.在當前session級設置
大多數時候我們使用SQL_TRACE跟蹤當前會話的進程。通過跟蹤當前進程可以發現當前操作的后臺數據庫遞歸活動(這在研究數據庫新特性時尤其有效),研究SQL執行,發現后臺錯誤等。
在session級啟用和停止SQL_TRACE方式如下:
啟用當前session的跟蹤:
SQL> alter session set SQL_TRACE=true;
Session altered.
此時的SQL操作將被跟蹤:
SQL> select count(*) from dba_users;
----------
結束跟蹤:
SQL> alter session set SQL_TRACE=false;
Session altered.
3.跟蹤其它用戶進程
通過v$session我們可以獲得sid、serial#等信息:
獲得進程信息,選擇需要跟蹤的進程:
SQL> select sid,serial#,username from v$session where username =’***’
---------- ---------- ------------------------------
設置跟蹤:
SQL> exec dbms_system.set_SQL_TRACE_in_session(9,437,true)
PL/SQL procedure successfully completed.
….
可以等候片刻,跟蹤session執行任務,捕獲sql操作…
….
停止跟蹤:
SQL> exec dbms_system.set_SQL_TRACE_in_session(9,437,false)
PL/SQL procedure successfully completed.
(B) 10046事件說明
10046事件是Oracle提供的內部事件,是對SQL_TRACE的增強.
10046事件可以設置以下四個級別:
1 - 啟用標準的SQL_TRACE功能,等價于SQL_TRACE。
4 - Level 1 加上綁定值(bind values)
8 - Level 1 + 等待事件跟蹤
12 - Level 1 + Level 4 + Level 8
類似SQL_TRACE方法,10046事件可以在全局設置,也可以在session級設置。
對于10046事件的設置,涉及到了oracle的“診斷事件”的概念。
可以參考以下鏈接了解詳情。http://www.itpub.net/323537,1.html
1. 在全局設置
在參數文件中增加:
EVENT="10046 trace name context forever,level 12"
此設置對所有用戶的所有進程生效、包括后臺進程.
2. 對當前session設置
通過alter session的方式修改,需要alter session的系統權限:
SQL> alter session set events '10046 trace name context forever';
Session altered.
SQL> alter session set events '10046 trace name context forever, level 8';
Session altered.
SQL> alter session set events '10046 trace name context off';
Session altered.
3. 對其他用戶session設置
通過DBMS_SYSTEM.SET_EV系統包來實現:
SQL> desc DBMS_SYSTEM.SET_EV;
Parameter Type
--------- -------------- ---- --------
SI
SE
EV
LE
NM
其中的參數SI、SE來自v$session視圖:
查詢獲得需要跟蹤的session信息:
SQL> select sid,serial#,username from v$session where username is not null;
SID SERIAL# USERNAME
---------- ---------- ------------------------------
8 2041 SYS
9 437 EYGLE
執行跟蹤:
SQL> exec dbms_system.set_ev(9,437,10046,8,'eygle');
PL/SQL procedure successfully completed.
結束跟蹤:
SQL> exec dbms_system.set_ev(9,437,10046,0,'eygle');
PL/SQL procedure successfully completed.
(C)對啟用方法的一些總結。
因為trace的目標范圍不同,導致必須使用不同的方法。
?nbsp;
?nbsp;
?nbsp;
再加上10046診斷事件,是SQL_TRACE的增強,又多了一套方法。
二、獲取跟蹤文件
以上生成的跟蹤文件位于“user_dump_dest”參數所指定的目錄中,位置及文件名可以通過以下SQL查詢獲得:
1.如果是查詢當前session的跟蹤文件,使用如下查詢:
SELECT d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
from
TRACE_FILE_NAME
-------------------------------------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc
2.如果是查詢其他用戶session的跟蹤文件,則根據用戶的sid和#serial使用如下查詢:
SELECT d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
from
TRACE_FILE_NAME
-------------------------------------------------------------------------------
D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc
三、格式化跟蹤文件。
原始的跟蹤文件是很難讀懂的。需要使用oracle自帶的tkprof命令行工具格式化一下。
SQL>$tkprof D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.trc D:\ORACLE\PRODUCT\10.2.0\ADMIN\MYORACLE\UDUMP\hsjf_ora_1026.txt
這個就可以方便的閱讀了。可以在hsjf_ora_1026.txt文件中看到所有的sql語句執行次數,CPU使用時間等數據。
備注:可以通過以下方法讀取當前已經設置的參數
對于全局的SQL_TRACE參數的設置,可以通過show parameter命令獲得。
當我們通過alter session的方式設置了SQL_TRACE,這個設置是不能通過show parameter的方式得到的,我們需要通過dbms_system.read_ev來獲取:
SQL> set feedback off
SQL> set serveroutput on
SQL> declare
2 event_level number;
3 begin
4 for event_number in 10000..10999 loop
5 sys.dbms_system.read_ev(event_number, event_level);
6 if (event_level > 0) then
7 sys.dbms_output.put_line(
8 'Event ' ||
9 to_char(event_number) ||
10 ' is set at level ' ||
11 to_char(event_level)
12 );
13 end if;
14 end loop;
15 end;
16 /
Event 10046 is set at level 1
引用:http://blog.sina.com.cn/s/blog_4cae4a25010008do.html
寫HINT目的
手工指定SQL語句的執行計劃
hints是oracle提供的一種機制,用來告訴優化器按照我們的告訴它的方式生成執行計劃。我們可以用hints來實現:
1) 使用的優化器的類型
2) 基于代價的優化器的優化目標,是all_rows還是first_rows。
3) 表的訪問路徑,是全表掃描,還是索引掃描,還是直接利用rowid。
4) 表之間的連接類型
5) 表之間的連接順序
6) 語句的并行程度
2、HINT可以基于以下規則產生作用
表連接的順序、表連接的方法、訪問路徑、并行度
3、HINT應用范圍
dml語句
查詢語句
4、語法
{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */
or
{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...
如果語(句)法不對,則ORACLE會自動忽略所寫的HINT,不報錯
1. /*+ALL_ROWS*/
表明對語句塊選擇基于開銷的優化方法,并獲得最佳吞吐量,使資源消耗最小化.
例如:
SELECT /*+ALL_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
2. /*+FIRST_ROWS*/
表明對語句塊選擇基于開銷的優化方法,并獲得最佳響應時間,使資源消耗最小化.
例如:
SELECT /*+FIRST_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
3. /*+CHOOSE*/
表明如果數據字典中有訪問表的統計信息,將基于開銷的優化方法,并獲得最佳的吞吐量;
表明如果數據字典中沒有訪問表的統計信息,將基于規則開銷的優化方法;
例如:
SELECT /*+CHOOSE*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
4. /*+RULE*/
表明對語句塊選擇基于規則的優化方法.
例如:
SELECT /*+ RULE */ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT';
5. /*+FULL(TABLE)*/
表明對表選擇全局掃描的方法.
例如:
SELECT /*+FULL(A)*/ EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO='SCOTT';
6. /*+ROWID(TABLE)*/
提示明確表明對指定表根據ROWID進行訪問.
例如:
SELECT /*+ROWID(BSEMPMS)*/ * FROM BSEMPMS WHERE ROWID>='AAAAAAAAAAAAAA'
AND EMP_NO='SCOTT';
7. /*+CLUSTER(TABLE)*/
提示明確表明對指定表選擇簇掃描的訪問方法,它只對簇對象有效.
例如:
SELECT /*+CLUSTER */ BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS,BSDPTMS
WHERE DPT_NO='TEC304' AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
8. /*+INDEX(TABLE INDEX_NAME)*/
表明對表選擇索引的掃描方法.
例如:
SELECT /*+INDEX(BSEMPMS SEX_INDEX) USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS */ FROM BSEMPMS WHERE SEX='M';
9. /*+INDEX_ASC(TABLE INDEX_NAME)*/
表明對表選擇索引升序的掃描方法.
例如:
SELECT /*+INDEX_ASC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';
10. /*+INDEX_COMBINE*/
為指定表選擇位圖訪問路經,如果INDEX_COMBINE中沒有提供作為參數的索引,將選擇出位圖索引的布爾組合方式.
例如:
SELECT /*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/ * FROM BSEMPMS
WHERE SAL<5000000 AND HIREDATE
11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/
提示明確命令優化器使用索引作為訪問路徑.
例如:
SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE
FROM BSEMPMS WHERE SAL<60000;
12. /*+INDEX_DESC(TABLE INDEX_NAME)*/
表明對表選擇索引降序的掃描方法.
例如:
SELECT /*+INDEX_DESC(BSEMPMS PK_BSEMPMS) */ FROM BSEMPMS WHERE DPT_NO='SCOTT';
13. /*+INDEX_FFS(TABLE INDEX_NAME)*/
對指定的表執行快速全索引掃描,而不是全表掃描的辦法.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_EMPNAM)*/ * FROM BSEMPMS WHERE DPT_NO='TEC305';
14. /*+ADD_EQUAL TABLE INDEX_NAM1,INDEX_NAM2,...*/
提示明確進行執行規劃的選擇,將幾個單列索引的掃描合起來.
例如:
SELECT /*+INDEX_FFS(BSEMPMS IN_DPTNO,IN_EMPNO,IN_SEX)*/ * FROM BSEMPMS WHERE EMP_NO='SCOTT' AND DPT_NO='TDC306';
15. /*+USE_CONCAT*/
對查詢中的WHERE后面的OR條件進行轉換為UNION ALL的組合查詢.
例如:
SELECT /*+USE_CONCAT*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
16. /*+NO_EXPAND*/
對于WHERE后面的OR 或者IN-LIST的查詢語句,NO_EXPAND將阻止其基于優化器對其進行擴展.
例如:
SELECT /*+NO_EXPAND*/ * FROM BSEMPMS WHERE DPT_NO='TDC506' AND SEX='M';
17. /*+NOWRITE*/
禁止對查詢塊的查詢重寫操作.
18. /*+REWRITE*/
可以將視圖作為參數.
19. /*+MERGE(TABLE)*/
能夠對視圖的各個查詢進行相應的合并.
例如:
SELECT /*+MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELET DPT_NO
,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO
AND A.SAL>V.AVG_SAL;
20. /*+NO_MERGE(TABLE)*/
對于有可合并的視圖不再合并.
例如:
SELECT /*+NO_MERGE(V) */ A.EMP_NO,A.EMP_NAM,B.DPT_NO FROM BSEMPMS A (SELECT DPT_NO,AVG(SAL) AS AVG_SAL FROM BSEMPMS B GROUP BY DPT_NO) V WHERE A.DPT_NO=V.DPT_NO AND A.SAL>V.AVG_SAL;
21. /*+ORDERED*/
根據表出現在FROM中的順序,ORDERED使ORACLE依此順序對其連接.
例如:
SELECT /*+ORDERED*/ A.COL1,B.COL2,C.COL3 FROM TABLE1 A,TABLE2 B,TABLE3 C WHERE A.COL1=B.COL1 AND B.COL1=C.COL1;
22. /*+USE_NL(TABLE)*/
將指定表與嵌套的連接的行源進行連接,并把指定表作為內部表.
例如:
SELECT /*+ORDERED USE_NL(BSEMPMS)*/ BSDPTMS.DPT_NO,BSEMPMS.EMP_NO,BSEMPMS.EMP_NAM FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
23. /*+USE_MERGE(TABLE)*/
將指定的表與其他行源通過合并排序連接方式連接起來.
例如:
SELECT /*+USE_MERGE(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
24. /*+USE_HASH(TABLE)*/
將指定的表與其他行源通過哈希連接方式連接起來.
例如:
SELECT /*+USE_HASH(BSEMPMS,BSDPTMS)*/ * FROM BSEMPMS,BSDPTMS WHERE BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;
25. /*+DRIVING_SITE(TABLE)*/
強制與ORACLE所選擇的位置不同的表進行查詢執行.
例如:
SELECT /*+DRIVING_SITE(DEPT)*/ * FROM BSEMPMS,DEPT@BSDPTMS WHERE BSEMPMS.DPT_NO=DEPT.DPT_NO;
26. /*+LEADING(TABLE)*/
將指定的表作為連接次序中的首表.
27. /*+CACHE(TABLE)*/
當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩沖區緩存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) CAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
28. /*+NOCACHE(TABLE)*/
當進行全表掃描時,CACHE提示能夠將表的檢索塊放置在緩沖區緩存中最近最少列表LRU的最近使用端
例如:
SELECT /*+FULL(BSEMPMS) NOCAHE(BSEMPMS) */ EMP_NAM FROM BSEMPMS;
29. /*+APPEND*/
直接插入到表的最后,可以提高速度.
insert /*+append*/ into test1 select * from test4 ;
30. /*+NOAPPEND*/
通過在插入語句生存期內停止并行模式來啟動常規插入.
insert /*+noappend*/ into test1 select * from test4 ;
31. NO_INDEX: 指定不使用哪些索引
/*+ NO_INDEX ( table [index [index]...] ) */
select /*+ no_index(emp ind_emp_sal ind_emp_deptno)*/ * from emp where deptno=200 and sal>300;
32. parallel
select /*+ parallel(emp,4)*/ * from emp where deptno=200 and sal>300;
另:每個SELECT/INSERT/UPDATE/DELETE命令后只能有一個/*+ */,但提示內容可以有多個,可以用逗號分開,空格也可以。
如:/*+ ordered index() use_nl() */
---------
類似如下的一條語句:insert into xxxx select /*+parallel(a) */ * from xxx a;數據量大約在75G左右,這位兄弟從上午跑到下午還沒跑完,過來問我咋回事,說平常2hrs能跑完的東西跑了好幾個小時還撒動靜。查看系統性能也比較 正常,cpu,io都不繁忙,平均READ速度在80M/s左右(勉強湊合),但平均寫速度只有10M不到。等待事件里面大量的‘ ‘PX Deq Credit: send blkd’,這里能看出并行出了問題,從而最后得知是并行用法有問題,修改之后20分鐘完成了該操作。正確的做法應該是:
alter session enable dml parallel;
insert /*+parallel(xxxx,4) */ into xxxx select /*+parallel(a) */ * from xxx a;
因為oracle默認并不會打開PDML,對DML語句必須手工啟用。 另外不得不說的是,并行不是一個可擴展的特性,只有在數據倉庫或作為DBA等少數人的工具在批量數據操作時利于充分利用資源,而在OLTP環境下使用并行 需要非常謹慎。事實上PDML還是有比較多的限制的,例如不支持觸發器,引用約束,高級復制和分布式事務等特性,同時也會帶來額外的空間占用,PDDL同 樣是如此。有關Parallel excution可參考官方文檔,在Thomas Kyte的新書《Expert Oracle Database architecture》也有精辟的講述。
---------
select count(*)
From wid_serv_prod_mon_1100 a
where a.acct_month = 201010
and a.partition_id = 10
and serv_state not in ('2HB', '2HL', '2HJ', '2HP', '2HF')
and online_flag in (0)
and incr_product_id in (2000020)
and product_id in (2020966, 2020972, 2100297, 2021116)
and billing_mode_id = 1
and exp_date > to_date('201010', 'yyyymm')
and not exists (select /*+no_index (b IDX_W_CDR_MON_SERV_ID_1100)*/
1
from wid_cdr_mon_1100 b
where b.acct_month = 201010
and b.ANA_EVENT_TYPE_4 in
('10201010201', '10202010201', '10203010201', '10203010202', '10203030201', '10203030202', '10204010201', '10204010202', '10204030201')
and a.serv_id = b.serv_id)