遷移主要是通過Navicat工具來實現的。遷移工具的選定在此不討論。 遷移前準備 1.提前通知DBA\SA\BI等,並確認發佈計劃及資料庫遷移方案。 2.梳理出SQL Server DB 中影響業務的Job(遷移的過程中要關閉)、DB LinkServer、相關賬號。 3.模擬數據遷移,評估出相關精 ...
遷移主要是通過Navicat工具來實現的。遷移工具的選定在此不討論。
遷移前準備
1.提前通知DBA\SA\BI等,並確認發佈計劃及資料庫遷移方案。
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
本文版權歸作者所有,未經作者同意不得轉載,謝謝配合!!!