iT邦幫忙

2021 iThome 鐵人賽

DAY 22
1
Modern Web

網站一條龍 - 從架站到前端系列 第 22

[Day22] 在 GCP 的 VM 上安裝 MySQL

MySQL or MariaDB

CentOS 的 rpm 套件管理器預設沒有 MySQL repository,而是預設使用 MySQL 的妹妹 MariaDB。MySQL 與 MaraiDB 用起來基本上沒什麼差別,甚至連 MySQL Workbench 也通用。但是 .NET 用來與 MySQL/MariaDB 溝通的套件更新速度有差,以 .NET 5 來說,兩者的 release 時間差了約 2 個月。

所以在選擇 MySQL 或 MariaDB 的時候,就必須考量一下自己的情況了。MySQL 的優點是支援速度比較快,而 MariaDB 則是可以完全不用擔心將來他的授權會變。本文系列選擇使用 MySQL 當範例。

安裝 MySQL

  1. CentOS 預設沒有包含 MySQL 在 yum 的 repository裡(但是 MySQL 的妹妹 MariaDB 有),所以我們要透過 wget 來下載這個 repository。首先,先來安裝 wget
    sudo yum install wget

  2. 開啟瀏覽器到 MySQL 的網站找 yum 的 MySQL repository
    https://dev.mysql.com/downloads/repo/yum/
    然後複製下面的 repository name
    https://ithelp.ithome.com.tw/upload/images/20210922/20140664llPxcdfRPV.png

  3. 將剛剛複製的 repository name 貼到 wget 指令開始下載這個 repository 的資訊
    wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

  4. Repository 的資訊下載下來之後,再把它加入 rpm 套件管理器
    sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm

  5. 加入完成後開始安裝 MySQL Server
    sudo yum install mysql-server

  6. 一樣用 systemctl 指令來啟動 MySQL
    sudo systemctl start mysqld

MySQL 預設會隨著開機啟動,所以不必再跑 systemctl enable 指令

  1. 檢查一下 MySQL 的狀態
    sudo systemctl status mysqld

設定 MySQL

安裝完之後,MySQL 會在 /var/log/mysqld.log 這個檔案裡產生一組亂數的密碼,我們可以用下面的指令將它輸出到螢幕上
sudo grep 'temporary password' /var/log/mysqld.log

[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 安裝時產生的密碼

輸出之後別把畫面洗掉,馬上就要用到這組密碼。輸入下列指令開始設定 MySQL
sudo mysql_secure_installation

一開始 MySQL 會要求我們輸入剛剛的預設密碼,這邊有點煩的是不能用複製的,要用手 key 才行。

Enter password for user root: #手動 Key 密碼

認證成功之後,需要輸入一組新的密碼

Securing the MySQL server deployment.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password: 

以前完年的帳號=root密碼=root不能用了QQ…筆者自己測大概最少要 10 碼而且要包含大小寫英文、數字跟符號

換完密碼之後,馬上又會再問一次要不要換密碼(有事嗎…),因為我們才剛剛換過,這邊就輸入 N 不要

Change the password for root ? ((Press y|Y for Yes, any other key for No): N

接下來有一個選項會禁止 root 帳號從外部連線,只能從本機(VM)連,這個設定雖然會增加安全性但是頗麻煩,如果想要從外部用 root 連線,請注意下面這個設定,輸入 N 讓 root 保持可以對外連線。

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : 

接下來除了上面的 root 對外連線看個人喜好要不要開放,其他就是一直按 y 然後 enter 就好

新增使用者

如果上面的設定沒有阻擋 root 對外開放可以跳過這個小節,直接都用 root 帳號操作。

設定完 MySQL 之後,我們來新增一個可以從外部連進來的使用者。首先,我們要先進到 MySQL 的命列列模式,一樣在 Linux shell,輸入
mysql -u root -p
接著輸入 root 的密碼。認證成功之後,就會看到命令的開頭變成

mysql>

再來,輸入建立使用者的 MySQL 指令
CREATE USER '使用者名稱'@'允許連線的IP' IDENTIFIED BY '使用者密碼';

允許連線的 IP 可以打百分比符號(%)允許所有來源 IP 連線。例如
CREATE USER 'ironman'@'%' IDENTIFIED BY 'user_password';

接著要來填筆者自己造的坑(跪)。筆者在自己的電腦是使用 installer 安裝整套 Developer Default,裡面包含了一個範例資料庫 “world”,但是在 CentOS 用 yum 裝不會有這個範例資料庫,所以我們要手動把它建出來,這樣前幾天的 SQL 腳本才不會出錯(再跪QAQ)。
CREATE SCHEMA `world` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci ;

建立使用者之後,要賦予這個使用者權限,為了方便 demo,這邊筆者直接給全部權限
GRANT ALL PRIVILEGES ON world.* TO 'ironman'@'%';

這邊說明一下,上面指令的 ON 後面要接 「資料庫.資料表」,星號代表這個資料庫底下的資料表全給;TO 後面的是使用者名稱,小老鼠後面一樣是來源 IP。一次給全部權限不是很好的做法,正常的情況會根據不同的工程師給對應的權限,這時候就需要用以下語法分別給權限
GRANT SELECT, INSERT,...其他權限 ON 資料庫名稱.資料表名稱 TO '使用者名稱'@'允許的IP來源';
完整的權限列表請參考 MySQL 官方文件

打開防火牆

MySQL server 端的工作搞定了,接下來我們要開啟防火牆,讓我們從自己的電腦用 MySQL Workbench 連線。請參考本系列的 Day13 把 mysql 的 3306 port 打開。

打開之後就能用剛剛創的使用者帳號登入。

匯入資料

登入之後,我們要來把之前在本機建的表還有資料匯入到 VM 上的 MySQL。首先,打開本機的連線,然後點上方的 Server 選單 -> Data Export
https://ithelp.ithome.com.tw/upload/images/20210922/20140664iLM7mdgju1.png

選一下要匯出的資料表以及輸出路徑
https://ithelp.ithome.com.tw/upload/images/20210922/20140664ySLONKiauk.png

接下來點 Start Export,這個按鈕很雷,螢幕太小的話會被 SQL 執行的 Output 視窗遮住,用筆電的邦友可能要調整一下 Output 視窗才能看到這個按鈕。

匯出完成後,切換到 VM 上的 MySQL 連線,一樣在 Server 選單,選 Data Import。然後瀏覽資料夾選一下剛剛匯出的檔案,再點 Start Import。

更新 API 程式

首先 SSH 連上 VM,更新一下程式碼

cd /ironman/dotnet_api/IThomeIronman/
sudo git pull

再來用 vim 編輯正式環境用的 appsettings.json

sudo vi /ironman/dotnet_api/IThomeIronman/Ithome_2021_API/appsettings.json
"MySqlOptions": {
    "ConnectionString": "Server=localhost;Database=world;Uid=root;Pwd=安裝時設定的密碼;"
  }

然後重新發布 API 程式並重啟

sudo dotnet publish -c Release
sudo systemctl restart ironman_api

測試連線

一切就緒之後,再到我們的瀏覽器打打看 https://之前申請的域名/api/User,應該就能看到我們 API 從 MySQL 撈資料然後回傳給我們
https://ithelp.ithome.com.tw/upload/images/20210922/20140664IJr64SwfxM.png


到此,架站、API、資料庫等躲在前端頁面後的東西大致上都完成了,明天開始,我們即將開始介紹網頁的前端。


上一篇
[Day21] 在 .NET 使用 Dapper 操作 MySQL
下一篇
[Day23] Angular 簡介
系列文
網站一條龍 - 從架站到前端33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言