阿里巴巴數(shù)據(jù)時(shí)庫操作手冊_第1頁
阿里巴巴數(shù)據(jù)時(shí)庫操作手冊_第2頁
阿里巴巴數(shù)據(jù)時(shí)庫操作手冊_第3頁
阿里巴巴數(shù)據(jù)時(shí)庫操作手冊_第4頁
阿里巴巴數(shù)據(jù)時(shí)庫操作手冊_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、阿里巴巴數(shù)據(jù)庫標(biāo)準(zhǔn)操作手冊01-建表一、 目的明確建表操作的風(fēng)險(xiǎn)及標(biāo)準(zhǔn)流程,最大限度避免建表操作帶來的故障。二、 適用范圍l 項(xiàng)目預(yù)發(fā)布新建表l 項(xiàng)目正式發(fā)布新建表l 不包含數(shù)據(jù)訂正所建臨時(shí)表l 不包含導(dǎo)數(shù)據(jù)所建的中間表三、 風(fēng)險(xiǎn)評估l 登錄到錯(cuò)誤的schema下,導(dǎo)致表建到錯(cuò)誤的schema里,而應(yīng)用無法訪問。l 忽略了tablespace參數(shù),導(dǎo)致表建到了默認(rèn)表空間,導(dǎo)致后續(xù)空間增長和維護(hù)困難。l 對于未來增量較快的表選擇了一個(gè)空間規(guī)劃不足的表空間,導(dǎo)致后續(xù)空間增長和維護(hù)困難。l 腳本末尾缺少分號(hào),導(dǎo)致該表沒有被創(chuàng)建上,而執(zhí)行ddl的過程又不會(huì)報(bào)錯(cuò)。l 其他原因漏建了表,導(dǎo)致應(yīng)用訪問錯(cuò)誤。

2、l 所建的表定義(表名、字段名、字段定義、字段個(gè)數(shù)、字段順序)跟測試環(huán)境不一致,導(dǎo)致應(yīng)用訪問錯(cuò)誤。l 同步庫沒有及時(shí)創(chuàng)建相應(yīng)的表,或者沒有更新同步配置,導(dǎo)致同步及應(yīng)用出問題。四、 操作流程1. 準(zhǔn)備工作a) 在項(xiàng)目需求分析階段,跟數(shù)據(jù)庫設(shè)計(jì)人員一起明確新表所存放的數(shù)據(jù)庫。具體設(shè)計(jì)原則本文不繁述。b) 準(zhǔn)備發(fā)布腳本時(shí),檢查tablespace定義,檢查tablespace剩余空間,參考表空間自身負(fù)荷及新表的預(yù)期負(fù)荷,為每個(gè)新建的表選擇合適的表空間,并在建表語句中添加tablespace的配置。c) 定發(fā)布計(jì)劃時(shí),跟開發(fā)接口人一起商定好建表操作的時(shí)間點(diǎn)。如小需求沒有發(fā)布計(jì)劃評審,則必須在提交測試時(shí)

3、(即表結(jié)構(gòu)凍結(jié)時(shí))即開始與開發(fā)接口人確定建表時(shí)間點(diǎn)。如果發(fā)生計(jì)劃外的發(fā)布建表需求,則要追究項(xiàng)目跟進(jìn)的應(yīng)用dba溝通不力的責(zé)任。d) 以目前的認(rèn)知,僅建表操作本身不會(huì)對數(shù)據(jù)庫造成任何風(fēng)險(xiǎn),故操作的時(shí)間點(diǎn)可以放寬:在變更時(shí)間窗口內(nèi),均可以執(zhí)行建表操作。e) 建表操作屬于預(yù)授權(quán)變更,在做之前必須在itil中提交相應(yīng)的變更申請。2. 執(zhí)行過程 a) 用應(yīng)用賬戶登錄數(shù)據(jù)庫,show user檢查是否連接到正確的schema。嚴(yán)禁使用sys、system等用戶建表。b) 執(zhí)行建表腳本。若一次建表個(gè)數(shù)超過三個(gè)以上,要求將腳本事先保存為文本文件,上傳至數(shù)據(jù)庫服務(wù)器,執(zhí)行時(shí)使用 create_table_ddl

4、.sql的方式直接執(zhí)行。c) 查看過程若無報(bào)錯(cuò),退出當(dāng)前登錄。若有報(bào)錯(cuò),找出報(bào)錯(cuò)的地方,修改確認(rèn)再執(zhí)行,直至全部執(zhí)行通過,最后退出當(dāng)前登錄。3. 驗(yàn)證方案a) 常規(guī)檢查:dbcheckb) 檢查表定義是否與測試庫一致:exec pkg_check.compareobject(user,table_name);c) 立即聯(lián)系開發(fā)接口人進(jìn)行應(yīng)用測試,【建表】變更是否成功以應(yīng)用測試結(jié)果為準(zhǔn)。d) 同步庫若建表,也需要執(zhí)行 a) 和 b) 兩個(gè)步驟。02-數(shù)據(jù)訂正一、 目的明確【數(shù)據(jù)訂正】操作的種類、風(fēng)險(xiǎn),并根據(jù)各種類型的數(shù)據(jù)訂正制定完善的步驟和回退方案,最大限度減少此類操作帶來的故障。二、 適用范圍

5、l 新建表數(shù)據(jù)初始化l 現(xiàn)有表新增數(shù)據(jù)l 現(xiàn)有表刪除數(shù)據(jù)l 現(xiàn)有表上新增字段初始化l 現(xiàn)有表上現(xiàn)有字段值修改三、 風(fēng)險(xiǎn)評估l 業(yè)務(wù)風(fēng)險(xiǎn):訂正本身所包含的業(yè)務(wù)不正確,導(dǎo)致給客戶給公司帶來損失。l 程序風(fēng)險(xiǎn):訂正本身業(yè)務(wù)正確,但是應(yīng)用程序無法兼容訂正的數(shù)據(jù),導(dǎo)致應(yīng)用出錯(cuò)。l 數(shù)據(jù)庫風(fēng)險(xiǎn):訂正本身業(yè)務(wù)正確,應(yīng)用程序也可以兼容,但是訂正速度過快、訂正并發(fā)壓力過大,導(dǎo)致數(shù)據(jù)庫無法正常提供服務(wù)。通常會(huì)造成表空間耗盡、undo消耗過快、archive增長過快、備庫恢復(fù)壓力大等問題。l 溝通風(fēng)險(xiǎn):在業(yè)務(wù)方-開發(fā)接口人-dba三方的溝通交流過程中,信息傳遞錯(cuò)誤或者不及時(shí),導(dǎo)致最終訂正的數(shù)據(jù)沒有達(dá)到預(yù)期的目的。l

