DB2資料庫SQL0670N錯誤案例解析

來源:互聯網
上載者:User

  開發人員在修改一個表時,DB2資料庫報SQL0670N錯誤,具體資訊如下:

650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/220H9E93-0.jpg" title="11111.jpg" alt="164703641.jpg" />

  這個錯誤是怎麼引起的?又該怎麼解決呢?

  首先我們看一下DB2資料庫自身對這個錯誤的解釋

650) this.width=650;" src="http://www.bkjia.com/uploads/allimg/131229/220H94617-1.jpg" title="33333.jpg" alt="165220662.jpg" />

  這裡告訴我們在具有32K頁大小的資料表空間中,行長度不能超過32677位元組。

  解決這個問題,我們自然會想到增大行長度限制的資料表空間的大小或設定較大的pagesize ,當然也可以考慮降低一列或多列的長度來降低行長度。

  先查看錶空間的具體資訊:


$ db2  list  tablespaces  show detail


資料表空間標識                          = 9

名稱                                = TPMS

類型                                = 系統管理空間

內容                                = 任何資料

狀態                                = 0x0000

  詳細解釋:

    正常

總計頁數                            = 2084

可用頁數                            = 2084

已用頁數                            = 2084

未用頁數                            = 不適用

高水位標記頁)                    = 不適用

頁大小以位元組計)                  = 32768

擴充資料區塊大小頁)                = 32

預取大小頁)                      = 32

容器數                              = 1


pagesize的值已經比較大了,可以考慮增大資料表空間。

DB2現有資料表空間擴容的方法
1)直接添加一個容器的例子:

db2 " ALTER TABLESPACE TPMS ADD (DEVICE '/dev/rhdisk9' 10000) "
加容器之後DB2會有一個自動balance的過程,可能會持續幾個小時!!!  線上做有一定風險!

2)改變現有容器的大小(該方法不會觸發balance,但如果資料表空間建立在裸裝置上,則要擴沖裸裝置空間):

db2 " ALTER TABLESPACE TPMS RESIZE (FILE '/conts/cont0' 2000, DEVICE '/dev/rcont1' 2000, FILE 'cont2' 2000) "

注意這種方式就是將原有的相應容器都改成大小是2000頁


或者考慮降低一列或多列的長度來降低行長度。

例如:執行的SQL語句為

alter table tpms.tpms_target alter column "target_value_by" set data type varchar(4000);

如果報錯,可以設一個小點的值varchar(2000),這樣就執行成功了。如果2000還放不下,可以分成兩個表,主鍵、欄位;主鍵、其他欄位


varchar類型的最大長度為8000,如果有更大的資料,還可以考慮long varchar或clob類型。


最後本例中的報錯是通過設定CLOB類型解決的。

alter table tpms.tpms_target alter column "target_value_by" set data type clob(4000);


補充:varchar的最大長度是由DB2的資料表空間決定,在DB2中一行資料的大小不能超過資料表空間的pagesize。而clob,dbclob和blob大小為2GB。


一般來說,為了提高效能,資料庫需要專門建立一個用於存放大欄位的資料表空間,資料表的大欄位列應該將資料存放於對應的資料表空間中,這是因為不經過記憶體緩衝池)直接讀取的。


DB2的限制
1. 一個表的最大列數<=1012
2. 一個視圖的最大列數<=5000
3. 一行的最大長度(位元組)<=32677
4. 每個分區中表的最大尺寸(千MB數)<=512
5. 每個分區中索引的最大尺寸(千MB數)<=512
6. 每個分區中表的最大行數<=4000000000
7. 最長索引關鍵字(位元組數)<=1024
8. 一個索引關鍵字中的最大列數<=16
9. 一個表的最大索引數<=32767或存儲器
10. 一個SQL語句或視圖中所引用的最大表數<=存儲器



本文出自 “滴水穿石” 部落格,請務必保留此出處http://xjsunjie.blog.51cto.com/999372/1345793

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.