SQLServer DBA 三十問之我答(第7題)

來源:互聯網
上載者:User

前幾天看到一篇"SQLServer DBA 三十問",很不錯,比較中肯。這些題目還是需要一定操作經驗的才能答得上來,其中的很多題目都可以通過books online查到,有些題目我也非常感興趣,因為也處理過類似的問題,所以印象深刻,現在把我的答案寫出來,希望可以幫到有緣人,如果有更好的方案,當然我也很樂意學學。

題目:7. 線上系統,一個表有五千萬記錄,現在要你將其中的兩千萬條記錄匯入到另一台伺服器的某個表中,導完後,需要將這兩千萬資料刪 除,你預備如何處理,優缺點是什麼; 

我的答案: (先說明一下我的環境是sqlserver 2000,並且假設他有主鍵id)

 

)第1步:先做一個表,t_update_log,記錄更新過的記錄的主鍵id,記錄修改和刪除的記錄,這步驟的具體作用看下面的步驟; 

 

)第2步:匯出2000萬的資料到另一個庫另一表,我起名為 t_2000w ,我是用dts來處理的,效率很好,如果沒有大欄位,2000萬大概3個小時可以導完,如果有大欄位,比如很大的varchar,text,ntext 等,那需要的時間久會比較長,具體時間還要看資料的大小。

 

)第3步:刪除當前庫匯出的2000萬,我把當前庫起名為 t_5000w, 我是這樣來處理的,首先建一個和來源資料表相同結構的表,起名t_3000w,匯入剩下的3000萬條資料,然後用sp_rename 分別修改兩個表,把t_5000w改成t_5000w_bak,把t_3000w改成t_5000w(即源表), 大概就是這樣,很easy吧。

 

別急,第一步的準備工作還沒用上呢,而且還有很多細節的問題。

Q1:如何保證資料的準確性,如果你在匯入的同時有人對資料進行了更新怎麼辦?

Q2:盡量減少對使用者的影響,如果在sp_rename修改表名稱需要的時間比較長,而且剛好有資料需要insert怎麼辦?

我的解決方案:

A1:剛好用到了第1步的表t_update_log,把有更新的記錄再重新匯入到新表t_2000w,從此記錄表中t_update_log找出被刪除的id,從t_2000w中刪除;

A2:修改對錶t_5000w的insert操作介面,可以再建一個結構和t_5000w一樣的新表,取名t_6000w,如果有自增id,把自增id的當前值設定為6000w,然後新增的資料都insert到t_6000w中,如果你的資料庫操作都是通過預存程序統一操作,那很幸運,你只需要修改預存程序,不需要修改你的。net程式,你甚至可以不停止服務就可以順利升級,在這裡預存程序的優越性得到了充分體現,如果你不是通過預存程序,而是sql語句,而且調用的地方很多,那我建議,升級期間你還是暫停服務吧。

 

當然以上操作都是需要再測試環境下演練一遍,記錄下每一部需要的時間,並且做好失敗時能及時恢複到之前狀態。當然升級期間還是建議暫停服務,因為大部分人可以接受暫停服務,但不能接受資料丟失。

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.