6、 回滾風(fēng)險(xiǎn):主要是因?yàn)闃I(yè)務(wù)方的原因,訂正完成一段時(shí)間后要求回退,若在訂正前沒有備份原始數(shù)據(jù),則可能導(dǎo)致無法順利回退或者回退難度極大,給客戶給公司帶來損失。l 同步風(fēng)險(xiǎn):各類同步架構(gòu)下,數(shù)據(jù)訂正可能導(dǎo)致同步堆積和同步延時(shí),影響正常同步業(yè)務(wù),所以有些大規(guī)模訂正必須要正確屏蔽同步,并在多個(gè)庫分別執(zhí)行相同的訂正腳本。l 緩存:有些表在應(yīng)用層面做了緩存,制定訂正計(jì)劃的時(shí)候要考慮到訂正后是否需要更新緩存。四、 操作流程1. 準(zhǔn)備工作a) 需求分析階段確認(rèn)項(xiàng)目涉及的數(shù)據(jù)訂正范圍和數(shù)據(jù)量。b) 跟開發(fā)人員確定訂正后是否涉及到對緩存的刷新和訂正。c) 根據(jù)數(shù)據(jù)量評估對數(shù)據(jù)同步的影響,決定是否屏蔽同步。(應(yīng)用db

7、a必須熟悉同步采用的技術(shù)、正常情況下的同步量和延時(shí)、可以容忍的同步延時(shí)、屏蔽同步的具體方法。)d) 注意規(guī)劃訂正速度,以防undo消耗殆盡。e) 訂正腳本:i. 開發(fā)接口人直接提供可執(zhí)行的sql腳本,dba只負(fù)責(zé)拷貝執(zhí)行。ii. 開發(fā)接口人提供主鍵及更新字段新值列表,由dba導(dǎo)入數(shù)據(jù)庫,寫sql腳本關(guān)聯(lián)原表批量訂正。iii. 開發(fā)接口人提供訂正邏輯,由dba翻譯為批量提交sql腳本。iv. 訂正腳本要求可斷點(diǎn)續(xù)跑,可反復(fù)執(zhí)行。v. 嚴(yán)禁僅用一個(gè)事務(wù)來處理大規(guī)模訂正(影響的記錄數(shù)超過1萬筆)。超過一萬筆的訂正必須分段提交。vi. 確認(rèn)訂正腳本的執(zhí)行計(jì)劃正確。vii. 腳本中加入“進(jìn)度報(bào)告”,即調(diào)

8、用如下包(但是對于trigger中判斷client_info的不允許這樣處理。):dbms_application_info.set_client_info(n | rows commit.);n為變量,累加,表示當(dāng)前訂正的總記錄數(shù)。f) 開發(fā)階段跟開發(fā)接口人確認(rèn)數(shù)據(jù)訂正邏輯,完成訂正腳本,并跟開發(fā)接口人確認(rèn)腳本是否正確,同時(shí)按照需求準(zhǔn)備備份腳本。g) 測試階段在測試庫執(zhí)行訂正腳本,由開發(fā)接口人和測試人員驗(yàn)證訂正的正確性,應(yīng)用dba協(xié)助驗(yàn)證。h) 發(fā)布前確定訂正速度和并發(fā)度,確定訂正時(shí)間段,預(yù)估訂正總時(shí)長,若涉及量較大,需要跨天做訂正,則應(yīng)規(guī)劃好每日訂正的數(shù)據(jù)量和時(shí)間段。i) 備份要求:i.

9、新建表初始化:無需備份,回退時(shí)直接truncate即可。ii. 現(xiàn)有表新增數(shù)據(jù):新建備份表記錄下新增記錄的主鍵,或者在新增記錄中特定字段標(biāo)識(shí)區(qū)分出訂正所新增的數(shù)據(jù),回退時(shí)定向delete這些記錄。iii. 現(xiàn)有表刪除數(shù)據(jù):新建備份表記錄下刪除數(shù)據(jù)的完整記錄,回退時(shí)直接從備份表中取出數(shù)據(jù)insert到原表。iv. 現(xiàn)有表上新增字段初始化:無需備份,回退時(shí)將該字段update為null或者開發(fā)接口人要求的值。不得將刪除字段作為回退手段。v. 現(xiàn)有表上現(xiàn)有字段值修改:新建備份表記錄下所改動(dòng)記錄的主鍵及所改動(dòng)字段的原始值,回退時(shí)將改動(dòng)過的字段按照主鍵更新到原表(若應(yīng)用程序在回滾前已經(jīng)修改了記錄,則要根

10、據(jù)具體業(yè)務(wù)具體分析回滾方案)。vi. 備份表:備份表統(tǒng)一命名為 table_name_bak_mmdd_operator,最后的operator為操作dba的姓名每個(gè)字的首字母,如果超長了,則將原表名縮減。創(chuàng)建人有責(zé)任定期刪除創(chuàng)建時(shí)間超過一個(gè)月以上的備份表。2. 執(zhí)行過程 a) 如果需要,按照備份腳本備份數(shù)據(jù)。b) 執(zhí)行訂正腳本。查看訂正進(jìn)度,使用如下腳本:select client_info from v$session where client_info is not null;這個(gè)腳本必須配合前面描述的“進(jìn)度報(bào)告”腳本執(zhí)行。c) 檢查undo消耗: undod) 檢查表空間消耗: tbs

11、e) 檢查歸檔空間f) 檢查同步延時(shí)是否異常。g) 如果需要刷新應(yīng)用緩存,在訂正結(jié)束后通知應(yīng)用刷新緩存。3. 驗(yàn)證方案a) 以應(yīng)用驗(yàn)證為主,數(shù)據(jù)庫輔助做一些count等驗(yàn)證。以應(yīng)用驗(yàn)證通過為操作成功標(biāo)準(zhǔn)。五、 核心對象風(fēng)險(xiǎn)l 考慮到對erosa和otter的影響,嚴(yán)禁數(shù)據(jù)訂正更新主鍵值。六、 回退方案按照備份時(shí)所做的各種不同的回退方案進(jìn)行回退,回退之后也要要求應(yīng)用做驗(yàn)證。03-創(chuàng)建、刪除、修改sequence一、 目的明確定義對于sequence對象的操作風(fēng)險(xiǎn)及步驟。二、 適用范圍l 項(xiàng)目發(fā)布創(chuàng)建新sequence。l 以刪除、重建的方式修改sequence的起始值。l 在線修改sequenc

