方法一:通過在mysql中備份sql來將mysql數據導入sqlserver。適合於數據量不大的情況使用(如何你的數據中存在的blob字段的數據量不是很多或者不存在可以考慮)。
特點:對於小數據量的遷移:方便快捷。
步驟:1:使用mysql工具備份sql文件,我這裡用的是SQLyog軟件。
2:對備份的sql文件進行處理(原因是這些備份的sql文件可以在sqlserver解析器中不能通過需要進行寫修改)。此處以SQLyog舉例:
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Data for the table `t_standard_check_unit` */
insert into `t_standard_check_unit`(`SYSTEM_ID`,`UNIT_TYPE_1`,`UNIT_TYPE_2`,`UNIT_TYPE_3`,`UNIT_TYPE_4`,
`UNIT_TYPE_5`,`UNIT_TYPE_6`) values ('01',9,7,6,8,4,NULL),('02',9,8,6,5,4,NULL),('03',9,8,5,6,4,NULL),('04',9,8,5,6,4,NULL),('05',9,8,6,5,4,NULL),('06',9,8,5,6,4,NULL),('07',9,9,9,8,4,NULL),('08',9,8,6,5,4,NULL),('09',9,9,9,8,4,NULL);
/*Data for the table `t_standard_system` */
上面是備份的sql文件中的部分:
注意:a:其中insert into `t_standard_check_unit`(`SYSTEM_ID`,`UNIT_TYPE_1`,`UNIT_TYPE_2`,`UNIT_TYPE_3`,
`UNIT_TYPE_4`,`UNIT_TYPE_5`,`UNIT_TYPE_6`)這一段中的引號在sqlserver中不能支持所以得通過程序處理掉。
處理程序:
public void switchSqlFile(File file) throws IOException{
BufferedReader bReader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));
String filePathOld = file.getAbsolutePath();
String filePath = filePathOld.substring(0,filePathOld.indexOf(".")) + "_switchFile"
+ filePathOld.substring(filePathOld.indexOf("."));
BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(filePath)),"utf-8"));
String str = "";
while((str =bReader.readLine()) !=null){
if(str.contains("CREATE DATABASE"))
continue;
if(str.contains("USE `q9`"))
continue;
if(str.toLowerCase().contains(") values(") || str.toLowerCase().contains(") values (")|| str.toLowerCase().contains(")values(")||str.toLowerCase().contains(")values (")){
String ss = str.substring(0,str.toLowerCase().indexOf("values ("));
str = ss.substring(0,ss.indexOf("(")).replaceAll("`", "") + str.substring(str.toLowerCase().indexOf(" values ("));
}
str +="rn";
bWriter.write(str);
}
bReader.close();
bWriter.close();
}
此部分程序不是很智能,此處只舉個例子。
b:這裡是通過將一個表的數據導出為一行,這樣導出恢復速度快,(sql優化問題),但是注意:當表中的數據行數超過1K時在sql腳本解析中是通不過的,此時應該選擇一條記錄一行insert語句的形式。(補充點知識:當一行過長時文本編輯器打開的速度會很慢,所以第二種方式也方便在文本編輯器中查看。)
3:利用處理後的sql導入sqlserver數據庫。
方法1:直接打開sql文件通過在sqlserver中執行導入。
方法2:利用sqlcmd命令導入sql文件,功能同mysql中的source,具體使用參考上一篇文章。
方法二:通過ODBC橋接器來完成數據遷移:
待續。。。。。。。。。。。。。。。。。。。。。。。
總結的小知識:
mysql向sqlserver2008兼容
一:腳本兼容問題
1:sqlserver不支持在外鍵約束中加on delete restrict on update restrict。
2:sqlserver2008不支持drop table if exists XXX。
3:sqlserver2008不支持blob類型,需要改成image或者text類型。
注意,建立數據庫時最好用修改的方式添加約束,這樣在進行數據庫恢復時可以先不建立約束,可以免去約束帶來的麻煩和效率問題。
最好將約束整理到最下面。及采用表及約束而不是列及約束。