人生處處皆學問,工作也是如此!過去不止一次在Linux上安裝MySQL,可以說輕車熟路,但是寫篇文章總結一下,發現有很多細節值得學習!
安裝包選擇
為什么用rpm?
在Linux系列上安裝軟件一般有源碼編譯安裝、rpm(或者dpkg)、yum等方式,優劣主要體現在是否需要網絡環境、是否能自動檢測依賴,升級和卸載是否方便等。作為非運維人員,也需基本了解。
源碼安裝支持離線,但即使可以自動創建 Makefile等文件簡化安裝,整個過程也比較復雜,升級和卸載更麻煩。針對一些沒有官方釋出的軟件,只能選擇這種方式。
yum方式可以自動監測依賴,並且安裝過程中可以將安裝信息寫入系統的軟件管理程序,升級卸載都比較方便。缺點是多數情況下需要良好的網絡環境,尤其是一些沒有國內鏡像的軟件,速度感人。(事實上,有些情況也可以在rpm包所在的目錄下以離線方式使用yum,前提是各種依賴都在本地具備)。
rpm相當於官方編譯好的安裝包,支持離線,能夠檢測依賴,但部分軟件沒有rpm包。所以說一定程度上rpm具備了上述兩種方式的優點。
實際情況下,要根據具體的環境選擇,一般來說rpm優先於源碼。
本次安裝環境:
Centos7.8 (最小安裝,root權限)
mysql 社區版8.0.16
此處選擇上傳已經下載好的官方打包bundle文件mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar
,也可以在官方網站分別下載未打包的多個文件。
或者在線下載(也可以在本地直接將wget后面的地址復制到瀏覽器地址欄,將自動開始下載)
wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar
解壓
注意此處解壓命令是,-xvf 沒有z
tar -xvf mysql-8.0.16-2.el7.x86_64.rpm-bundle.tar
解壓后包含8個文件,
安裝前環境檢測
檢查
在MySQL被收購后,MySQL最初的作者擔心MySQL存在閉源的風險,在MySQL的分支上開發了mariadb。后來一些Linux分發版就將mariadb作為系統默認安裝的數據庫系統,理論上mariadb兼容MySQL,甚至某些方面性能更好。(當然,我沒有測試過)
rpm -qa | grep -i mariadb
可能結果顯示
mariadb-libs-5.5.65-1.el7.x86_64
去除依賴
rpm -ev --nodeps mariadb-libs-5.5.65-1.el7.x86_64
安裝
安裝順序
應當按照common–>libs–>client–>server的順序安裝,否則安裝過程會提醒依賴順序,其他的為非必須安裝包。
rpm -ivh mysql-community-common-8.0.16-2.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.16-2.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.16-2.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.16-2.el7.x86_64.rpm
正如文章開始提到的,也可以在解壓后的安裝包文件下使用yum install
命令代替rpm(非必須)
啟動與修改密碼
啟動
systemctl start mysqld
查看狀態
systemctl status mysqld
查看初始隨機密碼
cat /var/log/mysqld.log | grep password
結果類似下面內容,則初始密碼為tC0;+kB?BqCg
2020-09-02T05:30:06.739311Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: tC0;+kB?BqCg
使用root角色登錄
mysql -u root -p
粘貼或輸入初始密碼,注意,Linux為了安全,MySQL命令行上可能沒有反應或者****,但密碼已經輸入
修改密碼
第一次使用隨機生成的密碼登錄后必須修改密碼,否則無法進行其他操作。
密碼要求
按照MySQL8.0默認的密碼組件,此時的密碼要求是必須包含數字,大小寫字母,特殊字符,且長度不低於8位,否則會提示密碼不符合規則。建議按照這種方式設置,如果想將密碼設置成123456這種簡單形式(養成良好習慣,不建議),請看本文最后一部分,密碼問題。
以123456為密碼測試
ALTER user 'root'@'localhost' IDENTIFIED BY '123456';
此處我們將密碼設置為Root.123456 注意R大寫,t后有英文句號。
ALTER user 'root'@'localhost' IDENTIFIED BY 'Root.123456';
開放遠程登錄權限
此時只能以root角色登錄,同樣出於安全,MySQL的root角色只能在本地登錄,正規的做法應當是用root權限分配其他不同角色供遠程登錄。
但這里還是強行開啟root角色的遠程登錄權限,否則再寫角色分配相關的內容,文章就成了太長不看系列了。
開放權限的本質是在數據庫mysql中修改user表的host屬性,使其可以被本地之外的IP連接,依次執行以下語句。
use mysql;
select host,user from user;
update user set host='%' where user ='root';
執行以上語句之后在執行刷新權限:
flush privileges;
開放防火牆端口
開啟root遠程登錄權限后,還無法直接被外界連接,因為MySQL的端口號3306在Linux中默認關閉的。
注意:使用阿里雲等雲服務器還需要在控制台中安全組策略打開端口,此處省略。
查詢3306端口是否開啟
firewall-cmd --query-port=3306/tcp
開啟3306
firewall-cmd --zone=public --add-port=3306/tcp --permanent
重新加載防火牆
firewall-cmd --reload
此時我們的程序已經可以直接連接MySQL了。
配置文件更改(非必須)
要修改mysql數據和日志存放位置等信息,配置文件是/etc/my.cnf,直接修改保存位置。
vim /etc/my.cnf
以下內容非必須。
Navicat等工具遠程連接問題(非必須)
在使用Navicat或者Sqlyog工具時,較新的版本已經可以直接連接,所以開始此步驟前可以使用Navicat測試連接是否成功。
但舊版本Navicat連接mysql8.0時,可能無法與mysql的加密規則匹配,導致連接失敗。此處的加密規則說的是對你的密碼進行加密保存時采用的算法。
更改mysql的加密規則
查看加密規則
show variables like "default_authentication%";
結果可能為
修改規則
alter user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密碼';
此時使用Navicat連接成功。
密碼問題(非必須)
修改密碼規則
注意:若依照前面說的規則設置復雜的密碼,這一步驟直接可以省略。
再次啰嗦,建議將密碼設置為復雜程度較高的(前提是不要忘記)。若仍然要將密碼設置為簡單的,往下看。
登錄MySQL
查看密碼規則要求(正常情況下已經默認安裝了密碼相關組件)
SHOW VARIABLES LIKE 'validate_password.%';
validate_password.policy的值
可以使用數字值0、1、2或相應的符號值LOW,MEDIUM,STRONG來指定validate_password.policy值
Policy | Tests Performed |
---|---|
0 or LOW |
Length |
1 or MEDIUM |
Length; numeric, lowercase/uppercase, and special characters |
2 or STRONG |
Length; numeric, lowercase/uppercase, and special characters; dictionary file |
如果想使用類似於123456形式的簡單密碼,需要更改密碼規則和密碼長度
mysql8.0及以后的版本
set global validate_password.policy=0;
set global validate_password.length=1;
實際上,密碼長度即使設為1,其最小長度也不會小於下面函數的值,即默認長度始終不會小於4
validate_password.number_count+ validate_password.special_char_count+ (2 * validate_password.mixed_case_count)
5.7及以前版本
set global validate_password_policy=0;
set global validate_password_length=1;
更改密碼
此處密碼改為123456
ALTER user 'root'@'localhost' IDENTIFIED BY '123456';
最后
比起整個流水化的安裝過程,其實更值得深思的是,僅僅一個密碼設置和保存,MySQL就提供了不同的組件,設置了不同的規則和策略,盡最大程度去平衡方便和安全,某種意義上說,也是值得我們學習的匠心吧!