12、e的cache值。三、 風(fēng)險(xiǎn)評估l sequence命名與應(yīng)用程序中不一致,導(dǎo)致應(yīng)用無法正常訪問sequence。l 雙向同步的庫,多庫創(chuàng)建同名sequence,起始值和步長值設(shè)置不合理,導(dǎo)致生成的值在表中對應(yīng)主鍵值同步產(chǎn)生沖突。l 刪除、重建sequence的過程中,應(yīng)用無法訪問sequence,高并發(fā)的應(yīng)用可能會(huì)產(chǎn)生故障。l 刪除、重建sequence之后沒有對sequence的權(quán)限進(jìn)行恢復(fù),導(dǎo)致原本訪問該sequence的其他schema無法正常訪問。l sequence的cache設(shè)置不合理,設(shè)置過小會(huì)導(dǎo)致大量的系統(tǒng)相關(guān)等待,反之則導(dǎo)致sequence生成值斷層過多浪費(fèi)嚴(yán)重。l jav

13、a程序的int16數(shù)據(jù)類型只能容納最大21億,所以sequence不能超過這個(gè)值,如果有可能超過,需要跟開發(fā)確認(rèn)。四、 操作流程1. 準(zhǔn)備工作a) 默認(rèn)使用變更系統(tǒng)生成的sequence名稱,如果要修改,必須跟開發(fā)人員溝通一致。b) 與開發(fā)人員、項(xiàng)目發(fā)布負(fù)責(zé)人溝通變更時(shí)間點(diǎn)。對于刪除、重建的操作必須明確告訴他們其間會(huì)有短暫的無法訪問,如果是高并發(fā)的應(yīng)用則選擇在系統(tǒng)訪問量最低的時(shí)候執(zhí)行,規(guī)避風(fēng)險(xiǎn)。c) 根據(jù)并發(fā)數(shù)確定cache值,默認(rèn)為100,如遇特殊需求,酌情調(diào)整。d) 刪除、重建的操作,事先檢查是否有其他schema擁有對于該sequence的訪問權(quán)限:select grantee, own

14、er, table_name, privilegefrom dba_tab_privswhere table_name = upper(重建的對象名);e) 全面考慮同步的風(fēng)險(xiǎn),確定同步環(huán)節(jié)中各個(gè)數(shù)據(jù)庫的同名sequence起始值及步長,保證不會(huì)發(fā)生沖突,通常有如下兩種做法:i. 起始值相差不大,步長值等于數(shù)據(jù)庫個(gè)數(shù)。以雙庫同步為例,起始值分別設(shè)為1和2,步長均設(shè)為2。ii. 起始值相距較大,步長值相同。以雙庫同步為例,a庫起始值設(shè)為1,b庫起始值設(shè)為2億,步長均設(shè)為1。相差的值可以根據(jù)增長預(yù)期進(jìn)行調(diào)整。2. 執(zhí)行過程 a) 標(biāo)準(zhǔn)新建腳本:create sequence seq_tablena

15、me start with 1 cache 100;命名規(guī)范: seq_tablename默認(rèn)不指定recycle和max value。b) 標(biāo)準(zhǔn)重建腳本:drop sequence seq_tablename ;create sequence seq_tablename start with 1 cache 100;為了盡量縮短sequence不可用時(shí)間,這兩個(gè)語句一起放在securecrt的chartwindow中一起執(zhí)行。c) 標(biāo)準(zhǔn)修改cache腳本:alter sequence seq_tablename cache 200;d) 標(biāo)準(zhǔn)賦權(quán)腳本:grant select on seq_

16、tablename to username;3. 驗(yàn)證方案a) dbcheck 檢查是否有失效對象b) 通知應(yīng)用驗(yàn)證是否可以正常訪問sequence五、 核心對象風(fēng)險(xiǎn)高并發(fā)對象重建時(shí)短暫不可訪問;04_增加、刪除唯一約束一、 目的明確增刪唯一約束操作的風(fēng)險(xiǎn)及標(biāo)準(zhǔn)流程,最大限度避免增刪唯一約束操作帶來的故障。二、 適用范圍l 項(xiàng)目發(fā)布新建表的增刪唯一約束l 對于舊表的增刪唯一約束三、 風(fēng)險(xiǎn)評估l 對現(xiàn)有表新增唯一約束的操作,會(huì)堵塞包括查詢在內(nèi)的所有操作,風(fēng)險(xiǎn)很大,請謹(jǐn)慎使用,盡量在新建表時(shí)和開發(fā)討論后增加。l 沒有指定index,系統(tǒng)自動(dòng)創(chuàng)建了index,刪除約束時(shí),自動(dòng)創(chuàng)建的index同時(shí)刪除

17、了。l 在高峰期創(chuàng)建,導(dǎo)致大量的library cache lock/pin的等待l 有同步的應(yīng)用,先要在源端加,后在目標(biāo)端加。l 表里有重復(fù)的數(shù)據(jù),導(dǎo)致操作失敗。四、 操作流程1. 準(zhǔn)備工作a) 檢查唯一建字段上是否存在index。沒有的話,需首先創(chuàng)建index( 步驟詳見增加index手冊)。 b) 檢查唯一鍵上是否有重復(fù)數(shù)據(jù),如有,需和開發(fā)討論如何處理。c) 根據(jù)應(yīng)用的需求和數(shù)據(jù)庫的負(fù)載情況,確定操作的時(shí)間點(diǎn)。對于數(shù)據(jù)量和訪問量較大的表,變更時(shí)間點(diǎn)要謹(jǐn)慎選擇.d) 檢查字段上是否已經(jīng)有了約束。e) 增加和刪除唯一約束屬于標(biāo)準(zhǔn)變更,需要開發(fā)在itil中提交事件單,應(yīng)用dba提交變更單,有技

18、術(shù)經(jīng)理審批后執(zhí)行。f) 對現(xiàn)有表新增約束,如果使用validate這個(gè)參數(shù),會(huì)導(dǎo)致該表上連查詢在內(nèi)的所有操作都被鎖住,風(fēng)險(xiǎn)非常大;如果使用novalidate參數(shù),這個(gè)參數(shù)會(huì)導(dǎo)致數(shù)據(jù)字典不一致(及導(dǎo)致sqlldr的時(shí)候會(huì)導(dǎo)入重復(fù)數(shù)據(jù))。兩者相比,故通常情況下用validate的風(fēng)險(xiǎn)更大,默認(rèn)必須使用novalidate參數(shù)。g) 約束名與所依賴索引名一致。2. 執(zhí)行過程 a) 用應(yīng)用賬戶登錄數(shù)據(jù)庫,show user檢查是否連接到正確的schema。b) 執(zhí)行增加或刪除的命令。命令模板如下:alter table 表名 add constraint 表名_uk unique (字段名) usi

19、ng index 索引名 novalidate;alter table 表名 drop constraint 約束名 keep index;如有otter同步,要注意執(zhí)行順序:先在源數(shù)據(jù)庫端加后在目標(biāo)端增加。c) 查看過程若無報(bào)錯(cuò),退出當(dāng)前登錄。若有報(bào)錯(cuò),找出報(bào)錯(cuò)的地方,修改確認(rèn)再執(zhí)行,直至全部執(zhí)行通過,最后退出當(dāng)前登錄。3. 驗(yàn)證方案a) 常規(guī)檢查:dbcheckb) 檢查表定義是否與測試庫一致:exec pkg_check.compareobject(user,table_name);c) 檢查約束是否加上或刪除:select* fromdba_cons_columns wheretabl

