目錄
1. 問題的提出
2. 源碼下載
3. 升級或安裝某些前置軟件?
3.1. 升級CMake
3.2. 升級gcc、g++
4. 安裝依賴庫
4.1. 安裝OpenSSL
4.2. 安裝Curses
4.3. 安裝pkg-config
5. 編譯、安裝
6. 編譯結果、配置?
7. 編譯錯誤處理
7.1. 錯誤1
7.2. 錯誤2
8.? 搭建mysql數據庫服務端
8.1.?創建mysql用戶及更改相應目錄的屬主
?8.2. 將mysql進程啟動做成服務?
9. 參考鏈接
1. 問題的提出
? ? ? ?由于客戶要求軟件跑在國產飛騰CPU上,而mysql官網上的so沒有基于飛騰的so庫,都是基于X86或ARM的。因為不同的CPU的指令集不同,所以基于X86或ARM的so在飛騰CPU上肯定是不能運行的,所以需要利用mysql源碼在飛騰CPU上編譯出相應的.so庫。
2. 源碼下載
? ? ? ?打開MySQL Community Downloads?頁面如下:
? ? ?因為是要下載源碼,而不是下載編譯好的so,所以在第2個下拉框中選擇“Source Code”,在最后一個下拉框中選擇All Operating Systems開頭的那項,然后在下面選擇下載“Compressed TAR Archive, Includes Boost Headers”項或“Compressed TAR Archive”。
注意:下載需要有oracle賬號,如果你是新注冊賬號或以前有賬號,但忘記了密碼,oracle會向你發郵件,有時收不到郵件,此時請根據收不到oracle注冊或重置密碼郵件導致無法登錄oracle神奇解決方法博文登錄oracle官網。
3. 升級或安裝某些前置軟件?
? ? ? ? 在編譯mysql-8.2.0時,下列軟件必須保證,否則編譯會報錯。
- cmake, 版本必須 >= 3.14.6。
- gcc、g++,?版本必須 >= 10.0.0。
3.1. 升級CMake
按如下博文:
CMake 版本升級或CMake版本升級
升級CMake,都會報如下錯誤:
即從源碼編譯cmake會報找不到openSSL,通過如下命令聯網安裝:
sudo snap install cmake --classic
?成功將本機CMake升級到3.27.8版本。或者參見4.1節安裝OpenSSL,再通過源碼安裝。
3.2. 升級gcc、g++
? ? ? ? ?參見Linux下升級gcc(親測可用)博文操作。
4. 安裝依賴庫
? ????????以下安裝以Ubuntu來講解,其它系統也有類似的安裝命令,請根據不同系統,做相應更改。
4.1. 安裝OpenSSL
? ? ? ? 執行如下命令:
sudo apt-get install libssl-dev
如果不安裝OpenSSL,則編譯時會報如下錯誤:
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR)
4.2. 安裝Curses
????????執行如下命令,安裝Curses庫:
sudo apt-get install libncurses5-dev
如果不安裝該庫,則會報如下錯誤:?
Curses library not found. Please install appropriate package,
4.3. 安裝pkg-config
?????????執行如下命令,安裝pkg-config庫:
sudo apt install pkg-config
如果不安裝,則會報如下錯誤:
Cannot find pkg-config
5. 編譯、安裝
執行如下命令:
sudo cmake . -DCMAKE_INSTALL_PREFIX=/opt/mysql8.2.0 -DMYSQL_DATADIR=/opt/mysql8.2.0/data -DWITH_DEBUG=0 -DSYSCONFDIR=/opt/mysql8.2.0/config -DMYSQL_TCP_PORT=3306 -DWITH_BOOST=/opt/mysql8.2.0/boost -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DFORCE_INSOURCE_BUILD=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=./boost_1_77_0
參數說明:
# 參數說明 (不需要輸入進去)
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
#指定mysql的安裝路徑
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
#指定mysql進程監聽套接字文件(數據庫連接文件)的存儲路徑
-DSYSCONFDIR=/etc \
#指定配置文件的存儲路徑
-DSYSTEMD_PID_DIR=/usr/local/mysql \
#指定進程文件的存儲路徑
-DDEFAULT_CHARSET=utf8 ?\
#指定默認使用的字符集編碼,如utf8
-DDEFAULT_COLLATION=utf8_general_ci \
#指定默認使用的字符集校對規則
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
#安裝INNOBASE存儲引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
#安裝ARCHIVE存儲引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
#安裝BLACKHOLE存儲引擎
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
#安裝FEDERATED存儲引擎
-DMYSQL_DATADIR=/usr/local/mysql/data \
#指定數據庫文件的存儲路徑
-DWITH_BOOST=boost \
#指定boost的路徑,
-DWITH_SYSTEMD=1
#生成便于systemctl管理的文件
上面的/opt/mysql8.2.0目錄及其子目錄請根據你本機實際創建好或換成你自己的路徑,下同,后文不再就mysql路徑目錄問題做表述。之后執行如下命令編譯:
sudo make -j8
估計編譯耗時1.5小時,注意:如果編譯出錯,請參考第7節排除。編譯完成后,執行如下命令安裝so到指定目錄:
sudo make install
6. 編譯結果、配置?
編譯、安裝后的結果如下:
?執行如下命令打開配置:?
sudo vi /etc/profile
在文件末尾加入如下幾行(注意:路徑換成你本機的實際路徑):
export PATH=/opt/mysql8.2.0/bin:$PATH
export LD_LIBRARY_PATH=/opt/mysql8.2.0/lib:$LD_LIBRARY_PATH
?保存退出,執行如下命令,使配置生效:
source /etc/profile
7. 編譯錯誤處理
7.1. 錯誤1
version `GLIBCXX_3.4.32' not found
version `GLIBCXX_3.4.29' not found
第1步:使用如下命令查看是否缺失文件(一般來講肯定是缺失的)
strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX
?結果如下:
可以看到,并沒有3.4.29、3.4.32版本。
?第2步:使用如下命令查看當前系統中是否有其他同類型的文件,找一個版本較高的。
sudo find / -name "libstdc++.so.6*"
如下圖,可以看到有更高版本的同類型文件:
?這個高版本的庫位于gcc編譯構建目錄下,這也就是為何編譯時提示gcc版本太低的原因。然后使用如下命令查看這個文件中是否包含需要的版本:
strings /home/dansir/gcc-13.2.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.32 | grep GLIBCXX
結果如下:
如上圖所示,里面包含有我們需要的版本。然后進行如下操作:
sudo cp /home/dansir/gcc-13.2.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.32 /usr/lib/x86_64-linux-gnu/
?即將上面找到的高版本的復制到?/usr/lib/x86_64-linux-gnu 目錄下,然后執行如下命令刪除軟連接:
sudo rm /usr/lib/x86_64-linux-gnu/libstdc++.so.6
然后執行如下命令重新建立/usr/lib/x86_64-linux-gnu/libstdc++.so.6軟連接,以指向剛才復制的高版本的庫:
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.32 /usr/lib/x86_64-linux-gnu/libstdc++.so.6
問題解決!!!。注意:上面的路徑,請根據你本機實際情況更改。?
7.2. 錯誤2
致命錯誤:已殺死 signal terminated program cc1plus
在虛擬機中編譯的,機器本身是16G內存,分給了虛擬機8G。編譯一個大項目時出現這種提示。檢查原來的/etc/fstab或者通過“sudo swapon -s” 檢查swap文件,發現只有2G左右大小。于是執行如下幾組命令:
sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=8192
sudo mkswap /swapfile
sudo swapon /swapfile
?如果還不行,將8192再改大些。
8.? 搭建mysql數據庫服務端
? ? ? ?說明:請切換到root用戶操作本大節內容,否則某些步驟的操作可能會因為權限不夠而失敗!
8.1.?創建mysql用戶及更改相應目錄的屬主
請切換到root用戶操作,依次執行如下命令:
groupadd mysql
useradd -M -g mysql -s /sbin/nologin mysql
chown -R mysql:mysql /opt/mysql8.2.0
chown -R mysql:mysql /opt/mysql8.2.0/data
注意:上面的命令中,如果你本機沒有/sbin/nologin,則改為: /usr/sbin/nologin
請切換到root用戶操作,編輯配置文件?:
vim /etc/my.cnf
[mysqld]
basedir=/opt/mysql8.2.0
datadir=/opt/mysql8.2.0/data
socket=/tmp/mysql.sock[mysqld_safe]
log-error=/var/log/mysqld/mysqld.log
pid-file=/var/run/mysqld/mysql.pid
請切換到root用戶操作,創建日志文件存放的目錄和pid文件存放的目錄,并賦權給mysql用戶:
mkdir -p /var/log/mysqld /var/run/mysqld
chown -R mysql:mysql /var/log/mysqld
chown -R mysql:mysql /var/run/mysqldtouch /var/log/mysqld/mysqld.log
?請切換到root用戶操作,配置環境變量,方便使用MySQL的命令:
vim /etc/profile
export MYSQL_HOME=/opt/mysql8.2.0
export PATH=$PATH:$MYSQL_HOME/bin
?使配置立即生效:
source /etc/profile
查看mysql版本,以確定是否安裝成功:
mysql --version # 驗證配置是否成功
?如果出現下面版本信息,則證明安裝成功:
mysql Ver 8.2.0 for Linux on x86_64 (Source distribution)
請切換到root用戶操作,執行如下命令初始化數據庫:
mysqld --initialize --user=mysql --basedir=/opt/mysql8.2.0 --datadir=/opt/mysql8.2.0/data
?初始化成功后會生成root賬戶的默認密碼。將該密碼復制并保存,因為后面需要使用該密碼登錄到MySQL中修改密碼。
請切換到root用戶操作,執行如下命令啟動mysql進程,如果沒報錯,能看到如下界面,證明啟動成功:
cd /opt/mysql8.2.0/support-files
./mysql.service
Starting MySQL
.. *
再說一遍:一定要root用戶執行上面的命令,否則會報如下錯誤:
mysql server quit without updating PID file
8.2. 將mysql進程啟動做成服務?
? ? ?增加一個systemd單元配置文件,該文件詳細描述了MySQL服務。文件名為mysqld.service,文件位于 /usr/lib/systemd/system 。
9. 參考鏈接
【1】:ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found - 知乎 (zhihu.com)
【2】:gcc的升級?。
【3】:"Killed signal terminated program cc1plus"編譯錯誤解決
【4】:MySQL——源碼安裝教程?
【5】:mysql安裝(一) - 知乎 (zhihu.com)