[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、资料库等躲在前端页面後的东西大致上都完成了,明天开始,我们即将开始介绍网页的前端。


<<:  [早餐吃到饱-3] 温莎咖啡厅 - 裕元花园酒店 Breakfast Buffet at Windsor Hotel in Taichung

>>:  [Day7]Where子句

虹语岚访仲夏夜-22(专业的小四篇)

「你又在看什麽? 我已经气到不想跟你说话了。」 『我才气好吗?  别生气啦...我把现在这个看完好吗...

Day20 vue.js椅毒供毒之整理code

写出不乾净的code跟WEED一样 一开始写的时候可能会感到轻松快乐 但是後续的维护或修改会把自己搞...

EP15 - [TDD] 建立 Order 参数 (1/2)

Youtube 频道:https://www.youtube.com/c/kaochenlong ...

DAY13 资料室--Vuex载荷Payload

前言 为什麽要特别提一下 Payload ? 是因为像 mutations 跟 actions,其实...

WordPress 如何关闭 XML-RPC 服务,避免资安攻击风险

为了提升 WordPress 站台安全性,我安装了防火墙及防毒外挂 Wordfence,此外挂提供了...