天天看點

小白學習MySQL - 資料庫軟體和初始化安裝

作為個人學習環境來說,搭建一套VMWare的環境,算是成本效益最高的一種選擇,當然你可以購買一些公有雲伺服器。

Linux的安裝就不在這贅述了,重點說說MySQL資料庫的安裝。

首先,就是下載下傳媒體,MySQL官網就可以下,這兩個連結都可以的,

https://www.mysql.com/downloads/ https://dev.mysql.com/downloads/mysql/

差別就是前者是商業版,後者是社群版,從軟體自身來說,兩者都是相同的,不同的是商業版可以購買享受官方的技術服務,社群版隻能從社群獲得技術支援。

從下載下傳選項中,我們看到支援很多的作業系統,例如Windows、各種Linux、Solaris、macOS等等,

小白學習MySQL - 資料庫軟體和初始化安裝

對企業來說,一般會選擇非Windows平台安裝MySQL,我們的測試環境選擇在Linux下安裝MySQL,其中作業系統版本是Red Hat Enterprise Linux Server release 7.5 (Maipo),資料庫是MySQL 5.7和MySQL 8.0。

MySQL其實和Oracle在某些地方很相像,在這我們說的“安裝資料庫“,算是個廣義概念,可以拆成倆步驟,一是安裝資料庫軟體,二是初始化資料庫,首先我們說資料庫軟體的安裝。

Linux下的安裝可以分成幾類,rpm安裝、源碼安裝、二進制安裝,

1. rpm安裝,可能很簡單,直接執行rpm指令,即可完成安裝,但是這種安裝,不是很靈活,例如不能改動安裝路徑。

2. 源碼安裝,顧名思義,下載下傳的是MySQL的源碼,通過執行cmake進行編譯來安裝,用時較長,能根據自己的需要進行自定義配置。

3. 二進制安裝,官方提供的二進制安裝包,都是針對特定平台專門優化過的,無需考慮過多的環境因素,直接解壓即可,還可以根據實際需求做一些個性化的配置。

一、rpm安裝

可參考文末連結,通過rpm安裝MySQL 5.6,不在此贅述。

二、源碼安裝

這種安裝操作,簡單嘗試一下,5.7和8.0基本相同,以5.7為例。

媒體通常是.tar.gz檔案,mysql-VERSION.tar.gz格式壓縮包,例如,

mysql-5.7.32.tar.gz

mysql-8.0.23.tar.gz

1. 解除安裝Linux自帶的MariaDB,

rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodepsrpm -e mariadb-5.5.56-2.el7.x86_64 --nodepsrpm -e mariadb-server-5.5.56-2.el7.x86_64 --nodeps      

2. 建立使用者、使用者組,(可能已存在,繼續使用,或者删除重建)

groupadd mysql
useradd -g mysql mysql      

3. 設定作業系統的資源限制,

vi /etc/security/limits.conf
mysql            soft    nproc          2047
mysql            hard    nproc          16347
mysql            soft    nofile         1024 
mysql            hard    nofile         65536      

4. 安裝依賴包,(可能有些包已經存在)

yum install bison libaio-devel* perl gcc gcc-c++ ncurses ncurses-devel openssl openssl-devel      

5. 源碼安裝需要cmake,一種方式是通過yum安裝,但是這種操作,并未生成CMakeCache.txt,會導緻安裝資料庫失敗,可能還是配置問題或者有其他workaround,沒太深究,

yum install cmake      

選擇了另一種方式即通過wget下載下傳安裝,

wget https://cmake.org/files/v3.9/cmake-3.9.0.tar.gz
cd cmake-3.9.0
./configure --prefix=/opt/software/cmake
gmake
make install      

從5.7開始,安裝資料庫時,需要使用boost,下載下傳boost_1_59_0.tar.gz,

http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz      

6. 安裝資料庫,cmake安裝,基礎配置如下(可根據實際需求,調整配置參數),DWITH_BOOST是剛才下載下傳解壓的路徑,

