- 0.寫在前面 - 1.準備工作 - 1.1 準備Docker環境 - 1.2 下載源碼包 - 1.3 修改MySQL Shell源碼包 - 1.4 編譯相關軟體包 - 2.準備編譯MySQL Shell - 2.1 編譯MySQL 8.0.32 - 2.2 編譯MySQL Shell 8.0.3 ...
-
0.寫在前面
-
1.準備工作
-
1.1 準備Docker環境
-
1.2 下載源碼包
-
1.3 修改MySQL Shell源碼包
-
1.4 編譯相關軟體包
-
2.準備編譯MySQL Shell
-
2.1 編譯MySQL 8.0.32
-
2.2 編譯MySQL Shell 8.0.32
-
2.3 運行測試
-
3.寫在最後
-
延伸閱讀
升級MySQL Shell for GreatSQL版本
0. 寫在前面
GreatSQL 8.0.32-24已發佈,配套的MySQL Shell也需要跟著升級一波,MySQL Shell版本從8.0.25升級到8.0.32後,也引入了一些不錯的新特性。
下麵正式開始MySQL Shell編譯工作。
1. 準備工作
1.1 準備Docker環境
參考編譯環境要求 greatsql_docker_build(https://gitee.com/GreatSQL/GreatSQL-Doc/blob/master/greatsql_shell_docker_build/Dockerfile) ,構建好一個Docker鏡像環境,基本上照著做就行,這裡不贅述。
1.2 下載源碼包
先下載準備好下列幾個源碼包:
- antlr4-cpp-runtime-4.10-source.zip, https://github.com/antlr/website-antlr4/blob/gh-pages/download/antlr4-cpp-runtime-4.10-source.zip
- boost_1_77_0.tar.gz, https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz
- mysql-8.0.32.tar.gz, https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.32.tar.gz
- mysql-shell-8.0.32-src.tar.gz, https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.32-src.tar.gz
- patchelf-0.14.5.tar.gz, https://github.com/NixOS/patchelf/releases/download/0.14.5/patchelf-0.14.5.tar.gz
- protobuf-all-3.19.4.tar.gz, https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protobuf-all-3.19.4.tar.gz
- rpcsvc-proto-1.4.tar.gz, https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4/rpcsvc-proto-1.4.tar.gz
下載完後都放在 /opt/
目錄下,並解壓縮。
1.3 修改MySQL Shell源碼包
打開鏈接:https://gitee.com/GreatSQL/GreatSQL-Doc/blob/master/greatsql_shell_docker_build/mysqlsh-for-greatsql-8.0.32.patch,下載GreatSQL補丁包文件 mysqlsh-for-greatsql-8.0.32.patch。
為了讓MySQL Shell支持GreatSQL仲裁節點(ARBITRATOR)特性,需要打上補丁包:
$ cd /opt/mysql-shell-8.0.32-src
$ patch -p1 -f < /opt/mysqlsh-for-greatsql-8.0.32.patch
patching file mysqlshdk/libs/mysql/group_replication.cc
patching file mysqlshdk/libs/mysql/group_replication.h
1.4 編譯相關軟體包
1.43.1 antlr4-4.10
編譯antlr4需要依賴 uuid
庫,先安裝上:
$ yum install -y libuuid libuuid-devel uuid
接著開始編譯antlr4:
$ cd /opt/antlr4-4.10/runtime/Cpp/
$ mkdir bld && cd bld
$ cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/antlr4 && make -j16 && make -j16 install
1.4.2 patchelf-0.14.5
$ cd /opt/patchelf-0.14.5
$ ./bootstrap.sh && ./configure && make -j16 && make -j16 install
1.4.3 protobuf-3.19.4
$ cd /opt/protobuf-3.19.4
$ ./configure && make -j16 && make -j16 install
1.4.4 rpcsvc-proto-1.4
$ cd /opt/rpcsvc-proto-1.4
$ ./configure && make -j16 && make -j16 install
2. 準備編譯MySQL Shell
2.1 編譯MySQL 8.0.32
在MySQL 8.0.32源碼目錄中,編譯生成MySQL客戶端相關依賴庫,這是編譯MySQL Shell之前要先做的事:
$ cd /opt/mysql-8.0.32
$ mkdir bld && cd bld
$ cmake .. -DBOOST_INCLUDE_DIR=/opt/boost_1_77_0 \
-DLOCAL_BOOST_DIR=/opt/boost_1_77_0 \
-DWITH_SSL=system && \
cmake --build . --target mysqlclient -- -j16; \
cmake --build . --target mysqlxclient -- -j16
P.S,在 cmake
後面加上 -- -j16
的作用是多線程並行編譯,這樣速度更快,不加的話只能單線程編譯,速度比較慢。
2.2 編譯MySQL Shell 8.0.32
編譯完成後,切換到MySQL Shell源碼目錄下,準備繼續編譯:
$ cd /opt/mysql-shell-8.0.32-src/
$ mkdir bld && cd bld
$ cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/greatsql-shell-8.0.32-24-Linux-glibc2.28-x86_64 \
-DMYSQL_SOURCE_DIR=/opt/mysql-8.0.32 \
-DMYSQL_BUILD_DIR=/opt/mysql-8.0.32/bld/ \
-DHAVE_PYTHON=1 \
-DWITH_PROTOBUF=bundled \
-DBUILD_SOURCE_PACKAGE=0 \
-DBUNDLED_ANTLR_DIR=/usr/local/antlr4/ \
&& make && make install
測試提示錯誤信息:
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
(Required is at least version "3.8")
這表示需要先安裝Python 3.8相關軟體包,因為還需要libssh,就一併安裝:
$ yum install -y python38 python38-devel python38-libs python38-pyyaml libssh libssh-config libssh-devel
再次編譯,並指定Python 3.8的相關路徑:
$ cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/greatsql-shell-8.0.32-24-Linux-glibc2.28-x86_64 \
-DMYSQL_SOURCE_DIR=/opt/mysql-8.0.32 \
-DMYSQL_BUILD_DIR=/opt/mysql-8.0.32/bld/ \
-DHAVE_PYTHON=1 \
-DWITH_PROTOBUF=bundled \
-DBUILD_SOURCE_PACKAGE=0 \
-DBUNDLED_ANTLR_DIR=/usr/local/antlr4/ \
-DPYTHON_LIBRARIES=/usr/lib64/python3.8 -DPYTHON_INCLUDE_DIRS=/usr/include/python3.8/ \
&& make -j16 && make -j16 install
編譯完成後,會把二進位文件安裝到 /usr/local/greatsql-shell-8.0.32-24-Linux-glibc2.28-x86_64
目錄下。
2.3 運行測試
運行 mysqlsh
,看是否能直接跑起來:
$ cd /usr/local/greatsql-shell-8.0.32-24-Linux-glibc2.28-x86_64
$ ./bin/mysqlsh
./bin/mysqlsh: error while loading shared libraries: libprotobuf.so.30: cannot open shared object file: No such file or directory
提示無法找到動態庫文件 libprotobuf.so.30
。實際上這個動態庫文件在 /usr/local/lib
目錄下,只需將其拷貝一份到MySQL Shell的lib目錄下即可:
$ cp /usr/local/lib/libprotobuf.so.30 lib/mysqlsh/
$ ldd bin/mysqlsh | grep libprotobuf.so
libprotobuf.so.30 => /usr/local/greatsql-shell-8.0.32-24-Linux-glibc2.28-x86_64/bin/../lib/mysqlsh/libprotobuf.so.30 (0x00007f60660a2000)
這次找到依賴庫文件了。
運行 mysqlsh
,看能否正常使用:
$ ./bin/mysqlsh
MySQL Shell 8.0.32
...
Type '\help' or '\?' for help; '\quit' to exit.
WARNING: Found errors loading plugins, for more details look at the log at: /root/.mysqlsh/mysqlsh.log
MySQL Py > \q
Bye!
看到有 WARNING 提示,檢查日誌文件 /root/.mysqlsh/mysqlsh.log
,看到有了類似下麵的內容:
ModuleNotFoundError: No module named 'certifi'
只需用pip安裝相應模塊即可:
$ pip3.8 install --user certifi
好了,開始感受GreatSQL 8.0.32-24新版本特性,以及MGR仲裁節點的魅力吧 O(∩_∩)O哈哈~
3. 寫在最後
折騰完這些,是不是感覺還是有點麻煩?沒關係,我已經把這些工作都封裝到docker鏡像中了,包括Dockerfile以及自動編譯腳本。下麵簡單介紹下怎麼用。
自行下載MySQL和MySQL Shell,以及boost源碼包,上面已經給過下載地址了。
下載完後都放在 /opt/
目錄下,並解壓縮。
下載 MySQL Shell for GreatSQL編譯輔助包(https://product.greatdb.com/GreatSQL/greatsql-shell-requirement-pkg.tar.xz),解壓縮到 /opt/
目錄下。
執行下麵命令構建docker鏡像:
$ cd /opt/greatsql_shell_docker_build
$ sh ./greatsql-shell-docker-build.sh /opt/mysql-8.0.32/ /opt/mysql-shell-8.0.32-src/ /opt/boost_1_77_0
說明: 上述命令中,腳本後面跟著三個目錄參數,分別對應MySQL、MySQL Shell、boost源碼全路徑。
之後就可以自動完成MySQL Shell for GreatSQL編譯docker容器環境,啟動併進入該容器:
$ docker images | grep -i greatsql_shell
greatsql_shell_build_env latest 4db9dcd3c563 About an hour ago 4.1GB
$ docker run -d \
-v /opt/mysql-8.0.32:/opt/mysql-8.0.32 \
-v /opt/mysql-shell-8.0.32-src:/opt/mysql-shell-8.0.32-src \
-v /opt/boost_1_77_0:/opt/boost_1_77_0 \
--name greatsql_shell_build_env greatsql_shell_build_env
$ docker exec -it greatsql_shell_build_env bash
進入容器後,編輯 /opt/greatsql-shell-automake.sh
腳本,確認其中文件目錄是否都正確,確認都沒問題的話,就可以執行該腳本開始編譯源碼了。
# 載入環境變數,並切換到高版本gcc編譯環境
[root@a5cebc4c0276 opt]# cd /opt
[root@a5cebc4c0276 opt]# source ~/.bash_profile
[root@a5cebc4c0276 opt]# ls -la
total 136
drwxr-xr-x 1 root root 110 Jul 11 08:56 .
drwxr-xr-x 1 root root 62 Jul 11 08:08 ..
drwxr-xr-x 8 root root 4096 Aug 5 2021 boost_1_77_0
-rwxr-xr-x 1 root root 910 Jul 11 08:15 greatsql-shell-automake.sh
drwxr-xr-x 32 7161 31415 65536 Jul 11 08:12 mysql-8.0.32
drwxr-xr-x 18 root root 65536 Jul 11 08:15 mysql-shell-8.0.32-src
drwxr-xr-x 3 root root 28 Jul 11 07:27 rh
# 開始自動編譯
[root@a5cebc4c0276 opt]# sh ./greatsql-shell-automake.sh
編譯結束後,試著運行 mysqlsh
客戶端,確認可用:
/usr/local/greatsql-mysql-shell-8.0.32-centos-glibc2.28-x86_64/bin/mysqlsh
MySQL Shell 8.0.32
Copyright (c) 2016, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Type '\help' or '\?' for help; '\quit' to exit.
MySQL Py >
看起來挺順利的哈 :)
延伸閱讀
- 利用MySQL Shell安裝部署MGR集群
- mysql-shell for GreatSQL 8.0.27編譯安裝及使用
- MySQL Shell Release Notes, https://dev.mysql.com/doc/relnotes/mysql-shell/8.0/en/
- GreatSQL 8.0.32-24 今日發佈
Enjoy GreatSQL