20、e_name=upper(table_name)五、 核心對象風(fēng)險(xiǎn)1. 核心表訪問量大,數(shù)據(jù)量大。增加唯一約束時(shí)會(huì)短暫出現(xiàn)library cache pin/lock。執(zhí)行時(shí)間要訂在核心表訪問的低峰期。六、 回退方案1. 執(zhí)行前需準(zhǔn)備好回退的腳本。2. 回退時(shí)需得到開發(fā)的確認(rèn),并確認(rèn)回退的時(shí)間點(diǎn)。05-加字段一、 目的闡述表變更的風(fēng)險(xiǎn)及其步驟,降低對應(yīng)用的影響和避免故障。二、 適用范圍l 所有在使用的表的加字段三、 風(fēng)險(xiǎn)評估l 新增字段的類型、長度(精度)是否合適解決方法:跟應(yīng)用明確加字段和改字段的風(fēng)險(xiǎn),確認(rèn)新增字段類型正確、長度(精度)合適。以及跟應(yīng)用明確老數(shù)據(jù)是否要訂正?如何訂正?新增列是

21、否非空?是否有默認(rèn)值等等。l 新增字段的非空屬性、默認(rèn)值以及老數(shù)據(jù)問題。新增字段如果是not null的,則一定要有默認(rèn)值,否則老應(yīng)用的insert代碼可能報(bào)錯(cuò)。表如果存在老數(shù)據(jù),帶上默認(rèn)值的時(shí)候會(huì)導(dǎo)致oracle去訂正老的數(shù)據(jù)行的新增列。如果老數(shù)據(jù)非常多,表的并發(fā)訪問高,很有可能導(dǎo)致大面積的阻塞等待以及產(chǎn)生大事務(wù),甚至有可能導(dǎo)致undo耗盡。倘若回滾,還會(huì)因?yàn)榛貪L產(chǎn)生的并發(fā)會(huì)話導(dǎo)致load飆升。解決方法:先不帶not null不帶默認(rèn)值加上列,再更改列默認(rèn)值,再批量訂正老數(shù)據(jù),然后再加上not null屬性。如果是大表,并且并發(fā)訪問很高的表,則新增列不允許為not null,以簡化后面變更步

22、驟,降低風(fēng)險(xiǎn)!l 新增字段導(dǎo)致依賴對象失效、sql游標(biāo)失效問題。表的dml并發(fā)很高的時(shí)候,如果表上面還有依賴對象,新增字段會(huì)導(dǎo)致依賴對象失效。默認(rèn)其他dml會(huì)話會(huì)嘗試去自動(dòng)編譯這個(gè)依賴對象,此時(shí)很可能會(huì)出現(xiàn)大面積的library cache pin。應(yīng)用會(huì)話的連接時(shí)間會(huì)加長,進(jìn)而導(dǎo)致出現(xiàn)后續(xù)應(yīng)用報(bào)不能取得連接池錯(cuò)誤。應(yīng)用服務(wù)器load由此飆升。表新增字段也會(huì)導(dǎo)致跟該表有關(guān)的sql的游標(biāo)失效,如果sql的并發(fā)很高(查詢sql或者dml sql),失效后sql會(huì)重新解析,此時(shí)也可能會(huì)出現(xiàn)大量的library cache pin & library cache lock。解決方法:選擇在業(yè)務(wù)

23、低峰期發(fā)布,同時(shí)在數(shù)據(jù)庫級別開啟trigger禁用客戶端程序自動(dòng)編譯功能,字段加完后再禁用該trigger。l 表的依賴對象是否要相應(yīng)調(diào)整。表上面的依賴對象如果有存儲(chǔ)過程或觸發(fā)器等,邏輯是否需要相應(yīng)調(diào)整。l 是否涉及到同步。同步中的表需要兩地都要變更。涉及到erosa的要更新一下數(shù)據(jù)字典。erosa需要重啟一下。l 是否要通知其他關(guān)聯(lián)的部門。如dw, asc或crm等等。有些表很多部門都用,需要溝通約定時(shí)間一起變更。如果有同步方案,同步方案的變更也要考慮。四、 操作流程1. 準(zhǔn)備工作a) 該表的數(shù)據(jù)量以及大小,以及數(shù)據(jù)變更量(按日/時(shí)/分/秒等)b) 該表的并發(fā)訪問數(shù),以及頻率最高的幾種sql

24、的訪問方式2. 執(zhí)行過程以表t1 加字段 col2為例。t1的數(shù)據(jù)量非常大,訪問頻率很高。a) 在sysdba下開啟trigger禁用客戶端自動(dòng)編譯功能。(可選)alter trigger sys.ddl_trigger_for_database enable;b) 變更字段以下加字段同編譯失效對象連著執(zhí)行。編譯時(shí)先編譯trigger再編譯存儲(chǔ)過程或package等conn zzzzzz/aaaalter table t1 add col2 varchar2(20);alter trigger trg_t1_search compile;conn retl/rrralter trigger t

25、rg_t1_sync compile;conn bopsretl/bbbalter trigger trg_t1_sync compile;conn zzzzzz/aaaalter procedure sp_test compile;后面3個(gè)trigger的編譯可以開三個(gè)窗口同時(shí)進(jìn)行。另開一個(gè)窗口,在admin用戶下查看當(dāng)前失效對象dbcheckc) 老數(shù)據(jù)訂正如果需要默認(rèn)值,加上默認(rèn)值alter table t1 modify col2 default y;數(shù)據(jù)訂正存儲(chǔ)過程create or replace procedure sp_dml0214ascursor c1 is select

26、rowed rid, id, col2 from t1 where col2 is null;v_cnt number := 0;beginfor rec_c1 in c1 loopv_cnt := v_cnt + 1;update t1 set col2=y where rowed = rec_c1.rid and id=rec_c1.id;if mod(v_cnt,500)=0 thencommit;dbms_application_info.set_client_info(sp_dml0214 | v_cnt | rows!);end if;end loop;commit;dbms_ap

27、plication_info.set_client_info(sp_dml0214 | v_cnt | rows!);end;/exec sp_dml0214;另開一個(gè)窗口,查看訂正進(jìn)度col machine for a19col status for a12col client_info for a50select sid,serial#,status,machine,client_info,sql_hash_value from v$session where client_info is not null;d) 訂正完后加上not null屬性alter table t1 add col

