Linux安裝mysql 8.0

趙帥強發表於2018-12-13

經過一番努力下載mysql檔案,我們可以開始Mysql8.0的安裝了。

解壓檔案

// 解壓檔案生成兩個xz格式的壓縮檔案
$ tar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar
mysql-router-8.0.13-linux-glibc2.12-x86_64.tar.xz
mysql-test-8.0.13-linux-glibc2.12-x86_64.tar.xz
// 我們需要先刪掉/移除原有檔案,才可以繼續解壓,因為解壓出來的.tar檔案和.tar.xz檔案重名
mv mysql-8.0.13-linux-glibc2.12-x86_64.tar ../
xz -d mysql-router-8.0.13-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar
// 為了方便查詢,改個名字
mv mysql-8.0.13-linux-glibc2.12-x86_64.tar mysql8

環境配置

我們需要專門的mysql程式啟動使用者和許可權管理:

// 建立mysql系統使用者和使用者組
useradd -r mysql
// 給予安裝目錄mysql許可權
chown mysql:mysql -R mysql8

配置自己的mysql配置檔案,因為我有多個Mysql庫,我手動指定很多引數:

[client]
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
default-character-set=utf8

[mysql]
basedir=/home/work/lnmp/mysql8/
datadir=/home/work/lnmp/mysql8/data/
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
port=3306
user=mysql
# 指定日誌時間為系統時間
log_timestamps=SYSTEM
log-error=/home/work/lnmp/mysql8/log/mysql.err
# 指定字符集為utf8,因為mysql8.0中的預設字符集為utfmb4,會和其他程式引起相容性問題
default-character-set=utf8

[mysqld]
basedir=/home/work/lnmp/mysql8/
datadir=/home/work/lnmp/mysql8/data/
socket=/home/work/lnmp/mysql8/tmp/mysql.sock
port=3306
user=mysql
log_timestamps=SYSTEM
collation-server = utf8_unicode_ci
character-set-server = utf8
# 指定預設認證的加密方式,mysql8.0中預設方式為caching_sha2_password,引起老版本相容性問題
default_authentication_plugin= mysql_native_password

[mysqld_safe]
log-error=/home/work/lnmp/mysql8/log/mysqld_safe.err
pid-file=/home/work/lnmp/mysql8/tmp/mysqld.pid
socket=/home/work/lnmp/mysql8/tmp/mysql.sock

[mysql.server]
basedir=/home/work/lnmp/mysql8
socket=/home/work/lnmp/mysql8/tmp/mysql.sock

[mysqladmin]                                                                                                                                  
socket=/home/work/lnmp/mysql8/tmp/mysql.sock 

這個裡面我指定了錯誤日誌的路徑,在接下來的操作中,如果出現錯誤,除了檢視終端顯示的錯誤,還要記得去錯誤日誌裡檢視詳細的資訊。

因為我指定了一些檔案,所以需要提前建立:

