標籤

2018年7月6日 星期五

省錢大作戰從MS-SQL跳槽到MySQL:第六步從 MsSQL 備份檔還原 MySQL 資料庫

備份的重點在還原,如果不能還原,那備份就白做了

◎  從備份檔還原   MS-SQL 

執行 SQL Server 2014 Management Studio --> 展開資料庫 -->  右擊 KT --> 工作 --> 還原 --> 資料庫 --> 點擊 裝置 -->  點擊 。。。 --> 加入 -->  尋找備份檔案 C:\KT\BACKSQL\KT6.bak
MsSQL 尋找備份檔案

-->  確定 --> 確定 --> 點擊 選項 --> 勾選覆寫現有的資料庫 --> 確定

MsSQL 資料庫還原成功

◎  Windows   還原程式
    以系統管理員身份啟動 Visual Stdio --> 檔案 --> 新增 --> 專案 -->
C#新增專案


選擇 Windows Form 應用程式 --> 名稱:MySQLFromMSWinAP --> 確定。

◎  設計畫面


還原程式畫面設計

Form1 放入 buttonSEARCH,buttonAll,buttonTruncate,buttonRESTORE,buttonEXIT五個按鍵。再放入 textBoxMsSql,textBoxMysql,textBoxTimeSpan 三個 TextBox,並且將 Enabled 設為 False。在三個 TextBox 之前放入 Label,並標上適當文字。最後加上 dataGridView。習慣上我還會將 Form1 之 WindowState 放到最大:Maximized。

◎  專案加入參考:


   專案 --> 加入參考 --> C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0\MySql.Data.dll 其中 v4.0 符合 .Net Framework 4.0 。與專案的 .NET Framework 相符--> 加入 --> 確定。
MySQL Connector Net 6.8.3 v4.0


◎撰寫程式


  Form1 上 buttonSEARCH,buttonAll,buttonTruncate,buttonRESTORE,buttonEXIT五個按鍵都雙擊一次。 開始撰寫還原程式。
 


--> 然後按 執行

◎程式解析 :

    ○專案參考命名空間:
       using System.Data.SqlClient;
       using MySql.Data.MySqlClient;

     ○連線字串:
       public string ConnectionStringMSSQL = @"server=localhost\SQLEXPRESS;database=KT;uid=PAM;pwd=12345678";
       public string ConnectionStringMySQL = @"server=192.168.0.250;database=PAM;uid=root;pwd=12345678;charset=utf8;PORT=3306;";

    ○buttonSEARCH_Click:
       建立 dt  --> 連結 MySQL 資料庫 --> 用  Show Tables 讀出 KT 資料庫所有 Tables --> 用 SELECT COUNT(*) from Table 逐一讀取 MsSQL 與 MySQL 資料表之筆數。
       最後將 dataGridView1 之 DataSource 綁訂為 dt,為 dataGridView1 做細部設定 --> 然後顯示抓到之總筆數。

○buttonAll_Click:
       逐一檢查 dataGridView1 之 Sel 欄位 --> 無值者放 V;有值者放空白

○buttonTruncate_Click:
       逐一檢查 dataGridView1 之 Sel 欄位有值者  --> 用 Truncate Table 清除 MySQL 資料表之資料

 ○buttonRESTORE_Click:
       逐一檢查 dataGridView1 之 Sel 欄位有值者  --> 如果 MsSql 資料表之筆數小於 10000,使用 MySqlDataAdapter 技術來還原;否則以 1000 筆為單位用參數化查詢還原。
       顯還原筆數,與還原使用時間。

 ○buttonEXIT_Click:
       結束還原程式

◎執行還原程式 :

偵錯 --> 開始偵錯 -->  按 SEARCH --> 全選

共選取 299 萬筆資料要還原到 MySQL

接著 按 Restore
299 萬筆資料還原到 MySQL 需要 34 分 49 秒

◎選擇性還原:

本程式可選擇性還原特定資料表,使用此功能時需暸解資料表的關連性

省錢大作戰從MS-SQL跳槽到MySQL:第五步透過 MsSQL 備份 MySQL 資料庫

 MySQLDUMP 是官方推薦的資料庫備份工具,只是遇到中文就有一堆問題,乾脆自己寫一個備份程式

◎  安裝   MS-SQL   Express

下載並執行 SQLEXPRADV_x64_CHT.exe 安裝 MS-SQL Express,目前使用的是 2014 版。

◎  建立資料庫

執行 SQL Server 2014 Management Studio --> 連上資料庫 --> Create DataBase KT; --> Use KT; --> 在 Query 視窗輸入: 

--> 然後按執行建立資料表  (這個 SQL Script  與 MySQL 所用的相同)。

◎  Windows   轉檔程式

    以系統管理員身份啟動 Visual Stdio --> 檔案 --> 新增 --> 專案 -->
C#新增專案

選擇 Windows Form 應用程式 --> 名稱:MySQL2MSWinAP --> 確定。

