安裝MySQL8以及相關設置
1、概述
本文記錄在CentOS7.5中使用rpm包安裝MySQL8的過程,以及裝完數據庫之後需要做的一些設置,包括設置非大小敏感、設置遠程連接、修改數據庫默認存儲目錄,這些是對過往工作經歷的總結,一份書寫一份沉澱,若能不經意間幫到正在路上的你,吾心備喜焉。
2、安裝過程
2.1、上傳rpm包到CentOS中
本文使用的rpm捆綁包(rpm-bundle),包含client、server以及一些其他內容,從MySQL官方的下載列表中也可以看出rpm-bundle文件大小是最大的,所以它包含的內容是也是最全的,本文使用的版本詳細如下:
mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar
將tar包上傳到當前用戶的home目錄下。
2.2、檢查並卸載MariaDB
從CentOS7開始,CentOS系統預裝了MariaDB數據庫,它是MySQL的一個分支,由最初的MySQL開發者管理維護,如果我們暫時不需要該數據線庫,可以將其卸載,如果不卸載的話在安裝MySQL時也會出現錯誤。
檢查MariaDB的安裝情況,命令rpm -qa|grep mariadb,如下:
[Jhone@workstation ~]$ rpm -qa|grep mariadb
mariadb-libs-5.5.56-2.el7.x86_64
卸載已安裝的MariaDB,命令rpm -e --nodeps xxx,如下:
[Jhone@workstation ~]$ sudo rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
若要檢查系統中是否已安裝MySQL,也可以使用上面的命令進行檢查和卸載,將參數換成MySQL相關的即可。
2.3、解壓MySQL8安裝包
tar -xvf mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar
[Jhone@workstation ~]$ tar -xvf mysql-8.0.15-1.el7.x86_64.rpm-bundle.tar
mysql-community-server-8.0.15-1.el7.x86_64.rpm
mysql-community-client-8.0.15-1.el7.x86_64.rpm
mysql-community-common-8.0.15-1.el7.x86_64.rpm
mysql-community-libs-8.0.15-1.el7.x86_64.rpm
mysql-community-devel-8.0.15-1.el7.x86_64.rpm
mysql-community-test-8.0.15-1.el7.x86_64.rpm
mysql-community-libs-compat-8.0.15-1.el7.x86_64.rpm
mysql-community-embedded-compat-8.0.15-1.el7.x86_64.rpm
通常,要實現MySQL的實用且標準的安裝,需要把 mysql-community-server, mysql-community-client, mysql-community-libs, mysql-community-common, and mysql-community-libs-compat這些包都進行安裝,即使用如下命令:
[Jhone@workstation ~]$ sudo yum install mysql-community-{server,client,common,libs}-*
安裝這些包時使用更高級別的包管理工具(如yum)更可取的,喜歡使用rmp命令的用戶可以考慮使用rpm -Uvh來取代yum install,然而使用rpm -Uvh安裝時更容易失敗,因爲存在一些潛在的依賴問題。
如果只安裝MySQL的客戶端程序,在安裝列表裏面可以略過mysql-community-server,即使用如下的命令:
[Jhone@workstation ~]$ sudo yum install mysql-community-{client,common,libs}-*
2.4 安裝完成後默認目錄概覽
使用RPM包產生安裝標準的MySQL時會在系統目錄下產生一寫文件和資源,它們的具體路徑如下:
Files or Resources | Location |
---|---|
Client programs and scripts | /usr/bin |
mysqld server | /usr/sbin |
Configuration file | /etc/my.cnf |
Data directory | /var/lib/mysql |
Error log file | For RHEL, Oracle Linux, CentOS or Fedora platforms: /var/log/mysqld.log For SLES: /var/log/mysql/mysqld.log |
Value of secure_file_priv | /var/lib/mysql-files |
System V init script | For RHEL, Oracle Linux, CentOS or Fedora platforms: /etc/init.d/mysqld For SLES: /etc/init.d/mysql |
Systemd service | For RHEL, Oracle Linux, CentOS or Fedora platforms: mysqld For SLES: mysql |
Pid file | /var/run/mysql/mysqld.pid |
Socket | /var/lib/mysql/mysql.sock |
Keyring directory | /var/lib/mysql-keyring |
Unix manual pages | /usr/share/man |
Include (header) files | /usr/include/mysql |
Libraries | /usr/lib/mysql |
Miscellaneous support files (for example, error messages, and character set files) | /usr/share/mysql |
安裝結束後會在系統中產生名爲mysql的用戶和名爲mysql的組。
注意,使用老版本的安裝包安裝MySQL的話,會在/usr下產生一個名爲my.cnf的配置文件,在此強烈推薦,將該文件的內容合併到/etc/my.conf中,並移除/usr/my.conf。
3、修改MySQL8大小寫敏感問題
MySQL8默認情況下是區分大小寫的,這也是在一次遷移數據庫的過程中發現的問題,要想設置MySQL8爲非大小寫敏感,可以在/etc/my.cnf中添加一行內容,lower_case_table_names=1(1-不敏感,0-敏感,MySQL8中默認大小寫敏感),注意一定要在首次啓動數據庫服務之前進行添加,且應該添加到datadir之前,如下所示,一旦啓動後再添加該內容設置非大小寫敏感將無效,且可能面臨數據庫無法啓動的問題。
lower_case_table_names=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
4、MySQL啓/停
MySQL在安裝過程結束後是沒有啓動的,可以使用下面命令來管理MySQL
啓動MySQL:
systemctl start mysqld
重啓MySQL:
systemctl restart mysqld
停止MySQL:
systemctl stop mysqld
查看MySQL狀態:
systemctl status mysqld
mysqld服務默認是使能的,隨系統啓動而啓動。還可以使用service命令來管理MySQL,與systemctl命令的區別是,後面的兩個參數互換一下位置,如下:
啓動MySQL:
service mysqld start
重啓MySQL:
service mysqld restart
停止MySQL:
service mysqld stop
查看MySQL狀態:
service mysqld status
5、初始化時發生了什麼
假設data directory是空的,那麼在數據庫初始化節點發生了一下幾件事:
- 初始化MySQL服務
- 在data directory中生成SSL證書和key文件
- 安裝密碼有效性驗證機制(validate_password)並使之生效
- 創建超級用戶賬號root,設置root的密碼並將其保存在日誌文件中(/var/log/mysqld.log)
注意,密碼有效性驗證機制要求密碼包含至少一個大寫密碼、一個小寫字母、一個數字和一個特殊字符,且密碼長度至少爲8爲。如果安裝過程中出現問題,可以查看日誌文件——/var/log/mysqld.log
6、安裝完畢之後的設置
6.1、查看root的臨時密碼並登陸
使用grep命令在日誌文件中查看root用戶的臨時密碼,如下:
[Jhone@workstation ~]$ sudo grep 'temporary password' /var/log/mysqld.log
2020-03-26T08:55:59.825512Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: H5NAGiWh,tOm
因爲是臨時密碼,在此將其公之於衆也無妨 :)。
使用上面查到的臨時密碼登錄數據庫,雖說在命令行中直接顯式地輸入密碼不提倡,但有時臨時密碼略顯複雜,不太容易做到一次輸對,所以用臨時密碼登錄時暫且用這種方式吧:
[Jhone@workstation ~]$ mysql -uroot -pH5NAGiWh,tOm
6.2、修root用戶的密碼
在用臨時密碼登錄數據庫之後,需要修改root用戶的密碼,否則無法使用數據庫。具體操作如下:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'newPassword888!';
Query OK, 0 rows affected (0.01 sec)
6.3、授權遠程連接
6.3.1、對遠程命令行連接的支持
默認情況下,MySQL數據庫不支持遠程連接,可以是使用use mysql命令進入到mysql這個數據庫下,查看user表中root用戶的host值,查看命令如下:
mysql> select host, user, authentication_string plugin from user;
+-----------+------------------+------------------------------------------------------------------------+
| host | user | plugin |
+-----------+------------------+------------------------------------------------------------------------+
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root | $A$005$(.%YF==%<b+F;(r#jtUqzHRL993Exsb.fe2ctAxgd3CXz9QwvrotzYO42LXS/ |
+-----------+------------------+------------------------------------------------------------------------+
4 rows in set (0.00 sec)
爲實現遠程使用root用戶訪問MySQL,更新user表中root用戶的host值爲%即可,操作詳情如下:
mysql> update user set host='%'where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
再次查看root用戶host值:
mysql> select host, user, authentication_string plugin from user;
+-----------+------------------+------------------------------------------------------------------------+
| host | user | plugin |
+-----------+------------------+------------------------------------------------------------------------+
| % | root | $A$005$W 4-XlUuGNx[\4j0z80uDbY0Sa4t2c0pO81/ujAy0tbtW5OE0nEkLaiX3jvD |
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
+-----------+------------------+------------------------------------------------------------------------+
4 rows in set (0.00 sec)
可以看host已經變爲%,然後還需要執行flush privileges;,執行效果如下:
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
經過以上修改,就可以從遠程的命令行客戶端連接MySQL了。
6.3.2、對GUI客戶端工具連接的支持
如果使用GUI客戶端進行連接,可能會出現以下錯誤:
‘caching_sha2_password’ cannot be loaded
這是因爲MySQL8使用了最新的認證插件——caching_sha2_password,而剛纔使用的GUI客戶端如果因版本低不包含此插件的話就會出現這種問題,解決方法有兩種,要麼使用新版本的GUI工具,比如MySQL Workbench 8.0 CE,要麼把密碼加密方式恢復到MySQL之前版本使用的方式——mysql_native_password,這裏採用恢復到原來版本中使用的機密方式進行修改,操作如下:
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'newPassword888!';
Query OK, 0 rows affected (0.01 sec)
依然記得要執行flush privileges;,執行效果如下:
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
至此,通過遠程命令行和GUI工具都可以連接MySQL數據庫了。
6.4、修改數據存儲目錄
在生產環境中,如果想把數據存儲在空間更大的目錄下,就需要修改數據存儲目錄。
6.4.1、確認當前的數據目錄
從命令行登錄數據庫,查看datadir的值:
mysql> select @@datadir;
+-----------------+
| @@datadir |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)
可以看到當前MySQL使用的的默認數據目錄——/var/lib/mysql/,之後使用exit命令退出數據庫即可:
mysql> exit
Bye
6.4.2、停止運行數據庫
爲保證數據完整性,在更改數據存儲目錄之前先停止數據庫:
[Jhone@workstation ~]$ systemctl stop mysqld
6.4.3、使用rsync同步數據至新目錄
使用rsync命令將已有數據同步到新路徑下,該命令配合-a使用可以保留全新和其他目錄屬性,配合-v使用可以輸出詳細信息以便跟蹤安裝進度,假設要把新目錄指定到/newmysqldata下,使用如下方式進行數據同步:
[Jhone@workstation ~]$ sudo rsync -av /var/lib/mysql /newmysqldata
注意,上面的操作沒有在/var/lib/mysql後加斜槓,這種方式能把mysql目錄本身及其來裏面的內容全部同步到新目錄中。
一旦同步完成,將/var/lib/mysql重命令爲/var/lib/mysql.bak,以避免再次啓動數據庫時可能引起的混淆:
[Jhone@workstation ~]$ sudo mv /var/lib/mysql /var/lib/mysql.bak
6.4.4、修改配置文件
修改/etc/my.cnf文件,並將datadir指向新的數據目錄,另外,由於socket也指向之前的數據目錄,這裏也需要將它更新爲新目錄:
datadir=/newmysqldata/mysql
socket=/newmysqldata/mysql/mysql.sock
除了更新配置文件中已存在的內容外,還需要在配置文件中爲mysql客戶端添加新內容,在文件末尾添加如下新內容:
[client]
port=3306
socket=/newmysqldata/mysql/mysql.sock
以上內容,存盤即可。
6.4.5、關於selinux工作模式
CentOS中selinux默認是開啓的,可以通過如下命令查看:
[Jhone@workstation ~]$ getenforce
Enforcing
selinux有三種工作模式enforcing-強制模式、permissive-寬容模式和disabled-關閉模式,上面的輸出標明其默認工作在強制模式下,在這種模式下可能會影響修改數據目錄後的MySQL的啓動,爲此需要將工作模式更改爲permissive或enforcing。
更改爲permissive模式
可以使用setenforce 0命令臨時從enforcing切換到permissive模式,並查看模式是否已變更:
[Jhone@workstation ~]$ sudo setenforce 0
[Jhone@workstation ~]$ getenforce
Permissive
enforcing 和 permissive 模式可以通過 setenforce 1或0 命令快速切換,但是這種切換是臨時性的,在系統重啓後立即失效。
如果想運行在permissive模式下且永久生效,需要修改/etc/selinux/config文件,將SELINUX=enforcing改爲SELINUX=permissive,重啓系統即可。
更改爲disabled模式
在Linux命令行中無法直接通過命令將selinux切換到disabled模式,唯一的辦法就是將/etc/selinux/config文件中SELINUX的值改爲disabled,並重啓系統。
需要注意的是,從disabled模式切換到enforcing或permissive模式時,只能通過修改文件並重啓系統的方式解決,反之亦然。
6.4.6、重新啓動MySQL並查看datadir
當selinux處於permissive或disabled模式時,修改了數據目錄後的MySQL均可以正常啓動,啓動後再次從命令行登入MySQL,查看datadir的值:
mysql> select @@datadir;
+----------------------+
| @@datadir |
+----------------------+
| /newmysqldata/mysql/ |
+----------------------+
1 row in set (0.00 sec)
可以看到數據目錄已經指向了新的目錄。
7、總結
本文走過了從安裝MySQL8到設置非大小敏感到設置遠程連接到修改數據庫默認存儲目錄這樣一條華麗路線,給自己一份總結給讀者一份幫助。