28、2 not null;e) (國際站 可選)中美都變更,erosa重啟更新erosa數(shù)據(jù)字典./getdict.sh erosa重啟./erctl stop./erctl start3. 驗(yàn)證方案a) 驗(yàn)證sys下的trigger已經(jīng)禁用select owner,trigger_name,status from dba_triggers where owner in (sys) and trigger_name= ddl_trigger_for_database enable;b) 驗(yàn)證結(jié)構(gòu)正確desc zzzzzz.t1c) 驗(yàn)證無失效依賴對象dbcheck 五、 核心對象風(fēng)險(xiǎn)核心對象風(fēng)險(xiǎn)指

29、的是業(yè)務(wù)上重要的表,并且數(shù)據(jù)量很大或表大小很大或并發(fā)訪問數(shù)很高時(shí),變更的潛在風(fēng)險(xiǎn)。前面已經(jīng)闡述。六、 回退方案1. 大表的新增字段不允許回滾。因?yàn)榛貪L即刪掉字段,會(huì)導(dǎo)致鎖表,持續(xù)時(shí)間很長進(jìn)而導(dǎo)致一序列的嚴(yán)重問題。2. 普通表的新增字段如果是發(fā)布失敗,后續(xù)還會(huì)有二次發(fā)布,也不考慮回滾?;蛘咧皇菍ot null屬性拿掉,下次發(fā)布再加上。3. 普通表如果應(yīng)用有足夠的理由要求回滾,則回滾。06-加not null字段一、 目的闡述表變更的風(fēng)險(xiǎn)及其步驟,降低對應(yīng)用的影響和避免故障。二、 適用范圍l 所有在使用的表的加not null字段,但核心表(并發(fā)訪問高的大表不允許加not null)。三、 風(fēng)險(xiǎn)

30、評估l 新增字段的類型、長度(精度)是否合適解決方法:跟應(yīng)用明確加字段和改字段的風(fēng)險(xiǎn),確認(rèn)新增字段類型正確、長度(精度)合適。是否有默認(rèn)值?以及跟應(yīng)用明確老數(shù)據(jù)是否要訂正?如何訂正?l 新增字段的非空屬性、默認(rèn)值以及老數(shù)據(jù)問題。新增字段是not null的,則一定要有默認(rèn)值,否則老應(yīng)用的insert代碼可能報(bào)錯(cuò)。表如果存在老數(shù)據(jù),帶上默認(rèn)值的時(shí)候會(huì)導(dǎo)致oracle去訂正老的數(shù)據(jù)行的新增列。如果老數(shù)據(jù)非常多,表的并發(fā)訪問高,很有可能導(dǎo)致大面積的阻塞等待以及產(chǎn)生大事務(wù),甚至有可能導(dǎo)致undo耗盡。倘若回滾,還會(huì)因?yàn)榛貪L產(chǎn)生的并發(fā)會(huì)話導(dǎo)致load飆升。解決方法:先不帶not null不帶默認(rèn)值加上列

31、,再更改列默認(rèn)值,再批量訂正老數(shù)據(jù),然后再加上not null屬性。如果是大表,并且并發(fā)訪問很高的表,則新增列不允許為not null,以簡化后面變更步驟,降低風(fēng)險(xiǎn)!l 新增字段導(dǎo)致依賴對象失效、sql游標(biāo)失效問題。表的dml并發(fā)很高的時(shí)候,如果表上面還有依賴對象,新增字段會(huì)導(dǎo)致依賴對象失效。默認(rèn)訪問這些依賴對象的會(huì)話(如dml會(huì)話,或者應(yīng)用調(diào)存儲(chǔ)過程等)會(huì)嘗試去自動(dòng)編譯這個(gè)依賴對象(9i所有會(huì)話都會(huì)嘗試去編譯,10g以后只有一個(gè)會(huì)話去主動(dòng)編譯,其他等待),此時(shí)很可能會(huì)出現(xiàn)大面積的library cache pin。應(yīng)用會(huì)話的連接時(shí)間會(huì)加長,進(jìn)而導(dǎo)致出現(xiàn)后續(xù)應(yīng)用報(bào)不能取得連接池錯(cuò)誤。應(yīng)用服務(wù)器

32、load由此飆升。表新增字段也會(huì)導(dǎo)致跟該表有關(guān)的sql的游標(biāo)失效,如果sql的并發(fā)很高(查詢sql或者dml sql),失效后sql會(huì)重新解析,此時(shí)也可能會(huì)出現(xiàn)大量的library cache pin & library cache lock。解決方法:選擇在業(yè)務(wù)低峰期發(fā)布,同時(shí)在數(shù)據(jù)庫級別開啟trigger禁用客戶端程序自動(dòng)編譯功能,字段加完后再禁用該trigger。l 表的依賴對象是否要相應(yīng)調(diào)整。表上面的依賴對象如果有存儲(chǔ)過程或觸發(fā)器等,邏輯是否需要相應(yīng)調(diào)整。l 是否涉及到同步。同步中的表需要兩地都要變更。涉及到erosa的要更新一下數(shù)據(jù)字典。erosa需要重啟一下。l 是否要通知

33、其他關(guān)聯(lián)的部門。如dw, asc或crm等等。有些表很多部門都用,需要溝通約定時(shí)間一起變更。如果有同步方案,同步方案的變更也要考慮。l 表結(jié)構(gòu)變更后應(yīng)用需要重啟。應(yīng)用端緩存的表結(jié)構(gòu)跟實(shí)際結(jié)構(gòu)有沖突報(bào)錯(cuò)。四、 操作流程1. 準(zhǔn)備工作a) 該表的數(shù)據(jù)量以及大小,以及數(shù)據(jù)變更量(按日/時(shí)/分/秒等)b) 該表的并發(fā)訪問數(shù),以及頻率最高的幾種sql的訪問方式2. 執(zhí)行過程以表t1 加字段 col2為例。t1的數(shù)據(jù)量非常大,訪問頻率很高。a) 在sysdba下開啟trigger禁用客戶端自動(dòng)編譯功能。(可選)alter trigger sys.ddl_trigger_for_database enabl

34、e;b) 變更字段以下加字段同編譯失效對象連著執(zhí)行。編譯時(shí)先編譯trigger再編譯存儲(chǔ)過程或package等conn zzzzzz/aaaalter table t1 add col2 varchar2(20);如果需要默認(rèn)值,加上默認(rèn)值alter table t1 modify col2 default y;alter trigger trg_t1_search compile;conn retl/rrralter trigger trg_t1_sync compile;conn bopsretl/bbbalter trigger trg_t1_sync compile;conn zzzz

35、zz/aaaalter procedure sp_test compile;另開一個(gè)窗口,在admin用戶下查看當(dāng)前失效對象dbcheckc) 禁用ddl triggeralter trigger sys.ddl_trigger_for_database disable;d) 老數(shù)據(jù)訂正數(shù)據(jù)訂正存儲(chǔ)過程create or replace procedure sp_dml0214ascursor c1 is select rowed rid, id, col2 from t1 where col2 is null;v_cnt number := 0;beginfor rec_c1 in c1 l

