遷移主要是通過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
本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!