/opt/software/cmake/bin/cmake . -DCMAKE_INSTALL_PREFIX=/opt/mysql/mysql7 \
-DDEFAULT_CHARSET=utf-8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DCOMPILATION_COMMENT="MySQL Server(GPL)" \
-DSYSCONFDIR=/opt/mysql/data/3306 \
-DMYSQL_UNIX_ADDR=/opt/mysql/data/3306/mysql.sock \
-DWITH_BOOST=/opt/software/boost_1_59_0      

執行make和make install,

make && make install      

整個過程,将近1小時。

三、二進制安裝

媒體下載下傳,MySQL 5.7,我們選擇目前最高的5.7.32,指定RHEL7平台,下載下傳gz檔案,檔案名為mysql-5.7.32-el7-x86_64.tar.gz,

小白學習MySQL - 資料庫軟體和初始化安裝
小白學習MySQL - 資料庫軟體和初始化安裝

MySQL 8.0,我們選擇目前最高的8.0.23,指定RHEL7平台,下載下傳gz檔案,檔案名為mysql-8.0.23-el7-x86_64.tar.gz,

小白學習MySQL - 資料庫軟體和初始化安裝
小白學習MySQL - 資料庫軟體和初始化安裝

具體安裝步驟上,1-4和上述安裝相同。

rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps
rpm -e mariadb-5.5.56-2.el7.x86_64 --nodeps
rpm -e mariadb-server-5.5.56-2.el7.x86_64 --nodeps      
groupadd mysql
useradd -g mysql mysql      
vi /etc/security/limits.conf 
mysql            soft    nproc          2047
mysql            hard    nproc          16347
mysql            soft    nofile         1024 
mysql            hard    nofile         65536      
yum install bison libaio-devel* perl gcc gcc-c++ ncurses ncurses-devel openssl openssl-devel      

5. 設定路徑結構

因為我的磁盤空間有限,為了能兼顧實際磁盤空間和正常安裝路徑習慣,設定一些軟連結,例如,

ln -s /opt/oracle/software/mysql7 /usr/local/mysql7      

在/usr/local/mysql7中解壓,mysql-5.7.32-el7-x86_64.tar.gz,完成安裝,

tar zxvf mysql-5.7.32-el7-x86_64.tar.gz      

如果其他機器,環境相同,需要安裝MySQL,可以将此目錄,直接複制到對應路徑下,即可完成安裝,和Oracle的克隆安裝,有異曲同工之處。

無論是源碼安裝,還是二進制安裝,此時我們就有了資料庫軟體,如果要操作這個資料庫,還需要初始化建立資料庫。

初始化資料庫

1. 建立相關目錄,授權使用者mysql,

mkdir -p /mysql/3306/{data,tmp,binlog,log,backup,scripts}
chown -R mysql:mysql mysql      

2. 配置使用者.bash_profile

export LANG=zh_CN.GB18030
export PATH=/opt/mysql/mysql7/bin:$PATH      

3. 配置參數檔案,需切換到mysql使用者,建立my.cnf,因為我會在這台機器建立5.7和8.0兩個資料庫,是以加了字首3306,

su - mysql
cd /mysql/3306/
touch 3306_my.cnf      

配置檔案,我設定了這些初始化參數,

[client]
port=3306
socket=/mysql/3306/tmp/mysql.sock

[mysqld]
socket=/mysql/3306/tmp/mysql.sock
log_timestamps=system
user=mysql
server-id=1303306
port=3306
datadir=/mysql/3306/data/
basedir=/usr/local/mysql/
tmpdir=/mysql/3306/tmp
default-storage-engine=innodb
character_set_server=utf8mb4
pid-file=/mysql/3306/tmp/mysql.pid
log-error=/mysql/3306/log/mysql-error.log
log-bin=/mysql/3306/log/mysql-bin
long_query_time=2
slow_query_log =1
slow_query_log_file=/mysql/3306/log/slow.log
explicit_defaults_for_timestamp
federated

[mysql]
default-character-set=utf8mb4
prompt="\u@db1 \R:\m:\s [\d]> "
no-auto-rehash      

4. 初始化資料庫

/usr/local/mysql7/bin/mysqld --defaults-file=/mysql/3306/3306_my.cnf --initialize --user=mysql      

