1. 存在分區表或分區索引 (公司這樣的情況是否存在,這次是否需要研究這方面的升級?)
分區列所在的表將不進行升級。因升級後的列與原來的分區架構(分區函數)中的分區列的類型不同,從而不能再重立起原有的分區表或分區索引。
若也要升級分區列所在的表,則:(據需要會進一步研究)
分區函數中的分區列,需升級至unicode,但這樣那些未升級至unicode的分區列所在的表,將無法使用原分區架構與分區函數。所以:
b.升級部分分區列所在的表,爲了不影響未升級的分區表或分區索引所在的表,
2. 無複製分發的情況
直接升級表(除了分區列(分區表及分區索引)所在的表不能升級)
3. 存在複製分發的情況
(1) 若在不去除複製分發的情況下,用於複製分發的表及與這些表有關聯的表(如外健引用)都將不會被升級。
(2)若要對用於複製分發的表,也進行升級,則必須先刪除掉複製分發後再升級
a.生成原複製分發項目的腳本
b.刪除複製分發項目
c.升級表(至unicode)
d.重建複製分發(用生成的腳本重新生成原複製分發項目,更改密碼及重新生成snapshot即可)
方案1:外鍵不及時建立 ----適用停機升級
(缺點是與複製分發及分區列上的與升級後的表上引用即外健會無法建立,
但這會記錄下來,以便手工處理,以後會進一步完善)
WHILE依次傳入每個要升級的表-----外層
具體處理一個表 -----內層,作爲一個事務執行
1. 記錄下每個要升級列上的所有對象
(PK,UQ,INDEX,DEFAULT,CHECK,外健及被引用表上的外健)
2. 刪除一個表上與升級列有關的所有對象,及引用表上的外健
3. 更新一個表的所有列至unicode
4. 重新建立本表上與升級列有關的所有對象,除了外健(引用和被引用)。
5. 若事務執行失敗,則回滾,同時將表名,更改列的SQL,刪除對象的SQL,
所有表升級後,統一建立每個表上的外鍵。-----外層
若無法建立,則將建立外健的SQL記錄到‘外健建立失敗的表中’,以供分析與處理-----外層
(此時主,外表都升級了,所以外健可以建立上)當然也存在引用表上的外健無法建立的情況(即從表升級了,但主表未升級,這會記錄下來)。
遞歸處理與本表相關聯的表,要是關聯的表太多,開銷會很大。