[Web] 自動備份 utf16 MySQL 資料庫

前一篇文章裡面我們講解了如何針對 MySQL 資料庫中的 utf16_unicode_ci 的欄位進行讀寫,加入 utf16 的編碼的確讓開發多了很多要考慮的地方,筆者在進行網站開發的時候,為了不影響到 business 的運作,跟大部分的工程師一樣有 DEV 與 PRD 的環境,本篇想要紀錄自動拷貝 PRD 的 MySQL 資料庫到 DEV 的環境並且自動備份 utf16 MySQL 資料庫的方法。

網路上很多參考資料有講解如何利用 Cmd 的方式自動備份資料庫,主要可以分成以下兩個方式:

1. 利用 mysqldump, mysqladmin 與 mysql 等等指令:
mysqldump -u user -p$passwd -R old_database > ./backup/tmp".sql"
mysqladmin -u user -p$passwd create new_database
mysql -u user -p$passwd new_database < ./backup/tmp".sql"
mysqladmin -u user -p$passwd drop old_database

筆者嘗試過這個方法,雖然可以成功地將所有檔案匯出到 .sql 的檔案中備份,但是所有 utf16_unicode_ci 的欄位,在第三步匯入 .sql 到新的資料庫的時候會發生亂碼的情形!

2. 自己寫一個  Linux Shell Script 利用迴圈複製表格(後來採用的方法):
$mysqlconn -e "CREATE DATABASE new_database CHARACTER SET utf16 COLLATE utf16_unicode_ci"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE table_schema='old_database'")

for name in $params; do
    $mysqlconn -e "CREATE TABLE IF NOT EXISTS new_database.\`$name\` LIKE old_database.\`$name\`";
    $mysqlconn -e "INSERT new_database.\`$name\` SELECT * FROM old_database.\`$name\`";
done;

首先我們利用 mysqlconn 這一個指令將 old_database 裡面的所有表格都列表出來放在 $params 裡面,接著用一個 Linux Shell Script 將個別的表格複製並新增進新的資料庫!以上兩個方法理論上都是可以行得通的,但是筆者因為有特殊符號要處理,所以只能夠使用第二個方法!以上提供參考!

備註:關於 Create Table 我們使用的是參考網站提供的方法
CREATE TABLE IF NOT EXISTS new_database.`table` LIKE old_database.`table`
INSERT new_database.\`$name\` SELECT * FROM old_database.\`$name\`

而不是使用

CREATE TABLE new_database.`table` SELECT * FROM old_database.\`$name\`

主要原因是因為後面的方法並無法複製表格中的一些設定值例如 PrimaryKey 或是 Auto_Increment 等等的特性!