目錄
1. 相同版本的遷移
2. 不用版本的遷移
3. 不同數據庫的遷移
數據庫遷移就是把數據從一個系統移動到另一個系統上,遷移過程其實就是在源數據庫備份和目標數據庫恢復的過程組合。遷移的原因是多種多樣的,比如:
- 需要安裝新的數據庫服務器
- MySQL 版本更新
- 數據庫管理系統的變更(如從 SQL Server 遷移到 MySQL)
根據實際操作等情況,可以將數據庫遷移操作分成以下 3 種形式。
- 相同版本?MySQL 數據庫之間的遷移。
- 不同版本?MySQL 數據庫之間的遷移。
- 不同數據庫間的遷移。
下面將詳細介紹數據庫遷移的各種方式。
1. 相同版本的遷移
相同版本的 MySQL 數據庫是指主版本號一致的數據庫。主版本號一致的數據庫遷移最容易實現。由于遷移前后 MySQL 數據庫的主版本號相同,所以可以通過復制數據庫目錄來實現數據庫遷移。
最安全和最常用的方式是通過使用 mysqldump 命令進行數據庫備份,然后使用 mysql 命令將備份文件還原到新的 MySQL 數據庫。遷移時的備份和還原操作可以同時執行。
假設從一個名為 hostname1 的機器中備份出所有數據庫,然后將這些數據庫遷移到名為 hostname2 的機器上,具體語法形式如下:
mysqldump -h hostname1 -u root -password=password1 -all-databases
|
mysql -h hostname2 -u root -password=password2
其中:
- 符號“|”用來實現將命令 mysqldump 備份的文件送給 mysql 命令;
- password1 為 hostname1 主機上 root 用戶的密碼;
- password2 為 hostname2 主機上 root 用戶的密碼;
- -all-databases 表示遷移全部的數據庫,可省略。
通過上述語句就可以直接遷移。
2. 不用版本的遷移
不同版本的 MySQL 數據庫之間的數據遷移通常是 MySQL 升級的原因。例如,服務器使用 4.0 版本的 MySQL 數據庫,現在要升級為 5.7 版本的。這樣就需要不同版本的 MySQL 數據庫之間進行數據遷移。
不同版本下的數據庫遷移,分為 2 種方式:
- 低版本數據庫向高版本數據庫進行遷移
- 高版本數據庫向低版本數據庫進行遷移
低版本數據庫向高版本數據庫進行遷移時,由于高版本會兼容低版本,所以該種方式也是最容易實現的操作。對于存儲類型為 MyISAM 的表,最安全和最常用的操作是直接復制數據文件。對于存儲類型為 InnoDB 的表,最安全和最常用的操作是執行 mysqldump 命令進行備份和執行 mysql 命令還原恢復數據。
但是高版本數據庫向低版本數據庫進行遷移時,因為高版本數據庫可能有一些新的特性,這些特性是低版本數據庫所不具有的,所以數據庫遷移時要特別小心,最好使用 mysqldump 命令來進行備份,避免遷移時造成數據丟失。
3. 不同數據庫的遷移
不同數據庫之間的遷移是指從其它類型的數據庫遷移到 MySQL 數據庫,或者從 MySQL 數據庫遷移到其他類型的數據庫。例如,某個網站原來使用 Oracle 數據庫,因為運營成本太高等諸多原因,希望改用 MySQL 數據庫。或者,某個管理系統原來使用 MySQL 數據庫,因為某種特殊性能的要求,希望改用 Oracle 數據庫。這樣的不同數據庫之間的遷移也經常會發生。但是這種遷移沒有普通適用的解決辦法。
其它數據庫也有類似 mysqldump 這樣的備份工具,可以將數據庫中的文件備份成 sql 文件或普通文本。但是,不同的數據庫廠商并沒有完全按照 SQL 標準來設計數據庫,這就造成了不同數據庫使用的 SQL 語句的差異。例如,微軟的 SQL Server 軟件使用的是 T-SQL 語言。T-SQL 中包含了非標準的 SQL 語句。這就造成了 SQL Server 和 MySQL 的 SQL 語句不能兼容。
除了 SQL 語句存在不兼容的情況外,不同的數據庫之間的數據類型也有差異。例如,MySQL 不支持 SQL Server 中的 ntext、 Image 等數據類型。同樣,SQL Server 也不支持 MySQL 中的 ENUM 和 SET 等數據類型。數據類型的差異也造成了遷移的困難。
從某種意義上說,這種差異是商業數據庫公司故意造成的壁壘,這種行為是阻礙數據庫市場健康發展的。
但是不同數據庫服務器間的遷移并不是完全不可能。在 Windows 操作系統下,如果要實現從 MySQL 數據庫服務器向 SQL SERVER 數據庫服務器遷移,可以通過 MyODBC 來實現;如果要實現從 MySQL 數據庫服務器向 ORACLE 數據庫服務器遷移,可以先通過執行 mysqldump 命令導出 sql 文件,然后手動修改 sql 文件中的 CREATE 語句。