36、oopv_cnt := v_cnt + 1;update t1 set col2=y where rowid = rec_c1.rid and id=rec_c1.id;if mod(v_cnt,500)=0 thencommit;end if;end loop;commit;end;/exec sp_dml0214;另開一個(gè)窗口,用sqlinfo腳本查看訂正進(jìn)度e) 訂正完后加上not null屬性(核心表不要做了),風(fēng)險(xiǎn)和步驟詳情參見文檔:4.增加、刪除唯一約束alter table t1 modify col2 not null;f) 表涉及到同步后,再多個(gè)節(jié)點(diǎn)變更,erosa是否重啟取

37、決于erosa版本。更新erosa數(shù)據(jù)字典./getdict.sh erosa重啟./erctl stop./erctl start3. 驗(yàn)證方案a) 驗(yàn)證sys下的trigger已經(jīng)禁用select owner,trigger_name,status from dba_triggers where owner in (sys) and trigger_name=upper( ddl_trigger_for_database);b) 驗(yàn)證結(jié)構(gòu)正確desc zzzzzz.t1c) 驗(yàn)證無失效依賴對象dbcheck d) 跟測試庫比對。五、 核心對象風(fēng)險(xiǎn)核心對象風(fēng)險(xiǎn)指的是業(yè)務(wù)上重要的表,并且數(shù)據(jù)量

38、很大或表大小很大或并發(fā)訪問數(shù)很高時(shí),變更的潛在風(fēng)險(xiǎn)。前面已經(jīng)闡述。六、 回退方案1. 大表的新增字段不允許回滾。因?yàn)榛貪L即刪掉字段,會(huì)導(dǎo)致鎖表,持續(xù)時(shí)間很長進(jìn)而導(dǎo)致一序列的嚴(yán)重問題。2. 普通表的新增字段如果是發(fā)布失敗,后續(xù)還會(huì)有二次發(fā)布,也不考慮回滾?;蛘咧皇菍ot null屬性拿掉,下次發(fā)布再加上。3. 普通表如果應(yīng)用有足夠的理由要求回滾,則回滾07-賦權(quán)一、 目的明確常用賦權(quán)操作標(biāo)準(zhǔn)流程,以及賦權(quán)過程中可能產(chǎn)生的風(fēng)險(xiǎn),最大限度避免賦權(quán)操作帶來的系統(tǒng)故障。二、 適用范圍l 對數(shù)據(jù)庫對象的授權(quán)操作,數(shù)據(jù)庫對象包括表、存儲(chǔ)過程、同義詞、視圖和序列等。授權(quán)類型包括查詢、增刪改、執(zhí)行。l 對數(shù)據(jù)

39、庫用戶的系統(tǒng)授權(quán)操作。三、 風(fēng)險(xiǎn)評估l 對數(shù)據(jù)庫用戶進(jìn)行系統(tǒng)授權(quán)時(shí),需要根據(jù)實(shí)際情況進(jìn)行,避免因?qū)τ脩羰谟柽^高的系統(tǒng)權(quán)限或角色,進(jìn)而使該用戶存在誤操作引發(fā)數(shù)據(jù)庫或應(yīng)用故障的風(fēng)險(xiǎn)。l 對于存儲(chǔ)機(jī)密數(shù)據(jù)的表的授權(quán),需要慎重。以免泄露機(jī)密數(shù)據(jù)。l 對于涉及同步的數(shù)據(jù)庫,需要分別在同步的兩端數(shù)據(jù)庫執(zhí)行相同的授權(quán)操作。l 10g之前版本,grant操作需要獲得exclusive級別的library cache lock/pin。其風(fēng)險(xiǎn)主要針對于procedure、function等,對table基本無影響。若procedure正在執(zhí)行時(shí),對其本身或者其依賴的procedure、function進(jìn)行授權(quán),

40、將阻塞其他要執(zhí)行此procedure或其依賴procedure、function的會(huì)話,直到授權(quán)前正在執(zhí)行的procedure結(jié)束。l 對數(shù)據(jù)庫對象授權(quán)時(shí),不會(huì)引起依賴對象失效,但會(huì)導(dǎo)致library cache中與授權(quán)對象有依賴關(guān)系的游標(biāo)失效,進(jìn)而產(chǎn)生硬解析。如果對象的依賴游標(biāo)過多,或執(zhí)行頻率較高,可能會(huì)對系統(tǒng)造成較大的沖擊,造成cpu繁忙,latch爭用嚴(yán)重,最常引起的latch爭用有 shared pool、library cache還會(huì)有l(wèi)ibrary cache pin、cursor pin s:wait x等爭用出現(xiàn)。如果爭用比較嚴(yán)重,甚至可能導(dǎo)致數(shù)據(jù)庫crash。為避免此類情況出

41、現(xiàn),對于新建對象,應(yīng)盡可能的先把權(quán)限授予給可能會(huì)使用到的用戶;對于在使用的對象,應(yīng)充分評估對象依賴游標(biāo)的個(gè)數(shù)和執(zhí)行次數(shù),選擇執(zhí)行低峰進(jìn)行操作。l 對于grant any table,或者grant dba/ exp_full_database等涉及大量對象的系統(tǒng)授權(quán)操作,應(yīng)該作為重大變更對待,此類操作的風(fēng)險(xiǎn)極大,務(wù)必在業(yè)務(wù)低峰期進(jìn)行操作。四、 操作流程1. 準(zhǔn)備工作a) 確認(rèn)此次授權(quán)是否屬于正常的業(yè)務(wù)需要。b) 若賦予的為系統(tǒng)權(quán)限,禁止使用with admin option選項(xiàng)。c) 若賦予的為對象權(quán)限,請確認(rèn)此對象在數(shù)據(jù)庫中緩存的游標(biāo)個(gè)數(shù),以及每個(gè)游標(biāo)在不同時(shí)段的執(zhí)行頻率,根據(jù)具體的情況選擇

42、合適的變更時(shí)間窗口進(jìn)行授權(quán)。d) 準(zhǔn)備授權(quán)腳本。e) 新建對象的授權(quán)需要走事件流程。f) 在用對象的授權(quán)或涉及大量對象的系統(tǒng)授權(quán)需要走一般變更或重大變更流程。2. 執(zhí)行過程a) 以賦權(quán)對象所在的用戶登錄數(shù)據(jù)庫,show user檢查是否連接到正確的schema。b) 如果被依賴對象的執(zhí)行頻率很高,需要打開ddl trigger.c) 執(zhí)行賦權(quán)腳本。d) 查看過程若無報(bào)錯(cuò),退出當(dāng)前登錄。3. 驗(yàn)證方案,以下列舉兩種驗(yàn)證方式:使用被賦權(quán)用戶登錄:i. 驗(yàn)證對象權(quán)限:select owner,grantee,table_name,privilege from user_tab_privswhere