mkdir log
touch log/mysql.err
touch log/mysqld_safe.err
mkdir tmp
chown mysql:mysql -R ../*

資料庫初始化

如果我們不初始化,直接使用bin/mysqld_safe啟動會報錯,因為我們需要初始化mysql環境,此時參考文章

$ bin/mysqld --initialize --user=mysql --basedir=/home/work/lnmp/mysql8/ --datadir=/home/work/lnmp/mysql8/data/
2018-12-13T06:15:03.159123Z 0 [System] [MY-013169] [Server] /home/work/lnmp/mysql8/bin/mysqld (mysqld 8.0.13) initializing of server in progress as process 1190
2018-12-13T06:15:05.255817Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: !/7oy-u%(XfZ
2018-12-13T06:15:06.135143Z 0 [System] [MY-013170] [Server] /home/work/lnmp/mysql8/bin/mysqld (mysqld 8.0.13) initializing of server has completed

提示中提示我們已經建立了root的使用者和一個臨時密碼,同時初始化成功。

啟動資料庫

這時根據官方文件我們使用mysqld_safe 命令來啟動:

$ bin/mysqld_safe
2018-12-13T06:16:58.604154Z mysqld_safe Logging to `/home/work/lnmp/mysql8/log/mysql.err`.
2018-12-13T06:16:58.629249Z mysqld_safe Starting mysqld daemon with databases from /home/work/lnmp/mysql8/data

開啟資料庫

資料庫程式已經啟動,我們可以在新終端正常使用mysql資料庫了:

$ ps aux | grep mysql 
root      2141  0.0  0.0 815844  5328 pts/0    S+   14:16   0:00 /bin/sh bin/mysqld_safe
mysql     2319  1.0  0.5 1997492 374448 pts/0  Sl+  14:16   0:00 /home/work/lnmp/mysql8/bin/mysqld --basedir=/home/work/lnmp/mysql8/ --datadir=/home/work/lnmp/mysql8/data --plugin-dir=/home/work/lnmp/mysql8//lib/plugin --user=mysql --log-error=/home/work/lnmp/mysql8/log/mysql.err --pid-file=/home/work/lnmp/mysql8/tmp/mysqld.pid --socket=/home/work/lnmp/mysql8/tmp/mysql.sock --port=3306
work     25258  0.0  0.0 105356   824 pts/1    S+   14:18   0:00 grep mysql

但是直接使用mysql命令報錯:

$ bin/mysql -uroot
ERROR 2002 (HY000): Can`t connect to local MySQL server through socket `/tmp/mysql.sock` (2)

根據mysql.sock的作用的說明,我們指定mysql.sock路徑即可:

bin/mysql -S /home/work/lnmp/mysql8/tmp/mysql.sock -h localhost -uroot -p
Enter password: 

修改初始密碼

我們開啟資料庫後使用任何命令會提示我們修改初始的臨時密碼:

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

修改密碼:

mysql> ALTER USER `root`@`localhost` IDENTIFIED BY `123456`;
Query OK, 0 rows affected (0.05 sec)

重新連線,新密碼生效。

連結全域性命令

此時,我們呼叫mysql只能用路徑/home/work/lnmp/mysql8/bin/mysql或相對路徑,需要連結為全域性命令:

$ ln -s /home/work/lnmp/mysql8/bin/mysql /usr/bin/
$ ln -s /home/work/lnmp/mysql8/bin/mysql_safe /usr/bin/

指定socket檔案

在8.0這個版本,我嘗試了很多方法試圖在my.cnf中修改mysql命令查詢的預設socket路徑,依然不成功,所以只好在預設路徑裡面連結socket檔案了:

ln -s /home/work/lnmp/mysql8/tmp/mysql.sock /tmp/

然後我們再呼叫mysql命令就不會報錯了。

重啟資料庫

在過程中我們除錯引數可能需要重啟資料庫:

// 殺死程式,相當於停止
cat tmp/mysqld.pid | xargs kill
// 正常啟動mysql
bin/mysqld_safe  --defaults-file=/home/work/lnmp/mysql8/my.cnf

新增使用者&賦予許可權

在mysql8裡,我建立使用者並賦值,結果報錯:

mysql > grant all privileges on *.* to root@localhost indentified by `123456`;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near `indentified by `123456`` at line 1

根據網上資料,是由於Mysql8將建立賬戶和賦予許可權的操作分開了:

// 建立賬戶
create user `使用者名稱`@`訪問主機` identified by `密碼`;
// 賦予許可權(修改許可權時在後面加with grant option)
grant 許可權列表 on 資料庫 to `使用者名稱`@`訪問主機` ;
// 重新整理許可權
flush privileges;

注意事項

當我安裝好後連線我其他的資料庫時:

$ mysql -h 10.92.143.15 -uroot -p
Enter password: 
ERROR 1043 (08S01): Bad handshake

這個錯誤是由於遠端資料庫版本過低(版本:5.1.30)的問題,在mysql8.0的文件上,有標明支援的資料庫版本需要>=5.5才行,因此他們建議升級其餘的資料庫為5.6版本。

總結

經過解壓檔案,建立mysql使用者和使用者組,配置my.cnf配置檔案,修改許可權,資料庫初始化、啟動,開啟資料庫,修改初始密碼,連結全域性命令和指定socket檔案路徑,所有的安裝工作都已經完成了。

參考資料

  1. 4.3.2 mysqld_safe — MySQL Server Startup Script:https://dev.mysql.com/doc/ref…
  2. mysql_install_db command is missing after installing mysql: https://bbs.archlinux.org/vie…
  3. mysql.sock 檔案解析:https://segmentfault.com/a/11…
  4. Linux升級wget/curl用於下載https檔案的過程:https://segmentfault.com/a/11…
  5. :https://blog.csdn.net/li_0891…

相關文章