作為個人學習環境來說,搭建一套VMWare的環境,算是成本效益最高的一種選擇,當然你可以購買一些公有雲伺服器。
Linux的安裝就不在這贅述了,重點說說MySQL資料庫的安裝。
首先,就是下載下傳媒體,MySQL官網就可以下,這兩個連結都可以的,
https://www.mysql.com/downloads/ https://dev.mysql.com/downloads/mysql/差別就是前者是商業版,後者是社群版,從軟體自身來說,兩者都是相同的,不同的是商業版可以購買享受官方的技術服務,社群版隻能從社群獲得技術支援。
從下載下傳選項中,我們看到支援很多的作業系統,例如Windows、各種Linux、Solaris、macOS等等,
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yN2EWNyUTOmBDZjdjYiBTOxIWY0MzYzUTZiRmNmNDOm9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
對企業來說,一般會選擇非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 8.0,我們選擇目前最高的8.0.23,指定RHEL7平台,下載下傳gz檔案,檔案名為mysql-8.0.23-el7-x86_64.tar.gz,
具體安裝步驟上,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