43、grantee=&user_nameand table_name=&object_name;ii. 驗(yàn)證系統(tǒng)權(quán)限:select username,privilege from user_sys_privs;五、 核心對象風(fēng)險(xiǎn)核心對象上的依賴sql往往較多,而且執(zhí)行頻率較高,授權(quán)操作會(huì)導(dǎo)致對象依賴的游標(biāo)失效,進(jìn)而導(dǎo)致硬解析風(fēng)暴。應(yīng)該盡量選擇業(yè)務(wù)低峰期來進(jìn)行核心表的賦權(quán)操作。六、 回退方案我們遭遇的授權(quán)操作的最大風(fēng)險(xiǎn)第一是導(dǎo)致的硬解析風(fēng)暴,第二是授權(quán)操作涉及數(shù)據(jù)字典的修改,甚至可能會(huì)導(dǎo)致row cache lock的出現(xiàn)。對于硬解析風(fēng)暴的風(fēng)險(xiǎn),回退的方案不是revoke對象的權(quán)限,

44、而是等待硬解析風(fēng)暴過去。對于賦權(quán)操作引發(fā)的問題,要根據(jù)具體的情況而定。提前把方案一定要整理好,慎重選擇變更的時(shí)間,避免出現(xiàn)問題。08-修改字段長度一、 目的闡述表變更的風(fēng)險(xiǎn)及其步驟,降低對應(yīng)用的影響和避免故障。二、 適用范圍l 所有在使用的表修改字段長度,具體是number型和varchar2型,只允許范圍擴(kuò)大。三、 風(fēng)險(xiǎn)評估l 相關(guān)表的長度是否一并修改當(dāng)該表某個(gè)字段長度加長后,可能有關(guān)聯(lián)的表的數(shù)據(jù)來自于該表,那么那個(gè)關(guān)聯(lián)的表的相應(yīng)字段也應(yīng)該加長。這點(diǎn)由應(yīng)用去評估。該表上如果有物化視圖,則物化視圖的基表的對應(yīng)的字段長度也要加長。該表上如果有存儲(chǔ)過程、觸發(fā)器、package,里面的代碼中跟該字段

45、有關(guān)的變量如果聲明的是具體的長度,則也要加長。正確的聲明方式是col%type。l 修改字段導(dǎo)致依賴對象失效、sql游標(biāo)失效問題。表的dml并發(fā)很高的時(shí)候,如果表上面還有依賴對象,修改字段長度會(huì)導(dǎo)致依賴對象失效。默認(rèn)其他dml會(huì)話會(huì)嘗試去自動(dòng)編譯這個(gè)依賴對象,此時(shí)很可能會(huì)出現(xiàn)大面積的library cache pin。應(yīng)用會(huì)話的連接時(shí)間會(huì)加長,進(jìn)而導(dǎo)致出現(xiàn)后續(xù)應(yīng)用報(bào)不能取得連接池錯(cuò)誤。應(yīng)用服務(wù)器load由此飆升。表修改字段長度也會(huì)導(dǎo)致跟該表有關(guān)的sql的游標(biāo)失效,如果sql的并發(fā)很高(查詢sql或者dml sql),失效后sql會(huì)重新解析,此時(shí)也可能會(huì)出現(xiàn)大量的library cache pi

46、n & library cache lock。解決方法:選擇在業(yè)務(wù)低峰期發(fā)布,同時(shí)在數(shù)據(jù)庫級別開啟trigger禁用客戶端程序自動(dòng)編譯功能,字段加完后再禁用該trigger。l 表的依賴對象是否要相應(yīng)調(diào)整。表上面的依賴對象如果有存儲(chǔ)過程或觸發(fā)器等,邏輯是否需要相應(yīng)調(diào)整。l 是否涉及到同步。同步中的表需要兩地都要變更。涉及到erosa的要更新一下數(shù)據(jù)字典。erosa是否需要重啟取決于erosa版本。l 是否要通知其他關(guān)聯(lián)的部門。如dw, asc或crm等等。有些表很多部門都用,需要溝通約定時(shí)間一起變更。如果有同步方案,同步方案的變更也要考慮。四、 操作流程1. 準(zhǔn)備工作a) 該表的數(shù)據(jù)量

47、以及大小,以及數(shù)據(jù)變更量(按日/時(shí)/分/秒等)b) 該表的并發(fā)訪問數(shù),以及頻率最高的幾種sql的訪問方式2. 執(zhí)行過程 以表t1 加字段 col2為例。t1的數(shù)據(jù)量非常大,訪問頻率很高。a) 在sysdba下開啟trigger禁用客戶端自動(dòng)編譯功能。(可選)alter trigger sys.ddl_trigger_for_database enable;b) 變更字段以下加字段同編譯失效對象連著執(zhí)行。編譯時(shí)先編譯trigger再編譯存儲(chǔ)過程或package等conn zzzzzz/aaaalter table t1 modify col2 varchar2(50);alter trigger

48、 trg_t1_search compile;conn retl/rrralter trigger trg_t1_sync compile;conn bopsretl/bbbalter trigger trg_t1_sync compile;conn zzzzzz/aaaalter procedure sp_test compile;后面3個(gè)trigger的編譯可以開三個(gè)窗口同時(shí)進(jìn)行。另開一個(gè)窗口,在admin用戶下查看當(dāng)前失效對象dbcheckc) 禁用ddl triggeralter trigger sys.ddl_trigger_for_database disable;d) 涉及到同步

49、的表,各個(gè)節(jié)點(diǎn)都變更,erosa重啟取決于版本更新erosa數(shù)據(jù)字典./getdict.sh erosa重啟./erctl stop./erctl start3. 驗(yàn)證方案a) 驗(yàn)證sys下的trigger已經(jīng)禁用select owner,trigger_name,status from dba_triggers where owner in (sys) and trigger_name=upper( ddl_trigger_for_database );b) 驗(yàn)證結(jié)構(gòu)正確desc alibaba1949.t1c) 驗(yàn)證無失效依賴對象dbcheck d) 跟測試庫比對結(jié)構(gòu)五、 核心對象風(fēng)險(xiǎn)核心