◎  設計畫面


轉檔程式畫面設計

Form1 放入 buttonMy2MS,buttonBACKUP,buttonEXIT三個按鍵。再放入 textBoxMsSql,textBoxMysql,textBoxBackDir 三個 TextBox,並且將 Enabled 設為 False。在三個 TextBox 之前放入 Label,並標上適當文字。最後加上 dataGridView。習慣上我還會將 Form1 之 WindowState 放到最大:Maximized。

◎  專案加入參考:


   專案 --> 加入參考 --> C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0\MySql.Data.dll 其中 v4.0 符合 .Net Framework 4.0 。與專案的 .NET Framework 相符--> 加入 --> 確定。
MySQL Connector Net 6.8.3 v4.0


◎撰寫程式


  Form1 上 buttonMy2MS,buttonBACKUP,buttonEXIT三個按鍵都雙擊一次。 開始撰寫轉檔程式。
 


--> 然後按 執行

◎程式解析 :

    ○專案參考命名空間:
       using System.Data.SqlClient;
       using MySql.Data.MySqlClient;
       using System.Diagnostics;

     ○資料庫備份目錄:
       textBoxBackDir.Text = @"C:\KT\BACKSQL";

     ○連線字串:
       public string ConnectionStringMSSQL = @"server=localhost\SQLEXPRESS;database=KT;uid=PAM;pwd=12345678";
       public string ConnectionStringMySQL = @"server=192.168.0.250;database=PAM;uid=root;pwd=12345678;charset=utf8;PORT=3306;";

    ○buttonMy2MS_Click:
       建立 dt  --> 連結 MySQL 資料庫 --> 用  Show Tables 讀出 KT 資料庫所有 Tables --> 用 SELECT * from Table 逐一讀取 MySQL 資料表 --> 先用 Truncate Table 清除 MS-SQL 資料表之資料 --> 再用 SqlBulkCopy 將資料存入 MS-SQL --> 返回存入資料筆數。
       最後將 dataGridView1 之 DataSource 綁訂為 dt,為 dataGridView1 做細部設定 --> 然後顯示抓到之總筆數。

 ○buttonBACKUP_Click:
       先 Check MySql 筆數必須大於0,且 MySql 筆數等於MsSql 筆數 --> 再 Check 資料庫備份目錄必須存在 --> 在程式中執行 BACKKT.bat --> 會產生 KT + 星期.bak 的備份檔 --> 所以會有 7 個備份檔。。
       顯示備份完成,並提示將備份檔案 Copy 到隨身碟。

 ○buttonEXIT_Click:
       結束備份程式

◎執行備份程式 :

偵錯 --> 開始偵錯 -->  按 My --> MS
從 MySQL 將 299 萬筆資料 Copy 到 MsSQL 只需 1 分 18 秒

接著 按 Backup
將 MsSql 資料庫備份到 KT+星期.bak 會產生 7 個備份檔


◎查看備份結果 :
程式產生的備分檔 C:\KT\BACKSQL\KT6.bak

備份程式會產生 7 個備份檔,週日為 1 ,週六為 7 。可以避免最近的備份檔有問題而無法復原的窘境。

◎自動化備份:

將 Windows 程式改成主控台程式,就可以上 Windows 排程每天自動備份。但是還是要靠人工將備份檔 Copy 到隨身碟。

2018年7月4日 星期三

省錢大作戰從MS-SQL跳槽到MySQL:第四步將 Delphi 的 Paradox 資料庫轉到 MySQL資料庫

我在 1997~2004 年期間使用 Delphi ,併用 MS-SQL 與 Paradox 兩種資料庫。到目前為止,尚有一小部份在使用 Paradox 資料庫,這些客戶中還是有在使用Windows XP 系統。以前曾經將 Paradox 轉到 MS-SQL,現在要轉到 MySQL

◎  建立   MySQL   資料庫

啟動 MySQL Workbench  --> 連上資料庫主機 --> 在 Query 視窗輸入 CREATE DATABASE KT CHARACTER SET utf8 COLLATE utf8_unicode_ci;  --> 然後按執行 -->  在 Query 視窗輸入 USE KT;  --> 然後再按 執行 --> 在 Query 視窗輸入:

--> 然後按執行

◎  安裝 BDE

    執行 BDE32.EXE --> Next --> Finish --> 安裝成功後可於控制台看到
BDE Administrator

◎  Windows   轉檔程式

    以系統管理員身份啟動 Visual Stdio --> 檔案 --> 新增 --> 專案 -->
C#新增專案

選擇 Windows Form 應用程式 --> 名稱:MySQLFromParadoxWinAP --> 確定。

◎  設計畫面


轉檔程式畫面設計

Form1 放入 buttonSEARCH,buttonPOST,buttonEXIT三個按鍵。再放入 textBoxMsSql,textBoxMysql,textBoxTimeSpan 三個 TextBox,並且將 Enabled 設為 False。在三個 TextBox 之前放入 Label,並標上適當文字。最後加上 dataGridView。習慣上我還會將 Form1 之 WindowState 放到最大:Maximized。