5. 啟動資料庫服務

/usr/local/mysql7/bin/mysqld_safe --defaults-file=/mysql/3306/3306_my.cnf &      

6. 登入資料庫

有時登入資料庫,會提示這個錯誤,提示沒找到sock檔案,

mysql -uroot -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)      

實際這個sock在配置檔案中配置了,不太清楚為什麼有時候就是不生效,作為替代方案,可以建立軟連結,模拟存在,

ln -s /mysql/3306/tmp/mysql.sock /tmp/mysql.sock      

初始登入資料庫,需要使用密碼,從5.7開始,初始化的密碼,可以從日志mysql-error.log得到,

2021-02-06T00:28:02.454667+08:00 1 [Note] A temporary password is generated for root@localhost: eS<ol9SDoskc      

登入資料庫,會提示需要立即修改密碼,否則不能進行其他的操作,有的教程說使用password()函數,但會提示warning,指出這個函數,即将廢棄,

set password=password('root');
show warnings;
'SET PASSWORD = PASSWORD('<plaintext_password>')' is deprecated and will be removed in a future release. Please use SET PASSWORD = '<plaintext_password>' instead      

可以改為直接輸入文本,

set password='root';      

設定密碼不過期,重新整理權限,

alter user root@localhost password expire never;
flush privileges;      

此時,資料庫就可以使用了。

從丙洋老師的《塗抹MySQL》書中,還學到了幾個實用的腳本,借鑒于此。

1. 配置檔案,mysql7_env.ini

# set env
MYSQL_USER=root
MYSQL_PAS='root'

# check parameter
if [ $# -ne 1 ]
then
        HOST_PORT=3306
else
        HOST_PORT=$1
fi      

2. 資料庫服務啟動腳本,mysql7_db_startup.sh

可以增加參數,啟動多個資料庫,預設啟動的是3306的資料庫,

#!/bin/sh
# Created by bisal @20210207

source /mysql/scripts/mysql7_env.ini

echo "Startup MySQL5.7 Service: localhost_"${HOST_PORT}
/usr/local/mysql7/bin/mysqld_safe --defaults-file=/mysql/${HOST_PORT}/${HOST_PORT}_my.cnf &      

3. 資料庫服務停止腳本,mysql7_db_shutdown.sh

可以增加參數,停止多個資料庫,預設停止的是3306的資料庫,

#!/bin/sh
# Created by bisal @20210207

source /mysql/scripts/mysql7_env.ini

echo "Shutdown MySQL Service: localhost_"${HOST_PORT}
/usr/local/mysql7/bin/mysqladmin -u${MYSQL_USER} -p${MYSQL_PASS} -S /mysql/${HOST_PORT}/tmp/mysql.sock shutdown      

4. 資料庫登陸腳本,mysql7plus.sh

這個非常友善,一鍵登入,預設登入的是3306的資料庫,

#!/bin/sh
# Created by bisal @20210207

source /mysql/scripts/mysql7_env.ini

echo "Login MySQL Service: localhost_"${HOST_PORT}
/usr/local/mysql7/bin/mysql -u${MYSQL_USER} -p${MYSQL_PASS} -S /mysql/${HOST_PORT}/tmp/mysql.sock $2      

如果要是更友善,可以将上述腳本路徑加到PATH中,用唯一的腳本名稱在任意路徑下都可執行。

MySQL 8.0的二進制安裝和上述5.7基本一緻,隻是相關路徑,需要改下名稱,例如,

資料庫軟體路徑,/usr/local/mysql8
資料庫路徑,/mysql/3307      

因為一台機器上,有多個資料庫,增加一個腳本,ps_mysql.sh,可以查詢mysql的程序資訊(增加參數,可以查詢其他的程序),便于了解目前系統運作的MySQL資料庫程序,

#!/bin/sh
# Created by bisal @20210207

if [ $# -ne 1 ]
then
        echo "Execute ps mysql"
        ps -ef | grep mysql | grep -v grep
else
        echo "Execute ps "$1
        ps -ef | grep $1 | grep -v grep
fi