50、對象風(fēng)險(xiǎn)指的是業(yè)務(wù)上重要的表,并且數(shù)據(jù)量很大或表大小很大或并發(fā)訪問數(shù)很高時(shí),變更的潛在風(fēng)險(xiǎn)。前面已經(jīng)闡述。09-改動(dòng)統(tǒng)計(jì)信息一、 目的oracle優(yōu)化器依據(jù)對象、系統(tǒng)的統(tǒng)計(jì) 信息來產(chǎn)生執(zhí)行計(jì)劃。因此如何收集對象、系統(tǒng)的統(tǒng)計(jì)信息尤其重要,本文檔主要介紹收集對象統(tǒng)計(jì)信息的操作方法。某些情況下,如執(zhí)行計(jì)劃走錯(cuò)、表缺少關(guān)鍵字 段統(tǒng)計(jì)信息,需要我們手工的設(shè)置統(tǒng)計(jì)信息,因此也會(huì)涉及修改對象統(tǒng)計(jì)信息的內(nèi)容。對于執(zhí)行計(jì)劃走錯(cuò),通過修改統(tǒng)計(jì)信息來修正的情況,要對cbo算法有簡單的了解,知道哪些統(tǒng)計(jì)信息涉及到cost計(jì)算的過程??梢詤⒖糽ewis的cbo優(yōu)化法則來了解cost的計(jì)算.本手冊不會(huì)涉及這些內(nèi)容。二、

51、適用范圍l 新建表,表里初始化了大量的數(shù)據(jù)。 l 對于已經(jīng)存在的表,表里數(shù)據(jù)量變化比較大。比如表刪除了大量數(shù)據(jù)。需要重新收集統(tǒng)計(jì)信息。l 由于表上統(tǒng)計(jì)信息不準(zhǔn)確或缺失導(dǎo)致執(zhí)行計(jì)劃走錯(cuò)。l 表統(tǒng)計(jì)信息過于陳舊,可能導(dǎo)致執(zhí)行計(jì)劃錯(cuò)誤三、 風(fēng)險(xiǎn)評估l 統(tǒng)計(jì)信息的改變會(huì)涉及到表上所有sql在下一次硬解析的時(shí)候用到,因此影響面廣。在操作的時(shí)候,需要確認(rèn)影響的范圍,不要單純?yōu)榱四骋粋€(gè)sql的執(zhí)行計(jì)劃正確,而導(dǎo)致更多的sql執(zhí)行計(jì)劃走錯(cuò)。l 請仔細(xì)評估好,no_invalidate的設(shè)置問題,這個(gè)參數(shù)設(shè)置為true,表上依賴的sql不會(huì)立馬失效,即不會(huì)立刻采用表上新的統(tǒng)計(jì)信息。只有下一次硬解析的時(shí)候才會(huì)用新

52、的統(tǒng)計(jì)信息來生成執(zhí)行計(jì)劃。絕大多數(shù)時(shí)候,我們這邊采用的參數(shù)值是false.代表讓表上依賴的游標(biāo)立刻失效,在下一次解析的時(shí)候,能夠立刻用上表上新的統(tǒng)計(jì)信息。l no_invalidate在設(shè)置為false會(huì)導(dǎo)致在收集統(tǒng)計(jì)信息完成后,表上所有的sql重新解析,對于核心表以及一些依賴sql很多的表,要盡量放到業(yè)務(wù)低峰期去操作,否則可能遭遇硬解析的風(fēng)暴,導(dǎo)致系統(tǒng)cpu繁忙,latch爭用(shared pool latch ,library cache latch,library cache pin,cursor pin s:wait x).如果遭遇這種情況,大多數(shù)時(shí)候,這種爭用會(huì)隨著硬解析完成而很快

53、結(jié)束,但是也有可能會(huì)導(dǎo)致oracle crash。l oracle優(yōu)化器依賴準(zhǔn)確健全的統(tǒng)計(jì)信息來產(chǎn)生優(yōu)秀的執(zhí)行計(jì)劃,雖然收集統(tǒng)計(jì)信息理論上是為了讓更精準(zhǔn)的、更能反映目前數(shù)據(jù)的分布的統(tǒng)計(jì)信息產(chǎn)生出更優(yōu)秀的執(zhí)行計(jì)劃,但是無論如何oracle無法保證這一點(diǎn),有可能執(zhí)行計(jì)劃更優(yōu)秀或者不變,有可能更糟糕了,相信隨著oracle版本的不斷提升,優(yōu)化器的bug會(huì)越來越少。l oracle的dbms_stats不能單獨(dú)收集列的統(tǒng)計(jì)信息,要了解到,如果收集了某一列的統(tǒng)計(jì)信息,表的統(tǒng)計(jì)信息會(huì)隨著更新。l 把estimate_percent設(shè)置的比較小,可以加快收集統(tǒng)計(jì)信息的時(shí)間,在不收集直方圖的情況下,設(shè)置較小的

54、值一般也不會(huì)有任何問題。可是如果表存在直方圖,那么還是建議你根據(jù)情況把這個(gè)參數(shù)設(shè)置的大點(diǎn)。l 目前生產(chǎn)環(huán)境都關(guān)閉了綁定變量窺探的功能,因此對于收集了直方圖的列,需要確認(rèn)傳入的是文本變量。四、 操作流程幾個(gè)重要收集參數(shù)的介紹以及使用規(guī)范:1. no_invalidate 是否讓表上的游標(biāo)立即失效:自動(dòng)定期執(zhí)行(crontab)設(shè)置true,手動(dòng)收集設(shè)置false。2. force 是否對鎖定統(tǒng)計(jì)信息的表收集統(tǒng)計(jì)信息 :不指定,統(tǒng)一規(guī)范使用默認(rèn)值false 不收集鎖定表的統(tǒng)計(jì)信息,如果需要收集請?zhí)釂谓o出原因。3. degree 收集統(tǒng)計(jì)信息的并行度 : 不指定,使用默認(rèn)值1;如果為了加快收集時(shí)間,

55、可以設(shè)置高的并行度,需要提單給出理由。4. estimate_percent 采樣百分比:一般設(shè)置成 0.5 ,可以讓收集統(tǒng)計(jì)信息的時(shí)間縮短。這個(gè)值是個(gè)最小值,如果oracle覺得這個(gè)值小,會(huì)自動(dòng)調(diào)大。采樣的大小不要超過100m,采樣的時(shí)間控制在1分鐘以內(nèi)。5. method_opt 收集直方圖的方法 :分以下幾種情況:a) 執(zhí)行計(jì)劃走錯(cuò):1. 收集指定列的基本統(tǒng)計(jì)信息:for columns a size repeat,b size repeat2. 收集指定列的直方圖:for columns a size auto,b size auto b) 統(tǒng)計(jì)信息全為空:收集所有列的基本信息,同時(shí)收集個(gè)別列的直方圖:for columns size repeat, a size auto,b size autoc) 定時(shí)收集統(tǒng)計(jì)信息:for all columns size repeat 6. cascade 設(shè)置成true,收集索引的統(tǒng)計(jì)信息。9i默認(rèn)值是false,10g默認(rèn)值是true.7. 如果是分區(qū)表,需要指定partname參數(shù)。更多參數(shù)的說明請參照我寫的dbms_stats包參數(shù)介紹。文檔位于:數(shù)據(jù)庫管理à知識(shí)總結(jié)-àdbms_st

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論