◎  確定專案為 .Net Framework 4.0:

    專案 --> MySQLFromMSWinAP 屬性 --> 目標 Framework --> 確定為 .Net Framework 4.0 ,如果不是,請改過來。
選擇 .Net Framework 4.0

◎  專案加入參考:


   專案 --> 加入參考 --> C:\Program Files (x86)\MySQL\MySQL Connector Net 6.8.3\Assemblies\v4.0\MySql.Data.dll 其中 v4.0 符合 .Net Framework 4.0 。與前一項的 .NET Framework 相符--> 加入 --> 確定。
MySQL Connector Net 6.8.3 v4.0

◎  確定專案平台為 x86:

右擊 方案 MySQLFromParadoxWinAP --> 選擇 屬性 
方案屬性


--> 點擊 組態管理員 --> 使用中的方案平台 , 點擊 Any CPU --> 選擇 <新增...> --> 輸入或選擇新平台:x86 --> 確定 --> 關閉 --> 確定。
組態管理員選擇平台:x86


右擊 專案 MySQLFromParadoxWinAP --> 選擇 屬性 
專案屬性


--> 點擊 建置 -->  確定專案平台為 x86。
專案平台為 x86

◎撰寫程式


  Form1 上 buttonSEARCH,buttonPOST,buttonEXIT三個按鍵都雙擊一次。 開始撰寫參數化的轉檔程式。
 


--> 然後按 執行

◎程式解析 :

    ○專案參考命名空間:
       using MySql.Data.MySqlClient;
       using System.Data.OleDb;
       using System.IO;

     ○Paradox 資料庫所在目錄:
       public string sDIR = @"C:\KT\DATA";

     ○連線字串:
       public string ConnectionStringMySQL = @"server=192.168.0.250;database=PAM;uid=root;pwd=12345678;charset=utf8;PORT=3306;";

    ○buttonSEARCH_Click:
       建立 dtTable --> 用 Directory.GetFiles 抓取資料庫所在目錄的所有檔案 --> 過濾抓到的檔案尾端有 .db 寫入 dtTable
        Paradox  連線字串: string ConnectionStringParadox = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + sDIR + ";Extended Properties=Paradox 5.x"; --> 用 OleDb 連結 Paradox 資料庫 OleDbConnection SC_Ole = new OleDbConnection(ConnectionStringParadox); -->  用 SELECT COUNT(*) 指令讀取每個 TParadox 資料表的筆數放進 dtTable 之 Paradox 欄位。
        連結 MySQL 資料庫 --> 用  Show Tables 讀出 KT 資料庫所有 Tables --> 用 SELECT COUNT(*) 指令讀取每個 Table 的筆數放進 dtTable 之 MySQL 欄位。
       若 Paradox 之筆數大於 0 且 Paradox 之筆數不等於 MySQL 之筆數,Sel 欄位自動標示為 V。
       最後將 dataGridView1 之 DataSource 綁訂為 dtTable,為 dataGridView1 做細部設定 --> 然後顯示抓到之總筆數與耗用時間。

 ○buttonPOST_Click:
       用 MessageBox 確認轉檔動作 --> 逐步掃描 dataGridView1 抓取 TableName 與 Sel 欄位都有值者才轉檔。
       Post1 -->  先抓取 Paradox 資料表 --> 從 Paradox 資料表名稱切出 MySQL 資料表名稱 --> 用  Show Columns from Table 讀出 MySQL 資料庫中該資料表所有的 Column -->  再抓取 MySQL 資料表 --> 剔除 MySQL 現有的資料,只將 Paradox 多的資料存入 MySQL 資料表中。最後返回轉檔的筆數。
        Paradox 資料表的結構與 MySQL 略有不同。除了有些欄位名稱需要調整外,Paradox 資料表名稱字尾有 DDD 或 DD2 者會全部轉到字尾為 DBK 之 MySQL 資料表。此外有少許資料因兩種系統結構不同,不用轉檔。
       顯示總轉檔筆數與耗用時間。

 ○buttonEXIT_Click:
       結束轉檔程式

◎執行轉檔程式 :

偵錯 --> 開始偵錯 -->  按 Search
讀取 Paradox 資料庫  299 萬筆資料耗時 8 分 46 秒。

接著 按 Post --> 開始轉檔 ? --> 是(Y)
Paradox --> MySQL 轉檔完成,299 萬筆資料耗時59分38秒。


◎測試轉檔結果 :

  直接執行 C:\KT\MyKTWinAP\MyKTWinAP\bin\x64\Debug\MyKTWinAP.exe  --> 使用者名稱:MGR,密碼:MGR --> 簽入。

MyKTWinAP 順利簽入後之主選單畫面


◎Paradox --> MySQL 資料轉檔完成,系統正常運轉。