SQL Server 遷移至MySQL 關鍵步驟的梳理總結

東山絮柳仔發表於2018-12-12

遷移主要是通過Navicat工具來實現的。遷移工具的選定在此不討論。

遷移前準備

1.提前通知DBASABI等,並確認釋出計劃及資料庫遷移方案。

2.梳理出SQL  Server DB 中影響業務的Job(遷移的過程中要關閉)、DB LinkServer、相關賬號。

3.模擬資料遷移,評估出相關精確的時間。例如每張大表的耗時(我們定義的表準是,每張百萬級別的表耗時都要測評出來),每2分鐘一個進度標記。Navicat 工具不能指定SQL條件遷移 ,需全表遷移,因此 不支援增量遷移。SQL Server 和 MySQL 表結構需一致。表名、欄位名一致。如果不一致,需要建立一個過渡庫過渡表來進行遷移。

4.建立生產環境的MySQL資料庫,將最終的Dev環境的表匯入生產環境(只導表結構)。與SQL Server 相比,如果有表結構調整,最好要求開發提供數變化的list(包含新增表、新增索引等)。

5.對生產環境的MySQL進行賬號設定(DBkey等相關配置一起設定)。

6.對生產環境的表進行檢查(主要表結構的變化,例如主要欄位、索引、預設值等)。Navicat工具匯入的過程中,可以保留索引,但是預設值會丟失,並且預設欄位不理想。此步驟可參照附錄。

7.進行測試(全鏈路,從資料庫的連線到插入更新等)。測試可以是全面的,DB對資料庫進行測試,當然,針對應用程式,可以要求測試人員提供一份效能壓測報告。

8.資料庫備份作業的設定(完整備份和Binlog備份)。

9.驗證遷移步驟及準備指令碼

遷移中

1.請SA團隊暫停相關的業務服務

2.禁用Server 上DB的相關賬號。

3.停止備份Job 和影響業務的Job。

4.資料遷移。

5.驗證資料,主要是比對遷移前後資料量。

6.通知全員資料遷移完畢。通知SA開啟相關服務。

遷移後

1.刪除連結伺服器(DBLink,本地相關連結伺服器 和異地有關此DB的連線伺服器)。

2.通過活動監視器或SQL命令查詢是否還有對此 SQL Server DB的請求。

3.MySQL資料庫效能監控。

4.資料庫做一個完整備份,Copy至異地伺服器。Copy至異地,主要是考慮伺服器資源的回收,此為,在異地最好要新增一個對備份檔案的描述,例如此檔案是什麼時候產生的,用途是什麼,是否可以刪除,建議保留時間,操作人等。

5.關閉SQL Server 剩餘的Job。

6.Detach (分離)資料庫(一定是Detach 不要直接刪除,雖然有備份檔案,但恢復還是相對較慢的)。

7.如果此伺服器上沒有其它的使用者資料庫,停止SQL Server 服務。

8.歷史資料庫的遷移(如果有的話)。

9.歸檔資料Job的設定。

10.本次遷移的總結報告(主要是梳理出遷移過程注意的事項和提升的建議)

 

附錄

附錄A

SQL Server 與 MySQL 欄位型別對照表

SQL Server MySQL
n/varchar(1-4000) varchar(1-4000)
varchar(4000-8000) text
n/varchar(max) longtext
char char
nchar varchar
timestamp timestamp
time datetime(3)
datetime datetime(3)
date datetime(3)
smalldatetime datetime(3)
numeric decimal
numeric17 decimal
ntext mediumtext
text mediumtext
bit tinyint
int int
tinyint tinyint
bigint bigint
smallint int
float double
decimal decimal
varbinary varchar
binary varchar
image longblob
uniqueidentifier varchar(40)
real double
money decimal(19,4)
longblob longblob

 

附錄B

查詢生成 需新增預設值和調整欄位的SQL語句。

以下T-SQL在需要遷移的SQL Server DB上執行,生成的SQL 語句在MySQL直接執行(sql_text列)。

 

SELECT  `alter table ` + D.name + ` modify column ` + A.name+` `
        + CASE WHEN B.name = `datetime` THEN ` datetime(3)`
               WHEN B.name = `bit` THEN ` tinyint(1)`
               WHEN B.name = `decimal`
               THEN ` decimal(`
                    + CAST(COLUMNPROPERTY(A.id, A.name, `PRECISION`) AS VARCHAR(10))
                    + `,`
                    + CAST(ISNULL(COLUMNPROPERTY(A.id, A.name, `Scale`), 0) AS VARCHAR(10))
                    + `)`
               WHEN B.name like `%varchar` AND COLUMNPROPERTY(A.id, A.name, `PRECISION`)=-1 THEN ` varchar(4000)` 
               WHEN B.name like `%varchar` AND COLUMNPROPERTY(A.id, A.name, `PRECISION`)<>-1 THEN ` varchar(`+CAST(COLUMNPROPERTY(A.id, A.name, `PRECISION`) AS VARCHAR(20))+`)`
               WHEN B.name like `%varbinary` AND COLUMNPROPERTY(A.id, A.name, `PRECISION`)=-1 THEN ` varbinary(4000)`
               WHEN B.name like `%varbinary` AND COLUMNPROPERTY(A.id, A.name, `PRECISION`)<>-1 THEN ` varbinary(`+CAST(COLUMNPROPERTY(A.id, A.name, `PRECISION`) AS VARCHAR(20))+`)`
               ELSE B.name
                 END + CASE WHEN A.isnullable = 1 THEN ` NULL`
                     ELSE ` NOT NULL `
                END + ` default `
             + CAST (CASE WHEN E.text = `(getdate())` THEN `CURRENT_TIMESTAMP(3)`
                     WHEN E.text LIKE `(%`
                     THEN REPLACE(REPLACE(E.text, `(`, ``), `)`, ``)
                     ELSE E.text
                END AS VARCHAR(30))
           + CASE WHEN ISNULL(G.[value], ``) <> ``
               THEN ` COMMENT ```
                    + CAST(ISNULL(G.[value], ``) AS VARCHAR(100)) + ```;`
               ELSE `;`
          END AS sql_text ,
        表名 = D.name ,
        欄位名 = A.name ,
        欄位說明 = ISNULL(G.[value], ``) ,
        型別 = B.name ,
        佔用位元組數 = A.length ,
        長度 = COLUMNPROPERTY(A.id, A.name, `PRECISION`) ,
        小數位數 = ISNULL(COLUMNPROPERTY(A.id, A.name, `Scale`), 0) ,
        允許空 = CASE WHEN A.isnullable = 1 THEN `Y`
                   ELSE `N`
              END ,
        預設值 = ISNULL(E.text, ``)
FROM    syscolumns A
        INNER JOIN systypes B ON A.xusertype = B.xusertype
        INNER JOIN sysobjects D ON A.id = D.id
                                   AND D.xtype = `U`
                                   AND D.name <> `dtproperties`
        INNER JOIN syscomments E ON A.cdefault = E.id
        LEFT JOIN sys.extended_properties G ON A.id = G.major_id
                                               AND A.colid = G.minor_id
        LEFT JOIN sys.extended_properties F ON D.id = F.major_id
                                               AND F.minor_id = 0
WHERE   B.name <> `uniqueidentifier`
        and D.name not in (`需排除的表`)
ORDER BY D.name ,
        A.id ,
        A.colorder

 

 

本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!

相關文章