YJYW's Style Life

WordPress|使用 mysql_config_editor 解決自動化備份資料庫時,密碼輸入的問題

前言

備份 WordPress 資料庫的方法有很多,像是之前的文章 WordPress|如何進入 phpMyAdmin 管理畫面,登入 phpMyAdmin 後,可以從控制面板將資料庫 export 出來。但是這個方法需要手動登入 phpMyAdmin 才能操作,也不能設定排程或是備份目的地,稍微缺乏彈性。

WordPress 也有很多 plugin 可以做資料庫的自動備份,但如果要做到比較彈性的功能,像是備份到指定的雲端空間,通常需要額外付費才能啟用。

WordPress 使用的 database 是 MySQL,其實 MySQL 本身就有內建不錯用的工具 mysqldump 可以使用,結合 shell script、cron job 與 gsutil tool,就可以在 VM 上部署一個每日將資料庫備份到 GCP Storage 的小程式。

但是 mysqldump 在登入時需要輸入帳號與密碼,密碼如果用明文的方式寫在程式中,會有安全性的疑慮。這時候就可以使用 MySQL 的工具:mysql_config_editor,建立一個將登入密碼加密過的 login-path,再將 login-path 的名稱提供 mysqldump 就可以了。

設定方式

在 VM 的 command-line 輸入 mysql_config_editor --help 看一下說明:

$ mysql_config_editor --help
Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
verbose                           FALSE

Where command can be any one of the following :
       set [command options]     Sets user name/password/host name/socket/port
                                 for a given login path (section).
       remove [command options]  Remove a login path from the login file.
       print [command options]   Print all the options for a specified
                                 login path.
       reset [command options]   Deletes the contents of the login file.
       help                      Display this usage/help information.

輸入 mysql_config_editor print --all 可以印出目前所有的 login-path 設定檔:

$ mysql_config_editor print --all
[foo]
host = 127.0.0.1

輸入 mysql_config_editor set --help 看一下有哪些參數可以設定:

$ mysql_config_editor set --help
escription: Write a login path to the login file.
Usage: mysql_config_editor [program options] [set [command options]]
  -?, --help          Display this help and exit.
  -h, --host=name     Host name to be entered into the login file.
  -G, --login-path=name 
                      Name of the login path to use in the login file. (Default
                      : client)
  -p, --password      Prompt for password to be entered into the login file.
  -u, --user=name     User name to be entered into the login file.
  -S, --socket=name   Socket path to be entered into login file.
  -P, --port=name     Port number to be entered into login file.
  -w, --warn          Warn and ask for confirmation if set command attempts to
                      overwrite an existing login path (enabled by default).
                      (Defaults to on; use --skip-warn to disable.)

試試看建立一組名為 bar 的 login-path:

$ mysql_config_editor set --login-path=bar --host=127.0.0.1 --user=admin --port=3306 --password

--login-path:準備新增的 login-path 的名稱
--host:資料庫的位置,因為資料庫與 WordPress 是同一台 VM,所以輸入 127.0.0.1 即可
--user:登入資料庫的 user name
--port:資料庫開放連線的 port,預設是 3306
--password:登入資料庫的 password,後面不用帶參數,系統會提示操作者輸入密碼;這裡要特別注意,如果密碼中有使用到一些系統在用的特殊符號,需要在密碼前後用雙引號(”)包起來,這樣才會將正確的密碼儲存進去

login-path 成功建立後,不會出現特別的訊息,可以輸入 mysql_config_editor print -all 確認:

$ mysql_config_editor print --all
[foo]
host = 127.0.0.1
[bar]
user = admin
password = *****
host = 127.0.0.1
port = 3306

login-path 建立後,輸入 mysql --login-path=bar 或 mysqldump --login-path=bar -A > backup.sql,就可以登入 mysql,或是將資料庫所有的內容,備份為名稱是 backup.sql 的檔案了。

mysql_config_editor 建立的檔案,存放在 ~/.mylogin.cnf,打開文件會發現是一串被加密過的亂碼。

如果要修改已存在的 login-path,方法與建立 login-path 一樣,都是使用 set 指令,差別在於,修改時系統會偵測到輸入的 login-path 已存在,因此會再與你確認一次,是否真的要修改。

如果想要刪除已存在的 login-path,只要將 set 改成 remove,並且加上 --login-path= 的參數即可:

$ mysql_config_editor remove --login-path=bar

成功刪除後也不會有特別的訊息,一樣可以使用 mysql_config_editor print --all 確認:

$ mysql_config_editor print --all
[foo]
host = 127.0.0.1

藉由 mysql_config_editor 建立的 login-path,撰寫 shell script 登入 mysql 時,只要填入 login-path 的名稱即可,減少了將密碼以明文寫在程式碼中的安全性風險。

參考資料

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *