MySQL8-中文參考-三-

绝不原创的飞龙發表於2024-06-23

MySQL8 中文參考(三)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

2.8.7 MySQL 源配置選項

原文:dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html

CMake程式提供了對如何配置 MySQL 源分發的大量控制。通常,您可以使用CMake命令列上的選項來執行此操作。有關CMake支援的選項的資訊,請在頂層源目錄中執行以下命令之一:

$> cmake . -LH

$> ccmake .

您還可以使用某些環境變數影響CMake。請參閱第 6.9 節“環境變數”。

對於布林選項,值可以指定為1ON以啟用該選項,或者指定為0OFF以禁用該選項。

許多選項配置編譯時的預設值,可以在伺服器啟動時進行覆蓋。例如,CMAKE_INSTALL_PREFIXMYSQL_TCP_PORTMYSQL_UNIX_ADDR選項配置預設安裝基目錄位置、TCP/IP 埠號和 Unix 套接字檔案,可以透過--basedir--port--socket選項在伺服器啟動時進行更改,用於mysqld。在適用的情況下,配置選項描述指示相應的mysqld啟動選項。

以下部分提供有關CMake選項的更多資訊。

  • CMake 選項參考

  • 常規選項

  • 安裝佈局選項

  • 儲存引擎選項

  • 功能選項

  • 編譯器標誌

  • 編譯 NDB 叢集的 CMake 選項

CMake 選項參考

以下表格顯示了可用的CMake選項。在預設列中,PREFIX代表CMAKE_INSTALL_PREFIX選項的值,該選項指定安裝基目錄。該值用作多個安裝子目錄的父位置。

表 2.14 MySQL 源配置選項參考(CMake)

格式 描述 預設 引入 移除
ADD_GDB_INDEX 是否啟用二進位制檔案中.gdb_index 部分的生成 8.0.18
BUILD_CONFIG 使用與官方釋出相同的構建選項
BUNDLE_RUNTIME_LIBRARIES 將執行時庫與 Windows 伺服器 MSI 和 Zip 軟體包捆綁在一起 OFF
CMAKE_BUILD_TYPE 生成的構建型別 RelWithDebInfo
CMAKE_CXX_FLAGS C++編譯器標誌
CMAKE_C_FLAGS C 編譯器標誌
CMAKE_INSTALL_PREFIX 安裝基本目錄 /usr/local/mysql
COMPILATION_COMMENT 編譯環境註釋
COMPILATION_COMMENT_SERVER 用於 mysqld 使用的編譯環境註釋 8.0.14
COMPRESS_DEBUG_SECTIONS 壓縮二進位制可執行檔案的除錯部分 OFF 8.0.22
CPACK_MONOLITHIC_INSTALL 包構建是否生成單個檔案 OFF
DEFAULT_CHARSET 預設伺服器字符集 utf8mb4
DEFAULT_COLLATION 預設伺服器排序規則 utf8mb4_0900_ai_ci
DISABLE_PSI_COND 排除效能模式條件儀表化 OFF
DISABLE_PSI_DATA_LOCK 排除效能模式資料鎖定儀表化 OFF
DISABLE_PSI_ERROR 排除效能模式伺服器錯誤儀表化 OFF
DISABLE_PSI_FILE 排除效能模式檔案儀表化 OFF
DISABLE_PSI_IDLE 排除效能模式空閒儀表化 OFF
DISABLE_PSI_MEMORY 排除效能模式記憶體儀器 OFF
DISABLE_PSI_METADATA 排除效能模式 metadata 儀器 OFF
DISABLE_PSI_MUTEX 排除效能模式互斥儀器 OFF
DISABLE_PSI_PS 排除效能模式預處理語句 OFF
DISABLE_PSI_RWLOCK 排除效能模式 rwlock 儀器 OFF
DISABLE_PSI_SOCKET 排除效能模式套接字儀器 OFF
DISABLE_PSI_SP 排除效能模式儲存過程儀器 OFF
DISABLE_PSI_STAGE 排除效能模式 stage 儀器 OFF
DISABLE_PSI_STATEMENT 排除效能模式語句儀器 OFF
DISABLE_PSI_STATEMENT_DIGEST 排除效能模式 statements_digest 儀器 OFF
DISABLE_PSI_TABLE 排除效能模式表儀器 OFF
DISABLE_PSI_THREAD 排除效能模式執行緒儀器 OFF
DISABLE_PSI_TRANSACTION 排除效能模式事務儀器 OFF
DISABLE_SHARED 不構建共享庫,編譯位置相關程式碼 OFF 8.0.18
DOWNLOAD_BOOST 是否下載 Boost 庫 OFF
DOWNLOAD_BOOST_TIMEOUT 下載 Boost 庫的超時時間(秒) 600
ENABLED_LOCAL_INFILE 是否啟用 LOAD DATA 的 LOCAL 功能 OFF
ENABLED_PROFILING 是否啟用查詢分析程式碼 ON
ENABLE_DOWNLOADS 是否下載可選檔案 OFF 8.0.26
ENABLE_EXPERIMENTAL_SYSVARS 是否啟用實驗性 InnoDB 系統變數 OFF
ENABLE_GCOV 是否包含 gcov 支援
ENABLE_GPROF 啟用 gprof(僅最佳化的 Linux 構建) OFF
FORCE_COLORED_OUTPUT 是否給編譯輸出著色 OFF 8.0.33
FORCE_INSOURCE_BUILD 是否強制在原始碼構建 OFF 8.0.14
FORCE_UNSUPPORTED_COMPILER 是否允許不支援的編譯器 OFF
FPROFILE_GENERATE 是否生成配置引導最佳化資料 OFF 8.0.19
FPROFILE_USE 是否使用配置引導最佳化資料 OFF 8.0.19
HAVE_PSI_MEMORY_INTERFACE 啟用效能模式記憶體跟蹤模組,用於動態儲存超對齊型別的記憶體分配函式 OFF 8.0.26
IGNORE_AIO_CHECK 使用 -DBUILD_CONFIG=mysql_release 時,忽略 libaio 檢查 OFF
INSTALL_BINDIR 使用者可執行檔案目錄 PREFIX/bin
INSTALL_DOCDIR 文件目錄 PREFIX/docs
INSTALL_DOCREADMEDIR README 檔案目錄 PREFIX
INSTALL_INCLUDEDIR 標頭檔案目錄 PREFIX/include
INSTALL_INFODIR 資訊檔案目錄 PREFIX/docs
INSTALL_LAYOUT 選擇預定義的安裝佈局 STANDALONE
INSTALL_LIBDIR 庫檔案目錄 PREFIX/lib
INSTALL_MANDIR 手冊頁目錄 PREFIX/man
INSTALL_MYSQLKEYRINGDIR keyring_file 外掛資料檔案目錄 特定於平臺
INSTALL_MYSQLSHAREDIR 共享資料目錄 PREFIX/share
INSTALL_MYSQLTESTDIR mysql-test 目錄 PREFIX/mysql-test
INSTALL_PKGCONFIGDIR mysqlclient.pc pkg-config 檔案目錄 INSTALL_LIBDIR/pkgconfig
INSTALL_PLUGINDIR 外掛目錄 PREFIX/lib/plugin
INSTALL_PRIV_LIBDIR 安裝私有庫目錄 8.0.18
INSTALL_SBINDIR 伺服器可執行檔案目錄 PREFIX/bin
INSTALL_SECURE_FILE_PRIVDIR secure_file_priv 預設值 特定於平臺
INSTALL_SHAREDIR aclocal/mysql.m4 安裝目錄 PREFIX/share
INSTALL_STATIC_LIBRARIES 是否安裝靜態庫 ON
INSTALL_SUPPORTFILESDIR 額外支援檔案目錄 PREFIX/support-files
LINK_RANDOMIZE 是否隨機化 mysqld 二進位制檔案中符號的順序 OFF
LINK_RANDOMIZE_SEED LINK_RANDOMIZE 選項的種子值 mysql
MAX_INDEXES 每個表的最大索引數 64
MEMCACHED_HOME memcached 路徑;已過時 [none] 8.0.23
MSVC_CPPCHECK 啟用 MSVC 程式碼分析。 OFF 8.0.33
MUTEX_TYPE InnoDB 互斥型別 event
MYSQLX_TCP_PORT X 外掛使用的 TCP/IP 埠號 33060
MYSQLX_UNIX_ADDR X 外掛使用的 Unix 套接字檔案 /tmp/mysqlx.sock
MYSQL_DATADIR 資料目錄
MYSQL_MAINTAINER_MODE 是否啟用 MySQL 維護者特定的開發環境 OFF
MYSQL_PROJECT_NAME Windows/macOS 專案名稱 MySQL
MYSQL_TCP_PORT TCP/IP 埠號 3306
MYSQL_UNIX_ADDR Unix 套接字檔案 /tmp/mysql.sock
NDB_UTILS_LINK_DYNAMIC 使 NDB 工具動態連結到 ndbclient 8.0.22
ODBC_INCLUDES ODBC 包含目錄
ODBC_LIB_DIR ODBC 庫目錄
OPTIMIZER_TRACE 是否支援最佳化器跟蹤
OPTIMIZE_SANITIZER_BUILDS 是否最佳化 sanitizer 構建 ON 8.0.34
REPRODUCIBLE_BUILD 特別注意建立與構建位置和時間無關的構建結果
SHOW_SUPPRESSED_COMPILER_WARNING 是否顯示被抑制的編譯器警告並且不使用-Werror 失敗。 OFF 8.0.30
SYSCONFDIR 選項檔案目錄
SYSTEMD_PID_DIR systemd 下 PID 檔案目錄 /var/run/mysqld
SYSTEMD_SERVICE_NAME systemd 下 MySQL 服務的名稱 mysqld
TMPDIR tmpdir 預設值
USE_LD_GOLD 是否使用 GNU gold 連結器 ON 8.0.31
USE_LD_LLD 是否使用 LLVM lld 連結器 ON 8.0.16
WIN_DEBUG_NO_INLINE 是否禁用函式內聯 OFF
WITHOUT_SERVER 不構建伺服器 OFF
WITHOUT_xxx_STORAGE_ENGINE 從構建中排除儲存引擎 xxx
WITH_ANT 用於構建 GCS Java 包裝器的 Ant 路徑
WITH_ASAN 啟用 AddressSanitizer OFF
WITH_ASAN_SCOPE 啟用 AddressSanitizer 的 -fsanitize-address-use-after-scope Clang 標誌 OFF
WITH_AUTHENTICATION_CLIENT_PLUGINS 如果構建了相應的伺服器認證外掛,則自動啟用 8.0.26
WITH_AUTHENTICATION_LDAP 是否在無法構建 LDAP 認證外掛時報告錯誤 OFF
WITH_AUTHENTICATION_PAM 構建 PAM 認證外掛 OFF
WITH_AWS_SDK Amazon Web Services 軟體開發工具包的位置
WITH_BOOST Boost 庫原始碼的位置
WITH_BUILD_ID 在 Linux 系統上生成唯一的構建 ID ON 8.0.31
WITH_BUNDLED_LIBEVENT 在構建 ndbmemcache 時使用捆綁的 libevent;已過時 ON 8.0.23
WITH_BUNDLED_MEMCACHED 在構建 ndbmemcache 時使用捆綁的 memcached;已過時 ON 8.0.23
WITH_CLASSPATH 構建 MySQL Cluster Connector for Java 時要使用的類路徑。預設為空字串。
WITH_CLIENT_PROTOCOL_TRACING 構建客戶端協議跟蹤框架 ON
WITH_CURL curl 庫的位置
WITH_DEBUG 是否包含除錯支援 OFF
WITH_DEFAULT_COMPILER_OPTIONS 是否使用預設編譯器選項 ON
WITH_DEFAULT_FEATURE_SET 是否使用預設功能集 ON 8.0.22
WITH_DEVELOPER_ENTITLEMENTS 是否在 macOS 上為所有可執行檔案新增 'get-task-allow' 許可權,以便在伺服器意外停止時生成核心轉儲 OFF 8.0.30
WITH_EDITLINE 使用哪個 libedit/editline 庫 bundled
WITH_ERROR_INSERT 啟用 NDB 儲存引擎中的錯誤注入。不應用於構建用於生產的二進位制檔案。 OFF
WITH_FIDO FIDO 庫支援型別 bundled 8.0.27
WITH_GMOCK googlemock 分發路徑 8.0.26
WITH_ICU ICU 支援型別 bundled
WITH_INNODB_EXTRA_DEBUG 是否包含 InnoDB 的額外除錯支援。 OFF
WITH_INNODB_MEMCACHED 是否生成 memcached 共享庫。 OFF
WITH_JEMALLOC 是否連結 -ljemalloc OFF 8.0.16
WITH_KEYRING_TEST 構建金鑰環測試程式 OFF
WITH_LIBEVENT 使用哪個 libevent 庫 bundled
WITH_LIBWRAP 是否包含 libwrap(TCP wrappers)支援 OFF
WITH_LOCK_ORDER 是否啟用 LOCK_ORDER 工具 OFF 8.0.17
WITH_LSAN 是否執行 LeakSanitizer,不包括 AddressSanitizer OFF 8.0.16
WITH_LTO 啟用連結時最佳化器 OFF 8.0.13
WITH_LZ4 LZ4 庫支援型別 bundled
WITH_LZMA LZMA 庫支援型別 bundled 8.0.16
WITH_MECAB 編譯 MeCab
WITH_MSAN 啟用 MemorySanitizer OFF
WITH_MSCRT_DEBUG 啟用 Visual Studio CRT 記憶體洩漏跟蹤 OFF
WITH_MYSQLX 是否禁用 X 協議 ON
WITH_NDB 構建 MySQL NDB 叢集 OFF 8.0.31
WITH_NDBAPI_EXAMPLES 構建 API 示例程式 OFF
WITH_NDBCLUSTER 構建 NDB 儲存引擎 OFF
WITH_NDBCLUSTER_STORAGE_ENGINE 供內部使用;在所有情況下可能不起作用;使用者應該使用 WITH_NDBCLUSTER 代替 ON
WITH_NDBMTD 構建多執行緒資料節點 ON
WITH_NDB_DEBUG 生成用於測試或故障排除的除錯構建 OFF
WITH_NDB_JAVA 啟用構建 Java 和 ClusterJ 支援。預設啟用。僅在 MySQL Cluster 中受支援。 ON
WITH_NDB_PORT 使用此選項構建的管理伺服器使用的預設埠。如果未使用此選項構建它,則管理伺服器的預設埠為 1186。 [none]
WITH_NDB_TEST 包括 NDB API 測試程式 OFF
WITH_NUMA 設定 NUMA 記憶體分配策略
WITH_PACKAGE_FLAGS 用於 RPM/DEB 包通常使用的標誌,是否將它們新增到這些平臺上的獨立構建中 8.0.26
WITH_PLUGIN_NDBCLUSTER 供內部使用;在所有情況下可能不起作用。使用者應該使用 WITH_NDBCLUSTER 或 WITH_NDB 代替 8.0.13 8.0.31
WITH_PROTOBUF 使用哪個 Protocol Buffers 包 bundled
WITH_RAPID 是否構建快速開發週期外掛 ON
WITH_RAPIDJSON RapidJSON 支援型別 bundled 8.0.13
WITH_RE2 RE2 庫支援型別 bundled 8.0.18
WITH_ROUTER 是否構建 MySQL Router ON 8.0.16
WITH_SSL SSL 支援型別 system
WITH_SYSTEMD 啟用 systemd 支援檔案的安裝 OFF
WITH_SYSTEMD_DEBUG 啟用額外的 systemd 除錯資訊 OFF 8.0.22
WITH_SYSTEM_LIBS 設定未顯式設定的庫選項的系統值 OFF
WITH_TCMALLOC 是否連結 -ltcmalloc OFF 8.0.22
WITH_TEST_TRACE_PLUGIN 構建測試協議跟蹤外掛 OFF
WITH_TSAN 啟用執行緒檢測器 OFF
WITH_UBSAN 啟用未定義行為檢測器 OFF
WITH_UNIT_TESTS 使用單元測試編譯 MySQL ON
WITH_UNIXODBC 啟用 unixODBC 支援 OFF
WITH_VALGRIND 是否編譯 Valgrind 標頭檔案 OFF
WITH_WIN_JEMALLOC 包含 jemalloc.dll 的目錄路徑 8.0.29
WITH_ZLIB zlib 支援型別 bundled
WITH_ZSTD zstd 支援型別 bundled 8.0.18
WITH_xxx_STORAGE_ENGINE 將儲存引擎 xxx 靜態編譯到伺服器中
格式 描述 預設值 引入版本 移除版本

通用選項

  • -DBUILD_CONFIG=mysql_release

    此選項配置源分發,使用 Oracle 用於生成官方 MySQL 發行版的二進位制分發的相同構建選項。

  • -DWITH_BUILD_ID=*bool*

    在 Linux 系統上,生成一個唯一的構建 ID,該 ID 用作build_id系統變數的值,並在 MySQL 伺服器啟動時寫入 MySQL 伺服器日誌。將此選項設定為OFF以禁用此功能。

    在 MySQL 8.0.31 中新增,此選項對 Linux 以外的平臺沒有影響。

  • -DBUNDLE_RUNTIME_LIBRARIES=*bool*

    是否將執行時庫與 Windows 伺服器 MSI 和 Zip 包捆綁在一起。

  • -DCMAKE_BUILD_TYPE=*type*

    要生成的構建型別:

    • RelWithDebInfo:啟用最佳化並生成除錯資訊。這是預設的 MySQL 構建型別。

    • Release:啟用最佳化但省略除錯資訊以減小構建大小。此構建型別在 MySQL 8.0.13 中新增。

    • Debug:禁用最佳化並生成除錯資訊。如果啟用了WITH_DEBUG選項,則也使用此構建型別。也就是說,-DWITH_DEBUG=1-DCMAKE_BUILD_TYPE=Debug具有相同效果。

    選項值NoneMinSizeRel不受支援。

  • -DCPACK_MONOLITHIC_INSTALL=*bool*

    此選項影響make package操作是生成多個安裝包檔案還是單個檔案。如果禁用,則操作會生成多個安裝包檔案,這可能對於只想安裝完整 MySQL 安裝的子集很有用。如果啟用,則會生成一個檔案用於安裝所有內容。

  • -DFORCE_INSOURCE_BUILD=*bool*

    定義是否強制在原始碼構建。推薦使用源外構建,因為它們允許從同一原始碼進行多次構建,並且可以透過刪除構建目錄快速進行清理。要強制在原始碼構建,請使用-DFORCE_INSOURCE_BUILD=ON呼叫CMake

  • -DFORCE_COLORED_OUTPUT=*bool*

    定義是否在命令列編譯時為gccclang啟用帶顏色的編譯器輸出。預設為OFF

安裝佈局選項

CMAKE_INSTALL_PREFIX選項指示基本安裝目錄。其他具有INSTALL_*xxx*形式名稱的元件位置指示選項相對於字首進行解釋,它們的值是相對路徑名。它們的值不應包括字首。

  • -DCMAKE_INSTALL_PREFIX=*dir_name*

    安裝基本目錄。

    可以使用--basedir選項在伺服器啟動時設定此值。

  • -DINSTALL_BINDIR=*dir_name*

    安裝使用者程式的位置。

  • -DINSTALL_DOCDIR=*dir_name*

    安裝文件的位置。

  • -DINSTALL_DOCREADMEDIR=*dir_name*

    安裝README檔案的位置。

  • -DINSTALL_INCLUDEDIR=*dir_name*

    標頭檔案安裝位置。

  • -DINSTALL_INFODIR=*dir_name*

    Info 檔案安裝位置。

  • -DINSTALL_LAYOUT=*name*

    選擇預定義的安裝佈局:

    • STANDALONE:與.tar.gz.zip包使用的佈局相同。這是預設設定。

    • RPM:類似於 RPM 軟體包的佈局。

    • SVR4:Solaris 軟體包佈局。

    • DEB:DEB 軟體包佈局(實驗性)。

    您可以選擇預定義的佈局,但透過指定其他選項修改各個元件的安裝位置。例如:

    cmake . -DINSTALL_LAYOUT=SVR4 -DMYSQL_DATADIR=/var/mysql/data
    

    INSTALL_LAYOUT的值確定secure_file_privkeyring_encrypted_file_datakeyring_file_data系統變數的預設值。請參閱第 7.1.8 節“伺服器系統變數”和第 8.4.4.19 節“金鑰環系統變數”中這些變數的描述。

  • -DINSTALL_LIBDIR=*dir_name*

    庫檔案安裝位置。

  • -DINSTALL_MANDIR=*dir_name*

    手冊頁安裝位置。

  • -DINSTALL_MYSQLKEYRINGDIR=*dir_path*

    用作keyring_file外掛資料檔案位置的預設目錄。預設值是平臺特定的,取決於INSTALL_LAYOUT CMake選項的值;請參閱第 7.1.8 節“伺服器系統變數”中keyring_file_data系統變數的描述。

  • -DINSTALL_MYSQLSHAREDIR=*dir_name*

    安裝共享資料檔案的位置。

  • -DINSTALL_MYSQLTESTDIR=*dir_name*

    安裝mysql-test目錄的位置。要禁止安裝此目錄,請將選項明確設定為空值(-DINSTALL_MYSQLTESTDIR=)。

  • -DINSTALL_PKGCONFIGDIR=*dir_name*

    用於安裝 mysqlclient.pc 檔案以供 pkg-config 使用的目錄。預設值是 INSTALL_LIBDIR/pkgconfig,除非 INSTALL_LIBDIR/mysql 結尾,在這種情況下會首先移除該部分。

  • -DINSTALL_PLUGINDIR=*dir_name*

    外掛目錄的位置。

    可以在伺服器啟動時使用 --plugin_dir 選項設定此值。

  • -DINSTALL_PRIV_LIBDIR=*dir_name*

    動態庫目錄的位置。

    **預設位置. ** 對於 RPM 構建,這是 /usr/lib64/mysql/private/,對於 DEB 是 /usr/lib/mysql/private/,對於 TAR 是 lib/private/

    Protobuf. ** 由於這是一個私有位置,載入器(例如 Linux 上的 ld-linux.so)可能無法找到 libprotobuf.so 檔案,除非得到幫助。為了指導載入器,將 RPATH=$ORIGIN/../$INSTALL_PRIV_LIBDIR 新增到 mysqldmysqlxtest。這對大多數情況都有效,但在使用 Resource Group 功能時,mysqld** 是 setsuid,載入器會忽略包含 $ORIGIN 的任何 RPATH。為了克服這個問題,在 DEB 和 RPM 版本的 mysqld 中設定了目錄的明確完整路徑,因為目標位置是已知的。對於 tarball 安裝,需要使用類似 patchelf 的工具對 mysqld 進行修補。

    這個選項是在 MySQL 8.0.18 版本中新增的。

  • -DINSTALL_SBINDIR=*dir_name*

    安裝 mysqld 伺服器的位置。

  • -DINSTALL_SECURE_FILE_PRIVDIR=*dir_name*

    secure_file_priv 系統變數的預設值。預設值是平臺特定的,取決於 INSTALL_LAYOUT CMake 選項的值;請參閱 Section 7.1.8, “Server System Variables” 中的 secure_file_priv 系統變數的描述。

  • -DINSTALL_SHAREDIR=*dir_name*

    安裝 aclocal/mysql.m4 的位置。

  • -DINSTALL_STATIC_LIBRARIES=*bool*

    是否安裝靜態庫。預設值是ON。如果設定為OFF,這些庫檔案不會被安裝:libmysqlclient.alibmysqlservices.a

  • -DINSTALL_SUPPORTFILESDIR=*dir_name*

    安裝額外支援檔案的位置。

  • -DLINK_RANDOMIZE=*bool*

    是否隨機化mysqld二進位制檔案中符號的順序。預設值是OFF。此選項僅應用於除錯目的。

  • -DLINK_RANDOMIZE_SEED=*val*

    LINK_RANDOMIZE選項的種子值。該值是一個字串。預設值是mysql,一個任意的選擇。

  • -DMYSQL_DATADIR=*dir_name*

    MySQL 資料目錄的位置。

    可以在伺服器啟動時使用--datadir選項設定此值。

  • -DODBC_INCLUDES=*dir_name*

    ODBC 包含目錄的位置,在配置 Connector/ODBC 時可能會用到。

  • -DODBC_LIB_DIR=*dir_name*

    ODBC 庫目錄的位置,在配置 Connector/ODBC 時可能會用到。

  • -DSYSCONFDIR=*dir_name*

    預設的my.cnf選項檔案目錄。

    無法在伺服器啟動時設定此位置,但可以使用--defaults-file=*file_name*選項啟動具有給定選項檔案的伺服器,其中file_name是檔案的完整路徑名。

  • -DSYSTEMD_PID_DIR=*dir_name*

    當 MySQL 由 systemd 管理時建立 PID 檔案的目錄名稱。預設值是/var/run/mysqld;根據INSTALL_LAYOUT的值可能會隱式更改。

    除非啟用了WITH_SYSTEMD,否則此選項將被忽略。

  • -DSYSTEMD_SERVICE_NAME=*name*

    當 MySQL 由systemd管理時要使用的 MySQL 服務名稱。預設值是mysqld;根據INSTALL_LAYOUT的值可能會隱式更改。

    除非啟用了WITH_SYSTEMD,否則此選項將被忽略。

  • -DTMPDIR=*dir_name*

    用於tmpdir系統變數的預設位置。如果未指定,則預設值為<stdio.h>中的P_tmpdir

儲存引擎選項

儲存引擎被構建為外掛。您可以將外掛構建為靜態模組(編譯到伺服器中)或動態模組(構建為必須使用INSTALL PLUGIN語句或--plugin-load選項安裝到伺服器中才能使用的動態庫)。一些外掛可能不支援靜態或動態構建。

InnoDBMyISAMMERGEMEMORYCSV引擎是強制性的(始終編譯到伺服器中)且無需顯式安裝。

要將儲存引擎靜態編譯到伺服器中,請使用-DWITH_*engine*_STORAGE_ENGINE=1。一些允許的engine值包括ARCHIVEBLACKHOLEEXAMPLEFEDERATED。示例:

-DWITH_ARCHIVE_STORAGE_ENGINE=1
-DWITH_BLACKHOLE_STORAGE_ENGINE=1

要構建支援 NDB 叢集的 MySQL,請使用WITH_NDB選項。(NDB 8.0.30 及更早版本:使用WITH_NDBCLUSTER。)

注意

無法在沒有效能模式支援的情況下進行編譯。如果希望在沒有特定型別的儀器的情況下進行編譯,可以使用以下CMake選項:

DISABLE_PSI_COND
DISABLE_PSI_DATA_LOCK
DISABLE_PSI_ERROR
DISABLE_PSI_FILE
DISABLE_PSI_IDLE
DISABLE_PSI_MEMORY
DISABLE_PSI_METADATA
DISABLE_PSI_MUTEX
DISABLE_PSI_PS
DISABLE_PSI_RWLOCK
DISABLE_PSI_SOCKET
DISABLE_PSI_SP
DISABLE_PSI_STAGE
DISABLE_PSI_STATEMENT
DISABLE_PSI_STATEMENT_DIGEST
DISABLE_PSI_TABLE
DISABLE_PSI_THREAD
DISABLE_PSI_TRANSACTION

例如,要在沒有互斥儀器的情況下進行編譯,請使用-DDISABLE_PSI_MUTEX=1配置 MySQL。

要排除構建中的儲存引擎,請使用-DWITH_*engine*_STORAGE_ENGINE=0。示例:

-DWITH_ARCHIVE_STORAGE_ENGINE=0
-DWITH_EXAMPLE_STORAGE_ENGINE=0
-DWITH_FEDERATED_STORAGE_ENGINE=0

也可以使用-DWITHOUT_*engine*_STORAGE_ENGINE=1(但更傾向於-DWITH_*engine*_STORAGE_ENGINE=0)來排除構建中的儲存引擎。示例:

-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1

如果對於給定的儲存引擎既未指定-DWITH_*engine*_STORAGE_ENGINE也未指定-DWITHOUT_*engine*_STORAGE_ENGINE,則該引擎將作為共享模組構建,或者如果無法作為共享模組構建,則將被排除。

功能選項

  • -DADD_GDB_INDEX=*bool*

    此選項確定是否啟用在二進位制檔案中生成.gdb_index部分,從而使在偵錯程式中載入它���更快。預設情況下禁用該選項。使用lld連結器,並且如果使用除lld或 GNU gold之外的連結器,則禁用它不起作用。

    此選項在 MySQL 8.0.18 中新增。

  • -DCOMPILATION_COMMENT=*string*

    有關編譯環境的描述性註釋。從 MySQL 8.0.14 開始,mysqld使用COMPILATION_COMMENT_SERVER。其他程式繼續使用COMPILATION_COMMENT

  • -DCOMPRESS_DEBUG_SECTIONS=*bool*

    是否壓縮二進位制可執行檔案的除錯部分(僅限 Linux)。壓縮可執行檔案的除錯部分可以節省空間,但在構建過程中會增加額外的 CPU 時間。

    預設為OFF。如果未顯式設定此選項,但設定了COMPRESS_DEBUG_SECTIONS環境變數,則該選項將從該變數中獲取其值。

    此選項在 MySQL 8.0.22 中新增。

  • -DCOMPILATION_COMMENT_SERVER=*string*

    用於mysqld的編譯環境的描述性註釋(例如,設定version_comment系統變數)。此選項在 MySQL 8.0.14 中新增。在 8.0.14 之前,伺服器使用COMPILATION_COMMENT

  • -DDEFAULT_CHARSET=*charset_name*

    伺服器字符集。預設情況下,MySQL 使用utf8mb4字符集。

    charset_name可以是binaryarmscii8asciibig5cp1250cp1251cp1256cp1257cp850cp852cp866cp932dec8eucjpmseuckrgb2312gbkgeostd8greekhebrewhp8keybcs2koi8rkoi8ulatin1latin2latin5latin7maccemacromansjisswe7tis620ucs2ujisutf8mb3utf8mb4utf16utf16leutf32

    可以在伺服器啟動時使用--character-set-server選項設定此值。

  • -DDEFAULT_COLLATION=*collation_name*

    伺服器排序規則。預設情況下,MySQL 使用utf8mb4_0900_ai_ci。使用SHOW COLLATION語句確定每個字符集可用的排序規則。

    可以在伺服器啟動時使用--collation_server選項設定此值。

  • -DDISABLE_PSI_COND=*bool*

    是否排除效能模式條件儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_FILE=*bool*

    是否排除效能模式檔案儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_IDLE=*bool*

    是否排除效能模式空閒儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_MEMORY=*bool*

    是否排除效能模式記憶體儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_METADATA=*bool*

    是否排除效能模式後設資料儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_MUTEX=*bool*

    是否排除效能模式互斥儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_RWLOCK=*bool*

    是否排除效能模式讀寫鎖儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_SOCKET=*bool*

    是否排除效能模式套接字儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_SP=*bool*

    是否排除效能模式儲存程式儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_STAGE=*bool*

    是否排除效能模式階段儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_STATEMENT=*bool*

    是否排除效能模式語句儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_STATEMENT_DIGEST=*bool*

    是否排除效能模式語句摘要儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_TABLE=*bool*

    是否排除效能模式表儀器。預設為OFF(包括)。

  • -DDISABLE_SHARED=*bool*

    是否禁用構建共享庫和編譯位置相關程式碼。預設為OFF(編譯位置無關程式碼)。

    此選項未使用,並在 MySQL 8.0.18 中已刪除。

  • -DDISABLE_PSI_PS=*bool*

    排除效能模式預備語句例項儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_THREAD=*bool*

    排除效能模式執行緒儀器。預設為OFF(包括)。

    僅在沒有任何儀器的情況下構建時禁用執行緒,因為其他儀器對執行緒有依賴。

  • -DDISABLE_PSI_TRANSACTION=*bool*

    排除效能模式事務儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_DATA_LOCK=*bool*

    排除效能模式資料鎖儀器。預設為OFF(包括)。

  • -DDISABLE_PSI_ERROR=*bool*

    排除效能模式伺服器錯誤儀器。預設為OFF(包括)。

  • -DDOWNLOAD_BOOST=*bool*

    是否下載 Boost 庫。預設為OFF

    有關使用 Boost 的更多討論,請參見WITH_BOOST選項。

  • -DDOWNLOAD_BOOST_TIMEOUT=*seconds*

    下載 Boost 庫的超時時間(秒)。預設為 600 秒。

    有關使用 Boost 的更多討論,請參見WITH_BOOST選項。

  • -DENABLE_DOWNLOADS=*bool*

    是否下載可選檔案。例如,啟用此選項後,CMake會下載用於執行單元測試的 Google Test 分發,或者構建 GCS Java 包裝器所需的 Ant 和 JUnit。

    截至 MySQL 8.0.26,MySQL 原始碼分發捆綁了用於執行單元測試的 Google Test 原始碼。因此,從該版本開始,WITH_GMOCKENABLE_DOWNLOADS CMake選項已被移除,並且如果指定了這些選項,則會被忽略。

  • -DENABLE_EXPERIMENTAL_SYSVARS=*bool*

    是否啟用實驗性InnoDB系統變數。實驗性系統變數適用於從事 MySQL 開發的人員,應僅在開發或測試環境中使用,並可能在未來的 MySQL 版本中被刪除而不另行通知。有關實驗性系統變數的資訊,請參考 MySQL 原始碼樹中的/storage/innobase/handler/ha_innodb.cc。實驗性系統變數可以透過搜尋“PLUGIN_VAR_EXPERIMENTAL”來識別。

  • -DWITHOUT_SERVER=*bool*

    是否在沒有 MySQL 伺服器的情況下構建。預設為 OFF,即構建伺服器。

    這被視為一個實驗選項;最好與伺服器一起構建。

  • -DENABLE_GCOV=*bool*

    是否包含gcov支援(僅限 Linux)。

  • -DENABLE_GPROF=*bool*

    是否啟用gprof(僅最佳化的 Linux 構建)。

  • -DENABLED_LOCAL_INFILE=*bool*

    此選項控制 MySQL 客戶端庫的預設LOCAL功能。因此,未做明確安排的客戶端將根據 MySQL 構建時指定的ENABLED_LOCAL_INFILE設定來禁用或啟用LOCAL功能。

    在 MySQL 二進位制發行版中,預設情況下,客戶端庫是使用禁用的ENABLED_LOCAL_INFILE編譯的。如果你從原始碼編譯 MySQL,請根據客戶端是否需要禁用或啟用LOCAL功能,相應地使用禁用或啟用ENABLED_LOCAL_INFILE進行配置。

    ENABLED_LOCAL_INFILE控制客戶端端的LOCAL功能的預設設定。對於伺服器端,local_infile系統變數控制伺服器端的LOCAL功能。要明確導致伺服器拒絕或允許LOAD DATA LOCAL語句(無論客戶端程式和庫在構建時或執行時如何配置),請分別使用啟用或禁用--local-infile啟動mysqldlocal_infile也可以在執行時設定。請參閱第 8.1.6 節,“LOAD DATA LOCAL 的安全注意事項”。

  • -DENABLED_PROFILING=*bool*

    是否啟用查詢分析程式碼(用於SHOW PROFILESHOW PROFILES語句)。

  • -DFORCE_UNSUPPORTED_COMPILER=*bool*

    預設情況下,CMake會檢查支援的編譯器的最低版本;要禁用此檢查,請使用-DFORCE_UNSUPPORTED_COMPILER=ON

  • -DSHOW_SUPPRESSED_COMPILER_WARNINGS=*bool*

    顯示被抑制的編譯器警告,並且不會因為-Werror而失敗。預設為OFF

    這個選項是在 MySQL 8.0.30 版本中新增的。

  • -DFPROFILE_GENERATE=*bool*

    是否生成基於配置檔案的最佳化(PGO)資料。此選項可用於在 GCC 中嘗試 PGO。有關使用 FPROFILE_GENERATEFPROFILE_USE 的資訊,請參閱 MySQL 原始碼分發中的 cmake/fprofile.cmake。這些選項已在 GCC 8 和 9 中進行了測試。

    這個選項是在 MySQL 8.0.19 版本中新增的。

  • -DFPROFILE_USE=*bool*

    是否使用基於配置檔案的最佳化(PGO)資料。此選項可用於在 GCC 中嘗試 PGO。有關使用 FPROFILE_GENERATEFPROFILE_USE 的資訊,請參閱 MySQL 原始碼分發中的 cmake/fprofile.cmake 檔案。這些選項已在 GCC 8 和 9 中進行了測試。

    啟用 FPROFILE_USE 也會啟用 WITH_LTO

    這個選項是在 MySQL 8.0.19 版本中新增的。

  • -DHAVE_PSI_MEMORY_INTERFACE=*bool*

    是否啟用效能模式記憶體跟蹤模組,用於動態儲存超對齊型別的記憶體分配函式(ut::aligned_*name* 庫函式)。

  • -DIGNORE_AIO_CHECK=*bool*

    如果在 Linux 上給出了 -DBUILD_CONFIG=mysql_release 選項,則預設情況下必須連結 libaio 庫。如果您沒有 libaio 或不想安裝它,可以透過指定 -DIGNORE_AIO_CHECK=1 來抑制對其的檢查。

  • -DMAX_INDEXES=*num*

    每個表的最大索引數。預設值為 64。最大值為 255。小於 64 的值將被忽略,使用預設值 64。

  • -DMYSQL_MAINTAINER_MODE=*bool*

    是否啟用 MySQL 維護者特定的開發環境。如果啟用,此選項會導致編譯器警告變為錯誤。

  • -DWITH_DEVELOPER_ENTITLEMENTS=*bool*

    是否向所有可執行檔案新增 get-task-allow 許可權,以便在伺服器意外停止時生成核心轉儲。

    在 macOS 11+ 上,核心轉儲僅限於具有 com.apple.security.get-task-allow 許可權的程序,此 CMake 選項啟用了該許可權。該許可權允許其他程序附加並讀取/修改程序記憶體,並允許 --core-file 正常工作。

    此選項是在 MySQL 8.0.30 中新增的。

  • -DMUTEX_TYPE=*type*

    InnoDB 使用的互斥型別。選項包括:

    • event:使用事件互斥量。這是預設值和原始的 InnoDB 互斥量實現。

    • sys:在 UNIX 系統上使用 POSIX 互斥量。如果可用,Windows 上使用 CRITICAL_SECTION 物件。

    • futex:使用 Linux futexes 而不是條件變數來排程等待執行緒。

  • -DMYSQLX_TCP_PORT=*port_num*

    X Plugin 監聽 TCP/IP 連線的埠號。預設值為 33060。

    可以使用 mysqlx_port 系統變數在伺服器啟動時設定此值。

  • -DMYSQLX_UNIX_ADDR=*file_name*

    伺服器監聽 X Plugin 套接字連線的 Unix 套接字檔案路徑。這必須是絕對路徑名。預設值為 /tmp/mysqlx.sock

    可以使用 mysqlx_port 系統變數在伺服器啟動時設定此值。

  • -DMYSQL_PROJECT_NAME=*name*

    對於 Windows 或 macOS,要合併到專案檔名中的專案名稱。

  • -DMYSQL_TCP_PORT=*port_num*

    伺服器監聽 TCP/IP 連線的埠號。預設值為 3306。

    可以使用 --port 選項在伺服器啟動時設定此值。

  • -DMYSQL_UNIX_ADDR=*file_name*

    伺服器監聽套接字連線的 Unix 套接字檔案路徑。這必須是絕對路徑名。預設值為 /tmp/mysql.sock

    可以使用 --socket 選項在伺服器啟動時設定此值。

  • -DOPTIMIZER_TRACE=*bool*

    是否支援最佳化器跟蹤。請參閱 MySQL 內部:最佳化器跟蹤。

  • -DREPRODUCIBLE_BUILD=*bool*

    對於在 Linux 系統上構建的版本,此選項控制是否要特別注意建立與構建位置和時間無關的構建結果。

    此選項是在 MySQL 8.0.11 中新增的。從 MySQL 8.0.12 開始,預設為 RelWithDebInfo 構建的 ON

  • -DUSE_LD_GOLD=*bool*

    MySQL 8.0.31 中刪除了 GNU gold連結器支援;此 CMake 選項也已刪除。

    CMake在可用且未明確禁用時會導致構建過程連結到 GNU gold連結器。要禁用此連結器的使用,請指定-DUSE_LD_GOLD=OFF選項。

  • -DUSE_LD_LLD=*bool*

    CMake在可用且未明確禁用時會導致使用 LLVM lld連結器為 Clang 進行連結。要禁用此連結器的使用,請指定-DUSE_LD_LLD=OFF選項。

    此選項是在 MySQL 8.0.16 中新增的。

  • -DWIN_DEBUG_NO_INLINE=*bool*

    是否在 Windows 上禁用函式內聯。預設值為OFF(啟用內聯)。

  • -DWITH_ANT=*path_name*

    設定 Ant 的路徑,在構建 GCS Java 包裝器時需要。將WITH_ANT設定為儲存 Ant 壓縮包或解壓縮存檔的目錄路徑。當未設定WITH_ANT,或設定為特殊值system時,構建過程假定二進位制ant存在於$PATH中。

  • -DWITH_ASAN=*bool*

    是否啟用 AddressSanitizer,適用於支援它的編譯器。預設值為OFF

  • -DWITH_ASAN_SCOPE=*bool*

    是否啟用 AddressSanitizer -fsanitize-address-use-after-scope Clang 標誌以進行使用後範圍檢測。預設值為關閉。要使用此選項,必須同時啟用-DWITH_ASAN

  • -DWITH_AUTHENTICATION_CLIENT_PLUGINS=*bool*

    如果構建了任何相應的伺服器身份驗證外掛,則此選項將自動啟用。因此,其值取決於其他CMake選項,不應明確設定。

    此選項是在 MySQL 8.0.26 中新增的。

  • -DWITH_AUTHENTICATION_LDAP=*bool*

    是否在無法構建 LDAP 身份驗證外掛時報告錯誤:

    • 如果禁用此選項(預設情況下),則僅當找到所需的標頭檔案和庫時才構建 LDAP 外掛。如果未找到,CMake會顯示相關提示。

    • 如果啟用此選項,則找不到所需的標頭檔案和庫將導致 CMake 生成錯誤,阻止伺服器的構建。

    有關 LDAP 認證的資訊,請參見第 8.4.1.7 節,“LDAP 可插拔認證”。

  • -DWITH_AUTHENTICATION_PAM=*bool*

    是否構建 PAM 認證外掛,對於包含此外掛的源樹。 (請參見第 8.4.1.5 節,“PAM 可插拔認證”。)如果指定了此選項且無法編譯外掛,則構建將失敗。

  • -DWITH_AWS_SDK=*path_name*

    亞馬遜 Web 服務軟體開發工具包的位置。

  • -DWITH_BOOST=*path_name*

    構建 MySQL 需要 Boost 庫。這些CMake選項可以控制庫源位置,並決定是否自動下載:

    • -DWITH_BOOST=*path_name* 指定 Boost 庫目錄位置。還可以透過設定 BOOST_ROOTWITH_BOOST 環境變數來指定 Boost 位置。

      -DWITH_BOOST=system 也是允許的,表示在標準位置上編譯主機上安裝了正確版本的 Boost。在這種情況下,將使用已安裝的 Boost 版本,而不是任何與 MySQL 源分發包含的版本。

    • -DDOWNLOAD_BOOST=*bool* 指定是否在指定位置不存在 Boost 源時下載 Boost 源。預設值為 OFF

    • -DDOWNLOAD_BOOST_TIMEOUT=*seconds* 下載 Boost 庫的超時時間(秒)。預設值為 600 秒。

    例如,如果通常將 MySQL 構建時將物件輸出放在 MySQL 源樹的 bld 子目錄中,您可以這樣構建 Boost:

    mkdir bld
    cd bld
    cmake .. -DDOWNLOAD_BOOST=ON -DWITH_BOOST=$HOME/my_boost
    

    這將導致 Boost 被下載到您的主目錄下的 my_boost 目錄中。如果所需的 Boost 版本已經存在,將不會進行下載。如果所需的 Boost 版本發生變化,則會下載新版本。

    如果 Boost 已經在本地安裝,並且您的編譯器自行找到 Boost 標頭檔案,則可能不需要指定前述的CMake選項。但是,如果 MySQL 需要的 Boost 版本發生變化,而本地安裝的版本沒有升級,可能會出現構建問題。使用CMake選項應該可以成功構建。

    使用上述設定允許將 Boost 下載到指定位置時,當所需的 Boost 版本發生變化時,您需要刪除 bld 資料夾,重新建立它,並再次執行 cmake 步驟。否則,新的 Boost 版本可能不會被下載,編譯可能會失敗。

  • -DWITH_CLIENT_PROTOCOL_TRACING=*bool*

    是否將客戶端協議跟蹤框架構建到客戶端庫中。預設情況下,此選項已啟用。

    有關編寫協議跟蹤客戶端外掛的資訊,請參閱 編寫協議跟蹤外掛。

    另請參閱 WITH_TEST_TRACE_PLUGIN 選項。

  • -DWITH_CURL=*curl_type*

    curl 庫的位置。curl_type 可以是 system(使用系統 curl 庫)或 curl 庫的路徑名。

  • -DWITH_DEBUG=*bool*

    是否包含除錯支援。

    配置 MySQL 以啟用除錯支援,使您可以在啟動伺服器時使用 --debug="d,parser_debug" 選項。這會導致用於處理 SQL 語句的 Bison 解析器將解析跟蹤轉儲到伺服器的標準錯誤輸出。通常,此輸出會寫入錯誤日誌。

    InnoDB 儲存引擎的同步除錯檢查在 UNIV_DEBUG 下定義,並且在使用 WITH_DEBUG 選項編譯時可用。當編譯時啟用除錯支援時,innodb_sync_debug 配置選項可用於啟用或禁用 InnoDB 同步除錯檢查。

    啟用 WITH_DEBUG 也會啟用除錯同步。此功能用於測試和除錯。編譯時,除錯同步在執行時預設情況下是禁用的。要啟用它,請使用 --debug-sync-timeout=*N* 選項啟動 mysqld,其中 N 是大於 0 的超時值。(預設值為 0,表示禁用除錯同步。)N 成為單個同步點的預設超時時間。

    當使用 WITH_DEBUG 選項編譯時,InnoDB 儲存引擎的同步除錯檢查可用。

    有關除錯同步功能及如何使用同步點的描述,請參閱 MySQL 內部:測試同步。

  • -DWITH_DEFAULT_FEATURE_SET=*bool*

    是否使用cmake/build_configurations/feature_set.cmake中的標誌。此選項在 MySQL 8.0.22 中已移除。

  • -DWITH_EDITLINE=*value*

    要使用的libedit/editline庫。允許的值為bundled(預設)和system

  • -DWITH_FIDO=*fido_type*

    authentication_fido身份驗證外掛是使用 FIDO 庫實現的(請參閱第 8.4.1.11 節,“FIDO 可插拔認證”)。WITH_FIDO選項指示 FIDO 支援的來源:

    • bundled: 使用與分發包捆綁的 FIDO 庫。這是預設設定。

      從 MySQL 8.0.30 開始,MySQL 包含fido2版本 1.8.0.(之前的版本使用了fido2 1.5.0)。

    • system: 使用系統 FIDO 庫。

    如果所有身份驗證外掛都已禁用,則WITH_FIDO將被禁用(設定為none)。

    此選項在 MySQL 8.0.27 中新增。

  • -DWITH_GMOCK=*path_name*

    用於 Google Test 基於單元測試的 googlemock 分發路徑。選項值是分發 zip 檔案的路徑。或者,將WITH_GMOCK環境變數設定為路徑名。還可以使用-DENABLE_DOWNLOADS=1,這樣 CMake 會從 GitHub 下載分發包。

    如果您在構建 MySQL 時沒有包含 Google Test 單元測試(透過配置不包含WITH_GMOCK),CMake 會顯示一條訊息,指示如何下載它。

    從 MySQL 8.0.26 開始,MySQL 原始碼分發包含 Google Test 原始碼。因此,從那個版本開始,WITH_GMOCKENABLE_DOWNLOADS CMake 選項被移除,並且如果指定了這些選項,則會被忽略。

  • -DWITH_ICU={*icu_type*|*path_name*}

    MySQL 使用國際 Unicode 元件(ICU)來支援正規表示式操作。WITH_ICU選項指示要包含的 ICU 支援型別或要使用的 ICU 安裝路徑。

    • icu_type可以是以下值之一:

      • bundled: 使用與分發包捆綁的 ICU 庫。這是預設設定,也是 Windows 唯一支援的選項。

      • system: 使用系統 ICU 庫。

    • path_name 是要使用的 ICU 安裝路徑名。這可能比使用 systemicu_type 值更可取,因為它可以防止 CMake 檢測和使用系統上安裝的舊版或不正確的 ICU 版本。(執行相同操作的另一種允許方式是將 WITH_ICU 設定為 system 並將 CMAKE_PREFIX_PATH 選項設定為 path_name。)

  • -DWITH_INNODB_EXTRA_DEBUG=*bool*

    是否包含額外的 InnoDB 除錯支援。

    啟用 WITH_INNODB_EXTRA_DEBUG 將開啟額外的 InnoDB 除錯檢查。只有在啟用 WITH_DEBUG 時才能啟用此選項。

  • -DWITH_INNODB_MEMCACHED=*bool*

    是否生成 memcached 共享庫(libmemcached.soinnodb_engine.so)。

  • -DWITH_JEMALLOC=*bool*

    是否連結 -ljemalloc。如果啟用,內建的 malloc()calloc()realloc()free() 函式將被禁用。預設值為 OFF

    WITH_JEMALLOCWITH_TCMALLOC 是互斥的。

    這個選項是在 MySQL 8.0.16 版本中新增的。

  • -DWITH_WIN_JEMALLOC=*string*

    在 Windows 上,傳入一個包含 jemalloc.dll 的目錄路徑以啟用 jemalloc 功能。構建系統將 jemalloc.dll 複製到與 mysqld.exe 和/或 mysqld-debug.exe 相同的目錄中,並將其用於記憶體管理操作。如果找不到 jemalloc.dll 或者沒有匯出所需函式,則使用標準記憶體函式。一個 INFORMATION 級別的日誌訊息記錄了是否找到並使用了 jemalloc。

    這個選項對於官方 MySQL Windows 二進位制檔案是啟用的。

    這個選項是在 MySQL 8.0.29 版本中新增的。

  • -DWITH_KEYRING_TEST=*bool*

    是否構建伴隨 keyring_file 外掛的測試程式。預設值為 OFF。測試檔案原始碼位於 plugin/keyring/keyring-test 目錄中。

  • -DWITH_LIBEVENT=*string*

    要使用哪個 libevent 庫。允許的值為 bundled(預設)和 system。在 MySQL 8.0.21 之前,如果指定 system,則如果存在系統 libevent 庫,則使用該庫,否則會出現錯誤。在 MySQL 8.0.21 及更高版本中,如果指定 system 並且找不到系統 libevent 庫,則無論如何都會出現錯誤,並且不會使用捆綁的 libevent

    libevent 庫是 InnoDB memcached、X Plugin 和 MySQL Router 所必需的。

  • -DWITH_LIBWRAP=*bool*

    是否包括libwrap(TCP 包裝程式)支援。

  • -DWITH_LOCK_ORDER=*bool*

    是否啟用 LOCK_ORDER 工具。預設情況下,此選項已禁用,伺服器構建不包含任何工��。如果啟用工具,則 LOCK_ORDER 工具可用,並且可以按照第 7.9.3 節,“LOCK_ORDER 工具”中描述的方式使用。

    注意

    啟用WITH_LOCK_ORDER選項後,MySQL 構建需要flex程式。

    此選項在 MySQL 8.0.17 中新增。

  • -DWITH_LSAN=*bool*

    是否執行 LeakSanitizer,不包括 AddressSanitizer。預設值為OFF

    此選項在 MySQL 8.0.16 中新增。

  • -DWITH_LTO=*bool*

    是否啟用連結時最佳化器,如果編譯器支援。預設值為OFF,除非啟用FPROFILE_USE

    此選項在 MySQL 8.0.13 中新增。

  • -DWITH_LZ4=*lz4_type*

    WITH_LZ4選項指示zlib支援的來源:

    • bundled: 使用分發的lz4庫。這是預設值。

    • system: 使用系統的lz4庫。如果WITH_LZ4設定為此值,則不會構建lz4_decompress實用程式。在這種情況下,可以使用系統的lz4命令。

  • -DWITH_LZMA=*lzma_type*

    要包含的 LZMA 庫支援型別。lzma_type可以是以下值之一:

    • bundled: 使用分發的 LZMA 庫。這是預設值。

    • system: 使用系統的 LZMA 庫。

    此選項在 MySQL 8.0.16 中移除。

  • -DWITH_MECAB={disabled|system|*path_name*}

    使用此選項編譯 MeCab 解析器。如果已將 MeCab 安裝到其預設安裝目錄,請設定-DWITH_MECAB=systemsystem選項適用於從原始碼或使用本機軟體包管理工具從二進位制檔案安裝的 MeCab。如果將 MeCab 安裝到自定義安裝目錄,請指定 MeCab 安裝路徑,例如-DWITH_MECAB=/opt/mecab。如果system選項不起作用,則在所有情況下指定 MeCab 安裝路徑應該起作用。

    有關相關資訊,請參見第 14.9.9 節,“MeCab 全文字解析器外掛”。

  • -DWITH_MSAN=*bool*

    是否啟用 MemorySanitizer,適用於支援它的編譯器。預設為關閉。

    如果啟用此選項,要使其生效,所有連結到 MySQL 的庫也必須使用啟用該選項進行編譯。

  • -DWITH_MSCRT_DEBUG=*bool*

    是否啟用 Visual Studio CRT 記憶體洩漏跟蹤。預設為OFF

  • -DMSVC_CPPCHECK=*bool*

    是否啟用 MSVC 程式碼分析。預設為OFF

  • -DWITH_MYSQLX=*bool*

    是否構建支援 X 外掛。預設為ON。參見第二十二章,將 MySQL 用作文件儲存

  • -DWITH_NUMA=*bool*

    明確設定 NUMA 記憶體分配策略。CMake根據當前平臺是否支援NUMA來設定預設值WITH_NUMA。對於不支援 NUMA 的平臺,CMake的行為如下:

    • 沒有 NUMA 選項(正常情況下),CMake會繼續正常執行,只會產生以下警告:NUMA 庫缺失或所需版本不可用。

    • 使用-DWITH_NUMA=ONCMake會中止並顯示以下錯誤:NUMA 庫缺失或所需版本不可用。

  • -DWITH_PACKAGE_FLAGS=*bool*

    對於通常用於 RPM 和 Debian 軟體包的標誌,是否將它們新增到這些平臺上的獨立構建中。對於非除錯構建,預設值為ON

    此選項在 MySQL 8.0.26 中新增。

  • -DWITH_PROTOBUF=*protobuf_type*

    要使用的 Protocol Buffers 包。protobuf_type可以是以下值之一:

    • bundled:使用與發行版捆綁的包。這是預設值。可選擇使用INSTALL_PRIV_LIBDIR來修改動態 Protobuf 庫目錄。

    • system:使用系統上安裝的包。

    其他值將被忽略,並回退到bundled

  • -DWITH_RAPID=*bool*

    是否構建快速開發週期外掛。啟用時,在構建樹中建立一個rapid目錄,其中包含這些外掛。禁用時,在構建樹中不會建立rapid目錄。預設為ON,除非從源樹中刪除了rapid目錄,此時預設值變為OFF

  • -DWITH_RAPIDJSON=*rapidjson_type*

    要包含的 RapidJSON 庫支援型別。rapidjson_type可以是以下值之一:

    • bundled: 使用與發行版捆綁的 RapidJSON 庫。這是預設設定。

    • system: 使用系統 RapidJSON 庫。需要版本 1.1.0 或更高版本。

    此選項在 MySQL 8.0.13 中新增。

  • -DWITH_RE2=*re2_type*

    要包含的 RE2 庫支援型別。re2_type可以是以下值之一:

    • bundled: 使用與發行版捆綁的 RE2 庫。這是預設設定。

    • system: 使用系統 RE2 庫。

    從 MySQL 8.0.18 開始,MySQL 不再使用 RE2 庫,此選項已被移除。

  • -DWITH_ROUTER=*bool*

    是否構建 MySQL Router。預設為ON

    此選項在 MySQL 8.0.16 中新增。

  • -DWITH_SSL={*ssl_type*|path_name}

    為了支援加密連線、用於隨機數生成的熵以及其他與加密相關的操作,MySQL 必須使用 SSL 庫構建。此選項指定要使用的 SSL 庫。

    • ssl_type可以是以下值之一:

      • system: 使用系統 OpenSSL 庫。這是預設設定。

        在 macOS 和 Windows 上,使用system配置 MySQL 構建,就好像使用path_name指向手動安裝的 OpenSSL 庫呼叫了 CMake 一樣。這是因為它們沒有系統 SSL 庫。在 macOS 上,brew install openssl安裝到/usr/local/opt/openssl,以便system可以找到它。在 Windows 上,它檢查%ProgramFiles%/OpenSSL%ProgramFiles%/OpenSSL-Win32%ProgramFiles%/OpenSSL-Win64C:/OpenSSLC:/OpenSSL-Win32C:/OpenSSL-Win64

      • yes: 這是system的同義詞。

      • openssl*version*:(MySQL 8.0.30 及更高版本:)使用替代的 OpenSSL 系統包,如 EL7 上的openssl11,或 EL8 上的openssl3

        身份驗證外掛,如 LDAP 和 Kerberos,已禁用,因為它們不支援這些替代版本的 OpenSSL。

    • path_name是要使用的 OpenSSL 安裝路徑名。這可能比使用systemssl_type值更可取,因為它可以防止 CMake 檢測和使用系統上安裝的舊版或不正確的 OpenSSL 版本。(執行相同操作的另一種允許的方法是將WITH_SSL設定為system並將CMAKE_PREFIX_PATH選項設定為path_name。)

    有關配置 SSL 庫的其他資訊,請參見第 2.8.6 節“配置 SSL 庫支援”。

  • -DWITH_SYSTEMD=*bool*

    是否啟用 systemd 支援檔案的安裝。預設情況下,此選項已禁用。啟用時,將安裝 systemd 支援檔案,並且諸如 mysqld_safe 和 System V 初始化指令碼等指令碼將不會安裝。在 systemd 不可用的平臺上,啟用 WITH_SYSTEMD 將導致 CMake 報錯。

    有關使用 systemd 的更多資訊,請參見 第 2.5.9 節,“使用 systemd 管理 MySQL 伺服器”。該部分還包括有關指定在 [mysqld_safe] 選項組中另行指定的選項的資訊。因為在使用 systemd 時未安裝 mysqld_safe,這些選項必須以另一種方式指定。

  • -DWITH_SYSTEM_LIBS=*bool*

    這個選項作為一個“總稱”選項,用於設定任何未明確設定的以下 CMake 選項的 system 值:WITH_CURLWITH_EDITLINEWITH_FIDOWITH_ICUWITH_LIBEVENTWITH_LZ4WITH_LZMAWITH_PROTOBUFWITH_RE2WITH_SSLWITH_ZSTD

    WITH_ZLIB 在 MySQL 8.0.30 之前包含在此處。

  • -DWITH_SYSTEMD_DEBUG=*bool*

    是否生成額外的 systemd 除錯資訊,用於在 systemd 上執行 MySQL 的平臺。默���值為 OFF

    這個選項是在 MySQL 8.0.22 版本中新增的。

  • -DWITH_TCMALLOC=*bool*

    是否連結 -ltcmalloc。如果啟用,內建的 malloc()calloc()realloc()free() 例程將被禁用。預設值為 OFF

    WITH_TCMALLOCWITH_JEMALLOC 是互斥的。

    這個選項是在 MySQL 8.0.22 版本中新增的。

  • -DWITH_TEST_TRACE_PLUGIN=*bool*

    是否構建測試協議跟蹤客戶端外掛(請參閱使用測試協議跟蹤外掛)。預設情況下,此選項已禁用。啟用此選項除非啟用了WITH_CLIENT_PROTOCOL_TRACING選項,否則不會產生任何效果。如果 MySQL 配置了這兩個選項,libmysqlclient 客戶端庫將內建測試協議跟蹤外掛,並且所有標準 MySQL 客戶端都會載入該外掛。但是,即使啟用了測試外掛,預設情況下也不會產生任何效果。可以使用環境變數控制外掛;請參閱使用測試協議跟蹤外掛。

    注意

    如果要使用自己的協議跟蹤外掛,請不要啟用WITH_TEST_TRACE_PLUGIN選項,因為一次只能載入一個這樣的外掛,嘗試載入第二個外掛時會出錯。如果您已經使用啟用了測試協議跟蹤外掛的 MySQL 進行構建以檢視其工作原理,則必須在使用自己的外掛之前重新構建 MySQL 以禁用它。

    有關編寫跟蹤外掛的資訊,請參閱編寫協議跟蹤外掛。

  • -DWITH_TSAN=*bool*

    是否啟用 ThreadSanitizer,適用於支援它的編譯器。預設情況下為關閉。

  • -DWITH_UBSAN=*bool*

    是否啟用未定義行為檢測器,適用於支援它的編譯器。預設情況下為關閉。

  • -DWITH_UNIT_TESTS={ON|OFF}

    如果啟用,使用單元測試編譯 MySQL。預設情況下為ON,除非伺服器未被編譯。

  • -DWITH_UNIXODBC=*1*

    啟用 unixODBC 支援,用於 Connector/ODBC。

  • -DWITH_VALGRIND=*bool*

    是否在 MySQL 程式碼中暴露 Valgrind API 的 Valgrind 標頭檔案。預設情況下為OFF

    要生成 Valgrind-aware 除錯構建,通常將-DWITH_VALGRIND=1-DWITH_DEBUG=1結合使用。請參閱構建除錯配置。

  • -DWITH_ZLIB=*zlib_type*

    一些功能要求伺服器構建時具有壓縮庫支援,例如 COMPRESS()UNCOMPRESS() 函式,以及客戶端/伺服器協議的壓縮。WITH_ZLIB 選項指示 zlib 支援的來源:

    在 MYSQL 8.0.32 及更高版本中,zlib 的最低支援版本為 1.2.13。

    • bundled:使用分發的 zlib 庫。這是預設值。

    • system:使用系統的 zlib 庫。如果 WITH_ZLIB 設定為此值,則不會構建 zlib_decompress 實用程式。在這種情況下,可以使用系統的 openssl zlib 命令。

  • -DWITH_ZSTD=*zstd_type*

    使用 zstd 演算法進行連線壓縮(參見 Section 6.2.8, “Connection Compression Control”) 需要伺服器構建時支援 zstd 庫。WITH_ZSTD 選項指示 zstd 支援的來源:

    • bundled:使用分發的 zstd 庫。這是預設值。

    • system:使用系統的 zstd 庫。

    此選項在 MySQL 8.0.18 中新增。

編譯器標誌

  • -DCMAKE_C_FLAGS="*flags*"

    C 編譯器的標誌。

  • -DCMAKE_CXX_FLAGS="*flags*"

    C++ 編譯器的標誌。

  • -DWITH_DEFAULT_COMPILER_OPTIONS=*bool*

    是否使用 cmake/build_configurations/compiler_options.cmake 中的標誌。

    注意

    所有最佳化標誌都經過 MySQL 構建團隊精心選擇和測試。覆蓋它們可能導致意外結果,並且由您自行承擔風險。

  • -DOPTIMIZE_SANITIZER_BUILDS=*bool*

    是否將 -O1 -fno-inline 新增到 sanitizer 構建中。預設值為 ON

要指定自己的 C 和 C++ 編譯器標誌,對於不影響最佳化的標誌,請使用 CMAKE_C_FLAGSCMAKE_CXX_FLAGS CMake 選項。

在提供自己的編譯器標誌時,您可能希望同時指定CMAKE_BUILD_TYPE

例如,在 64 位 Linux 機器上建立 32 位釋出構建,可以執行以下操作:

$> mkdir build
$> cd build
$> cmake .. -DCMAKE_C_FLAGS=-m32 \
  -DCMAKE_CXX_FLAGS=-m32 \
  -DCMAKE_BUILD_TYPE=RelWithDebInfo

如果設定影響最佳化的標誌(-O*number*),則必須設定 CMAKE_C_FLAGS_*build_type* 和/或 CMAKE_CXX_FLAGS_*build_type* 選項,其中 build_type 對應於 CMAKE_BUILD_TYPE 的值。要為預設構建型別(RelWithDebInfo)指定不同的最佳化設定,請設定 CMAKE_C_FLAGS_RELWITHDEBINFOCMAKE_CXX_FLAGS_RELWITHDEBINFO 選項。例如,在 Linux 上使用 -O3 編譯並帶有除錯符號,執行以下操作:

$> cmake .. -DCMAKE_C_FLAGS_RELWITHDEBINFO="-O3 -g" \
  -DCMAKE_CXX_FLAGS_RELWITHDEBINFO="-O3 -g"

編譯 NDB 叢集的 CMake 選項

在構建帶有 NDB 叢集支援的 MySQL 原始碼時,請使用以下選項。

  • -DMEMCACHED_HOME=*dir_name*

    NDB 在 NDB 8.0.23 中移除了對 memcached 的支援;因此,在此版本或更高版本中不再支援使用此選項構建 NDB

  • -DNDB_UTILS_LINK_DYNAMIC={ON|OFF}

    控制 NDB 實用程式(如 ndb_drop_table)是否靜態連結(OFF)或動態連結(ON)到 ndbclient;預設為靜態連結(OFF)。通常在構建這些工具時使用靜態連結以避免 LD_LIBRARY_PATH 的問題,或者當安裝了多個版本的 ndbclient 時使用。此選項適用於建立 Docker 映象和可能需要精確控制目標環境並希望減小映象大小的情況。

    在 NDB 8.0.22 中新增。

  • -DWITH_BUNDLED_LIBEVENT={ON|OFF}

    NDB 在 NDB 8.0.23 中移除了對 memcached 的支援;因此,在此版本或更高版本中不再支援使用此選項構建 NDB

  • -DWITH_BUNDLED_MEMCACHED={ON|OFF}

    NDB 在 NDB 8.0.23 中移除了對 memcached 的支援;因此,在此版本或更高版本中不再支援使用此選項構建 NDB

  • -DWITH_CLASSPATH=*path*

    設定構建 MySQL NDB 叢集 Java 聯結器的類路徑。預設為空。如果使用 -DWITH_NDB_JAVA=OFF,則忽略此選項。

  • -DWITH_ERROR_INSERT={ON|OFF}

    啟用 NDB 核心中的錯誤注入。僅用於測試;不適用於構建生產二進位制檔案。預設為 OFF

  • -DWITH_NDB={ON|OFF}

    構建 MySQL NDB 叢集;構建 NDB 外掛和所有 NDB 叢集程式。

    在 NDB 8.0.31 中新增。

  • -DWITH_NDBAPI_EXAMPLES={ON|OFF}

    storage/ndb/ndbapi-examples/中構建 NDB API 示例程式。有關這些示例的資訊,請參閱 NDB API 示例。

  • -DWITH_NDBCLUSTER_STORAGE_ENGINE={ON|OFF}

    NDB 8.0.30 及更早版本:僅供內部使用;可能不總是按預期工作。要構建帶有NDB支援的內容,請改用WITH_NDBCLUSTER

    NDB 8.0.31 及更高版本:僅控制ndbcluster外掛是否包含在構建中;WITH_NDB會自動啟用此選項,因此建議您改用WITH_NDB

  • -DWITH_NDBCLUSTER={ON|OFF}

    mysqld中構建並連結對NDB儲存引擎的支援。

    從 NDB 8.0.31 開始,此選項已棄用,並將最終刪除;請改用WITH_NDB

  • -DWITH_NDBMTD={ON|OFF}

    構建多執行緒資料節點可執行檔案ndbmtd。預設值為ON

  • -DWITH_NDB_DEBUG={ON|OFF}

    啟用構建 NDB 叢集二進位制檔案的除錯版本。預設值為OFF

  • -DWITH_NDB_JAVA={ON|OFF}

    啟用構建帶有 Java 支援的 NDB 叢集,包括對 ClusterJ 的支援(請參閱 MySQL NDB 叢集 Java 聯結器)。

    預設情況下,此選項為ON。如果不希望使用 Java 支援編譯 NDB 叢集,則在執行CMake時必須顯式禁用它,即指定-DWITH_NDB_JAVA=OFF。否則,如果找不到 Java,則構建配置將失敗。

  • -DWITH_NDB_PORT=*port*

    導致構建的 NDB 叢集管理伺服器(ndb_mgmd)預設使用此port。如果未設定此選項,則生成的管理伺服器預設嘗試使用埠 1186。

  • -DWITH_NDB_TEST={ON|OFF}

    如果啟用,將包括一組 NDB API 測試程式。預設值為OFF

  • -DWITH_PLUGIN_NDBCLUSTER={ON|OFF}

    僅供內部使用;可能不總是按預期工作。此選項在 NDB 8.0.31 中已移除;請改用WITH_NDB來構建 MySQL NDB 叢集。(NDB 8.0.30 及更早版本:請使用WITH_NDBCLUSTER。)

2.8.8 處理編譯 MySQL 時出現的問題

原文:dev.mysql.com/doc/refman/8.0/en/compilation-problems.html

許多問題的解決方案涉及重新配置。如果您重新配置,請注意以下事項:

  • 如果 CMake 在之前已經執行過後再次執行,它可能會使用在先前呼叫期間收集的資訊。這些資訊儲存在 CMakeCache.txt 中。當 CMake 啟動時,它會查詢該檔案,並在假定資訊仍然正確的情況下讀取其內容。當您重新配置時,這種假設是無效的。

  • 每次執行 CMake,您必須再次執行 make 進行重新編譯。但是,您可能希望在重新編譯之前刪除先前構建的舊目標檔案,因為它們是使用不同的配置選項編譯的。

為了防止使用舊的目標檔案或配置資訊,請在重新執行 CMake 之前執行以下命令:

在 Unix 系統上:

$> make clean
$> rm CMakeCache.txt

在 Windows 系統上:

$> devenv MySQL.sln /clean
$> del CMakeCache.txt

如果在原始碼樹之外構建,請在重新執行 CMake 之前刪除並重新建立您的構建目錄。有關在原始碼樹之外構建的說明,請參閱 如何使用 CMake 構建 MySQL 伺服器。

在某些系統上,由於系統包含檔案的差異,可能會出現警告。以下列表描述了���編譯 MySQL 時最常出現的其他問題:

  • 要定義要使用的 C 和 C++ 編譯器,您可以定義 CCCXX 環境變數。例如:

    $> CC=gcc
    $> CXX=g++
    $> export CC CXX
    

    雖然可以在命令列上執行此操作,就像剛才展示的那樣,但您可能更喜歡在構建指令碼中定義這些值,這種情況下不需要 export 命令。

    要指定自己的 C 和 C++ 編譯器標誌,請使用 CMAKE_C_FLAGSCMAKE_CXX_FLAGS CMake 選項。參見 編譯器標誌。

    要檢視可能需要指定的標誌,請使用 mysql_config 呼叫 --cflags--cxxflags 選項。

  • 在使用 CMake 配置 MySQL 後,要檢視編譯階段執行的命令,請執行 make VERBOSE=1 而不是僅執行 make

  • 如果編譯失敗,請檢查是否啟用了 MYSQL_MAINTAINER_MODE 選項。此模式會導致編譯器警告變為錯誤,因此禁用它可能會使編譯繼續進行。

  • 如果您的編譯失敗並出現以下任何錯誤,請升級您的 make 版本為 GNU make

    make: Fatal error in reader: Makefile, line 18:
    Badly formed macro assignment
    

    或者:

    make: file `Makefile' line 18: Must be a separator (:
    

    或者:

    pthread.h: No such file or directory
    

    Solaris 和 FreeBSD 已知具有問題的 make 程式。

    GNU make 3.75 已知可用。

  • sql_yacc.cc 檔案是從 sql_yacc.yy 生成的。通常,構建過程不需要建立 sql_yacc.cc,因為 MySQL 自帶一個預生成的副本。但是,如果你確實需要重新建立它,可能會遇到這個錯誤:

    "sql_yacc.yy", line *xxx* fatal: default action causes potential...
    

    這表明你的 yacc 版本不足。你可能需要安裝一個較新版本的 bisonyacc 的 GNU 版本)並使用它代替。

    bison 版本舊於 1.75 可能會報告此錯誤:

    sql_yacc.yy:#####: fatal error: maximum table size (32767) exceeded
    

    實際上並未超出最大表大小;錯誤是由舊版本的 bison 中的錯誤引起的。

有關獲取或更新工具的資訊,請參閱第 2.8 節,“從原始碼安裝 MySQL”中的系統要求。

2.8.9 MySQL 配置和第三方工具

原文:dev.mysql.com/doc/refman/8.0/en/source-configuration-third-party.html

需要從 MySQL 原始碼中確定 MySQL 版本的第三方工具可以讀取頂級源目錄中的 MYSQL_VERSION 檔案。該檔案單獨列出了版本的各個部分。例如,如果版本是 MySQL 8.0.36,則檔案如下所示:

MYSQL_VERSION_MAJOR=8
MYSQL_VERSION_MINOR=0
MYSQL_VERSION_PATCH=36
MYSQL_VERSION_EXTRA=
MYSQL_VERSION_STABILITY="LTS"

注意

在 MySQL 5.7 及更早版本中,此檔名為 VERSION

要從版本元件構建一個五位數,使用以下公式:

MYSQL_VERSION_MAJOR*10000 + MYSQL_VERSION_MINOR*100 + MYSQL_VERSION_PATCH

2.8.10 生成 MySQL Doxygen 文件內容

原文:dev.mysql.com/doc/refman/8.0/en/source-installation-doxygen.html

MySQL 原始碼包含使用 Doxygen 編寫的內部文件。生成的 Doxygen 內容可在 dev.mysql.com/doc/index-other.html 找到。還可以使用以下過程從 MySQL 源分發本地生成此內容:

  1. 安裝 doxygen 1.9.2 或更高版本。可在 www.doxygen.nl/ 找到發行版。

    安裝 doxygen 後,請驗證版本號:

    $> doxygen --version
    1.9.2
    
  2. 安裝 PlantUML

    在 Windows 上安裝 PlantUML(在 Windows 10 上測試過)時,必須至少以管理員身份執行一次,以便建立登錄檔鍵。開啟管理員控制檯並執行以下命令:

    $> java -jar *path-to-plantuml.jar*
    

    該命令應該開啟一個 GUI 視窗,並在控制檯上不返回任何錯誤。

  3. PLANTUML_JAR_PATH 環境設定為安裝 PlantUML 的位置。例如:

    $> export PLANTUML_JAR_PATH=*path-to-plantuml.jar*
    
  4. 安裝 Graphvizdot 命令。

    安裝 Graphviz 後,請驗證 dot 的可用性。例如:

    $> which dot
    /usr/bin/dot
    
    $> dot -V
    dot - graphviz version 2.40.1 (20161225.0304)
    
  5. 將位置更改到 MySQL 源分發的頂層目錄,並執行以下操作:

    首先,執行 cmake

    $> cd *mysql-source-directory*
    $> mkdir build
    $> cd build
    $> cmake ..
    

    接下來,生成 doxygen 文件:

    $> make doxygen
    

    檢查錯誤日誌,該日誌位於頂層目錄中的 doxyerror.log 檔案中。假設構建成功執行,請使用瀏覽器檢視生成的輸出。例如:

    $> firefox doxygen/html/index.html
    

2.9 安裝後設定和測試

原文:dev.mysql.com/doc/refman/8.0/en/postinstallation.html

2.9.1 初始化資料目錄

2.9.2 啟動伺服器

2.9.3 測試伺服器

2.9.4 初始 MySQL 賬戶的安全性

2.9.5 自動啟動和停止 MySQL

本節討論安裝 MySQL 後應執行的任務:

  • 如有必要,初始化資料目錄並建立 MySQL 授權表。對於某些 MySQL 安裝方法,資料目錄初始化可能會自動完成:

    • MySQL Installer 執行的 Windows 安裝操作。

    • 使用 Oracle 的伺服器 RPM 或 Debian 分發在 Linux 上安裝。

    • 在許多平臺上使用本機打包系統進行安裝,包括 Debian Linux、Ubuntu Linux、Gentoo Linux 等。

    • 使用 DMG 分發在 macOS 上安裝。

    對於其他平臺和安裝型別,您必須手動初始化資料目錄。這些包括在 Unix 和類 Unix 系統上從通用二進位制和源分發安裝,以及在 Windows 上從 ZIP 存檔包安裝。有關說明,請參見第 2.9.1 節,“初始化資料目錄”。

  • 啟動伺服器並確保可以訪問。有關說明,請參見第 2.9.2 節,“啟動伺服器”和第 2.9.3 節,“測試伺服器”。

  • 為初始root賬戶在授權表中分配密碼,如果在資料目錄初始化期間尚未完成。密碼可防止未經授權訪問 MySQL 伺服器。有關說明,請參見第 2.9.4 節,“保護初始 MySQL 賬戶”。

  • 可選地,安排伺服器在系統啟動和停止時自動啟動和停止。有關說明,請參見第 2.9.5 節,“自動啟動和停止 MySQL”。

  • 可選地,填充時區表以啟用命名時區的識別。有關說明,請參見第 7.1.15 節,“MySQL 伺服器時區支援”。

當您準備建立額外使用者賬戶時,您可以在第 8.2 節,“訪問控制和賬戶管理”中找到有關 MySQL 訪問控制系統和賬戶管理的資訊。

2.9.1 初始化資料目錄

原文:dev.mysql.com/doc/refman/8.0/en/data-directory-initialization.html

安裝 MySQL 後,必須初始化資料目錄,包括mysql系統模式中的表:

  • 對於某些 MySQL 安裝方法,資料目錄初始化是自動的,如第 2.9 節,“安裝後設定和測試”中所述。

  • 對於其他安裝方法,您必須手動初始化資料目錄。這些方法包括在 Unix 和類 Unix 系統上從通用二進位制和源分發安裝,以及在 Windows 上從 ZIP 存檔包安裝。

本節描述瞭如何手動為 MySQL 安裝方法初始化資料目錄,其中資料目錄初始化不是自動的。有一些建議的命令可用於測試伺服器是否可訪問和正常工作,請參見第 2.9.3 節,“測試伺服器”。

注意

在 MySQL 8.0 中,預設身份驗證外掛已從mysql_native_password更改為caching_sha2_password,並且'root'@'localhost'管理帳戶預設使用caching_sha2_password。如果您希望root帳戶使用先前的預設身份驗證外掛(mysql_native_password),請參見 caching_sha2_password 和 root 管理帳戶。

  • 資料目錄初始化概述

  • 資料目錄初始化過程

  • 資料目錄初始化期間的伺服器操作

  • 初始化後的 root 密碼分配

資料目錄初始化概述

在這裡顯示的示例中,伺服器旨在在mysql登入帳戶的使用者 ID 下執行。如果該帳戶不存在,請建立該帳戶(參見建立 mysql 使用者和組),或者替換您計劃用於執行伺服器的不同現有登入帳戶的名稱。

  1. 將位置更改為 MySQL 安裝的頂級目錄,通常為/usr/local/mysql(根據需要調整系統的路徑名):

    cd /usr/local/mysql
    

    在此目錄中,您可以找到幾個檔案和子目錄,包括包含伺服器以及客戶端和實用程式程式的bin子目錄。

  2. secure_file_priv系統變數限制匯入和匯出操作到特定目錄。建立一個目錄,其位置可以指定為該變數的值:

    mkdir mysql-files
    

    將目錄的使用者和組所有權授予mysql使用者和mysql組,並適當設定目錄許可權:

    chown mysql:mysql mysql-files
    chmod 750 mysql-files
    
  3. 使用伺服器初始化資料目錄,包括包含初始 MySQL 授權表的mysql模式,這些表確定使用者如何連線到伺服器。例如:

    bin/mysqld --initialize --user=mysql
    

    對於命令的重要資訊,特別是關於您可能使用的命令選項,請參閱資料目錄初始化過程。有關伺服器執行初始化的詳細資訊,請參閱資料目錄初始化期間的伺服器操作。

    通常,只有在首次安裝 MySQL 後才需要進行資料目錄初始化。(對於現有安裝的升級,請執行升級過程;請參閱第三章,升級 MySQL。)但是,初始化資料目錄的命令不會覆蓋任何現有的mysql模式表,因此在任何情況下執行都是安全的。

  4. 如果您希望部署具有自動支援安全連線的伺服器,請使用mysql_ssl_rsa_setup實用程式建立預設的 SSL 和 RSA 檔案:

    bin/mysql_ssl_rsa_setup
    

    欲瞭解更多資訊,請參閱 6.4.3 節,“mysql_ssl_rsa_setup — 建立 SSL/RSA 檔案”。

    注意

    mysql_ssl_rsa_setup實用程式已在 MySQL 8.0.34 中棄用。

  5. 在沒有任何選項檔案的情況下,伺服器將使用預設設定啟動。(請參閱 7.1.2 節,“伺服器配置預設值”。)要明確指定 MySQL 伺服器在啟動時應使用的選項,請將它們放在選項檔案中,例如/etc/my.cnf/etc/mysql/my.cnf。(請參閱 6.2.2.2 節,“使用選項檔案”。)例如,您可以使用選項檔案設定secure_file_priv系統變數。

  6. 要安排 MySQL 在系統啟動時無需手動干預即可啟動,請參閱第 2.9.5 節“自動啟動和停止 MySQL”。

  7. 資料目錄初始化在mysql模式中建立時區表,但不填充它們。要執行此操作,請使用第 7.1.15 節“MySQL 伺服器時區支援”中的說明。

資料目錄初始化過程

切換到 MySQL 安裝的頂級目錄,通常為/usr/local/mysql(根據需要調整系統的路徑名):

cd /usr/local/mysql

要初始化資料目錄,請使用--initialize--initialize-insecure選項呼叫mysqld,具體取決於您是否希望伺服器為'root'@'localhost'帳戶生成一個隨機初始密碼,或者建立該帳戶而不設定密碼:

  • 使用--initialize進行“預設安全”安裝(包括生成隨機初始root密碼)。在這種情況下,密碼被標記為過期,您必須選擇一個新密碼。

  • 使用--initialize-insecure,不會生成root密碼。這是不安全的;假定您打算在將伺服器��入生產使用之前及時為該帳戶分配密碼。

要了解如何分配新的'root'@'localhost'密碼,請參閱資料目錄初始化後的 root 密碼分配。

注意

伺服器將任何訊息(包括任何初始密碼)寫入其標準錯誤輸出。如果您在螢幕上看不到訊息,請檢視錯誤日誌。有關錯誤日誌的資訊,包括其位置,請參閱第 7.4.2 節“錯誤日誌”。

在 Windows 上,使用--console選項將訊息重定向到控制檯。

在 Unix 和類 Unix 系統上,資料庫目錄和檔案的所有權歸mysql登入帳戶所有,以便在以後執行時伺服器可以讀取和寫入這些檔案。為了確保這一點,從系統root帳戶啟動mysqld,幷包括如下所示的--user選項:

bin/mysqld --initialize --user=mysql
bin/mysqld --initialize-insecure --user=mysql

或者,以mysql身份登入時執行mysqld,在這種情況下,您可以從命令中省略--user選項。

在 Windows 上,使用以下命令之一:

bin\mysqld --initialize --console
bin\mysqld --initialize-insecure --console

注意

如果缺少必需的系統庫,資料目錄初始化可能會失敗。例如,您可能會看到類似於以下錯誤:

bin/mysqld: error while loading shared libraries:
libnuma.so.1: cannot open shared object file:
No such file or directory

如果發生這種情況,您必須手動安裝缺失的庫或使用系統的軟體包管理器。然後重試資料目錄初始化命令。

如果mysqld無法識別安裝目錄或資料目錄的正確位置,則可能需要指定其他選項,例如--basedir--datadir。例如(將命令輸入在一行上):

bin/mysqld --initialize --user=mysql
  --basedir=/opt/mysql/mysql
  --datadir=/opt/mysql/mysql/data

或者,將相關的選項設定放入一個選項檔案中,並將該檔案的名稱傳遞給mysqld。對於 Unix 和類 Unix 系統,假設選項檔名為/opt/mysql/mysql/etc/my.cnf。將以下內容放入檔案中:

[mysqld]
basedir=/opt/mysql/mysql
datadir=/opt/mysql/mysql/data

然後按照以下方式呼叫mysqld(將命令輸入在一行上,首先使用--defaults-file選項):

bin/mysqld --defaults-file=/opt/mysql/mysql/etc/my.cnf
  --initialize --user=mysql

在 Windows 上,假設C:\my.ini包含以下內容:

[mysqld]
basedir=C:\\Program Files\\MySQL\\MySQL Server 8.0
datadir=D:\\MySQLdata

然後按照以下方式呼叫mysqld(同樣,您應該將命令輸入在一行上,首先使用--defaults-file選項):

bin\mysqld --defaults-file=C:\my.ini
   --initialize --console

重要

在初始化資料目錄時,您不應指定除用於設定目錄位置的選項(如--basedir--datadir)以及如果需要的話--user選項之外的任何選項。在初始化後重新啟動 MySQL 伺服器時可以設定 MySQL 伺服器在正常使用期間要使用的選項。有關更多資訊,請參閱--initialize選項的描述。

資料目錄初始化期間伺服器執行的操作

注意

伺服器執行的資料目錄初始化序列不會替代mysql_secure_installationmysql_ssl_rsa_setup執行的操作。請參閱 Section 6.4.2, “mysql_secure_installation — Improve MySQL Installation Security”,以及 Section 6.4.3, “mysql_ssl_rsa_setup — Create SSL/RSA Files”。

當使用--initialize--initialize-insecure選項呼叫mysqld時,在資料目錄初始化序列期間執行以下操作:

  1. 伺服器檢查資料目錄的存在如下:

    • 如果不存在資料目錄,則伺服器將建立它。

    • 如果資料目錄存在但不為空(即包含檔案或子目錄),伺服器在生成錯誤訊息後退出:

      [ERROR] --initialize specified but the data directory exists. Aborting.
      

      在這種情況下,刪除或重新命名資料目錄,然後重試。

      如果現有資料目錄允許非空,但每個條目的名稱都以句點(.)開頭。

  2. 在資料目錄中,伺服器建立mysql系統模式及其表,包括資料字典表、授權表、時區表和伺服器端幫助表。請參閱 Section 7.3, “The mysql System Schema”。

  3. 伺服器初始化系統表空間和管理InnoDB表所需的相關資料結構。

    注意

    mysqld設定InnoDB系統表空間後,對錶空間特性的某些更改需要設定一個全新的例項。符合更改的包括系統表空間中第一個檔案的檔名和撤銷日誌的數量。如果不想使用預設值,請確保在執行mysqld之前在 MySQL 配置檔案中設定innodb_data_file_pathinnodb_log_file_size配置引數。還要確保根據需要指定其他影響InnoDB檔案建立和位置的引數,如innodb_data_home_dirinnodb_log_group_home_dir

    如果這些選項在您的配置檔案中,但該檔案不在 MySQL 預設讀取的位置,請在執行mysqld時使用--defaults-extra-file選項指定檔案位置。

  4. 伺服器建立一個'root'@'localhost'超級使用者賬戶和其他保留賬戶(參見第 8.2.9 節,“保留賬戶”)。一些保留賬戶被鎖定,不能被客戶端使用,但'root'@'localhost'用於管理目的,您應該為其分配一個密碼。

    關於'root'@'localhost'賬戶的密碼,伺服器的操作取決於您如何呼叫它:

    • 使用--initialize但不使用--initialize-insecure,伺服器生成一個隨機密碼,標記為過期,並顯示密碼的訊息:

      [Warning] A temporary password is generated for root@localhost:
      iTag*AfrH5ej
      
    • 使用--initialize-insecure(無論是否使用--initialize,因為--initialize-insecure隱含了--initialize),伺服器不生成密碼或標記為過期,並寫入警告訊息:

      [Warning] root@localhost is created with an empty password ! Please
      consider switching off the --initialize-insecure option.
      

    有關分配新的'root'@'localhost'密碼的說明,請參見初始化後的 root 密碼分配。

  5. 伺服器填充用於HELP語句的伺服器端幫助表(參見第 15.8.3 節,“HELP 語句”)。伺服器不填充時區表。要手動執行此操作,請參見第 7.1.15 節,“MySQL 伺服器時區支援”。

  6. 如果init_file系統變數指定了一個包含 SQL 語句的檔案,伺服器將執行檔案中的語句。此選項使您能夠執行自定義引導序列。

    當伺服器以引導模式執行時,某些功能不可用,限制了檔案中允許的語句。這些包括與賬戶管理相關的語句(如CREATE USERGRANT)、複製和全域性事務識別符號。

  7. 伺服器退出。

初始化後的 root 密碼分配

在使用--initialize--initialize-insecure啟動伺服器初始化資料目錄後,正常啟動伺服器(即,不使用這兩個選項之一)併為'root'@'localhost'賬戶分配一個新密碼:

  1. 啟動伺服器。有關說明,請參見第 2.9.2 節,“啟動伺服器”。

  2. 連線到伺服器:

    • 如果您使用了--initialize但沒有使用--initialize-insecure來初始化資料目錄,請以root身份連線到伺服器:

      mysql -u root -p
      

      然後,在密碼提示符處,輸入伺服器在初始化序列期間生成的隨機密碼:

      Enter password: *(enter the random root password here)*
      

      如果您不知道此密碼,請檢視伺服器錯誤日誌。

    • 如果您使用了--initialize-insecure來初始化資料目錄,請以無密碼的root身份連線到伺服器:

      mysql -u root --skip-password
      
  3. 連線後,使用ALTER USER語句分配一個新的root密碼:

    ALTER USER 'root'@'localhost' IDENTIFIED BY '*root-password'*;
    

請參閱 第 2.9.4 節,“保護初始 MySQL 帳戶”。

注意

嘗試連線到主機127.0.0.1通常會解析為localhost帳戶。但是,如果伺服器啟用了skip_name_resolve,則會失敗。如果您打算這樣做,請確儲存在一個可以接受連線的帳戶。例如,要能夠使用--host=127.0.0.1--host=::1連線為root,請建立這些帳戶:

CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '*root-password*';
CREATE USER 'root'@'::1' IDENTIFIED BY '*root-password*';

可以將這些語句放在一個檔案中,透過init_file系統變數執行,如資料目錄初始化期間的伺服器操作中所討論的那樣。

2.9.2 啟動伺服器

原文:dev.mysql.com/doc/refman/8.0/en/starting-server.html

2.9.2.1 啟動 MySQL 伺服器時出現問題的故障排除

本節描述瞭如何在 Unix 和類 Unix 系統上啟動伺服器。(對於 Windows,請參閱 Section 2.3.4.5, “首次啟動伺服器”。)有關一些建議的命令,您可以使用這些命令來測試伺服器是否可訪問並正常工作,請參閱 Section 2.9.3, “測試伺服器”。

如果您的安裝包含mysqld_safe,請像這樣啟動 MySQL 伺服器:

$> bin/mysqld_safe --user=mysql &

注意

對於安裝了 MySQL 的 Linux 系統,使用 RPM 包,伺服器的啟動和關閉是透過 systemd 管理的,而不是透過mysqld_safe,並且mysqld_safe未安裝。請參閱 Section 2.5.9, “使用 systemd 管理 MySQL 伺服器”。

如果您的安裝包含 systemd 支援,請像這樣啟動伺服器:

$> systemctl start mysqld

如果服務名稱與 mysqld 不同,請替換為適當的服務名稱(例如,在 SLES 系統上為 mysql)。

MySQL 伺服器必須使用非特權(非root)登入帳戶執行非常重要。為了確保這一點,請以 root 身份執行mysqld_safe,幷包含如下所示的 --user 選項。否則,您應該以 mysql 登入後執行該程式,這種情況下,您可以在命令中省略 --user 選項。

有關以非特權使用者身份執行 MySQL 的進一步說明,請參閱 Section 8.1.5, “如何以普通使用者身份執行 MySQL”。

如果命令立即失敗並列印 mysqld ended,請檢視錯誤日誌中的資訊(預設情況下是資料��錄中的 *host_name*.err 檔案)。

如果伺服器無法訪問資料目錄,啟動或讀取 mysql 模式中的授權表,它會在錯誤日誌中寫入一條訊息。如果您在繼續此步驟之前忽略了透過初始化資料目錄建立授權表,或者如果您在執行初始化資料目錄的命令時沒有使用 --user 選項,可能會出現此類問題。刪除 data 目錄並使用 --user 選項執行該命令。

如果您在啟動伺服器時遇到其他問題,請參見第 2.9.2.1 節,“啟動 MySQL 伺服器時出現問題的故障排除”。有關mysqld_safe的更多資訊,請參見第 6.3.2 節,“mysqld_safe — MySQL 伺服器啟動指令碼”。有關 systemd 支援的更多資訊,請參見第 2.5.9 節,“使用 systemd 管理 MySQL 伺服器”。

原文:dev.mysql.com/doc/refman/8.0/en/starting-server-troubleshooting.html

2.9.2.1 啟動 MySQL 伺服器時出現問題的故障排除

本節提供了有關啟動伺服器時出現問題的故障排除建議。有關 Windows 系統的其他建議,請參閱第 2.3.5 節,“解決 Microsoft Windows MySQL 伺服器安裝問題”。

如果您在啟動伺服器時遇到問題,請嘗試以下方法:

  • 檢查錯誤日誌以檢視伺服器為何無法啟動。日誌檔案位於資料目錄中(在 Windows 上通常為C:\Program Files\MySQL\MySQL Server 8.0\data,對於 Unix/Linux 二進位制分發為/usr/local/mysql/data,對於 Unix/Linux 原始碼分發為/usr/local/var)。在資料目錄中查詢名稱形式為*host_name*.err*host_name*.log的檔案,其中host_name是您伺服器主機的名稱。然後檢查這些檔案的最後幾行。使用tail命令顯示它們:

    $> tail *host_name*.err
    $> tail *host_name*.log
    
  • 指定儲存引擎所需的任何特殊選項。您可以建立一個my.cnf檔案,併為您計劃使用的引擎指定啟動選項。如果您要使用支援事務表的儲存引擎(InnoDBNDB),請確保在啟動伺服器之前將它們配置為您想要的方式。如果您使用InnoDB表,請參閱第 17.8 節,“InnoDB 配置”以獲取指南,以及第 17.14 節,“InnoDB 啟動選項和系統變數”以獲取選項語法。

    儘管儲存引擎對您省略的選項使用預設值,但 Oracle 建議您檢視可用選項,併為任何預設值不適合您安裝的選項指定顯式值。

  • 確保伺服器知道在哪裡找到資料目錄。mysqld伺服器將此目錄用作其當前目錄。這是它期望找到資料庫並寫入日誌檔案的地方。伺服器還會在資料目錄中寫入 pid(程序 ID)檔案。

    預設資料目錄位置在伺服器編譯時被硬編碼。要確定預設路徑設定是什麼,使用帶有--verbose--help選項呼叫mysqld。如果資料目錄位於系統的其他位置,請使用--datadir選項指定該位置給mysqldmysqld_safe,在命令列或選項檔案中。否則,伺服器將無法正常工作。作為--datadir選項的替代方案,您可以使用--basedir指定 MySQL 安裝的基本目錄的位置給mysqld,然後mysqld在那裡查詢data目錄。

    要檢查指定路徑選項的效果,請使用這些選項呼叫mysqld,然後跟隨--verbose--help選項。例如,如果將位置更改為安裝mysqld��目錄,然後執行以下命令,它會顯示使用基本目錄/usr/local啟動伺服器的效果:

    $> ./mysqld --basedir=/usr/local --verbose --help
    

    你可以指定其他選項,比如--datadir,但--verbose--help必須是最後的選項。

    一旦確定了所需的路徑設定,啟動伺服器時不要帶--verbose--help

    如果mysqld當前正在執行,可以透過執行以下命令查詢它正在使用的路徑設定:

    $> mysqladmin variables
    

    或者:

    $> mysqladmin -h *host_name* variables
    

    host_name是 MySQL 伺服器主機的名稱。

  • 確保伺服器可以訪問 data directory。資料目錄及其內容的所有權和許可權必須允許伺服器讀取和修改它們。

    如果在啟動mysqld時遇到Errcode 13(表示Permission denied),這意味著資料目錄或其內容的許可權不允許伺服器訪問。在這種情況下,您需要更改相關檔案和目錄的許可權,以便伺服器有權使用它們。您也可以以root使用者身份啟動伺服器,但這會帶來安全問題,應該避免。

    切換到資料目錄並檢查資料目錄及其內容的所有權,以確保伺服器有訪問許可權。例如,如果資料目錄是/usr/local/mysql/var,使用以下命令:

    $> ls -la /usr/local/mysql/var
    

    如果資料目錄或其檔案或子目錄的所有權不屬於您用於執行伺服器的登入帳��,請將它們的所有權更改為該帳戶。如果帳戶名為mysql,請使用以下命令:

    $> chown -R mysql /usr/local/mysql/var
    $> chgrp -R mysql /usr/local/mysql/var
    

    即使擁有正確的所有權,如果系統上執行了其他安全軟體來管理應用程式對檔案系統各部分的訪問,MySQL 可能無法啟動。在這種情況下,重新配置該軟體以允許mysqld訪問其在正常操作期間使用的目錄。

  • 驗證伺服器要使用的網路介面是否可用。

    如果出現以下任一錯誤,則表示可能有其他程式(也許是另一個mysqld伺服器)正在使用mysqld嘗試使用的 TCP/IP 埠或 Unix 套接字檔案:

    Can't start server: Bind on TCP/IP port: Address already in use
    Can't start server: Bind on unix socket...
    

    使用ps來確定是否有另一個mysqld伺服器正在執行。如果是,請在再次啟動mysqld之前關閉伺服器。(如果有其他伺服器在執行,並且您確實想要執行多個伺服器,您可以在第 7.8 節,“在一臺機器上執行多個 MySQL 例項”中找到如何操作的資訊。)

    如果沒有其他伺服器在執行,請執行命令telnet *your_host_name* *tcp_ip_port_number*。(預設的 MySQL 埠號是 3306。)然後按下幾次Enter鍵。如果你沒有收到類似telnet: Unable to connect to remote host: Connection refused的錯誤訊息,那麼可能是其他程式正在使用mysqld嘗試使用的 TCP/IP 埠。找出是哪個程式在使用,並禁用它,或者告訴mysqld使用不同的埠監聽,使用--port選項。在這種情況下,當使用 TCP/IP 連線到伺服器時,客戶端程式指定相同的非預設埠號。

    另一個埠無法訪問的原因可能是您的防火牆阻止對其的連線。如果是這樣,請修改防火牆設定以允許訪問該埠。

    如果伺服器啟動但無法連線,請確保您在/etc/hosts中有類似以下內容的條目:

    127.0.0.1       localhost
    
  • 如果無法啟動mysqld,嘗試使用--debug選項建立一個跟蹤檔案以查詢問題。參見第 7.9.4 節,“DBUG 包”。

2.9.3 測試伺服器

原文:dev.mysql.com/doc/refman/8.0/en/testing-server.html

在資料目錄初始化並啟動伺服器後,執行一些簡單的測試以確保其正常工作。本節假定您當前的位置是 MySQL 安裝目錄,並且其中包含一個包含此處使用的 MySQL 程式的 bin 子目錄。如果不是這樣,請相應調整命令路徑名稱。

或者,將 bin 目錄新增到您的 PATH 環境變數設定中。這樣可以使您的 shell(命令直譯器)正確找到 MySQL 程式,從而可以透過僅輸入程式名稱而不是路徑名稱來執行程式。參見 6.2.9 節“設定環境變數”。

使用 mysqladmin 來驗證伺服器是否正在執行。以下命令提供了簡單的測試,以檢查伺服器是否正在執行並響應連線:

$> bin/mysqladmin version
$> bin/mysqladmin variables

如果無法連線到伺服器,請指定 -u root 選項以連線為 root。如果您已經為 root 賬戶分配了密碼,還需要在命令列中指定 -p 並在提示時輸入密碼。例如:

$> bin/mysqladmin -u root -p version
Enter password: *(enter root password here)*

mysqladmin version 的輸出會根據您的平臺和 MySQL 版本略有不同,但應該類似於這裡顯示的內容:

$> bin/mysqladmin version
mysqladmin  Ver 14.12 Distrib 8.0.36, for pc-linux-gnu on i686
...

Server version          8.0.36
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/lib/mysql/mysql.sock
Uptime:                 14 days 5 hours 5 min 21 sec

Threads: 1  Questions: 366  Slow queries: 0
Opens: 0  Flush tables: 1  Open tables: 19
Queries per second avg: 0.000

要檢視您可以使用 mysqladmin 進行的其他���作,請使用 --help 選項呼叫它。

驗證您可以關閉伺服器(如果 root 賬戶已經有密碼,請包括 -p 選項):

$> bin/mysqladmin -u root shutdown

驗證您可以再次啟動伺服器。可以透過使用 mysqld_safe 或直接呼叫 mysqld 來執行此操作。例如:

$> bin/mysqld_safe --user=mysql &

如果 mysqld_safe 失敗,請參閱 2.9.2.1 節“啟動 MySQL 伺服器時出現問題的故障排除”。

執行一些簡單的測試,以驗證您可以從伺服器檢索資訊。輸出應類似於此處顯示的內容。

使用 mysqlshow 檢視存在哪些資料庫:

$> bin/mysqlshow
+--------------------+
|     Databases      |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

安裝的資料庫列表可能有所不同,但始終包括至少 mysqlinformation_schema

如果您指定了資料庫名稱,mysqlshow 將顯示資料庫中的表列表:

$> bin/mysqlshow mysql
Database: mysql
+---------------------------+
|          Tables           |
+---------------------------+
| columns_priv              |
| component                 |
| db                        |
| default_roles             |
| engine_cost               |
| func                      |
| general_log               |
| global_grants             |
| gtid_executed             |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| password_history          |
| plugin                    |
| procs_priv                |
| proxies_priv              |
| role_edges                |
| server_cost               |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+

使用mysql程式從mysql模式中的表中選擇資訊:

$> bin/mysql -e "SELECT User, Host, plugin FROM mysql.user" mysql
+------+-----------+-----------------------+
| User | Host      | plugin                |
+------+-----------+-----------------------+
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+

此時,您的伺服器正在執行,您可以訪問它。如果您尚未為初始帳戶分配密碼,請按照 Section 2.9.4, “Securing the Initial MySQL Account”中的說明加強安全性。

關於mysqlmysqladminmysqlshow的更多資訊,請參見 Section 6.5.1, “mysql — The MySQL Command-Line Client”,Section 6.5.2, “mysqladmin — A MySQL Server Administration Program”和 Section 6.5.7, “mysqlshow — Display Database, Table, and Column Information”。

2.9.4 保護初始 MySQL 帳戶

原文:dev.mysql.com/doc/refman/8.0/en/default-privileges.html

MySQL 安裝過程涉及初始化資料目錄,包括在mysql系統模式中定義 MySQL 帳戶的授權表。有關詳細資訊,請參見第 2.9.1 節,“初始化資料目錄”。

本節描述如何為在 MySQL 安裝過程中建立的初始root帳戶分配密碼,如果您尚未這樣做。

注意

執行本節描述的過程的替代方法:

  • 在 Windows 上,您可以在安裝過程中使用 MySQL Installer 執行該過程(參見第 2.3.3 節,“Windows 上的 MySQL Installer”)。

  • 在所有平臺上,MySQL 發行版包括mysql_secure_installation,一個命令列實用程式,自動化了大部分保護 MySQL 安裝過程的過程。

  • 在所有平臺上,MySQL Workbench 可用,並提供管理使用者帳戶的功能(參見第三十三章,MySQL Workbench)。

在以下情況下,初始帳戶可能已經分配了密碼:

  • 在 Windows 上,使用 MySQL Installer 執行的安裝會讓您選擇分配密碼。

  • 使用 macOS 安裝程式進行安裝會生成一個初始的隨機密碼,並在對話方塊中向使用者顯示。

  • 使用 RPM 軟體包進行安裝會生成一個初始的隨機密碼,並寫入伺服器錯誤日誌。

  • 使用 Debian 軟體包進行安裝會讓您選擇分配密碼。

  • 對於手動執行資料目錄初始化的情況,使用mysqld --initializemysqld會生成一個初始的隨機密碼,標記為過期,並寫入伺服器錯誤日誌。參見第 2.9.1 節,“初始化資料目錄”。

mysql.user授權表定義了初始的 MySQL 使用者帳戶及其訪問許可權。MySQL 的安裝僅建立一個具有所有許可權並可以執行任何操作的'root'@'localhost'超級使用者帳戶。如果root帳戶沒有密碼,您的 MySQL 安裝是不受保護的:任何人都可以連線到 MySQL 伺服器作為root無需密碼並被授予所有許可權。

'root'@'localhost'賬戶還在mysql.proxies_priv表中有一行,允許為''@''(即所有使用者和所有主機)授予PROXY許可權。這使root能夠設定代理使用者,以及委派其他賬戶設定代理使用者的許可權。參見 Section 8.2.19, “Proxy Users”。

要為初始的 MySQL root賬戶分配密碼,請使用以下程式。在示例中用你想要使用的密碼替換root-password

如果伺服器未執行,請啟動伺服器。有關說明,請參見 Section 2.9.2, “Starting the Server”。

初始的root賬戶可能有密碼,也可能沒有。選擇以下適用的任一程式:

  • 如果root賬戶存在並且初始的隨機密碼已過期,請使用該密碼連線到伺服器作為root,然後選擇一個新密碼。如果資料目錄是使用mysqld --initialize初始化的,無論是手動還是使用安裝程式,在安裝操作期間沒有指定密碼選項。因為密碼存在,你必須使用它連線到伺服器。但因為密碼已過期,你不能將該賬戶用於除選擇新密碼之外的任何目的,直到你選擇一個新密碼。

    1. 如果你不知道初始的隨機密碼,檢視伺服器錯誤日誌。

    2. 使用密碼連線到伺服器作為root

      $> mysql -u root -p
      Enter password: *(enter the random root password here)*
      
    3. 選擇一個新密碼以替換隨機密碼:

      mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '*root-password*';
      
  • 如果root賬戶存在但沒有密碼,請使用無密碼連線到伺服器作為root,然後分配一個密碼。如果你使用mysqld --initialize-insecure初始化資料目錄,則是這種情況。

    1. 使用無密碼連線到伺服器作為root

      $> mysql -u root --skip-password
      
    2. 分配密碼:

      mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '*root-password*';
      

root賬戶分配密碼後,每次使用該賬戶連線到伺服器時,都必須提供該密碼。例如,要使用mysql客戶端連線到伺服器,請使用此命令:

$> mysql -u root -p
Enter password: *(enter root password here)*

要使用mysqladmin關閉伺服器,請使用此命令:

$> mysqladmin -u root -p shutdown
Enter password: *(enter root password here)*

注意

有關設定密碼的更多資訊,請參見 Section 8.2.14, “Assigning Account Passwords”。如果設定後忘記了root密碼,請參見 Section B.3.3.2, “How to Reset the Root Password”。

要設定額外的賬戶,請參見 Section 8.2.8, “Adding Accounts, Assigning Privileges, and Dropping Accounts”。

2.9.5 自動啟動和停止 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/automatic-start.html

本節討論了啟動和停止 MySQL 伺服器的方法。

通常,您可以透過以下方式之一啟動mysqld伺服器:

  • 直接呼叫mysqld。這在任何平臺上都適用。

  • 在 Windows 上,您可以設定一個 MySQL 服務,該服務在 Windows 啟動時自動執行。請參閱 Section 2.3.4.8, “Starting MySQL as a Windows Service”。

  • 在 Unix 和類 Unix 系統上,您可以呼叫mysqld_safe,它會嘗試確定mysqld的正確選項,然後使用這些選項執行它。請參閱 Section 6.3.2, “mysqld_safe — MySQL Server Startup Script”。

  • 在支援 systemd 的 Linux 系統上,您可以使用它來控制伺服器。請參閱 Section 2.5.9, “Managing MySQL Server with systemd”。

  • 在使用 System V 風格執行目錄(即 /etc/init.d 和特定執行級別目錄)的系統上,呼叫mysql.server。該指令碼主要用於系統啟動和關閉。它通常以 mysql 的名稱安裝。mysql.server指令碼透過呼叫mysqld_safe來啟動伺服器。請參閱 Section 6.3.3, “mysql.server — MySQL Server Startup Script”。

  • 在 macOS 上,安裝一個 launchd 守護程式以在系統啟動時啟用自動 MySQL 啟動。該守護程式透過呼叫mysqld_safe來啟動伺服器。詳情請參閱 Section 2.4.3, “Installing and Using the MySQL Launch Daemon”。MySQL 首選項皮膚還提供了透過系統偏好設定啟動和停止 MySQL 的控制。請參閱 Section 2.4.4, “Installing and Using the MySQL Preference Pane”。

  • 在 Solaris 上,使用服務管理框架(SMF)系統來啟動和控制 MySQL 啟動。

systemd,mysqld_safemysql.server 指令碼,Solaris SMF,以及 macOS 啟動項(或 MySQL 首選項皮膚)可用於手動啟動伺服器,或在系統啟動時自動啟動。systemd,mysql.server 和啟動項也可用於停止伺服器。

以下表顯示伺服器和啟動指令碼從選項檔案中讀取的選項組。

表 2.15 MySQL 啟動指令碼和支援的伺服器選項組

指令碼 選項組
mysqld [mysqld], [server], [mysqld-*major_version*]
mysqld_safe [mysqld], [server], [mysqld_safe]
mysql.server [mysqld], [mysql.server], [server]

[mysqld-*major_version*] 意味著像 [mysqld-5.7][mysqld-8.0] 這樣的名稱組將被版本為 5.7.x、8.0.x 等的伺服器讀取。此功能可用於指定僅可由給定釋出系列內的伺服器讀取的選項。

為了向後相容,mysql.server 還會讀取 [mysql_server] 組,而 mysqld_safe 也會讀取 [safe_mysqld] 組。為了保持最新,您應該更新您的選項檔案以使用 [mysql.server][mysqld_safe] 組。

有關 MySQL 配置檔案及其結構和內容的更多資訊,請參見 Section 6.2.2.2, “使用選項檔案”。

2.10 Perl 安裝注意事項

原文:dev.mysql.com/doc/refman/8.0/en/perl-support.html

2.10.1 在 Unix 上安裝 Perl

2.10.2 在 Windows 上安裝 ActiveState Perl

2.10.3 使用 Perl DBI/DBD 介面時出現的問題

Perl DBI 模組提供了一個通用的資料庫訪問介面。您可以編寫一個適用於許多不同資料庫引擎的 DBI 指令碼,而無需更改。要使用 DBI,您必須安裝 DBI 模組,以及每種型別的資料庫伺服器的 DataBase Driver (DBD) 模組。對於 MySQL,這個驅動程式是 DBD::mysql 模組。

注意

MySQL 發行版不包含 Perl 支援。您可以從search.cpan.org獲取必要的模組,Unix 系統可以使用 ActiveState ppm程式在 Windows 上獲取。以下部分描述瞭如何執行此操作。

DBI/DBD 介面需要 Perl 5.6.0,最好使用 5.6.1 或更高版本。如果您使用較舊版本的 Perl,DBI 無法工作。您應該使用DBD::mysql 4.009 或更高版本。儘管早期版本可用,但它們不支援 MySQL 8.0 的全部功能。

2.10.1 在 Unix 上安裝 Perl

原文:dev.mysql.com/doc/refman/8.0/en/perl-installation.html

MySQL Perl 支援要求您已安裝了 MySQL 客戶端程式設計支援(庫和標頭檔案)。大多數安裝方法都會安裝必要的檔案。如果您在 Linux 上從 RPM 檔案安裝 MySQL,請確保也安裝了開發者 RPM。客戶端程式在客戶端 RPM 中,但客戶端程式設計支援在開發者 RPM 中。

您需要用於 Perl 支援的檔案可以從 CPAN(Comprehensive Perl Archive Network)獲取,網址為search.cpan.org

在 Unix 上安裝 Perl 模組的最簡單方法是使用CPAN模組。例如:

$> perl -MCPAN -e shell
cpan> install DBI
cpan> install DBD::mysql

DBD::mysql安裝執行了一系列測試。這些測試嘗試使用預設使用者名稱和密碼連線到本地 MySQL 伺服器。(預設使用者名稱是 Unix 上的登入名,Windows 上是ODBC。預設密碼是“no password”。)如果您無法使用這些值連線到伺服器(例如,如果您的帳戶有密碼),測試將失敗。您可以使用force install DBD::mysql來忽略失敗的測試。

DBI需要Data::Dumper模組。如果沒有安裝,您應該在安裝DBI之前安裝它。

也可以以壓縮的tar存檔形式下載模組分發,並手動構建模組。例如,要解壓和構建一個 DBI 分發,可以使用以下過程:

  1. 解壓分發到當前目錄:

    $> gunzip < DBI-*VERSION*.tar.gz | tar xvf -
    

    這個命令會建立一個名為DBI-*VERSION*的目錄。

  2. 將位置更改為解壓分發的頂級目錄:

    $> cd DBI-*VERSION*
    
  3. 構建分發並編譯所有內容:

    $> perl Makefile.PL
    $> make
    $> make test
    $> make install
    

make test命令很重要,因為它驗證模組是否正常工作。請注意,在DBD::mysql安裝期間執行該命令以執行介面程式碼時,MySQL 伺服器必須正在執行,否則測試將失敗。

重新構建和重新安裝DBD::mysql分發是一個好主意,每當你安裝新版本的 MySQL 時。這確保了最新版本的 MySQL 客戶端庫被正確安裝。

如果您沒有許可權在系統目錄中安裝 Perl 模組,或者想要安裝本地 Perl 模組,下面的參考可能會有用:learn.perl.org/faq/perlfaq8.html#How-do-I-keep-my-own-module-library-directory-

2.10.2 在 Windows 上安裝 ActiveState Perl

原文:dev.mysql.com/doc/refman/8.0/en/activestate-perl.html

在 Windows 上,您應該按照以下步驟使用 ActiveState Perl 安裝 MySQL DBD模組:

  1. www.activestate.com/Products/ActivePerl/獲取 ActiveState Perl 並安裝。

  2. 開啟控制檯視窗。

  3. 如果需要,設定HTTP_proxy變數。例如,您可以嘗試這樣的設定:

    C:\> set HTTP_proxy=my.proxy.com:3128
    
  4. 啟動 PPM 程式:

    C:\> C:\perl\bin\ppm.pl
    
  5. 如果之前沒有安裝過,安裝DBI

    ppm> install DBI
    
  6. 如果成功,執行以下命令:

    ppm> install DBD-mysql
    

這個步驟適用於 ActiveState Perl 5.6 或更高版本。

如果無法使該步驟生效,應安裝 ODBC 驅動程式,然後透過 ODBC 連線到 MySQL 伺服器:

use DBI;
$dbh= DBI->connect("DBI:ODBC:$dsn",$user,$password) ||
  die "Got error $DBI::errstr when connecting to $dsn\n";

2.10.3 使用 Perl DBI/DBD 介面時的問題

原文:dev.mysql.com/doc/refman/8.0/en/perl-support-problems.html

如果 Perl 報告找不到../mysql/mysql.so模組,則問題可能是 Perl 找不到libmysqlclient.so共享庫的位置。您可以透過以下方法之一解決此問題:

  • libmysqlclient.so複製到其他共享庫所在的目錄(可能是/usr/lib/lib)。

  • 修改用於編譯DBD::mysql-L選項,以反映libmysqlclient.so的實際位置。

  • 在 Linux 上,您可以將包含libmysqlclient.so的目錄路徑新增到/etc/ld.so.conf檔案中。

  • 將包含libmysqlclient.so的目錄路徑新增到LD_RUN_PATH環境變數中。一些系統使用LD_LIBRARY_PATH代替。

請注意,如果連結器無法找到其他庫,則可能還需要修改-L選項。例如,如果連結器無法找到libc,因為它在/lib中,而連結命令指定為-L/usr/lib,請將-L選項更改為-L/lib或將-L/lib新增到現有連結命令中。

如果從DBD::mysql獲得以下錯誤,則您可能正在使用gcc(或使用用gcc編譯的舊二進位制檔案):

/usr/bin/perl: can't resolve symbol '__moddi3'
/usr/bin/perl: can't resolve symbol '__divdi3'

在構建mysql.so庫時(編譯 Perl 客戶端時,請檢查make的輸出以檢視mysql.so),在連結命令中新增-L/usr/lib/gcc-lib/... -lgcc-L選項應指定系統上包含libgcc.a的目錄路徑。

此問題的另一個原因可能是 Perl 和 MySQL 都未使用gcc編譯。在這種情況下,您可以透過使用gcc編譯兩者來解決不匹配問題。

第三章 升級 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/upgrading.html

目錄

3.1 開始之前

3.2 升級路徑

3.3 升級最佳實踐

3.4 MySQL 升級過程升級了什麼

3.5 MySQL 8.0 中的更改

3.6 準備升級安裝

3.7 在 Unix/Linux 上升級 MySQL 二進位制或基於包的安裝

3.8 使用 MySQL Yum 儲存庫升級 MySQL

3.9 使用 MySQL APT 儲存庫升級 MySQL

3.10 使用 MySQL SLES 儲存庫升級 MySQL

3.11 在 Windows 上升級 MySQL

3.12 升級 MySQL 的 Docker 安裝

3.13 升級故障排除

3.14 重建或修復表或索引

3.15 將 MySQL 資料庫複製到另一臺機器

本章描述了升級 MySQL 安裝的步驟。

升級是一個常見的過程,因為您可以在相同的 MySQL 發行系列中獲取錯誤修復或在主要 MySQL 發行版之間獲取重要功能。您首先在一些測試系統上執行此過程,以確保一切順利執行,然後在生產系統上執行。

注意

在以下討論中,必須使用具有管理許可權的 MySQL 帳戶執行的 MySQL 命令包括在命令列中使用 -u root`` 指定 MySQL root 使用者。需要 root 密碼的命令還包括 -p 選項。因為 -p 後面沒有選項值,這些命令會提示輸入密碼。在提示時輸入密碼並按 Enter 鍵。

SQL 語句可以使用mysql命令列客戶端執行(以 root 身份連線以確保具有必要的許可權)。

3.1 開始之前

原文:dev.mysql.com/doc/refman/8.0/en/upgrade-before-you-begin.html

在升級之前,請檢視本節中的資訊。執行任何建議的操作。

  • 瞭解升級過程中可能發生的情況。請參見第 3.4 節,“MySQL 升級過程升級了什麼”。

  • 透過建立備份來保護您的資料。備份應包括包含 MySQL 資料字典表和系統表的mysql系統資料庫。參見第 9.2 節,“資料庫備份方法”。

    重要

    從 MySQL 8.0 降級到 MySQL 5.7,或從一個 MySQL 8.0 版本降級到以前的 MySQL 8.0 版本,不受支援。唯一支援的替代方法是恢復在升級之前進行的備份。因此,在開始升級過程之前,備份資料至關重要。

  • 檢視第 3.2 節,“升級路徑”以確保您打算的升級路徑得到支援。

  • 檢視第 3.5 節,“MySQL 8.0 中的更改”以瞭解升級前應注意的更改。某些更改可能需要採取行動。

  • 檢視第 1.3 節,“MySQL 8.0 中的新功能”以瞭解已棄用和移除的功能。如果您使用其中任何功能,則升級可能需要對這些功能進行更改。

  • 檢視第 1.4 節,“MySQL 8.0 中新增、棄用或移除的伺服器和狀態變數和選項”。如果您使用已棄用或移除的變數,則升級可能需要配置更改。

  • 檢視釋出說明以獲取有關修復、更改和新功能的資訊。

  • 如果您使用複製,請檢視第 19.5.3 節,“升級複製拓撲”。

  • 檢視第 3.3 節,“升級最佳實踐”並相應地進行計劃。

  • 升級過程因平臺和初始安裝方式而異。使用適用於當前 MySQL 安裝的過程:

    • 對於非 Windows 平臺上的二進位制和基於軟體包的安裝,請參考第 3.7 節,“在 Unix/Linux 上升級 MySQL 二進位制或基於軟體包的安裝”。

      注意

      對於支援的 Linux 發行版,升級基於軟體包的安裝的首選方法是使用 MySQL 軟體倉庫(MySQL Yum 倉庫,MySQL APT 倉庫和 MySQL SLES 倉庫)。

    • 對於在企業 Linux 平臺或 Fedora 上使用 MySQL Yum 倉庫進行安裝,請參考 第 3.8 節,“使用 MySQL Yum 倉庫升級 MySQL”。

    • 對於在 Ubuntu 上使用 MySQL APT 倉庫進行安裝,請參考 第 3.9 節,“使用 MySQL APT 倉庫升級 MySQL”。

    • 對於在 SLES 上使用 MySQL SLES 倉庫進行安裝,請參考 第 3.10 節,“使用 MySQL SLES 倉庫升級 MySQL”。

    • 對於使用 Docker 進行的安裝,請參考 第 3.12 節,“升級 Docker 安裝的 MySQL”。

    • 對於在 Windows 上安裝,請參考 第 3.11 節,“在 Windows 上升級 MySQL”。

  • 如果您的 MySQL 安裝包含大量資料,在原地升級後可能需要很長時間才能轉換,那麼建立一個用於評估所需轉換和執行工作量的測試例項可能會很有用。要建立一個測試例項,請複製包含 mysql 資料庫和其他資料庫但不包含資料的 MySQL 例項。在測試例項上執行升級過程,以評估執行實際資料轉換所需的工作量。

  • 重新構建和重新安裝 MySQL 語言介面是在安裝或升級到新版本的 MySQL 時建議的。這適用於 MySQL 介面,如 PHP mysql 擴充套件和 Perl DBD::mysql 模組。

3.2 升級路徑

原文:dev.mysql.com/doc/refman/8.0/en/upgrade-paths.html

  • 從 MySQL 5.7 升級到 8.0 是支援的。然而,升級僅在正式釋出(GA)版本之間支援。對於 MySQL 8.0,要求您從 MySQL 5.7 GA 版本(5.7.9 或更高版本)升級。不支援從 MySQL 5.7 的非 GA 版本升級。

  • 在升級到下一個版本之前,建議先升級到最新版本。例如,在升級到 MySQL 8.0 之前,先升級到最新的 MySQL 5.7 版本。

  • 不支援跳過版本的升級。例如,直接從 MySQL 5.6 升級到 8.0 是不支援的。

  • 一旦一個釋出系列達到正式釋出(GA)狀態,就支援在釋出系列內升級(從一個 GA 版本到另一個 GA 版本)。例如,從 MySQL 8.0.x 升級到 8.0.y 是支援的。(不支援涉及開發狀態非 GA 版本的升級。)跳過一個版本也是支援的。例如,從 MySQL 8.0.x 升級到 8.0.z 是支援的。MySQL 8.0.11 是 MySQL 8.0 釋出系列中的第一個 GA 狀態釋出。

3.3 升級最佳實踐

原文:dev.mysql.com/doc/refman/8.0/en/upgrade-best-practices.html

MySQL 支援在小版本之間升級(在 LTS 系列內)和到下一個主要版本(跨 LTS 系列)。升級提供最新功能、效能和安全修復。

為了準備並確保您對最新 MySQL 版本的升級成功,我們建議遵循以下最佳實踐:

  • 決定升級為主要版本還是次要版本

  • 決定升級型別

  • 審查支援的平臺

  • 瞭解 MySQL 伺服器變更

  • 執行升級檢查器並修復不相容性

  • 在測試環境中執行應用程式

  • 基準應用程式和工作負載效能

  • 並行執行兩個 MySQL 版本

  • 執行最終測試升級

  • 檢查 MySQL 備份

  • 升級生產伺服器

  • 企業支援

決定升級為主要版本還是次要版本

MySQL 釋出模型區分了 LTS(長期支援)和創新版本。 LTS 版本提供 8 年以上的支援,適用於生產環境。創新版本為使用者提供最新功能和能力。瞭解更多關於MySQL 釋出模型

執行小版本升級很簡單,而大版本升級需要在升級前進行戰略規劃和額外測試。這個指南對於大版本升級尤為有用。

決定升級型別

有三種主要的升級 MySQL 的方式,請閱讀相關文件以確定哪種升級方式最適合您的情況。

  • 原地升級:替換 MySQL 伺服器軟體包。

  • 邏輯升級:從舊的 MySQL 例項匯出 SQL 到新的例項。

  • 複製拓撲升級:考慮每個伺服器的拓撲角色。

檢視支援的平臺

如果您當前的作業系統不受新版本 MySQL 支援,則計劃升級作業系統,否則不支援就地升級。

有關當前支援的平臺列表,請參見:www.mysql.com/support/supportedplatforms/database.html

瞭解 MySQL 伺服器的更改

每個主要版本都帶來新功能、行為變化、棄用和移除。瞭解每個對現有應用程式的影響非常重要。

請參見:第 3.5 節,“MySQL 8.0 中的更改”。

執行升級檢查器並修復不相容性

MySQL Shell 的升級檢查器實用程式檢測資料庫版本之間必須在升級之前解決的不相容性。util.checkForServerUpgrade() 函式驗證 MySQL 伺服器例項是否準備好升級。連線到現有的 MySQL 伺服器,並選擇您計劃升級到的 MySQL 伺服器版本,以便實用程式報告在升級之前需要解決的問題。這些問題包括資料型別、儲存引擎等不相容性。

當升級檢查工具不再報告任何問題時,您就可以準備升級了。

在測試環境中執行應用程���

完成升級檢查器的要求後,接下來在新的目標 MySQL 伺服器上測試您的應用程式。檢查 MySQL 錯誤日誌和應用程式日誌中的錯誤和警告。

基準測試應用程式和工作負載效能

我們建議透過比較您的應用程式和工作負載在使用先前版本和新版本的 MySQL 時的效能來進行基準測試。通常,新版本的 MySQL 新增功能並提高效能,但也有可能升級後某些查詢執行速度較慢。可能導致效能回退的問題:

  • 先前的伺服器配置對於新版本不是最佳的

  • 資料型別的更改

  • 多位元組字符集支援需要額外的儲存空間

  • 儲存引擎更改

  • 刪除或更改的索引

  • 更強的加密

  • 更強的身份驗證

  • SQL 最佳化器的更改

  • 新版本的 MySQL 需要額外的記憶體

  • 物理或虛擬硬體較慢 - 計算或儲存

有關相關資訊和潛在的緩解技術,請參見有效效能迴歸。

並行執行兩個 MySQL 版本

為了最小化風險,在執行升級系統的同時最好保持當前系統執行。

執行最終測試升級

在升級生產伺服器之前進行練習和試執行。在升級生產系統之前徹底測試升級程式。

檢查 MySQL 備份

在執行升級之前,請檢查完整備份是否存在並可行。

升級生產伺服器

您已準備好完成升級。

企業支援

如果您是 MySQL 企業版客戶,您也可以聯絡 MySQL 支援團隊的專家以解決任何問題。

3.4 MySQL 升級過程升級的內容

原文:dev.mysql.com/doc/refman/8.0/en/upgrading-what-is-upgraded.html

安裝新版本的 MySQL 可能需要升級現有安裝的這些部分:

  • 包含 MySQL 伺服器執行所需資訊的表的 mysql 系統模式(請參閱 第 7.3 節,“mysql 系統模式”)。 mysql 模式表分為兩大類:

    • 儲存資料庫物件後設資料的資料字典表。

    • 系統表(即剩餘的非資料字典表),用於其他操作目的。

  • 其他模式,其中一些是內建的,可能被伺服器“擁有”,而另一些則不是:

    • performance_schema, INFORMATION_SCHEMA, ndbinfo, 和 sys 模式。

    • 使用者模式。

與可能需要升級的安裝部分相關聯的兩個不同版本號:

  • 資料字典版本。 這適用於資料字典表。

  • 伺服器版本,也稱為 MySQL 版本。 這適用於系統表和其他模式中的物件。

在這兩種情況下,現有 MySQL 安裝適用的實際版本儲存在資料字典中,當前期望的版本編譯到新版本的 MySQL 中。 當實際版本低於當前期望版本時,必須將與該版本相關聯的安裝部分升級到當前版本。 如果兩個版本都指示需要升級,則必須首先進行資料字典升級。

作為剛提到的兩個不同版本的反映,升級分為兩個步驟:

  • 步驟 1:資料字典升級。

    此步驟升級:

    • mysql 模式中的資料字典表。 如果實際資料字典版本低於當前期望版本,則伺服器會建立具有更新定義的資料字典表,將持久化的後設資料複製到新表中,原子性地用新表替換舊錶,並重新初始化資料字典。

    • 效能模式,INFORMATION_SCHEMAndbinfo

  • 步驟 2:伺服器升級。

    此步驟包括所有其他升級任務。 如果現有 MySQL 安裝的伺服器版本低於新安裝的 MySQL 版本,則必須升級其他所有內容:

    • mysql 模式中的系統表(剩餘的非資料字典表)。

    • sys 模式。

    • 使用者模式。

資料字典升級(步驟 1)是伺服器的責任,伺服器會在啟動時根據需要執行此任務,除非使用阻止其執行的選項。MySQL 8.0.16 中的選項是 --upgrade=NONE,MySQL 8.0.16 之前是 --no-dd-upgrade

如果資料字典過時但伺服器被阻止升級它,伺服器將不執行,並���錯退出。例如:

[ERROR] [MY-013381] [Server] Server shutting down because upgrade is
required, yet prohibited by the command line option '--upgrade=NONE'.
[ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.

MySQL 8.0.16 對步驟 2 的責任發生了一些變化:

  • 在 MySQL 8.0.16 之前,mysql_upgrade 升級效能模式、INFORMATION_SCHEMA 和步驟 2 中描述的物件。預期 DBA 在啟動伺服器後手動呼叫 mysql_upgrade

  • 從 MySQL 8.0.16 開始,伺服器執行以前由 mysql_upgrade 處理的所有任務。儘管升級仍然是一個兩步操作,但伺服器會執行這兩步,從而簡化了流程。

根據您要升級到的 MySQL 版本,在 原地升級 和 邏輯升級 中的說明指示伺服器是否執行所有升級任務,或者您必須在伺服器啟動後手動呼叫 mysql_upgrade

注意

因為伺服器在 MySQL 8.0.16 中升級了效能模式、INFORMATION_SCHEMA 和步驟 2 中描述的物件,所以 mysql_upgrade 不再需要,並且在該版本中已被棄用;預計在未來的 MySQL 版本中將其移除。

在 MySQL 8.0.16 之前和之後,步驟 2 中發生的大部分情況是相同的,儘管可能需要不同的命令選項來實現特定效果。

從 MySQL 8.0.16 開始,--upgrade 伺服器選項控制伺服器在啟動時是否以及如何執行自動升級:

  • 沒有選項或使用 --upgrade=AUTO,伺服器會升級任何被確定為過時的內容(步驟 1 和 2)。

  • 使用 --upgrade=NONE,伺服器不執行任何升級(跳過步驟 1 和 2),但如果資料字典必須升級,伺服器也會報錯退出。伺服器不允許使用過時的資料字典執行;伺服器要麼升級它,要麼退出。

  • 使用 --upgrade=MINIMAL,如果需要(步驟 1),伺服器將升級資料字典、效能模式和 INFORMATION_SCHEMA。請注意,使用此選項進行升級後,無法啟動組複製,因為複製內部依賴的系統表未更新,並且在其他領域也可能出現功能減少的情況。

  • 使用 --upgrade=FORCE,如果需要(步驟 1),伺服器將升級資料字典、效能模式和 INFORMATION_SCHEMA,並強制升級其他所有內容(步驟 2)。請注意,使用此選項可能會導致伺服器啟動時間較長,因為伺服器會檢查所有模式中的所有物件。

FORCE 用於強制執行第 2 步操作,如果伺服器認為這些操作是必要的。 FORCEAUTO 的一個區別是,使用 FORCE 時,如果系統表(如幫助表或時區表)丟失,伺服器會重新建立這些表。

以下列表顯示了 MySQL 8.0.16 之前的升級命令以及 MySQL 8.0.16 及更高版本的等效命令:

  • 執行正常升級(根據需要執行步驟 1 和 2):

    • MySQL 8.0.16 之前:mysqld 後跟 mysql_upgrade

    • 截至 MySQL 8.0.16:mysqld

  • 根據需要僅執行步驟 1:

    • MySQL 8.0.16 之前:不可能執行步驟 1 中描述的所有升級任務,同時排除步驟 2 中描述的任務。但是,您可以使用 mysqld 後跟 mysql_upgrade--upgrade-system-tables--skip-sys-schema 選項來避免升級使用者模式和 sys 模式。

    • 截至 MySQL 8.0.16:mysqld --upgrade=MINIMAL

  • 根據需要執行第 1 步,並強制執行第 2 步:

    • MySQL 8.0.16 之前:mysqld 後跟 mysql_upgrade --force

    • 截至 MySQL 8.0.16:mysqld --upgrade=FORCE

MySQL 8.0.16 之前,某些 mysql_upgrade 選項會影響其執行的操作。以下表格顯示了截至 MySQL 8.0.16,要實現類似效果應使用哪些伺服器 --upgrade 選項值。(這些不一定是確切的等效值,因為給定的 --upgrade 選項值可能具有額外效果。)

mysql_upgrade 選項 伺服器選項
--skip-sys-schema --upgrade=NONE--upgrade=MINIMAL
--upgrade-system-tables --upgrade=NONE--upgrade=MINIMAL
--force --upgrade=FORCE

升級步驟 2 的附加說明:

  • 步驟 2 會安裝sys模式(如果尚未安裝),否則將其升級到當前版本。如果存在sys模式但沒有version檢視,則會出現錯誤,因為缺少version檢視表明這是使用者建立的模式:

    A sys schema exists with no sys.version view. If
    you have a user created sys schema, this must be renamed for the
    upgrade to succeed.
    

    在這種情況下進行升級,首先刪除或重新命名現有的sys模式。然後再次執行升級過程。(可能需要強制執行步驟 2。)

    為了防止sys模式檢查:

    • 截至 MySQL 8.0.16:使用--upgrade=NONE--upgrade=MINIMAL選項啟動伺服器。

    • 在 MySQL 8.0.16 之前:使用--skip-sys-schema選項呼叫mysql_upgrade

  • 步驟 2 會升級系統表以確保其具有當前結構。無論是伺服器還是mysql_upgrade執行該步驟都是如此。關於幫助表和時區表的內容,mysql_upgrade不會載入任何型別的表,而伺服器會載入幫助表,但不會載入時區表。(即,在 MySQL 8.0.16 之前,伺服器僅在資料目錄初始化時載入幫助表。從 MySQL 8.0.16 開始,它在初始化和升級時載入幫助表。)載入時區表的過程取決於平臺,並且需要由 DBA 做出決策,因此無法自動完成。

  • 從 MySQL 8.0.30 開始,當第 2 步升級mysql模式中的系統表時,mysql.dbmysql.tables_privmysql.columns_privmysql.procs_priv表的主鍵中的列順序被更改為將主機名和使用者名稱列放在一起。將主機名和使用者名稱放在一起意味著可以使用索引查詢,這提高了CREATE USERDROP USERRENAME USER語句的效能,以及對具有多個許可權的多個使用者進行 ACL 檢查。如果系統具有大量使用者和許可權,則需要刪除並重新建立索引,這可能需要一些時間。

  • 第 2 步根據需要處理所有使用者模式中的所有表。表檢查可能需要很長時間才能完成。在處理表時,每個表都會被鎖定,因此在處理過程中對其他會話不可用。檢查和修復操作可能需要很長時間,特別是對於大表。表檢查使用CHECK TABLE語句的FOR UPGRADE選項。有關此選項的詳細資訊,請參見第 15.7.3.2 節,“CHECK TABLE Statement”。

    要防止表檢查:

    • 截至 MySQL 8.0.16 版本:使用--upgrade=NONE--upgrade=MINIMAL選項啟動伺服器。

    • 在 MySQL 8.0.16 版本之前:使用--upgrade-system-tables選項呼叫mysql_upgrade

    要強制進行表檢查:

    • 截至 MySQL 8.0.16 版本:使用--upgrade=FORCE選項啟動伺服器。

    • 在 MySQL 8.0.16 版本之前:使用--force選項呼叫mysql_upgrade

  • 第 2 步將 MySQL 版本號儲存在名為mysql_upgrade_info的檔案中,該檔案位於資料目錄中。

    要忽略mysql_upgrade_info檔案並執行檢查,請執行以下操作:

    • 截至 MySQL 8.0.16 版本:使用--upgrade=FORCE選項啟動伺服器。

    • 在 MySQL 8.0.16 版本之前:使用--force選項呼叫mysql_upgrade

    注意

    mysql_upgrade_info檔案已被棄用;預計將在 MySQL 的未來版本中刪除。

  • 第 2 步使用當前 MySQL 版本號標記所有已檢查和修復的表。這確保了下次使用相同版本的伺服器進行升級檢查時,可以確定是否需要再次檢查或修復給定的表。

3.5 MySQL 8.0 的變化

原文:dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html

在升級到 MySQL 8.0 之前,請檢視本節中描述的更改,以確定哪些適用於您當前的 MySQL 安裝和應用程式。執行任何建議的操作。

標記為不相容更改的更改與早期版本的 MySQL 不相容,並且可能需要您在升級之前注意。我們的目標是避免這些更改,但偶爾它們是必要的,以糾正比版本之間的不相容性更糟糕的問題。如果適用於您的安裝的升級問題涉及不相容性,請按照描述中給出的說明操作。

  • 資料字典變化

  • 將 caching_sha2_password 作為首選身份驗證外掛

  • 配置更改

  • 伺服器更改

  • InnoDB 變化

  • SQL 更改

  • 更改的伺服器預設值

  • 有效效能迴歸

資料字典變化

MySQL Server 8.0 包含一個全域性資料字典,其中包含事務表中資料庫物件的資訊。在以前的 MySQL 系列中,字典資料儲存在後設資料檔案和非事務系統表中。因此,升級過程要求您透過檢查特定先決條件來驗證安裝的升級準備情況。有關更多資訊,請參見第 3.6 節,“準備升級安裝”。啟用資料字典的伺服器存在一些一般操作上的差異;請參見第 16.7 節,“資料字典使用差異”。

將 caching_sha2_password 作為首選身份驗證外掛

caching_sha2_passwordsha256_password 認證外掛提供比 mysql_native_password 外掛更安全的密碼加密,而 caching_sha2_password 提供比 sha256_password 更好的效能。由於 caching_sha2_password 具有卓越的安全性和效能特性,因此從 MySQL 8.0 開始,它是首選的認證外掛,並且也是預設的認證外掛,而不是 mysql_native_password。這一變化影響了伺服器和 libmysqlclient 客戶端庫:

  • 對於伺服器,default_authentication_plugin 系統變數的預設值從 mysql_native_password 更改為 caching_sha2_password

    這一變化僅適用於安裝或升級到 MySQL 8.0 或更高版本後建立的新帳戶。對於已存在於升級安裝中的帳戶,它們的認證外掛保持不變。希望切換到 caching_sha2_password 的現有使用者可以使用 ALTER USER 語句進行切換:

    ALTER USER *user*
      IDENTIFIED WITH caching_sha2_password
      BY '*password*';
    
  • libmysqlclient 庫將 caching_sha2_password 視為預設的認證外掛,而不是 mysql_native_password

以下部分討論了 caching_sha2_password 更顯著角色的影響:

  • caching_sha2_password 相容性問題和解決方案

  • caching_sha2_password 相容的客戶端和聯結器

  • caching_sha2_password 和 root 管理員帳戶

  • caching_sha2_password 和複製

caching_sha2_password 相容性問題和解決方案

重要

如果您的 MySQL 安裝必須為 8.0 之前的客戶端提供服務,並且在升級到 MySQL 8.0 或更高版本後遇到相容性問題,解決這些問題並恢復到 8.0 之前的相容性的最簡單方法是重新配置伺服器以恢復到先前的預設認證外掛 (mysql_native_password)。例如,在伺服器選項檔案中使用以下行:

[mysqld]
default_authentication_plugin=mysql_native_password

該設定使得 8.0 之前的客戶端可以連線到 8.0 伺服器,直到您的安裝中使用的客戶端和聯結器升級以瞭解caching_sha2_password為止。然而,該設定應被視為臨時解決方案,而不是長期或永久解決方案,因為在該設定生效時建立的新帳戶將放棄caching_sha2_password提供的改進的身份驗證安全性。

使用caching_sha2_passwordmysql_native_password提供更安全的密碼雜湊(以及隨之改進的客戶端連線身份驗證)。然而,它也具有相容性影響,可能會影響現有的 MySQL 安裝:

  • 客戶端和聯結器如果沒有更新以瞭解caching_sha2_password,可能會在連線到配置了caching_sha2_password作為預設身份驗證外掛的 MySQL 8.0 伺服器時遇到問題,即使是使用不使用caching_sha2_password進行身份驗證的帳戶也是如此。這個問題的原因是伺服器向客戶端指定了其預設身份驗證外掛的名稱。如果客戶端或聯結器基於一個不能優雅處理未識別的預設身份驗證外掛的客戶端/伺服器協議實現,可能會出現以下錯誤之一:

    Authentication plugin 'caching_sha2_password' is not supported
    
    Authentication plugin 'caching_sha2_password' cannot be loaded:
    dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2):
    image not found
    
    Warning: mysqli_connect(): The server requested authentication
    method unknown to the client [caching_sha2_password]
    

    有關編寫聯結器以優雅處理伺服器對未知預設身份驗證外掛的請求的資訊,請參見身份驗證外掛聯結器編寫注意事項。

  • 使用一個使用caching_sha2_password進行身份驗證的帳戶的客戶端必須使用安全連線(使用 TLS/SSL 憑據透過 TCP 進行連線,一個 Unix 套接字檔案,或共享記憶體),或者支援使用 RSA 金鑰對進行密碼交換的未加密連線。這個安全要求不適用於mysql_native_passsword,因此切換到caching_sha2_password可能需要額外的配置(參見 8.4.1.2 節,“Caching SHA-2 Pluggable Authentication”)。然而,在 MySQL 8.0 中,預設情況下客戶端連線更傾向於使用 TLS/SSL,因此已經符合該偏好的客戶端可能不需要額外的配置。

  • 未更新以瞭解caching_sha2_password的客戶端和聯結器無法連線到使用caching_sha2_password進行身份驗證的賬戶,因為它們不認可此外掛為有效。(這是客戶端/伺服器認證外掛相容性要求的一個特殊例項,如認證外掛客戶端/伺服器相容性中所討論的。)要解決此問題,請重新連結客戶端到 MySQL 8.0 或更高版本的libmysqlclient,或獲取一個識別caching_sha2_password的更新聯結器。

  • 因為caching_sha2_password現在也是libmysqlclient客戶端庫中的預設認證外掛,所以從 MySQL 8.0 客戶端連線到使用mysql_native_password(之前的預設認證外掛)的賬戶時,認證需要在客戶端/伺服器協議中進行額外的往返,除非客戶端程式使用--default-auth=mysql_native_password選項呼叫。

用於 8.0 之前 MySQL 版本的libmysqlclient客戶端庫能夠連線到 MySQL 8.0 伺服器(除了使用caching_sha2_password進行身份驗證的賬戶)。這意味著基於libmysqlclient的 8.0 之前的客戶端也應該能夠連線。例如:

  • 標準的 MySQL 客戶端,如mysqlmysqladmin都是基於libmysqlclient

  • Perl DBI 的 DBD::mysql 驅動程式是基於libmysqlclient的。

  • MySQL Connector/Python 具有基於libmysqlclient的 C 擴充套件模組。要使用它,請在連線時包含use_pure=False選項。

當現有的 MySQL 8.0 安裝升級到 MySQL 8.0.4 或更高版本時,一些較舊的基於libmysqlclient的客戶端可能會“自動”升級,因為它們是動態連結的,因此它們使用升級安裝的新客戶端庫。例如,如果 Perl DBI 的 DBD::mysql 驅動程式使用動態連結,它可以在升級到 MySQL 8.0.4 或更高版本後直接使用libmysqlclient,結果如下:

  • 在升級之前,使用 DBD::mysql 的 DBI 指令碼可以連線到 MySQL 8.0 伺服器,除了使用caching_sha2_password進行身份驗證的賬戶。

  • 升級後,相同的指令碼也能夠使用caching_sha2_password賬戶。

然而,前述結果發生是因為 MySQL 8.0 安裝中 8.0.4 之前的libmysqlclient例項是二進位制相容的:它們都使用共享庫主版本號 21。對於連結到來自 MySQL 5.7 或更早版本的libmysqlclient的客戶端,它們連結到具有不相容的不同版本號的共享庫。在這種情況下,客戶端必須重新編譯以便與 MySQL 8.0 伺服器和caching_sha2_password帳戶完全相容。

MySQL Connector/J 5.1 至 8.0.8 能夠連線到 MySQL 8.0 伺服器,除了使用caching_sha2_password進行身份驗證的帳戶。(聯結器/J 8.0.9 或更高版本需要連線到caching_sha2_password帳戶。)

使用除libmysqlclient之外的客戶端/伺服器協議實現的客戶端可能需要升級到了解新身份驗證外掛的較新版本。例如,在 PHP 中,MySQL 連線通常基於mysqlnd,目前不瞭解caching_sha2_password。在更新的mysqlnd版本可用之前,使 PHP 客戶端連線到 MySQL 8.0 的方法是重新配置伺服器,將mysql_native_password恢復為預設身份驗證外掛,如前所述。

如果客戶端或聯結器支援顯式指定預設身份驗證外掛的選項,請使用它來命名除caching_sha2_password之外的外掛。示例:

  • 一些 MySQL 客戶端支援--default-auth選項。(標準 MySQL 客戶端,如mysqlmysqladmin支援此選項,但可以成功連線到 8.0 伺服器而無需它。但是,其他客戶端可能支援類似的選項。如果是這樣,值得嘗試。)

  • 使用libmysqlclient C API 的程式可以使用MYSQL_DEFAULT_AUTH選項呼叫mysql_options()函式。

  • 使用客戶端/伺服器協議的本機 Python 實現的 MySQL Connector/Python 指令碼可以指定auth_plugin連線選項。(或者,使用 Connector/Python C 擴充套件,可以連線到 MySQL 8.0 伺服器而無需auth_plugin。)

相容caching_sha2_password的客戶端和聯結器

如果有已更新以瞭解caching_sha2_password的客戶端或聯結器可用,則使用它是連線到配置為預設身份驗證外掛為caching_sha2_password的 MySQL 8.0 伺服器時確保相容性的最佳方法。

這些客戶端和聯結器已升級以支援caching_sha2_password

  • MySQL 8.0(8.0.4 或更高版本)中的 libmysqlclient 客戶端庫。標準 MySQL 客戶端,如 mysqlmysqladmin 基於 libmysqlclient,因此它們也是���容的。

  • MySQL 5.7(5.7.23 或更高版本)中的 libmysqlclient 客戶端庫。標準 MySQL 客戶端,如 mysqlmysqladmin 基於 libmysqlclient,因此它們也是相容的。

  • MySQL Connector/C++ 1.1.11 或更高版本或 8.0.7 或更高版本。

  • MySQL Connector/J 8.0.9 或更高版本。

  • MySQL Connector/NET 8.0.10 或更高版本(透過經典 MySQL 協議)。

  • MySQL Connector/Node.js 8.0.9 或更高版本。

  • PHP:X DevAPI PHP 擴充套件(mysql_xdevapi)支援 caching_sha2_password

    PHP:PDO_MySQL 和 ext/mysqli 擴充套件不支援 caching_sha2_password。此外,當與 PHP 版本 7.1.16 之前的版本和 PHP 7.2 之前的版本一起使用時,即使未使用 caching_sha2_password,它們也無法連線到 default_authentication_plugin=caching_sha2_password

caching_sha2_password 和 root 管理員帳戶

對於升級到 MySQL 8.0,現有帳戶的身份驗證外掛保持不變,包括 'root'@'localhost' 管理員帳戶的外掛。

對於新的 MySQL 8.0 安裝,在初始化資料目錄時(使用 第 2.9.1 節,“初始化資料目錄” 中的說明),會建立 'root'@'localhost' 帳戶,並且該帳戶預設使用 caching_sha2_password。因此,在資料目錄初始化後連線到伺服器時,您必須使用支援 caching_sha2_password 的客戶端或聯結器。如果您可以這樣做,但希望安裝後 root 帳戶使用 mysql_native_password,請按照通常的方式安裝 MySQL 並初始化資料目錄。然後連線到伺服器作為 root,並使用 ALTER USER 如下更改帳戶身份驗證外掛和密碼:

ALTER USER 'root'@'localhost'
  IDENTIFIED WITH mysql_native_password
  BY '*password*';

如果您使用的客戶端或聯結器尚不支援 caching_sha2_password,則可以使用修改後的資料目錄初始化過程,一旦建立帳戶,就將 root 帳戶與 mysql_native_password 關聯起來。為此,可以使用以下任一技術:

  • --initialize--initialize-insecure 選項中提供一個 --default-authentication-plugin=mysql_native_password 選項。

  • 在選項檔案中將default_authentication_plugin設定為mysql_native_password,並使用--defaults-file選項命名該選項檔案,以及--initialize--initialize-insecure。 (在這種情況下,如果您繼續使用該選項檔案進行後續伺服器啟動,則新帳戶將使用mysql_native_password而不是caching_sha2_password建立,除非從選項檔案中刪除default_authentication_plugin設定。)

caching_sha2_password和複製

對於所有伺服器都已升級到 MySQL 8.0.4 或更高版本的複製場景,副本連線到源伺服器可以使用使用caching_sha2_password進行身份驗證的賬戶。對於這樣的連線,與使用caching_sha2_password進行身份驗證的其他客戶端相同的要求適用:使用安全連線或基於 RSA 的密碼交換。

要連線到用於源/副本複製的caching_sha2_password賬戶:

  • 使用以下任何一個CHANGE MASTER TO選項:

    MASTER_SSL = 1
    GET_MASTER_PUBLIC_KEY = 1
    MASTER_PUBLIC_KEY_PATH='*path to RSA public key file*'
    
  • 或者,如果在伺服器啟動時提供所需的金鑰,則可以使用 RSA 公鑰相關選項。

要連線到使用caching_sha2_password賬戶的組複製:

  • 對於使用 OpenSSL 構建的 MySQL,設定以下任何一個系統變數:

    SET GLOBAL group_replication_recovery_use_ssl = ON;
    SET GLOBAL group_replication_recovery_get_public_key = 1;
    SET GLOBAL group_replication_recovery_public_key_path = '*path to RSA public key file*';
    
  • 或者,如果在伺服器啟動時提供所需的金鑰,則可以使用 RSA 公鑰相關選項。

配置更改

  • 不相容更改:MySQL 儲存引擎現在負責提供自己的分割槽處理程式,MySQL 伺服器不再提供通用分割槽支援。InnoDBNDB是唯一提供本機分割槽處理程式並在 MySQL 8.0 中受支援的儲存引擎。使用任何其他儲存引擎的分割槽表必須在升級伺服器之前進行更改,要麼將其轉換為InnoDBNDB,要麼刪除其分割槽,否則之後無法使用。

    有關將MyISAM錶轉換為InnoDB的資訊,請參見第 17.6.1.5 節,“從 MyISAM 轉換表到 InnoDB”。

    在 MySQL 8.0 中,使用不支援的儲存引擎建立分割槽表的表建立語句將失敗並顯示錯誤(ER_CHECK_NOT_IMPLEMENTED)。如果您從在 MySQL 5.7(或更早版本)中建立的轉儲檔案中匯入資料庫到 MySQL 8.0 伺服器,請確保任何建立分割槽表的語句不會同時指定不支援的儲存引擎,可以透過刪除任何與分割槽相關的引用,或者將儲存引擎指定為InnoDB或允許其預設設定為InnoDB來實現。

    注意

    在第 3.6 節,“準備升級安裝”中描述瞭如何在升級到 MySQL 8.0 之前識別必須更改的分割槽表的過程。

    有關更多資訊,請參閱第 26.6.2 節,“與儲存引擎相關的分割槽限制”。

  • 不相容更改:幾個伺服器錯誤程式碼未被使用並已被移除(詳細列表請參見 MySQL 8.0 中刪除的功能)。特別測試任何這些錯誤程式碼的應用程式應該進行更新。

  • 重要更改:預設字符集已從latin1更改為utf8mb4。這些系統變數受到影響:

    • character_set_servercharacter_set_database系統變數的預設值已從latin1更改為utf8mb4

    • collation_servercollation_database系統變數的預設值已從latin1_swedish_ci更改為utf8mb4_0900_ai_ci

    因此,除非顯式指定字符集和校對規則,否則新物件的預設字符集和校對規則與以前不同。這包括資料庫及其中的物件,如表、檢視和儲存過程。假設以前使用的是預設值,保留它們的一種方法是在my.cnf檔案中使用以下行啟動伺服器:

    [mysqld]
    character_set_server=latin1
    collation_server=latin1_swedish_ci
    

    在複製設定中,從 MySQL 5.7 升級到 8.0 時,建議在升級之前將預設字符集更改回 MySQL 5.7 中使用的字符集。升級完成後,可以將預設字符集更改為utf8mb4

    另外,您應該知道 MySQL 8.0 強制執行對給定字符集中允許字元的檢查,而 MySQL 5.7 不執行;這是一個已知問題。這意味著,在嘗試升級之前,您應確保沒有註釋包含未在使用的字符集中定義的字元。您可以透過以下兩種方式修復此問題:

    • 將字符集更改為包含相關字元的字符集。

    • 刪除有問題的字元或字元。

    上述適用於表、檔案和索引註釋。

  • 不相容更改:從 MySQL 8.0.11 開始,禁止使用與伺服器初始化時使用的lower_case_table_names設定不同的設定啟動伺服器。這個限制是必要的,因為各種資料字典表欄位使用的校對是基於伺服器初始化時定義的lower_case_table_names設定,重新啟動伺服器使用不同設定會導致識別符號的排序和比較出現不一致。

伺服器更改

  • 在 MySQL 8.0.11 中,已刪除了與帳戶管理相關的幾個棄用功能,例如使用GRANT語句修改使用者帳戶的非許可權特性,NO_AUTO_CREATE_USER SQL 模式,PASSWORD()函式和old_passwords系統變數。

    從 MySQL 5.7 複製到 8.0 的涉及這些已移除功能的語句可能導致複製失敗。使用任何已移除功能的應用程式應進行修訂以避免使用它們,並在可能的情況下使用替代方案,如 MySQL 8.0 中已移除的功能中所述。

    為避免在 MySQL 8.0 上啟動失敗,請從 MySQL 選項檔案的sql_mode系統變數設定中刪除任何NO_AUTO_CREATE_USER例項。

    將包含NO_AUTO_CREATE_USER SQL 模式的轉儲檔案載入到 MySQL 8.0 伺服器中會導致失敗。從 MySQL 5.7.24 和 MySQL 8.0.13 開始,mysqldump會從儲存程式定義中刪除NO_AUTO_CREATE_USER。使用早期版本的mysqldump建立的轉儲檔案必須手動修改以刪除NO_AUTO_CREATE_USER的例項。

  • 在 MySQL 8.0.11 中,這些已棄用的相容性 SQL 模式被移除:DB2MAXDBMSSQLMYSQL323MYSQL40ORACLEPOSTGRESQLNO_FIELD_OPTIONSNO_KEY_OPTIONSNO_TABLE_OPTIONS。它們不能再分配給sql_mode系統變數,也不能作為mysqldump --compatible選項的允許值。

    移除MAXDB意味著CREATE TABLEALTER TABLE中的TIMESTAMP資料型別不再被視為DATETIME

    從 MySQL 5.7 到 8.0 的複製中,涉及已移除 SQL 模式的語句可能導致複製失敗。這包括在當前sql_mode值包含任何已移除模式的情況下執行的儲存程式(儲存過程和函式、觸發器和事件)的CREATE語句的複製。使用任何已移除模式的應用程式應進行修改以避免使用它們。

  • 許多 MySQL 8.0 錯誤訊息的文字已經修訂和改進,提供的資訊比 MySQL 5.7 更多更好。如果您的應用程式依賴於特定內容或格式的錯誤訊息,您應該測試這些內容,並準備在升級之前更新應用程式。

  • 截至 MySQL 8.0.3,空間資料型別允許一個SRID屬性,明確指示儲存在列中的值的空間參考系統(SRS)。參見第 13.4.1 節,“空間資料型別”。

    具有顯式SRID屬性的空間列是 SRID 受限制的:該列僅接受具有該 ID 的值,並且該列上的SPATIAL索引成為最佳化器使用的物件。最佳化器會忽略沒有SRID屬性的空間列上的SPATIAL索引。參見第 10.3.3 節,“空間索引最佳化”。如果您希望最佳化器考慮對沒有 SRID 限制的空間列上的SPATIAL索引,應修改每個這樣的列:

    • 驗證列中的所有值是否具有相同的 SRID。要確定幾何列col_name中包含的 SRIDs,使用以下查詢:

      SELECT DISTINCT ST_SRID(*col_name*) FROM *tbl_name*;
      

      如果查詢返回多行,則該列包含混合的 SRIDs。在這種情況下,修改其內容使所有值具有相同的 SRID。

    • 重新定義列以具有顯式SRID屬性。

    • 重新建立SPATIAL索引。

  • 由於空間函式名稱空間更改實施了執行精確操作的函式的ST_字首,或者基於最小邊界矩形執行操作的函式的MBR字首,因此在 MySQL 8.0.0 中刪除了幾個空間函式。在生成列定義中使用已刪除的空間函式可能會導致升級失敗。在升級之前,執行mysqlcheck --check-upgrade以查詢已刪除的空間函式,並用它們的ST_MBR命名的替代函式替換任何找到的函式。有關已刪除的空間函式列表,請參考 MySQL 8.0 中刪除的功能。

  • 當進行就地升級到 MySQL 8.0.3 或更高版本時,具有RELOAD許可權的使用者會自動被授予BACKUP_ADMIN許可權。

  • 從 MySQL 8.0.13 開始,由於基於行或混合複製模式與基於語句的複製模式在處理臨時表的方式上的差異,切換二進位制日誌格式在執行時有了新的限制。

    • 如果會話有任何開啟的臨時表,則不能使用SET @@SESSION.binlog_format

    • 如果任何複製通道有任何開啟的臨時表,則不能使用SET @@global.binlog_formatSET @@persist.binlog_format。如果複製通道有開啟的臨時表,則允許使用SET @@persist_only.binlog_format,因為與PERSIST不同,PERSIST_ONLY不會修改執行時全域性系統變數值。

    • 如果任何複製通道應用程式正在執行,則不能使用SET @@global.binlog_formatSET @@persist.binlog_format。這是因為更改僅在複製通道的應用程式重新啟動時生效,此時複製通道可能有開啟的臨時表。這種行為比以前更為嚴格。如果任何複製通道應用程式正在執行,則允許使用SET @@persist_only.binlog_format

    • 從 MySQL 8.0.27 開始,為internal_tmp_mem_storage_engine配置會話設定需要SESSION_VARIABLES_ADMINSYSTEM_VARIABLES_ADMIN許可權。

    • 截至 MySQL 8.0.27 版本,克隆外掛允許在捐贈者 MySQL 伺服器例項上進行併發 DDL 操作,同時克隆操作正在進行中。以前,在克隆操作期間會持有備份鎖,阻止捐贈者上的併發 DDL。要恢復到在克隆操作期間阻止捐贈者上的併發 DDL 的先前行為,請啟用 clone_block_ddl 變數。參見 第 7.6.7.4 節,“克隆和併發 DDL”。

  • 從 MySQL 8.0.30 版本開始,在啟動時列出的 log_error_services 值中的錯誤日誌元件將在 MySQL 伺服器啟動序列的早期隱式載入。如果您以前使用 INSTALL COMPONENT 安裝了可載入的錯誤日誌元件,並且您在啟動時列出了這些元件(例如,從選項檔案中讀取的 log_error_services 設定),則應更新配置以避免啟動警告。有關更多資訊,請參見 錯誤日誌配置方法。

InnoDB 更改

  • 基於 InnoDB 系統表的 INFORMATION_SCHEMA 檢視已被內部資料字典表上的內部系統檢視所取代。受影響的 InnoDB INFORMATION_SCHEMA 檢視已更名為:

    表 3.1 重新命名的 InnoDB 資訊模式檢視

    舊名稱 新名稱
    INNODB_SYS_COLUMNS INNODB_COLUMNS
    INNODB_SYS_DATAFILES INNODB_DATAFILES
    INNODB_SYS_FIELDS INNODB_FIELDS
    INNODB_SYS_FOREIGN INNODB_FOREIGN
    INNODB_SYS_FOREIGN_COLS INNODB_FOREIGN_COLS
    INNODB_SYS_INDEXES INNODB_INDEXES
    INNODB_SYS_TABLES INNODB_TABLES
    INNODB_SYS_TABLESPACES INNODB_TABLESPACES
    INNODB_SYS_TABLESTATS INNODB_TABLESTATS
    INNODB_SYS_VIRTUAL INNODB_VIRTUAL
    舊名稱 新名稱

    升級到 MySQL 8.0.3 或更高版本後,請更新任何引用先前 InnoDB INFORMATION_SCHEMA 檢視名稱的指令碼。

  • MySQL 捆綁的 zlib 庫版本從 1.2.3 版升級到 1.2.11 版。

    zlib 1.2.11 中的 zlib compressBound()函式返回的壓縮給定長度位元組所需的緩衝區大小的估計比 zlib 版本 1.2.3 中的估計略高。compressBound()函式由確定在建立壓縮的InnoDB表或在壓縮的InnoDB表中插入和更新行時允許的最大行大小的InnoDB函式呼叫。因此,與早期版本中成功的最大行大小非常接近的CREATE TABLE ... ROW_FORMAT=COMPRESSEDINSERTUPDATE操作現在可能會失敗。為避免此問題,在升級之前,在 MySQL 8.0 測試例項上測試具有大行的壓縮InnoDB表的CREATE TABLE語句。

  • 隨著--innodb-directories功能的引入,使用絕對路徑建立的檔案表和通用表空間檔案或位於資料目錄之外的位置應新增到innodb_directories引數值中。否則,在恢復過程中,InnoDB將無法定位這些檔案。要檢視錶空間檔案位置,請查詢 Information Schema FILES表:

    SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES \G
    
  • 撤銷日誌不再可以駐留在系統表空間中。在 MySQL 8.0 中,預設情況下,撤銷日誌駐留在兩個 undo 表空間中。有關更多資訊,請參見第 17.6.3.4 節,“Undo Tablespaces”。

    當從 MySQL 5.7 升級到 MySQL 8.0 時,MySQL 5.7 例項中存在的任何 undo 表空間都將被刪除,並由兩個新的預設 undo 表空間替換。預設的 undo 表空間是在innodb_undo_directory變數定義的位置建立的。如果innodb_undo_directory變數未定義,則 undo 表空間將在資料目錄中建立。從 MySQL 5.7 升級到 MySQL 8.0 需要進行緩慢關閉,以確保 MySQL 5.7 例項中的 undo 表空間為空,從而可以安全地刪除它們。

    從較早的 MySQL 8.0 版本升級到 MySQL 8.0.14 或更高版本時,作為 innodb_undo_tablespaces 設定大於 2 的結果存在於升級前例項中的撤銷表空間被視為使用者定義的撤銷表空間,可以在升級後使用 ALTER UNDO TABLESPACEDROP UNDO TABLESPACE 語法分別停用和刪除。在 MySQL 8.0 版本系列內進行升級可能不總是需要慢速關閉,這意味著現有的撤銷表空間可能包含撤銷日誌。因此,升級過程不會刪除現有的撤銷表空間。

  • 不相容更改:從 MySQL 8.0.17 開始,CREATE TABLESPACE ... ADD DATAFILE 子句不允許迴圈目錄引用。例如,以下語句中的迴圈目錄引用 (/../) 是不允許的:

    CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd '*any_directory*/../ts1.ibd';
    

    在 Linux 上存在對限制的例外情況,如果前面的目錄是符號連結,則允許迴圈目錄引用。例如,如果上面示例中的資料檔案路徑是 any_directory 是符號連結,則允許。 (資料檔案路徑仍然可以以 '../' 開頭。)

    為避免升級問題,在升級到 MySQL 8.0.17 或更高版本之前,請從表空間資料檔案路徑中刪除任何迴圈目錄引用。要檢查表空間路徑,請查詢資訊模式 INNODB_DATAFILES 表。

  • 由於 MySQL 8.0.14 引入的一個迴歸,從 MySQL 5.7 或 MySQL 8.0.14 之前的 MySQL 8.0 版本在區分大小寫檔案系統上進行原地升級到 MySQL 8.0.16 時,對於具有分割槽表和 lower_case_table_names=1 的例項會失敗。失敗是由於與分割槽表檔名相關的大小寫不匹配問題引起的。導致迴歸的修復已被撤銷,這允許從 MySQL 5.7 或 MySQL 8.0.14 之前的 MySQL 8.0 版本升級到 MySQL 8.0.17 以正常執行。然而,迴歸仍然存在於 MySQL 8.0.14、8.0.15 和 8.0.16 版本中。

    在從 MySQL 8.0.14、8.0.15 或 8.0.16 升級到 MySQL 8.0.17 的區分大小寫檔案系統上進行原地升級時,如果存在分割槽表且 lower_case_table_names=1,在升級二進位制檔案或軟體包到 MySQL 8.0.17 後啟動伺服器時會出現以下錯誤:

    Upgrading from server version *version_number* with
    partitioned tables and lower_case_table_names == 1 on a case sensitive file
    system may cause issues, and is therefore prohibited. To upgrade anyway, restart
    the new server version with the command line option 'upgrade=FORCE'. When
    upgrade is completed, please execute 'RENAME TABLE *part_table_name*
    TO *new_table_name*; RENAME TABLE *new_table_name*
    TO *part_table_name*;' for each of the partitioned tables.
    Please see the documentation for further information.
    

    如果在升級到 MySQL 8.0.17 時遇到此錯誤,請執行以下解決方法:

    1. 使用 --upgrade=force 重新啟動伺服器以強制進行升級操作。

    2. 識別具有小寫分割槽名稱分隔符 (#p##sp#)的分割槽表檔名:

      mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%';
      
    3. 對於每個識別的檔案,將相關表重新命名為臨時名稱,然後將表重新命名為原始名稱。

      mysql> RENAME TABLE *table_name* TO *temporary_table_name*;
      mysql> RENAME TABLE *temporary_table_name* TO *table_name*;
      
    4. 確保沒有具有小寫分割槽名稱分隔符的分割槽表檔名(應返回空結果集)。

      mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%';
      Empty set (0.00 sec)
      
    5. 在每個重新命名的表上執行 ANALYZE TABLE 以更新 mysql.innodb_index_statsmysql.innodb_table_stats 表中的最佳化器統計資訊。

    由於 MySQL 8.0.14、8.0.15 和 8.0.16 版本中仍存在的迴歸,從 MySQL 8.0.14、8.0.15 或 8.0.16 匯入分割槽表到 MySQL 8.0.17 在 lower_case_table_names=1 的區分大小寫檔案系統上不受支援。嘗試這樣做會導致“表空間缺失於表”錯誤。

  • MySQL 在構建表分割槽的表空間名稱和檔名時使用分隔符字串。一個“ #p# ”分隔符字串位於分割槽名稱之前,一個“ #sp# ”分隔符字串位於子分割槽名稱之前,如下所示:

     *schema_name*.*table_name*#p#*partition_name*#sp#*subpartition_name*
          *table_name*#p#*partition_name*#sp#*subpartition_name*.ibd
    

    歷史上,在諸如 Linux 等區分大小寫的檔案系統上,分隔符字串為大寫(#P##SP#),而在諸如 Windows 等不區分大小寫的檔案系統上為小寫(#p##sp#)。從 MySQL 8.0.19 開始,分隔符字串在所有檔案系統上都為小寫。此更改可防止在區分大小寫和不區分大小寫的檔案系統之間遷移資料目錄時出現問題。不再使用大寫分隔符字串。

    另外,基於使用者指定的分割槽或子分割槽名稱生成的分割槽表空間名稱和檔名,無論 lower_case_table_names 設定如何,現在都會生成(並在內部儲存)為小寫,以確保不區分大小寫。例如,如果建立了一個名為 PART_1 的表分割槽,則表空間名稱和檔名將以小寫形式生成:

     *schema_name*.*table_name*#p#*part_1*
          *table_name*#p#*part_1*.ibd
    

    在升級期間,MySQL 檢查並根據需要修改:

    • 在磁碟上和資料字典中識別分割槽表檔名,以確保小寫分隔符和分割槽名稱。

    • 資料字典中的分割槽後設資料,以解決之前 bug 修復引入的相關問題。

    • InnoDB 統計資料用於之前 bug 修復引入的相關問題。

    在表空間匯入操作期間,會檢查並根據需要修改磁碟上的分割槽表空間檔名,以確保小寫分隔符和分割槽名稱。

  • 從 MySQL 8.0.21 開始,在啟動時或從 MySQL 5.7 升級時,如果發現表空間資料檔案位於未知目錄中,將向錯誤日誌寫入警告。已知目錄是由datadirinnodb_data_home_dirinnodb_directories變數定義的目錄。要使目錄成為已知目錄,請將其新增到innodb_directories設定中。使目錄成為已知目錄可確保在恢復期間可以找到資料檔案。有關更多資訊,請參見崩潰恢復期間的表空間發現。

  • 重要變更:從 MySQL 8.0.30 開始,innodb_redo_log_capacity變數控制重做日誌檔案佔用的磁碟空間量。隨著這一變更,預設的重做日誌檔案數量和位置也發生了變化。從 MySQL 8.0.30 開始,InnoDB在資料目錄中的#innodb_redo目錄中維護 32 個重做日誌檔案。以前,InnoDB預設在資料目錄中建立兩個重做日誌檔案,並且重做日誌檔案的數量和大小由innodb_log_files_in_groupinnodb_log_file_size變數控制。這兩個變數現已棄用。

    當定義了innodb_redo_log_capacity設定時,將忽略innodb_log_files_in_groupinnodb_log_file_size設定;否則,將使用這些設定來計算innodb_redo_log_capacity設定(innodb_log_files_in_group * innodb_log_file_size = innodb_redo_log_capacity)。如果這些變數都沒有設定,則重做日誌容量將設定為innodb_redo_log_capacity的預設值,即 104857600 位元組(100MB)。

    與任何升級一樣,此更改在升級之前需要乾淨的關閉。

    有關此功能的更多資訊,請參見第 17.6.5 節,“重做日誌”。

  • 在 MySQL 5.7.35 之前,具有冗餘或緊湊行格式的表中的索引沒有大小限制。從 MySQL 5.7.35 開始,限制為 767 位元組。從 MySQL 5.7.35 之前的 MySQL 版本升級到 MySQL 8.0 可能會導致無法訪問的表。如果具有冗餘或緊湊行格式的表的索引大於 767 位元組,請在升級到 MySQL 8.0 之前刪除索引並重新建立。錯誤訊息為:

    mysql> ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
    

SQL 變更

  • 不相容更改:從 MySQL 8.0.13 開始,已刪除了對 GROUP BY 子句的已棄用 ASCDESC 修飾符。先前依賴於 GROUP BY 排序的查詢可能會產生與先前 MySQL 版本不同的結果。為了產生給定的排序順序,請提供一個 ORDER BY 子句。

    從 MySQL 8.0.12 或更低版本中使用 ASCDESC 修飾符進行 GROUP BY 子句的查詢和儲存程式定義應進行修改。否則,升級到 MySQL 8.0.13 或更高版本可能會失敗,複製到 MySQL 8.0.13 或更高版本的複製伺服器也可能失敗。

  • 在 MySQL 8.0 中可能會保留一些在 MySQL 5.7 中未保留的關鍵字。請參閱第 11.3 節,“關鍵字和保留字”。這可能導致先前用作識別符號的單詞變得非法。要修復受影響的語句,請使用識別符號引用。請參閱第 11.2 節,“模式物件名稱”。

  • 升級後,建議測試應用程式程式碼中指定的最佳化器提示,以確保這些提示仍然需要實現所需的最佳化策略。最佳化器增強有時可能使某些最佳化器提示變得不必要。在某些情況下,不必要的最佳化器提示甚至可能適得其反。

  • 不相容更改:在 MySQL 5.7 中,為 InnoDB 表指定 FOREIGN KEY 定義而不帶 CONSTRAINT *symbol* 子句,或者指定 CONSTRAINT 關鍵字而不帶 symbol,會導致 InnoDB 使用生成的約束名。在 MySQL 8.0 中,InnoDB 的行為發生了變化,使用 FOREIGN KEY *index_name* 值而不是生成的名稱。由於約束名必須在模式(資料庫)中唯一,這種更改導致由於外來鍵索引名稱在模式中不唯一而導致錯誤。為避免此類錯誤,新的約束命名行為已在 MySQL 8.0.16 中恢復,InnoDB 再次使用生成的約束名。

    為了與 InnoDB 保持一致,基於 MySQL 8.0.16 或更高版本的 NDB 發行版如果未指定 CONSTRAINT *symbol* 子句,或者指定 CONSTRAINT 關鍵字而不帶 symbol,則使用生成的約束名。基於 MySQL 5.7 和早期 MySQL 8.0 發行版的 NDB 發行版使用 FOREIGN KEY *index_name* 值。

    上述描述的更改可能會對依賴於先前外來鍵約束命名行為的應用程式造成不相容性。

  • MySQL 8.0 中的系統變數值處理方式已更改,例如 IFNULL()CASE() 等 MySQL 流控制函式;現在系統變數值被視為相同字元和排序規則的列值,而不是常量。一些使用這些函式與系統變數的查詢可能會被拒絕,出現 Illegal mix of collations。在這種情況下,將系統變數轉換為正確的字符集和排序規則。

  • 不相容的更改:MySQL 8.0.28 修復了先前 MySQL 8.0 版本中的問題,即 CONVERT() 函式有時允許將 BINARY 值無效地轉換為非二進位制字符集。可能依賴於此行為的應用程式應在升級之前進行檢查,並在必要時進行修改。

    特別是,在索引生成列的表示式中使用 CONVERT(),函式行為的更改可能導致在升級到 MySQL 8.0.28 之後索引損壞。您可以透過以下步驟防止這種情況發生:

    1. 在執行升級之前,糾正任何無效的輸入資料。

    2. 刪除然後重新建立索引。

      您還可以使用 ALTER TABLE *table* FORCE 強制重建表。

    3. 升級 MySQL 軟體。

    如果您無法事先驗證輸入資料,則在升級到 MySQL 8.0.28 之後,不應重新建立索引或重建表。

更改的伺服器預設值

MySQL 8.0 提供了改進的預設值,旨在為大多數使用者提供最佳的開箱即用體驗。這些變化是由於技術的進步(機器擁有更多 CPU,使用 SSD 等),儲存的資料更多,MySQL 正在發展(InnoDB,Group Replication,AdminAPI)等。以下表格總結了已更改的預設值,以為大多數使用者提供最佳的 MySQL 體驗。

選項/引數 舊預設值 新預設值
伺服器更改
character_set_server latin1 utf8mb4
collation_server latin1_swedish_ci utf8mb4_0900_ai_ci
explicit_defaults_for_timestamp OFF ON
optimizer_trace_max_mem_size 16KB 1MB
validate_password_check_user_name OFF ON
back_log -1 (autosize) changed from : back_log = 50 + (max_connections / 5) -1 (autosize) changed to : back_log = max_connections
max_allowed_packet 4194304 (4MB) 67108864 (64MB)
max_error_count 64 1024
event_scheduler OFF ON
table_open_cache 2000 4000
log_error_verbosity 3 (Notes) 2 (Warning)
local_infile ON (5.7) OFF
InnoDB 更改
innodb_undo_tablespaces 0 2
innodb_undo_log_truncate OFF ON
innodb_flush_method NULL fsync (Unix), unbuffered (Windows)
innodb_autoinc_lock_mode 1 (consecutive) 2 (interleaved)
innodb_flush_neighbors 1 (enable) 0 (disable)
innodb_max_dirty_pages_pct_lwm 0 (%) 10 (%)
innodb_max_dirty_pages_pct 75 (%) 90 (%)
效能模式更改
performance-schema-instrument='wait/lock/metadata/sql/%=ON' OFF ON
performance-schema-instrument='memory/%=COUNTED' OFF COUNTED
performance-schema-consumer-events-transactions-current=ON OFF ON
performance-schema-consumer-events-transactions-history=ON OFF ON
performance-schema-instrument='transaction%=ON' OFF ON
複製更改
log_bin OFF ON
server_id 0 1
log-slave-updates OFF ON
expire_logs_days 0 30
master-info-repository FILE TABLE
relay-log-info-repository FILE TABLE
transaction-write-set-extraction OFF XXHASH64
slave_rows_search_algorithms INDEX_SCAN, TABLE_SCAN INDEX_SCAN, HASH_SCAN
slave_pending_jobs_size_max 16M 128M
gtid_executed_compression_period 1000 0
組複製更改
group_replication_autorejoin_tries 0 3
group_replication_exit_state_action ABORT_SERVER READ_ONLY
group_replication_member_expel_timeout 0 5
選項/引數 舊預設值 新預設值

有關已新增的選項或變數的更多資訊,請參閱 MySQL 8.0 的選項和變數更改,在MySQL 伺服器版本參考中。

以下部分解釋了預設值的更改以及它們可能對您的部署產生的影響。

伺服器預設值

  • character_set_server系統變數和命令列選項--character-set-server的預設值從latin1更改為utf8mb4。這是伺服器的預設字符集。目前,UTF8MB4 是網路的主要字元編碼,這一變化使得絕大多數 MySQL 使用者的生活更加便利。從 5.7 升級到 8.0 不會更改任何現有資料庫物件的字符集,但是,除非您明確設定character_set_server(要麼回到以前的值,要麼設定為新值),否則新模式預設使用utf8mb4。我們建議儘可能遷移到utf8mb4

  • collation_server系統變數和命令列引數--collation-server的預設值從latin1_swedish_ci更改為utf8mb4_0900_ai_ci。這是伺服器的預設排序規則,即字符集中字元的排序。排序規則和字符集之間存在連結,因為每個字符集都有可能的排序規則列表。從 5.7 升級到 8.0 不會更改任何現有資料庫物件的排序規則,但會影響新物件。

  • explicit_defaults_for_timestamp系統變數的預設值從OFF(MySQL 傳統行為)更改為ON(SQL 標準行為)。此選項最初在 5.6 中引入,在 5.6 和 5.7 中為OFF

  • optimizer_trace_max_mem_size系統變數的預設值從16KB更改為1MB。舊預設值會導致對於任何非平凡查詢,最佳化器跟蹤被截斷。這一變化確保了大多數查詢的最佳化器跟蹤是有用的。

  • validate_password_check_user_name系統變數的預設值從OFF更改為ON。這意味著當啟用validate_password外掛時,預設情況下現在拒絕與當前會話使用者名稱匹配的密碼。

  • back_log系統變數的自動調整演算法已更改。自動調整值(-1)現在設定為max_connections的值,這比由50 + (max_connections / 5)計算的值大。back_log在伺服器無法跟上傳入請求的情況下排隊傳入的 IP 連線請求。在最壞的情況下,例如在網路故障後,有max_connections數量的客戶端嘗試重新連線時,它們都可以被緩衝,並且避免了拒絕重試迴圈。

  • max_allowed_packet系統變數的預設值從4194304(4M)更改為67108864(64M)。這個更大的預設值的主要優點是減少接收關於插入或查詢大於max_allowed_packet的錯誤的機會。它應該與您想要使用的最大第 13.3.4 節,“BLOB 和 TEXT 型別”一樣大。要恢復到以前的行為,請設定max_allowed_packet=4194304

  • max_error_count系統變數的預設值從64更改為1024。這確保了 MySQL 處理更多警告,例如觸及數千行並且其中許多行給出轉換警告的 UPDATE 語句。許多工具通常會批次更新,以幫助減少複製延遲。外部工具如 pt-online-schema-change 預設為 1000,gh-ost 預設為 100。MySQL 8.0 覆蓋了這兩種用例的完整錯誤歷史。沒有靜態分配,因此此更改僅影響生成大量警告的語句的記憶體消耗。

  • event_scheduler系統變數的預設值從OFF更改為ON。換句話說,預設情況下啟用事件排程程式。這是 SYS 中新功能的啟用程式,例如“終止空閒事務”。

  • table_open_cache系統變數的預設值從2000更改為4000。這是一個增加表訪問會話併發性的微小更改。

  • log_error_verbosity系統變數的預設值從3(Notes)更改為2(Warning)。目的是使 MySQL 8.0 錯誤日誌預設情況下更少冗長。

InnoDB 預設值

  • 不相容的更改 innodb_undo_tablespaces系統變數的預設值從0更改為2。這配置了 InnoDB 使用的撤銷表空間的數量。在 MySQL 8.0 中,innodb_undo_tablespaces的最小值為 2,回滾段不再可以在系統表空間中建立。因此,這是一個您無法恢復到 5.7 行為的情況。這個更改的目的是能夠自動截斷 Undo 日誌(見下一項),回收像mysqldump這樣的(偶爾的)長事務使用的磁碟空間。

  • innodb_undo_log_truncate系統變數的預設值從OFF更改為ON。啟用後,超過innodb_max_undo_log_size定義的閾值的撤銷表空間將被標記為截斷。只有撤銷表空間可以被截斷。不支援截斷位於系統表空間中的撤銷日誌。從 5.7 升級到 8.0 會自動將系統轉換為使用撤銷表空間,8.0 中不再支援使用系統表空間。

  • innodb_flush_method系統變數的預設值在 Unix-like 系統上從NULL更改為fsync,在 Windows 系統上從NULL更改為unbuffered。這更多是術語和選項的清理,沒有任何實質性影響。對於 Unix 來說,這只是一個文件更改,因為預設值在 5.7 中也是fsync(預設的NULL意味著fsync)。同樣,在 Windows 上,innodb_flush_method預設的NULL在 5.7 中意味著async_unbuffered,在 8.0 中被預設的unbuffered替換,這與現有的預設innodb_use_native_aio=ON具有相同的效果。

  • 不相容的更改 innodb_autoinc_lock_mode系統變數的預設值從1(連續)更改為2(交錯)。將交錯鎖定模式作為預設設定的更改反映了從基於語句到基於行的複製作為預設複製型別的更改,該更改發生在 MySQL 5.7 中。基於語句的複製需要連續的自增鎖定模式,以確保自增值按照可預測和可重複的順序分配給給定序列的 SQL 語句,而基於行的複製不受 SQL 語句執行順序的影響。因此,這一更改已知與基於語句的複製不相容,並可能破壞一些依賴於順序自增的應用程式或使用者生成的測試套件。可以透過設定innodb_autoinc_lock_mode=1;來恢復先前的預設值。

  • innodb_flush_neighbors系統變數的預設值從1(啟用)更改為0(禁用)。這是因為快速 IO(SSD)現在是部署的預設設定。我們預計對於大多數使用者,這將帶來輕微的效能提升。使用較慢硬碟的使用者可能會看到效能下降,並鼓勵他們透過設定innodb_flush_neighbors=1來恢復到先前的預設值。

  • innodb_max_dirty_pages_pct_lwm系統變數的預設值從0 (%)更改為10 (%)。當innodb_max_dirty_pages_pct_lwm=10時,InnoDB 在緩衝池中包含修改('髒')頁面超過 10%時增加其重新整理活動。這一變化的目的是略微降低峰值吞吐量,以換取更一致的效能。

  • innodb_max_dirty_pages_pct系統變數的預設值從75 (%)更改為90 (%)。這一變化與innodb_max_dirty_pages_pct_lwm的更改結合在一起,確保 InnoDB 的重新整理行為平穩,避免重新整理突發。要恢復到先前的行為,設定innodb_max_dirty_pages_pct=75innodb_max_dirty_pages_pct_lwm=0

效能模式預設值

  • 預設情況下,效能模式後設資料鎖定(MDL)儀表化預設開啟。performance-schema-instrument='wait/lock/metadata/sql/%=ON'的編譯預設值從OFF更改為ON。這是為了在 SYS 中新增基於 MDL 的檢視的啟用器。

  • 效能模式記憶體儀表化預設開啟。performance-schema-instrument='memory/%=COUNTED'的編譯預設值從OFF更改為COUNTED。這很重要,因為如果在伺服器啟動後啟用了儀表化,會導致計算不正確,可能會因為錯過分配而得到負餘額,但捕捉到釋放。

  • 效能模式事務儀表化預設開啟。performance-schema-consumer-events-transactions-current=ONperformance-schema-consumer-events-transactions-history=ON,和performance-schema-instrument='transaction%=ON'的編譯預設值從OFF更改為ON

複製預設值

  • log_bin系統變數的預設值從OFF更改為ON。換句話說,預設情況下啟用了二進位制日誌記錄。幾乎所有的生產安裝都啟用了二進位制日誌,因為它用於複製和時間點恢復。因此,預設情況下啟用二進位制日誌可以省去一個配置步驟,稍後啟用需要重新啟動mysqld。預設情況下啟用它還提供更好的測試覆蓋率,並且更容易發現效能退化。記得也設定server_id(見下面的更改)。8.0 的預設行為就好像你發出了./mysqld --log-bin --server-id=1。如果你在 8.0 上想要 5.7 的行為,可以發出./mysqld --skip-log-bin --server-id=0

  • server_id系統變數的預設值從0更改為1(與log_bin=ON的更改相結合)。伺服器可以使用這個預設 ID 啟動,但實際上你必須根據部署的複製基礎架構設定server-id,以避免出現重複的伺服器 ID。

  • log-slave-updates系統變數的預設值從OFF更改為ON。這會導致副本將複製的事件記錄到自己的二進位制日誌中。這個選項對於組複製是必需的,並且在各種複製鏈設定中確保正確的行為,這在今天已經成為常態。

  • expire_logs_days系統變數的預設值從0更改為30。新的預設值30會導致mysqld定期清理未使用的超過 30 天的二進位制日誌。這個改變有助於防止過多的磁碟空間被浪費在不再需要用於複製或恢復目的的二進位制日誌上。舊值0禁用了任何自動二進位制日誌清理。

  • master_info_repositoryrelay_log_info_repository系統變數的預設值從FILE更改為TABLE。因此,在 8.0 中,預設情況下將複製後設資料儲存在 InnoDB 中。這增加了預設情況下嘗試實現崩潰安全複製的可靠性。

  • transaction-write-set-extraction系統變數的預設值從OFF更改為XXHASH64。這個改變預設啟用了事務寫入集。透過使用事務寫入集,源必須稍微增加一些工作來生成寫入集,但結果對於衝突檢測是有幫助的。這是 Group Replication 的要求,新的預設值使得在源上啟用二進位制日誌寫入集並行化變得更容易,以加快複製速度。

  • slave_rows_search_algorithms系統變數的預設值從INDEX_SCAN,TABLE_SCAN更改為INDEX_SCAN,HASH_SCAN。這個改變透過減少複製應用程式必須執行的表掃描次數來加快基於行的複製速度,以應用對沒有主鍵的表的更改。

  • slave_pending_jobs_size_max系統變數的預設值從16M更改為128M。這個改變增加了可用於多執行緒複製的記憶體量。

  • gtid_executed_compression_period系統變數的預設值從1000更改為0。這個改變確保mysql.gtid_executed表的壓縮只在需要時隱含發生。

Group Replication Defaults

  • group_replication_autorejoin_tries的預設值從 0 更改為 3,這意味著預設情況下啟用了自動重新加入。這個系統變數指定成員在被驅逐或在達到group_replication_unreachable_majority_timeout設定之前無法聯絡到大多陣列時,嘗試自動重新加入組的次數。

  • group_replication_exit_state_action的預設值從ABORT_SERVER更改為READ_ONLY。這意味著當一個成員退出組時,例如在網路故障後,例項將變為只讀,而不是被關閉。

  • group_replication_member_expel_timeout 的預設值從 0 更改為 5,這意味著在 5 秒檢測期之後,被懷疑與組失去聯絡的成員將在 5 秒後被驅逐。

這些預設值大多對開發和生產環境都是合理的。但有一個例外,我們決定保持名為 innodb_dedicated_server 的新選項設定為 OFF,儘管我們建議在生產環境中將其設定為 ON。預設設定為 OFF 的原因是它會導致共享環境(如開發人員膝上型電腦)無法使用,因為它會佔用 所有 可用記憶體。

對於生產環境,我們建議將 innodb_dedicated_server 設定為 ON。當設定為 ON 時,以下 InnoDB 變數(如果沒有明確指定)將根據可用記憶體進行自動縮放 innodb_buffer_pool_sizeinnodb_log_file_sizeinnodb_flush_method。請參閱 第 17.8.12 節,“為專用 MySQL 伺服器啟用自動配置”。

儘管新的預設值是大多數用例的最佳配置選擇,但也存在特殊情況,以及出於遺留原因使用現有的 5.7 配置選擇。例如,有些人希望儘可能少地更改他們的應用程式或執行環境來升級到 8.0。我們建議評估所有新的預設值,並儘可能多地使用它們。大多數新的預設值可以在 5.7 中進行測試,因此您可以在升級到 8.0 之前在 5.7 生產環境中驗證新的預設值。對於您需要保留舊的 5.7 值的少數預設值,請在您的執行環境中設定相應的配置變數或啟動選項。

MySQL 8.0 擁有效能模式 variables_info 表,顯示了每個系統變數最近設定的來源,以及其值範圍。這提供了關於配置變數及其值的所有資訊的 SQL 訪問。

有效的效能退化

在 MySQL 版本 5.7 和 8.0 之間預期會出現效能退化。MySQL 8.0 擁有更多功能,改變了預設值,更加穩健,並增加了安全功能和額外的診斷資訊。以下列出了這些版本之間出現效能退化的有效原因,包括潛在的調解選項。這並非詳盡列表。

MySQL 版本 5.7 和 8.0 之間預設值更改相關的變化:

  • 在 5.7 中,預設情況下禁用二進位制日誌記錄,而在 8.0 中預設啟用。

    調解:透過在啟動時指定--skip-log-bin--disable-log-bin選項來禁用二進位制日誌記錄。

  • 預設字符集從latin1更改為utf8mb4在 8.0 中。雖然utf8mb4在 8.0 中表現比 5.7 好得多,但latin1utf8mb4更快。

    調解:如果不需要utf8mb4,在 8.0 中使用latin1

事務資料字典(原子 DDL)在 8.0 中引入。

  • 這增加了魯棒性/可靠性,但以 DDL 效能(CREATE / DROP 密集負載)為代價,但不應影響 DML 負載(SELECT / INSERT / UPDATE / DELETE)。

    調解:無

從 5.7.28 開始使用的更現代的 TLS 密碼/演算法在啟用 TLS(SSL)時產生影響(預設情況下):

  • 在 MySQL 5.7.28 之前,MySQL 社群版使用 yaSSL 庫,企業版使用 OpenSSL。

    從 MySQL 5.7.28 開始,MySQL 僅使用 OpenSSL 及其更強的 TLS 密碼,這在效能方面更昂貴。

    從 MySQL 5.7.28 或更早版本升級到 MySQL 8.0 可能會導致 TLS 效能退化。

    調解:無(如果出於安全原因需要 TLS)

效能模式(PFS)在 8.0 中比 5.7 更廣泛:

  • 在 MySQL 8.0 中無法將 PFS 編譯取消,但可以關閉。即使關閉了一些效能模式仍將存在,但開銷會更小。

    調解:在 8.0 中設定 performance_schema = OFF,或者在需要部分但不是全部 PFS 功能時以更細粒度關閉效能模式儀表。

在 8.0 中預設啟用截斷撤消表空間,這可能會顯著影響效能:

  • 從歷史上看,InnoDB 將撤消日誌儲存在系統表空間中,但無法回收撤消日誌使用的空間。系統表空間只會增長而不會縮小,這激發了相關功能請求以解決此問題。

    MySQL 8.0 將撤消日誌移至單獨的表空間,從而允許手動和自動撤消日誌截斷。

    然而,自動截斷會帶來永久效能開銷,並且可能導致停頓。

    調解:在 8.0 中設定 innodb_undo_log_truncate = OFF,並根據需要手動截斷撤消日誌。有關相關資訊,請參閱截斷撤消表空間。

字元類[[:alpha:]][[:digit:]]在 MySQL 8.0 中的正規表示式函式(如REGEXP()RLIKE())中的效能不如在 MySQL 5.7 中表現得好。這是因為 MySQL 8.0 中用 ICU 庫替換了 Spencer 正規表示式庫,ICU 庫在內部使用 UTF-16。

中介:在[[:alpha:]]的位置使用[a-zA-Z];在[[:digit:]]的位置使用[0-9]

3.6 準備升級安裝

原文:dev.mysql.com/doc/refman/8.0/en/upgrade-prerequisites.html

在升級到最新的 MySQL 8.0 版本之前,請透過執行以下描述的初步檢查來確保您當前的 MySQL 5.7 或 MySQL 8.0 伺服器例項的升級準備就緒。否則,升級過程可能會失敗。

提示

考慮使用 MySQL Shell 升級檢查工具,它使您能夠驗證 MySQL 伺服器例項是否準備好升級。您可以選擇一個目標 MySQL Server 版本,從 MySQL Server 8.0.11 到與當前 MySQL Shell 版本號匹配的 MySQL Server 版本號。升級檢查工具執行與指定目標版本相關的自動檢查,並建議您進行進一步的手動檢查。升級檢查工具適用於 MySQL 5.7、8.0 和 8.3 的所有 GA 版本。MySQL Shell 的安裝說明可以在這裡找到。

初步檢查:

  1. 不能存在以下問題:

    • 不能有使用過時資料型別或函式的表。

      如果表中包含舊的時間列(TIMEDATETIMETIMESTAMP列不支援分數秒精度)的舊格式(在 5.6.4 之前),則不支援直接升級到 MySQL 8.0。如果您的表仍然使用舊的時間列格式,請在嘗試直接升級到 MySQL 8.0 之前使用REPAIR TABLE進行升級。有關更多資訊,請參閱伺服器更改,在 MySQL 5.7 參考手冊中。

    • 不能有孤立的.frm檔案。

    • 觸發器不能有缺失或空的定義者,也不能有無效的建立上下文(由SHOW TRIGGERS顯示的character_set_clientcollation_connectionDatabase Collation屬性或INFORMATION_SCHEMA TRIGGERS表)。任何此類觸發器必須被匯出和恢復以修復問題。

    要檢查這些問題,請執行以下命令:

    mysqlcheck -u root -p --all-databases --check-upgrade
    

    如果mysqlcheck報告任何錯誤,請糾正這些問題。

  2. 不能有使用不具有本機分割槽支援的儲存引擎的分割槽表。要識別這樣的表,請執行以下查詢:

    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE ENGINE NOT IN ('innodb', 'ndbcluster')
    AND CREATE_OPTIONS LIKE '%partitioned%';
    

    查詢報告的任何表必須被更改為使用InnoDB或變為非分割槽表。要將表儲存引擎更改為InnoDB,請執行此語句:

    ALTER TABLE *table_name* ENGINE = INNODB;
    

    有關將MyISAM錶轉換為InnoDB的資訊,請參見 Section 17.6.1.5,“從 MyISAM 轉換表到 InnoDB”。

    要使分割槽表變為非分割槽表,請執行此語句:

    ALTER TABLE *table_name* REMOVE PARTITIONING;
    
  3. 在 MySQL 8.0 中可能保留了以前未保留的一些關鍵字。請參見 Section 11.3,“關鍵字和保留字”。這可能導致以前用作識別符號的單詞變得非法。要修復受影響的語句,請使用識別符號引用。請參見 Section 11.2,“模式物件名稱”。

  4. MySQL 5.7 mysql系統資料庫中不能有與 MySQL 8.0 資料字典使用的表同名的表。要識別具有這些名稱的表,請執行此查詢:

    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE LOWER(TABLE_SCHEMA) = 'mysql'
    and LOWER(TABLE_NAME) IN
    (
    'catalogs',
    'character_sets',
    'check_constraints',
    'collations',
    'column_statistics',
    'column_type_elements',
    'columns',
    'dd_properties',
    'events',
    'foreign_key_column_usage',
    'foreign_keys',
    'index_column_usage',
    'index_partitions',
    'index_stats',
    'indexes',
    'parameter_type_elements',
    'parameters',
    'resource_groups',
    'routines',
    'schemata',
    'st_spatial_reference_systems',
    'table_partition_values',
    'table_partitions',
    'table_stats',
    'tables',
    'tablespace_files',
    'tablespaces',
    'triggers',
    'view_routine_usage',
    'view_table_usage'
    );
    

    查詢報告的任何表必須被刪除或重新命名(使用RENAME TABLE)。這可能還需要對使用受影響表的應用程式進行更改。

  5. 不能有外來鍵約束名超過 64 個字元的表。使用此查詢標識約束名過長的表:

    SELECT TABLE_SCHEMA, TABLE_NAME
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME IN
      (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1),
                   INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1)
       FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN
       WHERE CHAR_LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);
    

    對於約束名超過 64 個字元的表,請刪除約束並使用不超過 64 個字元的約束名重新新增它(使用ALTER TABLE)。

  6. 不能定義由sql_mode系統變數定義的過時 SQL 模式。嘗試使用過時的 SQL 模式會阻止 MySQL 8.0 啟動。應該修改使用過時 SQL 模式的應用程式以避免它們。有關 MySQL 8.0 中刪除的 SQL 模式的資訊,請參見伺服器更改。

  7. 不能有顯式定義列名超過 64 個字元的檢視(MySQL 5.7 允許具有長達 255 個字元的列名的檢視)。為避免升級錯誤,應在升級之前修改此類檢視。目前,識別列名超過 64 個字元的檢視的唯一方法是使用SHOW CREATE VIEW檢查檢視定義。您還可以透過查詢資訊模式VIEWS表來檢查檢視定義。

  8. 在個別ENUMSET列元素中,字元長度超過 255 個字元或 1020 個位元組的表格或儲存過程是不允許的。在 MySQL 8.0 之前,ENUMSET列元素的最大組合長度為 64K。在 MySQL 8.0 中,單個ENUMSET列元素的最大字元長度為 255 個字元,最大位元組長度為 1020 個位元組(1020 位元組限制支援多位元組字符集)。在升級到 MySQL 8.0 之前,修改任何超出新限制的ENUMSET列元素。如果不這樣做,升級將因錯誤而失敗。

  9. 在升級到 MySQL 8.0.13 或更高版本之前,不能有駐留在共享InnoDB表空間中的表分割槽,其中包括系統表空間和通用表空間。透過查詢INFORMATION_SCHEMA來識別共享表空間中的表分割槽:

    如果從 MySQL 5.7 升級,請執行此查詢:

    SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
      WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';
    

    如果從較早的 MySQL 8.0 版本升級,請執行此查詢:

    SELECT DISTINCT NAME, SPACE, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLES
      WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE 'Single';
    

    使用ALTER TABLE ... REORGANIZE PARTITION將表分割槽從共享表空間移動到每個表的表空間:

    ALTER TABLE *table_name* REORGANIZE PARTITION *partition_name*
      INTO (*partition_definition* TABLESPACE=innodb_file_per_table);
    
  10. 不能有來自 MySQL 8.0.12 或更低版本的查詢和儲存程式定義使用ASCDESC修飾符用於GROUP BY子句。否則,升級到 MySQL 8.0.13 或更高版本可能會失敗,複製到 MySQL 8.0.13 或更高版本的複製伺服器也可能失敗。有關更多詳細資訊,請參見 SQL Changes。

  11. 您的 MySQL 5.7 安裝不得使用 MySQL 8.0 不支援的功能。這裡的任何更改都是特定於安裝的,但以下示例說明了要查詢的內容:

    在 MySQL 8.0 中已刪除了一些伺服器啟動選項和系統變數。請參閱 MySQL 8.0 中刪除的功能,以及第 1.4 節,“MySQL 8.0 中新增、棄用或刪除的伺服器和狀態變數和選項”。如果您使用其中任何內容,升級需要進行配置更改。

    例如:由於資料字典提供有關資料庫物件的資訊,伺服器不再檢查資料目錄中的目錄名稱以查詢資料庫。因此,--ignore-db-dir選項是多餘的並已被移除。為了處理這個問題,在升級到 MySQL 8.0 之前,從啟動配置中刪除任何--ignore-db-dir的例項。此外,在升級到 MySQL 8.0 之前,刪除或移動命名資料目錄的子目錄。(或者,讓 8.0 伺服器將這些目錄新增到資料字典作為資料庫,然後使用DROP DATABASE刪除每個資料庫。)

  12. 如果您打算在升級時將lower_case_table_names設定為 1,請確保在升級之前模式和表名稱均為小寫。否則,可能會由於模式或表名稱大小寫不匹配而導致失敗。您可以使用以下查詢檢查包含大寫字元的模式和表名稱:

    mysql> select TABLE_NAME, if(sha(TABLE_NAME) !=sha(lower(TABLE_NAME)),'Yes','No') as UpperCase from information_schema.tables;
    

    截至 MySQL 8.0.19 版本,如果lower_case_table_names=1,升級過程將檢查表和模式名稱,確保所有字元均為小寫。如果發現表或模式名稱包含大寫字元,則升級過程將因錯誤而失敗。

    注意

    不建議在升級時更改lower_case_table_names設定。

如果由於上述任何問題導致 MySQL 8.0 升級失敗,則伺服器將撤銷對資料目錄的所有更改。在這種情況下,刪除所有重做日誌檔案並在現有資料目錄上重新啟動 MySQL 5.7 伺服器以解決錯誤。重做日誌檔案(ib_logfile*)預設位於 MySQL 資料目錄中。在錯誤修復後,在嘗試再次升級之前執行慢關閉(透過設定innodb_fast_shutdown=0)。

3.7 在 Unix/Linux 上升級 MySQL 二進位制或基於包的安裝

原文:dev.mysql.com/doc/refman/8.0/en/upgrade-binary-package.html

本節描述瞭如何在 Unix/Linux 上升級 MySQL 二進位制和基於包的安裝。介紹了原地和邏輯升級方法。

  • 原地升級

  • 邏輯升級

  • MySQL Cluster 升級

原地升級

原地升級涉及關閉舊的 MySQL 伺服器,用新的 MySQL 二進位制檔案或包替換舊的檔案,重新啟動現有資料目錄上的 MySQL,並升級需要升級的現有安裝的任何剩餘部分。有關可能需要升級的詳細資訊,請參閱 Section 3.4, “MySQL 升級過程升級的內容”。

注意

如果您正在升級最初透過安裝多個 RPM 包生成的安裝程式,請升級所有包,而不僅僅是一些。例如,如果您之前安裝了伺服器和客戶端 RPM 包,請不要僅升級伺服器 RPM 包。

對於某些 Linux 平臺,從 RPM 或 Debian 包安裝 MySQL 包括 systemd 支援以管理 MySQL 伺服器的啟動和關閉。在這些平臺上,mysqld_safe未安裝。在這種情況下,使用 systemd 代替以下說明中使用的方法進行伺服器的啟動和關閉。請參閱 Section 2.5.9, “使用 systemd 管理 MySQL 伺服器”。

對於 MySQL Cluster 安裝的升級,請參閱 MySQL Cluster 升級。

���行原地升級:

  1. 檢視 Section 3.1, “開始之前”中的資訊。

  2. 透過完成 Section 3.6, “準備升級安裝”中的初步檢查,確保您的安裝準備好升級。

  3. 如果您在 InnoDB 中使用 XA 事務,請在升級之前執行XA RECOVER以檢查未提交的 XA 事務。如果返回結果,請透過發出XA COMMITXA ROLLBACK語句提交或回滾 XA 事務。

  4. 如果您從 MySQL 5.7.11 或更早版本升級到 MySQL 8.0,並且存在加密的 InnoDB 表空間,請透過執行此語句旋轉金鑰環主金鑰:

    ALTER INSTANCE ROTATE INNODB MASTER KEY;
    
  5. 如果您通常將 MySQL 伺服器配置為將innodb_fast_shutdown設定為2(冷關閉),請透過執行以下任一語句之一配置它執行快速或慢速關閉:

    SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
    SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown
    

    使用快速或慢速關閉,InnoDB會將其撤銷日誌和資料檔案保留在一種狀態,以便在不同版本之間的檔案格式差異情況下進行處理。

  6. 關閉舊的 MySQL 伺服器。例如:

    mysqladmin -u root -p shutdown
    
  7. 升級 MySQL 二進位制檔案或軟體包。如果升級二進位制安裝,解壓新的 MySQL 二進位制分發包。參見獲取和解壓分發包。對於基於軟體包的安裝,請安裝新軟體包。

  8. 啟動 MySQL 8.0 伺服器,使用現有的資料目錄。例如:

    mysqld_safe --user=mysql --datadir=*/path/to/existing-datadir* &
    

    如果存在加密的InnoDB表空間,請使用--early-plugin-load選項載入金鑰環外掛。

    當您啟動 MySQL 8.0 伺服器時,它會自動檢測資料字典表是否存在。如果不存在,伺服器將在資料目錄中建立這些表,填充後設資料,然後繼續正常的啟動序列。在此過程中,伺服器會升級所有資料庫物件的後設資料,包括資料庫、表空間、系統和使用者表、檢視以及儲存程式(儲存過程和函式、觸發器和事件排程器事件)。伺服器還會刪除以前用於儲存後設資料的檔案。例如,在從 MySQL 5.7 升級到 MySQL 8.0 後,您可能會注意到表不再具有.frm檔案。

    如果此步驟失敗,伺服器將還原對資料目錄的所有更改。在這種情況下,您應刪除所有重做日誌檔案,在相同資料目錄上啟動您的 MySQL 5.7 伺服器,並修復任何錯誤的原因。然後執行另一個慢速關閉 5.7 伺服器,並啟動 MySQL 8.0 伺服器再次嘗試。

  9. 在前一步驟中,伺服器根據需要升級資料字典。現在需要執行任何剩餘的升級操作:

    • 從 MySQL 8.0.16 開始,伺服器會在前一步驟中執行這些操作,對mysql系統資料庫在 MySQL 5.7 和 MySQL 8.0 之間所需的任何更改進行處理,以便您可以利用新的許可權或功能。它還會為 MySQL 8.0 更新效能模式、INFORMATION_SCHEMAsys資料庫,並檢查所有使用者資料庫是否與當前版本的 MySQL 不相容。

    • 在 MySQL 8.0.16 之前,伺服器僅在前一步驟中升級資料字典。成功啟動 MySQL 8.0 伺服器後,執行mysql_upgrade來執行剩餘的升級任務:

      mysql_upgrade -u root -p
      

      然後關閉並重新啟動 MySQL 伺服器,以確保對系統表所做的任何更改生效。例如:

      mysqladmin -u root -p shutdown
      mysqld_safe --user=mysql --datadir=*/path/to/existing-datadir* &
      

      第一次啟動 MySQL 8.0 伺服器(在之前的步驟中),您可能會在錯誤日誌中看到有關未升級表的訊息。如果mysql_upgrade已成功執行,則第二次啟動伺服器時不應出現此類訊息。

注意

升級過程不會升級時區表的內容。有關升級說明,請參見第 7.1.15 節,“MySQL 伺服器時區支援”。

如果升級過程使用mysql_upgrade(即在 MySQL 8.0.16 之前),該過程也不會升級幫助表的內容。在這種情況下的升級說明,請參見第 7.1.17 節,“伺服器端幫助支援”。

邏輯升級

邏輯升級涉及使用備份或匯出工具(如mysqldumpmysqlpump)從舊的 MySQL 例項中匯出 SQL,安裝新的 MySQL 伺服器,並將 SQL 應用於新的 MySQL 例項。有關可能需要升級的詳細資訊,請參見第 3.4 節,“MySQL 升級過程升級了什麼”。

注意

對於某些 Linux 平臺,從 RPM 或 Debian 軟體包安裝 MySQL 包括 systemd 支援以管理 MySQL 伺服器的啟動和關閉。在這些平臺上,不安裝mysqld_safe。在這種情況下,請使用 systemd 來啟動和關閉伺服器,而不是以下說明中使用的方法。請參見第 2.5.9 節,“使用 systemd 管理 MySQL 伺服器”。

警告

將從先前的 MySQL 版本中提取的 SQL 應用於新的 MySQL 版本可能會由於新功能和能力的不相容性而導致錯誤。因此,從先前的 MySQL 版本中提取的 SQL 可能需要修改以實現邏輯升級。

在升級到最新的 MySQL 8.0 版本之前,執行第 3.6 節,“準備升級安裝”中描述的步驟以識別不相容性。

執行邏輯升級:

  1. 檢視第 3.1 節,“開始之前”中的資訊。

  2. 從先前的 MySQL 安裝中匯出現有資料:

    mysqldump -u root -p
      --add-drop-table --routines --events
      --all-databases --force > data-for-upgrade.sql
    

    注意

    如果您的資料庫包含儲存程式,請使用--routines--events選項與mysqldump(如上所示)。--all-databases選項包括轉儲中的所有資料庫,包括儲存系統表的mysql資料庫。

    重要

    如果您的表包含生成列,請使用 MySQL 5.7.9 或更高版本提供的mysqldump實用程式建立轉儲檔案。較早版本提供的mysqldump實用程式對生成列定義使用了不正確的語法(Bug #20769542)。您可以使用資訊模式COLUMNS表來識別具有生成列的表。

  3. 關閉舊的 MySQL 伺服器。例如:

    mysqladmin -u root -p shutdown
    
  4. 安裝 MySQL 8.0。有關安裝說明,請參見 Chapter 2, Installing MySQL

  5. 初始化新的資料目錄,如 Section 2.9.1, “Initializing the Data Directory”中所述。例如:

    mysqld --initialize --datadir=*/path/to/8.0-datadir*
    

    複製臨時顯示在螢幕上或寫入錯誤日誌以供以後使用的 'root'@'localhost' 密碼。

  6. 啟動 MySQL 8.0 伺服器,使用新的資料目錄。例如:

    mysqld_safe --user=mysql --datadir=*/path/to/8.0-datadir* &
    
  7. 重置root密碼:

    $> mysql -u root -p
    Enter password: ****  <- enter temporary root password
    
    mysql> ALTER USER USER() IDENTIFIED BY '*your new password*';
    
  8. 將先前建立的轉儲檔案載入到新的 MySQL 伺服器中。例如:

    mysql -u root -p --force < data-for-upgrade.sql
    

    注意

    當伺服器啟用 GTIDs(gtid_mode=ON)時,不建議載入包含系統表的轉儲檔案。mysqldump 為使用非事務性 MyISAM 儲存引擎的系統表發出 DML 指令,而在啟用 GTIDs 時,這種組合是不允許的。還要注意,將從啟用 GTIDs 的伺服器中載入的轉儲檔案載入到另一個啟用 GTIDs 的伺服器中會生成不同的事務識別符號。

  9. 執行任何剩餘的升級操作:

    • 在 MySQL 8.0.16 及更高版本中,關閉伺服器,然後使用--upgrade=FORCE選項重新啟動以執行剩餘的升級任務:

      mysqladmin -u root -p shutdown
      mysqld_safe --user=mysql --datadir=*/path/to/8.0-datadir* --upgrade=FORCE &
      

      重新啟動時使用--upgrade=FORCE,伺服器會在 MySQL 5.7 和 MySQL 8.0 之間對mysql系統模式進行所需的任何更改,以便您可以利用新的許可權或功能。它還會將效能模式、INFORMATION_SCHEMAsys模式更新到 MySQL 8.0,並檢查所有使用者模式與當前版本的 MySQL 的不相容性。

    • 在 MySQL 8.0.16 之前,執行mysql_upgrade執行剩餘的升級任務:

      mysql_upgrade -u root -p
      

      然後關閉並重新啟動 MySQL 伺服器,以確保對系統表所做的任何更改生效。例如:

      mysqladmin -u root -p shutdown
      mysqld_safe --user=mysql --datadir=*/path/to/8.0-datadir* &
      

注意

升級過程不會升級時區表的內容。有關升級說明,請參見第 7.1.15 節,“MySQL 伺服器時區支援”。

如果升級過程使用mysql_upgrade(即在 MySQL 8.0.16 之前),該過程也不會升級幫助表的內容。在這種情況下的升級說明,請參見第 7.1.17 節,“伺服器端幫助支援”。

注意

載入包含 MySQL 5.7 mysql模式的轉儲檔案會重新建立兩個不再使用的表:eventproc。(相應的 MySQL 8.0 表是eventsroutines,都是資料字典表並受到保護。)在確認升級成功後,您可以透過執行以下 SQL 語句刪除eventproc表:

DROP TABLE mysql.event;
DROP TABLE mysql.proc;

MySQL Cluster 升級

本節資訊是就地升級中描述的程式的附屬內容,用於升級 MySQL Cluster。

從 MySQL 8.0.16 開始,MySQL Cluster 升級可以作為常規滾動升級執行,遵循通常的三個有序步驟:

  1. 升級 MGM 節點。

  2. 逐個升級資料節點。

  3. 逐個升級 API 節點(包括 MySQL 伺服器)。

升級每個節點的方式幾乎與 MySQL 8.0.16 之前相同,因為升級資料字典和升級系統表之間有區別。升級每個單獨的mysqld有兩個步驟:

  1. 匯入資料字典。

    使用--upgrade=MINIMAL選項啟動新伺服器以升級資料字典但不升級系統表。這與 MySQL 8.0.16 之前啟動伺服器但不呼叫mysql_upgrade的操作基本相同。

    MySQL 伺服器必須連線到NDB才能完成此階段。如果存在任何NDBNDBINFO表,並且伺服器無法連線到叢集,則會顯示錯誤訊息並退出:

    Failed to Populate DD tables.
    
  2. 升級系統表。

    在 MySQL 8.0.16 之前,DBA 呼叫 mysql_upgrade 客戶端來升級系統表。從 MySQL 8.0.16 開始,伺服器執行此操作:為了升級系統表,重新啟動每個單獨的 mysqld,不使用 --upgrade=MINIMAL 選項。

3.8 使用 MySQL Yum 儲存庫升級 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/updating-yum-repo.html

對於支援 Yum 的平臺(參見第 2.5.1 節,“使用 MySQL Yum 儲存庫在 Linux 上安裝 MySQL”,有一個列表),您可以使用 MySQL Yum 儲存庫執行就地升級 MySQL(即,替換舊版本,然後使用舊資料檔案執行新版本)。

注意事項

  • 在對 MySQL 執行任何更新之前,請仔細遵循第三章,升級 MySQL中的說明。在那裡討論的其他說明中,特別重要的是在更新之前備份您的資料庫。

  • 以下說明假設您已經使用 MySQL Yum 儲存庫或直接從MySQL 開發者區的 MySQL 下載頁面下載的 RPM 包安裝了 MySQL;如果不是這種情況,請按照使用 MySQL Yum 儲存庫替換 MySQL 的第三方發行版中的說明操作。

  1. 選擇目標系列

    預設情況下,MySQL Yum 儲存庫將 MySQL 更新到您在安裝過程中選擇的釋出系列的最新版本(有關詳細資訊,請參見選擇釋出系列),這意味著,例如,5.7.x 安裝 不會 自動更新到 8.0.x 版本。要更新到另一個釋出系列,您必須首先禁用已選擇的系列的子儲存庫(預設情況下或自行選擇),然後啟用目標系列的子儲存庫。要執行此操作,請參見選擇釋出系列中給出的一般說明。對於從 MySQL 5.7 升級到 8.0,請執行選擇釋出系列中所示步驟的相反操作,禁用 MySQL 5.7 系列的子儲存庫,並啟用 MySQL 8.0 系列的子儲存庫。

    一般規則是,要從一個釋出系列升級到另一個釋出系列,請先轉到下一個系列,而不是跳過一個系列。例如,如果您當前執行 MySQL 5.6 並希望升級到 8.0,請先升級到 MySQL 5.7,然後再升級到 8.0。

    重要

    有關從 MySQL 5.7 升級到 8.0 的重要資訊,請參閱從 MySQL 5.7 升級到 8.0。

  2. 升級 MySQL

    透過以下命令升級 MySQL 及其元件,對於不支援 dnf 的平臺:

    sudo yum update mysql-server
    

    對於支援 dnf 的平臺:

    sudo dnf upgrade mysql-server
    

    或者,您可以透過告訴 Yum 更新系統上的所有內容來更新 MySQL,這可能需要更多時間。對於未啟用 dnf 的平臺:

    sudo yum update
    

    對於啟用 dnf 的平臺:

    sudo dnf upgrade
    
  3. 重新啟動 MySQL

    MySQL 伺服器在透過 Yum 更新後總是重新啟動。在 MySQL 8.0.16 之前,伺服器重新啟動後執行mysql_upgrade來檢查並可能解決舊資料與升級軟體之間的任何不相容性。mysql_upgrade還執行其他功能;有關詳細資訊,請參見 Section 6.4.5,“mysql_upgrade — 檢查和升級 MySQL 表”。從 MySQL 8.0.16 開始,不再需要此步驟,因為伺服器執行了以前由mysql_upgrade處理的所有任務。

您還可以僅更新特定元件。使用以下命令列出所有已安裝的 MySQL 元件的軟體包(對於啟用 dnf 的系統,請將命令中的 yum 替換為 dnf):

sudo yum list installed | grep "^mysql"

在確定您選擇的元件的軟體包名稱後,使用以下命令更新軟體包,將 package-name 替換為軟體包的名稱。對於未啟用 dnf 的平臺:

sudo yum update *package-name*

對於啟用 dnf 的平臺:

sudo dnf upgrade *package-name*

升級共享客戶端庫

使用 Yum 倉庫更新 MySQL 後,使用舊版本共享客戶端庫編譯的應用程式應繼續工作。

如果重新編譯應用程式並動態連結它們與更新的庫:與新版本共享庫一樣,新舊庫之間的符號版本之間存在差異或新增(例如,在新的標準 8.0 共享客戶端庫和一些較舊的—之前或變體—版本之間存在符號版本之間的差異或新增,這些共享庫是由 Linux 發行版的軟體倉庫原生提供的,或來自其他來源),在這些更新的新共享庫上編譯的任何應用程式需要在部署應用程式的系統上使用這些更新的庫。如預期的那樣,如果這些庫不在位,需要共享庫的應用程式將失敗。因此,請確保在這些系統上部署來自 MySQL 的共享庫軟體包。為此,請將 MySQL Yum 倉庫新增到系統中(請參見新增 MySQL Yum 倉庫)並按照使用 Yum 安裝其他 MySQL 產品和元件中給出的說明安裝最新的共享庫。

3.9 透過 MySQL APT 儲存庫升級 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/updating-apt-repo.html

在 Debian 和 Ubuntu 平臺上,要執行 MySQL 及其元件的原地升級,請使用 MySQL APT 儲存庫。請參閱 A Quick Guide to Using the MySQL APT Repository 中的透過 MySQL APT 儲存庫升級 MySQL。

3.10 使用 MySQL SLES 倉庫升級 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/updating-sles-repo.html

在 SUSE Linux Enterprise Server (SLES) 平臺上,要執行 MySQL 及其元件的就地升級,請使用 MySQL SLES 倉庫。參見 使用 MySQL SLES 倉庫升級 MySQL 在 使用 MySQL SLES 倉庫快速指南 中。

3.11 在 Windows 上升級 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/windows-upgrading.html

在 Windows 上升級 MySQL 有兩種方法:

  • 使用 MySQL Installer

  • 使用 Windows ZIP 存檔發行版

您選擇的方法取決於現有安裝是如何進行的。在繼續之前,請檢視第三章,“升級 MySQL”,瞭解有關升級 MySQL 的其他資訊,這些資訊不特定於 Windows。

注意

無論您選擇哪種方法,在執行升級之前,始終要備份當前的 MySQL 安裝。請參閱第 9.2 節,“資料庫備份方法”。

不支援非 GA 版本之間的升級(或從非 GA 版本升級到 GA 版本)。非 GA 版本中會發生重大的開發變化,您可能會遇到相容性問題或啟動伺服器時出現問題。

注意

MySQL Installer 不支援在社群版本和商業版本之間的升級。如果您需要此型別的升級,請使用 ZIP 存檔方法進行。

使用 MySQL Installer 升級 MySQL

噹噹前伺服器安裝是使用 MySQL Installer 進行的,並且升級在當前釋出系列內時,使用 MySQL Installer 進行升級是最佳方法。MySQL Installer 不支援在釋出系列之間的升級,例如從 5.7 升級到 8.0,並且不提供升級指示器來提示您進行升級。有關在釋出系列之間升級的說明,請參閱使用 Windows ZIP 發行版升級 MySQL。

要使用 MySQL Installer 進行升級:

  1. 啟動 MySQL Installer。

  2. 從儀表板中,點選 Catalog 下載目錄的最新更改。只有在儀表板顯示伺服器版本號旁邊有箭頭時,安裝的伺服器才能升級。

  3. 點選升級。現在,所有有更新版本的產品都會顯示在列表中。

    注意

    MySQL Installer 取消里程碑版本(預釋出)在同一釋出系列中的伺服器升級選項。此外,它顯示警告以指示不支援升級,識別繼續的風險,並提供手動執行升級步驟的摘要。您可以重新選擇伺服器升級並自行承擔風險繼續進行。

  4. 除非您打算此時升級其他產品,否則取消選擇除 MySQL 伺服器產品之外的所有產品,並點選下一步。

  5. 點選“執行”開始下載。下載完成後,點選“下一步”開始升級操作。

    升級到 MySQL 8.0.16 及更高版本可能會顯示一個選項,跳過系統表的升級檢查和處理。有關此選項的更多資訊,請參閱 Important server upgrade conditions。

  6. 配置伺服器。

使用 Windows ZIP 分發升級 MySQL。

使用 Windows ZIP 存檔分發執行升級:

  1. dev.mysql.com/downloads/下載最新的 Windows ZIP 存檔分發的 MySQL。

  2. 如果伺服器正在執行,請停止它。如果伺服器已安裝為服務,請使用命令提示符中的以下命令停止服務:

    C:\> SC STOP *mysqld_service_name*
    

    或者,使用NET STOP mysqld_service_name

    如果未將 MySQL 伺服器作為服務執行,請使用mysqladmin停止它。例如,在從 MySQL 5.7 升級到 8.0 之前,請使用 MySQL 5.7 中的mysqladmin如下:

    C:\> "C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqladmin" -u root shutdown
    

    注意

    如果 MySQL root使用者賬戶有密碼,請使用帶有-p選項的mysqladmin並在提示時輸入密碼。

  3. 解壓 ZIP 存檔。您可以覆蓋現有的 MySQL 安裝(通常位於C:\mysql),或將其安裝到不同的目錄,例如C:\mysql8。建議覆蓋現有安裝。

  4. 重新啟動伺服器。例如,如果將 MySQL 作為服務執行,請使用SC START mysqld_service_nameNET START mysqld_service_name命令,否則直接呼叫mysqld

  5. 在 MySQL 8.0.16 之前,以管理員身份執行mysql_upgrade檢查您的表,必要時嘗試修復它們,並更新授權表(如果已更改),以便利用任何新功能。請參閱 Section 6.4.5, “mysql_upgrade — Check and Upgrade MySQL Tables”。從 MySQL 8.0.16 開始,不再需要此步驟,因為伺服器執行了以前由mysql_upgrade處理的所有任務。

  6. 如果遇到錯誤,請參閱 Section 2.3.5, “Troubleshooting a Microsoft Windows MySQL Server Installation”。

3.12 升級 Docker 安裝的 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/upgrade-docker-mysql.html

要升級 MySQL 的 Docker 安裝,請參考 升級 MySQL 伺服器容器。

3.13 升級故障排除

原文:dev.mysql.com/doc/refman/8.0/en/upgrade-troubleshooting.html

  • 在 MySQL 5.7 例項中,表的.frm檔案與InnoDB資料字典之間的模式不匹配可能導致升級到 MySQL 8.0 失敗。這種不匹配可能是由於.frm檔案損壞造成的。要解決此問題,請在再次嘗試升級之前轉儲和恢復受影響的表。

  • 如果出現問題,比如新的mysqld伺服器無法啟動,請驗證您是否有來自先前安裝的舊my.cnf檔案。您可以使用--print-defaults選項來檢查(例如,mysqld --print-defaults)。如果此命令顯示除程式名稱之外的任何內容,則您有一個影響伺服器或客戶端操作的活動my.cnf檔案。

  • 如果在升級後,您遇到編譯的客戶端程式出現問題,比如Commands out of sync或意外的核心轉儲,那麼您可能在編譯程式時使用了舊的標頭檔案或庫檔案。在這種情況下,請檢查您的mysql.h檔案和libmysqlclient.a庫檔案的日期,以驗證它們是否來自新的 MySQL 發行版。如果不是,請使用新的標頭檔案和庫檔案重新編譯您的程式。如果共享客戶端庫的主要版本號已更改(例如,從libmysqlclient.so.20libmysqlclient.so.21),則可能還需要重新編譯針對共享客戶端庫編譯的程式。

  • 如果您已經建立了一個具有特定名稱的可載入函式,並將 MySQL 升級到實現具有相同名稱的新內建函式的版本,則該可載入函式將變得無法訪問。要糾正此問題,請使用DROP FUNCTION刪除可載入函式,然後使用CREATE FUNCTION使用不衝突的不同名稱重新建立可載入函式。如果新版本的 MySQL 實現了與現有儲存函式同名的內建函式,則情況也是如此。有關伺服器如何解釋對不同型別函式的引用的規則,請參見 Section 11.2.5, “Function Name Parsing and Resolution”。

  • 如果由於第 3.6 節“準備升級安裝”中概述的任何問題而導致升級到 MySQL 8.0 失敗,則伺服器會將所有更改恢復到資料目錄。在這種情況下,刪除所有重做日誌檔案並在現有資料目錄上重新啟動 MySQL 5.7 伺服器以解決錯誤。重做日誌檔案(ib_logfile*)預設位於 MySQL 資料目錄中。在錯誤修復後,在嘗試再次升級之前執行慢關閉(透過設定innodb_fast_shutdown=0)。

3.14 重建或修復表或索引

原文:dev.mysql.com/doc/refman/8.0/en/rebuilding-tables.html

本節描述瞭如何重建或修復表或索引,可能是由於:

  • MySQL 處理資料型別或字符集的更改。例如,校對錯誤可能已經被糾正,需要重建表以更新使用該校對的字元列的索引。

  • CHECK TABLE 報告的需要表修復或升級,mysqlcheckmysql_upgrade

重建表的方法包括:

  • 轉儲和重新載入方法

  • ALTER TABLE 方法

  • REPAIR TABLE 方法

轉儲和重新載入方法

如果您因為不同版本的 MySQL 在二進位制(原地)升級或降級後無法處理它們而需要重建表,您必須使用轉儲和重新載入的方法。在使用原始版本的 MySQL 升級或降級之前轉儲表。然後在升級或降級之後重新載入表。

如果您僅使用轉儲和重新載入方法來重建表以重建索引,您可以在升級或降級之前或之後執行轉儲。重新載入仍然必須在之後進行。

如果您需要重建一個 InnoDB 表,因為 CHECK TABLE 操作指示需要進行表升級,請使用 mysqldump 建立一個轉儲檔案,然後使用 mysql 重新載入檔案。如果 CHECK TABLE 操作指示存在損壞或導致 InnoDB 失敗,請參考 第 17.21.3 節,“強制 InnoDB 恢復” 瞭解如何使用 innodb_force_recovery 選項重新啟動 InnoDB。要了解 CHECK TABLE 可能遇到的問題型別,請參考 第 15.7.3.2 節,“CHECK TABLE 語句” 中的 InnoDB 註釋。

要透過轉儲和重新載入來重建表,使用 mysqldump 建立一個轉儲檔案,然後使用 mysql 重新載入檔案:

mysqldump *db_name* t1 > dump.sql
mysql *db_name* < dump.sql

要重建單個資料庫中的所有表格,請指定資料庫名稱,不需要跟隨任何表格名稱:

mysqldump *db_name* > dump.sql
mysql *db_name* < dump.sql

要重建所有資料庫中的所有表格,請使用--all-databases選項:

mysqldump --all-databases > dump.sql
mysql < dump.sql

ALTER TABLE 方法

要使用ALTER TABLE重新構建表格,請使用“null”修改;也就是說,使用一個ALTER TABLE語句“更改”表格以使用它已經具有的儲存引擎。例如,如果t1是一個InnoDB表格,使用以下語句:

ALTER TABLE t1 ENGINE = InnoDB;

如果不確定在ALTER TABLE語句中指定哪個儲存引擎,請使用SHOW CREATE TABLE來顯示錶格定義。

REPAIR TABLE 方法

REPAIR TABLE方法僅適用於MyISAMARCHIVECSV表格。

如果表格檢查操作指示存在損壞或需要升級,則可以使用REPAIR TABLE。例如,要修復一個MyISAM表格,請使用以下語句:

REPAIR TABLE t1;

mysqlcheck --repair提供了對REPAIR TABLE語句的命令列訪問。這可以是一個更方便的修復表格的方法,因為您可以使用--databases--all-databases選項來修復特定資料庫中的所有表格或所有資料庫中的所有表格:

mysqlcheck --repair --databases *db_name* ...
mysqlcheck --repair --all-databases

3.15 將 MySQL 資料庫複製到另一臺機器

原文:dev.mysql.com/doc/refman/8.0/en/copying-databases.html

在需要在不同架構之間傳輸資料庫的情況下,您可以使用mysqldump建立包含 SQL 語句的檔案。然後,您可以將檔案傳輸到另一臺機器,並將其作為輸入提供給mysql客戶端。

使用mysqldump --help檢視可用的選項。

注意

如果在建立轉儲的伺服器上使用了 GTIDs(gtid_mode=ON),預設情況下,mysqldump會在轉儲中包含gtid_executed集的內容,以將其傳輸到新機器。這樣做的結果可能會因涉及的 MySQL 伺服器版本而有所不同。檢視mysqldump--set-gtid-purged選項的描述,以瞭解您正在使用的版本的情況,以及如何更改行為,如果預設行為的結果不適合您的情況。

將資料庫在兩臺機器之間移動的最簡單(儘管不是最快)方法是在儲存資料庫的機器上執行以下命令:

mysqladmin -h '*other_hostname*' create *db_name*
mysqldump *db_name* | mysql -h '*other_hostname*' *db_name*

如果您想要透過緩慢的網路從遠端機器複製資料庫,可以使用以下命令:

mysqladmin create *db_name*
mysqldump -h '*other_hostname*' --compress *db_name* | mysql *db_name*

您還可以將轉儲儲存在檔案中,將檔案傳輸到目標機器,然後在那裡將檔案載入到資料庫中。例如,您可以在源機器上將資料庫轉儲到壓縮檔案中,如下所示:

mysqldump --quick *db_name* | gzip > *db_name*.gz

將包含資料庫內容的檔案傳輸到目標機器,並在那裡執行這些命令:

mysqladmin create *db_name*
gunzip < *db_name*.gz | mysql *db_name*

您還可以使用mysqldumpmysqlimport來傳輸資料庫。對於大表,這比簡單使用mysqldump要快得多。在以下命令中,DUMPDIR代表您用於儲存mysqldump輸出的完整路徑名。

首先,建立用於輸出檔案的目錄並轉儲資料庫:

mkdir *DUMPDIR*
mysqldump --tab=*DUMPDIR*
   *db_name*

然後將DUMPDIR目錄中的檔案傳輸到目標機器上的相應目錄,並在那裡將檔案載入到 MySQL 中:

mysqladmin create *db_name*           # create database
cat *DUMPDIR*/*.sql | mysql *db_name*   # create tables in database
mysqlimport *db_name*
   *DUMPDIR*/*.txt   # load data into tables

不要忘記複製mysql資料庫,因為那裡儲存著授權表。在新機器上,您可能需要以 MySQL root使用者身份執行命令,直到mysql資料庫就位。

在新機器上匯入mysql資料庫後,執行mysqladmin flush-privileges,以便伺服器重新載入授權表資訊。

第四章 降級 MySQL

原文:dev.mysql.com/doc/refman/8.0/en/downgrading.html

從 MySQL 8.0 降級到 MySQL 5.7,或者從 MySQL 8.0 的一個版本降級到之前的 MySQL 8.0 版本,都不受支援。唯一支援的替代方案是恢復在升級之前進行的備份。因此,在開始升級過程之前,務必備份您的資料。

第五章 教程

原文:dev.mysql.com/doc/refman/8.0/en/tutorial.html

目錄

5.1 連線和斷開伺服器

5.2 輸入查詢

5.3 建立和使用資料庫

5.3.1 建立和選擇資料庫

5.3.2 建立表

5.3.3 將資料載入到表中

5.3.4 從表中檢索資訊

5.4 獲取有關資料庫和表的資訊

5.5 批處理模式中使用 mysql

5.6 常見查詢示例

5.6.1 列的最大值

5.6.2 某列的最大行

5.6.3 每組列的最大值

5.6.4 某列的分組最大值的行

5.6.5 使用使用者定義變數

5.6.6 使用外來鍵

5.6.7 在兩個鍵上搜尋

5.6.8 計算每天的訪問量

5.6.9 使用 AUTO_INCREMENT

5.7 使用 MySQL 與 Apache

本章透過展示如何使用mysql客戶端程式建立和使用簡單資料庫,為您提供了 MySQL 的教程介紹。mysql(有時稱為“終端監視器”或只是“監視器”)是一個互動式程式,可以讓您連線到 MySQL 伺服器,執行查詢並檢視結果。mysql也可以以批處理模式使用:您事先將查詢放入檔案中,然後告訴mysql執行檔案的內容。這裡涵蓋了使用mysql的兩種方式。

要檢視mysql提供的選項列表,請使用--help選項呼叫它:

$> mysql --help

本章假設您的機器上已安裝mysql,並且可以連線到可用的 MySQL 伺服器。如果不是這樣,請聯絡您的 MySQL 管理員。(如果是管理員,則需要查閱本手冊的相關部分,如第七章,MySQL 伺服器管理。)

本章描述了建立和使用資料庫的整個過程。如果您只對訪問現有資料庫感興趣,您可能想跳過描述如何建立資料庫及其包含的表的部分。

由於本章是教程性質的,許多細節被必然省略了。請查閱手冊中相關章節,以獲取更多關於這裡涵蓋的主題的資訊。

5.1 連線和斷開伺服器

原文:dev.mysql.com/doc/refman/8.0/en/connecting-disconnecting.html

要連線到伺服器,通常需要在呼叫mysql時提供一個 MySQL 使用者名稱,並且很可能需要一個密碼。如果伺服器執行在您登入的機器之外的機器上,您還必須指定主機名。聯絡管理員以找出應該使用哪些連線引數來連線(即使用哪個主機、使用者名稱和密碼)。一旦知道正確的引數,您應該能夠像這樣連線:

$> mysql -h *host* -u *user* -p
Enter password: ********

hostuser 分別代表您的 MySQL 伺服器執行的主機名和您的 MySQL 帳戶的使用者名稱。替換適合您設定的值。********代表您的密碼;當mysql顯示輸入密碼:提示時輸入。

如果一切正常,您應該看到一些簡介資訊,然後是一個mysql>提示符:

$> mysql -h *host* -u *user* -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25338 to server version: 8.0.36-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

mysql>提示符告訴您mysql已準備好讓您輸入 SQL 語句。

如果您正在登入與 MySQL 執行在同一臺機器上,您可以省略主機,並簡單地使用以下內容:

$> mysql -u *user* -p

如果在嘗試登入時出現錯誤訊息,例如 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2),這意味著 MySQL 伺服器守護程式(Unix)或服務(Windows)未執行。請諮詢管理員或檢視適用於您作業系統的第二章 安裝 MySQL部分。

如果在嘗試登入時遇到其他常見問題,可以參考第 B.3.2 節 “使用 MySQL 程式時的常見錯誤”進行幫助。

一些 MySQL 安裝允許使用者以匿名(未命名)使用者連線到在本地主機上執行的伺服器。如果您的機器是這種情況,您應該能夠透過呼叫mysql而不使用任何選項來連線到該伺服器:

$> mysql

成功連線後,您可以隨時在mysql>提示符處鍵入QUIT(或\q)來斷開連線:

mysql> QUIT
Bye

在 Unix 上,您也可以透過按下 Control+D 來斷開連線。

在接下來的章節中,大多數示例假定您已連線到伺服器。它們透過mysql>提示符來指示這一點。

5.2 輸入查詢

原文:dev.mysql.com/doc/refman/8.0/en/entering-queries.html

確保您已連線到伺服器,如前一節所述。這本身並不選擇要使用的任何資料庫,但沒關係。此時,更重要的是瞭解如何發出查詢的基本原則,而不是立即開始建立表,將資料載入到其中並從中檢索資料。本節描述了輸入查詢的基本原則,使用幾個您可以嘗試以熟悉mysql工作方式的查詢。

這是一個簡單的查詢,要求伺服器告訴您其版本號和當前日期。按照這裡顯示的方式在mysql>提示後鍵入並按 Enter:

mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.8.0-m17 | 2015-12-21   |
+-----------+--------------+
1 row in set (0.02 sec)
mysql>

此查詢說明了關於mysql的幾個方面:

  • 查詢通常由一個 SQL 語句後跟一個分號組成。(有一些例外情況,其中分號可以省略。QUIT,前面提到的,是其中之一。我們稍後會介紹其他情況。)

  • 當您發出查詢時,mysql將其傳送到伺服器執行並顯示結果,然後列印另一個mysql>提示,表示它已準備好接受另一個查詢。

  • mysql以表格形式(行和列)顯示查詢輸出。第一行包含列的標籤。隨後的行是查詢結果。通常,列標籤是您從資料庫表中提取的列的名稱。如果您檢索的是表列的值而不是表列(如剛剛顯示的示例中),mysql使用表示式本身標記列。

  • mysql顯示了返回的行數以及查詢執行所需的時間,這給出了伺服器效能的大致概念。這些值不精確,因為它們代表掛鐘時間(而不是 CPU 或機器時間),並且受到伺服器負載和網路延遲等因素的影響。(為簡潔起見,本章剩餘示例中有時不顯示“結果集中的行”行。)

關鍵字可以以任何大小寫形式輸入。以下查詢是等效的:

mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

這是另一個查詢。它演示了您可以將mysql用作簡單的計算器:

mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------+---------+
| SIN(PI()/4)      | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 |      25 |
+------------------+---------+
1 row in set (0.02 sec)

到目前為止顯示的查詢相對較短,是單行語句。您甚至可以在一行上輸入多個語句。只需用分號結束每個語句:

mysql> SELECT VERSION(); SELECT NOW();
+-----------+
| VERSION() |
+-----------+
| 8.0.13    |
+-----------+
1 row in set (0.00 sec)

+---------------------+
| NOW()               |
+---------------------+
| 2018-08-24 00:56:40 |
+---------------------+
1 row in set (0.00 sec)

查詢不必全部在一行上給出,因此需要多行的長查詢不是問題。mysql透過查詢終止分號來確定語句的結束位置,而不是查詢輸入行的結尾。(換句話說,mysql接受自由格式的輸入:它收集輸入行但直到看到分號才執行它們。)

這是一個簡單的多行語句:

mysql> SELECT
 -> USER()
 -> ,
 -> CURRENT_DATE;
+---------------+--------------+
| USER()        | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2018-08-24   |
+---------------+--------------+

在這個例子中,請注意在輸入多行查詢的第一行後,提示符從mysql>變為->。這是mysql表示它尚未看到完整語句並正在等待其餘部分的方式。提示符是你的朋友,因為它提供了寶貴的反饋。如果你利用這個反饋,你就可以始終了解mysql正在等待什麼。

如果您決定不想執行正在輸入過程中的查詢,請鍵入\c取消它:

mysql> SELECT
 -> USER()
 -> \c
mysql>

在這裡,也請注意提示符。在鍵入\c後,它會切換回mysql>,提供反饋以指示mysql已準備好進行新查詢。

以下表顯示了您可能看到的每個提示符以及它們對mysql所處狀態的含義。

提示符 含義
mysql> 準備新查詢
-> 等待多行查詢的下一行
'> 等待下一行,等待完成以單引號(')開始的字串
"> 等待下一行,等待完成以雙引號(")開始的字串

| ``>| 等待下一行,等待完成以反引號開始的識別符號(```sql) | |/>| Waiting for next line, waiting for completion of a comment that began with/` |

Multiple-line statements commonly occur by accident when you intend to issue a query on a single line, but forget the terminating semicolon. In this case, mysql waits for more input:


mysql> SELECT USER()

->

```sql

If this happens to you (you think you've entered a statement but the only response is a `->` prompt), most likely **mysql** is waiting for the semicolon. If you don't notice what the prompt is telling you, you might sit there for a while before realizing what you need to do. Enter a semicolon to complete the statement, and **mysql** executes it:

mysql> SELECT USER()

-> ;

+---------------+

USER()

+---------------+

jon@localhost

+---------------+


The `'>` and `">` prompts occur during string collection (another way of saying that MySQL is waiting for completion of a string). In MySQL, you can write strings surrounded by either `'` or `"` characters (for example, `'hello'` or `"goodbye"`), and **mysql** lets you enter strings that span multiple lines. When you see a `'>` or `">` prompt, it means that you have entered a line containing a string that begins with a `'` or `"` quote character, but have not yet entered the matching quote that terminates the string. This often indicates that you have inadvertently left out a quote character. For example:

mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;

'>

If you enter this `SELECT` statement, then press **Enter** and wait for the result, nothing happens. Instead of wondering why this query takes so long, notice the clue provided by the `'>` prompt. It tells you that **mysql** expects to see the rest of an unterminated string. (Do you see the error in the statement? The string `'Smith` is missing the second single quotation mark.)

At this point, what do you do? The simplest thing is to cancel the query. However, you cannot just type `\c` in this case, because **mysql** interprets it as part of the string that it is collecting. Instead, enter the closing quote character (so **mysql** knows you've finished the string), then type `\c`:

mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;

'> '\c

mysql>


提示符改回`mysql>`,表示**mysql**已準備好進行新查詢。

``>`提示符類似於`'>`和`">`提示符,但表示您已經開始但尚未完成反引號引用的識別符號。

瞭解`'>`,`">`和``>`提示符的含義很重要,因為如果您錯誤地輸入了一個未終止的字串,您輸入的任何進一步行似乎都會被**mysql**忽略,包括包含`QUIT`的行。這可能會令人困惑,特別是如果您不知道在取消當前查詢之前需要提供終止引號。

注意

從這一點開始,多行語句將不再帶有次要提示(`->`或其他),以便更容易複製並貼上語句以供自己嘗試。


# 5.3 建立和使用資料庫

> 原文:[`dev.mysql.com/doc/refman/8.0/en/database-use.html`](https://dev.mysql.com/doc/refman/8.0/en/database-use.html)

5.3.1 建立和選擇資料庫

5.3.2 建立表

5.3.3 將資料載入到表中

5.3.4 從表中檢索資訊

一旦你知道如何輸入 SQL 語句,你就可以準備訪問資料庫了。

假設你家裡有幾隻寵物(你的動物園),你想要跟蹤它們的各種資訊。你可以透過建立表來儲存你的資料,並載入所需的資訊。然後,透過從表中檢索資料,你可以回答關於你的動物的不同問題。本節將向你展示如何執行以下操作:

+   建立一個資料庫

+   建立一個表

+   將資料載入到表中

+   以各種方式從表中檢索資料

+   使用多個表

動物園資料庫很簡單(故意的),但很容易想象在現實世界中可能使用類似型別的資料庫的情況。例如,這樣的資料庫可以被農民用來跟蹤牲畜,或者被獸醫用來跟蹤患者記錄。包含以下部分中使用的一些查詢和示例資料的動物園分發可以從 MySQL 網站獲取。它以壓縮的**tar**檔案和 Zip 格式提供在`dev.mysql.com/doc/`。

使用`SHOW`語句查詢伺服器上當前存在的資料庫:

```sql
mysql> SHOW DATABASES;
+----------+
| Database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+

mysql資料庫描述了使用者訪問許可權。test資料庫通常作為使用者嘗試事物的工作空間可用。

由該語句顯示的資料庫列表在您的機器上可能不同;如果您沒有SHOW DATABASES許可權,則SHOW DATABASES不會顯示您沒有許可權的資料庫。參見 Section 15.7.7.14, “SHOW DATABASES Statement”。

如果test資料庫存在,嘗試訪問它:

mysql> USE test
Database changed

USE,像QUIT一樣,不需要分號。(如果你願意,可以用分號終止這樣的語句;這並不會造成任何傷害。)USE語句在另一個方面也很特殊:它必須在一行上給出。

你可以在接下來的示例中使用test資料庫(如果你有許可權),但是任何你在該資料庫中建立的內容都可以被其他人刪除。因此,你應該向你的 MySQL 管理員請求使用自己的資料庫的許可權。假設你想要稱之為menagerie。管理員需要執行類似這樣的語句:

mysql> GRANT ALL ON menagerie.* TO 'your_mysql_name'@'your_client_host';

其中your_mysql_name是分配給您的 MySQL 使用者名稱,your_client_host是您連線到伺服器的主機。

5.3.1 建立和選擇資料庫

原文:dev.mysql.com/doc/refman/8.0/en/creating-database.html

如果管理員在設定許可權時為您建立資料庫,則可以開始使用它。否則,您需要自行建立:

mysql> CREATE DATABASE menagerie;

在 Unix 下,資料庫名稱區分大小寫(不像 SQL 關鍵字),因此您必須始終將資料庫稱為menagerie,而不是MenagerieMENAGERIE或其他變體。表名也是如此。(在 Windows 下,此限制不適用,儘管您必須在給定查詢中始終使用相同的大小寫來引用資料庫和表。但是,出於各種原因,推薦的最佳實踐始終是使用建立資料庫時使用的相同大小寫。)

注意

如果在嘗試建立資料庫時出現諸如 ERROR 1044 (42000): Access denied for user 'micah'@'localhost' to database 'menagerie'的錯誤,這意味著您的使用者帳戶沒有必要的許可權來執行此操作。請與管理員討論此問題或參見第 8.2 節,“訪問控制和帳戶管理”。

建立資料庫不會自動選擇它以供使用;您必須明確執行此操作。要使menagerie成為當前資料庫,請使用以下語句:

mysql> USE menagerie
Database changed

您只需建立資料庫一次,但每次開始mysql會話時,必須選擇它以供使用。您可以透過發出如示例中所示的USE語句來執行此操作。或者,您可以在呼叫mysql時在命令列上選擇資料庫。只需在可能需要提供的任何連線引數之後指定其名稱。例如:

$> mysql -h *host* -u *user* -p menagerie
Enter password: ********

重要

在剛剛顯示的命令中,menagerie不是您的密碼。如果您想在-p選項後的命令列上提供密碼,必須在沒有空格的情況下這樣做(例如,作為-p*password*,而不是作為-p *password*)。但是,將密碼放在命令列上並不推薦,因為這樣做會使其暴露給其他登入到您的計算機上的使用者。

注意

您可以隨時使用SELECT DATABASE()檢視當前選擇的資料庫。

5.3.2 建立表

原文:dev.mysql.com/doc/refman/8.0/en/creating-tables.html

建立資料庫很容易,但此時它是空的,正如SHOW TABLES所告訴你的那樣:

mysql> SHOW TABLES;
Empty set (0.00 sec)

更難的部分是決定你的資料庫應該是什麼結構:你需要哪些表,每個表應該有哪些列。

你需要一個包含每隻寵物記錄的表。這個表可以稱為pet表,至少應該包含每隻動物的名字。因為單獨的名字並不是很有趣,表中應該包含其他資訊。例如,如果你家裡有多個人養寵物,你可能想列出每隻動物的主人。你可能還想記錄一些基本的描述資訊,比如物種和性別。

年齡呢?這可能是有趣的,但不適合儲存在資料庫中。年齡隨時間變化,這意味著你必須經常更新記錄。相反,最好儲存一個固定值,比如出生日期。然後,每當你需要年齡時,你可以將當前日期與出生日期之間的差計算出來。MySQL 提供了進行日期運算的函式,所以這並不困難。儲存出生日期而不是年齡還有其他優點:

  • 你可以使用資料庫來執行諸如生成即將到來的寵物生日提醒之類的任務。(如果你認為這種查詢有點傻,注意這是你在業務資料庫環境中可能會問的同樣的問題,以確定需要在本週或本月傳送生日祝福的客戶,以實現計算機輔助的個人化關懷。)

  • 你可以根據除當前日期外的日期計算年齡。例如,如果你在資料庫中儲存了死亡日期,你可以輕鬆計算寵物死亡時的年齡。

你可能會想到其他型別的資訊對pet表也很有用,但到目前為止已經確定的這些足夠了:名字、主人、物種、性別、出生和死亡。

使用一個CREATE TABLE語句來指定表的佈局:

mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
       species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

VARCHARnameownerspecies列的一個很好的選擇,因為列值的長度不同。這些列定義中的長度不必相同,也不必是20。你通常可以選擇從165535的任何長度,看起來對你來說最合理。如果你做出了一個糟糕的選擇,後來發現需要一個更長的欄位,MySQL 提供了一個ALTER TABLE語句。

在動物記錄中,可以選擇幾種型別的值來表示性別,比如'm''f',或者'male''female'。使用單個字元'm''f'是最簡單的。

對於birthdeath列使用DATE資料型別是一個相當明顯的選擇。

一旦您建立了一個表,SHOW TABLES應該會產生一些輸出:

mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| pet                 |
+---------------------+

要驗證您的表是否按預期建立,請使用DESCRIBE語句:

mysql> DESCRIBE pet;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| name    | varchar(20) | YES  |     | NULL    |       |
| owner   | varchar(20) | YES  |     | NULL    |       |
| species | varchar(20) | YES  |     | NULL    |       |
| sex     | char(1)     | YES  |     | NULL    |       |
| birth   | date        | YES  |     | NULL    |       |
| death   | date        | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

您可以隨時使用DESCRIBE,例如,如果您忘記了表中列的名稱或它們的型別。

關於 MySQL 資料型別的更多資訊,請參閱第十三章,資料型別

5.3.3 將資料載入到表中

原文:dev.mysql.com/doc/refman/8.0/en/loading-tables.html

建立表後,你需要填充它。LOAD DATAINSERT 語句對此很有用。

假設你的寵物記錄可以如下所示描述。(注意 MySQL 期望日期以 '*YYYY-MM-DD*' 格式;這可能與你習慣的格式不同。)

名字 主人 種類 性別 出生 死亡
Fluffy Harold f 1993-02-04
Claws Gwen m 1994-03-17
Buffy Harold f 1989-05-13
Fang Benny m 1990-08-27
Bowser Diane m 1979-08-31 1995-07-29
Chirpy Gwen f 1998-09-11
Whistler Gwen 1997-12-09
Slim Benny m 1996-04-29

因為你從一個空表開始,一個簡單的方法是建立一個包含每隻動物一行的文字檔案,然後用一條語句將檔案內容載入到表中。

你可以建立一個文字檔案 pet.txt,每行包含一條記錄,值之間用製表符分隔,並按照 CREATE TABLE 語句中列出的順序給出。對於缺失的值(例如未知性別或仍然活著的動物的死亡日期),你可以使用 NULL 值。在文字檔案中表示這些值,使用 \N(反斜槓,大寫 N)。例如,鳥 Whistler 的記錄將如下所示(值之間的空格是一個製表符字元):

Whistler        Gwen    bird    \N      1997-12-09      \N

要將文字檔案 pet.txt 載入到 pet 表中,請使用以下語句:

mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;

如果你在 Windows 上使用以 \r\n 作為行終止符的編輯器建立檔案,你應該使用這條語句:

mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet
       LINES TERMINATED BY '\r\n';

(在執行 macOS 的 Apple 機器上,你可能想使用 LINES TERMINATED BY '\r'。)

如果你願意,可以在 LOAD DATA 語句中明確指定列值分隔符和行結束標記,但預設值是製表符和換行符。這對於語句正確讀取檔案 pet.txt 是足夠的。

如果語句失敗,很可能是因為你的 MySQL 安裝預設沒有啟用本地檔案功能。請參閱 Section 8.1.6, “LOAD DATA LOCAL 安全注意事項”,瞭解如何更改此設定。

當您想逐個新增新記錄時,INSERT語句很有用。在其最簡單的形式中,您按照CREATE TABLE語句中列出列的順序為每一列提供值。假設黛安獲得了一隻名為“Puffball”的新倉鼠。您可以使用類似於以下的INSERT語句新增新記錄:

mysql> INSERT INTO pet
       VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

字串和日期值在此處被指定為帶引號的字串。此外,使用INSERT,您可以直接插入NULL表示缺失值。您不像在LOAD DATA中使用\N

從這個例子中,您應該能夠看到,使用多個INSERT語句來最初載入您的記錄將涉及更多的輸入,而不是使用單個LOAD DATA語句。

5.3.4 從表中檢索資訊

原文:dev.mysql.com/doc/refman/8.0/en/retrieving-data.html

5.3.4.1 選擇所有資料

5.3.4.2 選擇特定行

5.3.4.3 選擇特定列

5.3.4.4 排序行

5.3.4.5 日期計算

5.3.4.6 處理 NULL 值

5.3.4.7 模式匹配

5.3.4.8 計算行數

5.3.4.9 使用多個表

SELECT 語句用於從表中提取資訊。語句的一般形式為:

SELECT *what_to_select*
FROM *which_table*
WHERE *conditions_to_satisfy*;

what_to_select 表示您想要檢視的內容。這可以是列的列表,或者使用 * 表示“所有列”。 which_table 表示您要從中檢索資料的表。WHERE 子句是可選的。如果存在,conditions_to_satisfy 指定行必須滿足的一個或多個條件才能符合檢索條件。

原文:dev.mysql.com/doc/refman/8.0/en/selecting-all.html

5.3.4.1 選擇所有資料

最簡單的SELECT形式從表中檢索所有內容:

mysql> SELECT * FROM pet;
+----------+--------+---------+------+------------+------------+
| name     | owner  | species | sex  | birth      | death      |
+----------+--------+---------+------+------------+------------+
| Fluffy   | Harold | cat     | f    | 1993-02-04 | NULL       |
| Claws    | Gwen   | cat     | m    | 1994-03-17 | NULL       |
| Buffy    | Harold | dog     | f    | 1989-05-13 | NULL       |
| Fang     | Benny  | dog     | m    | 1990-08-27 | NULL       |
| Bowser   | Diane  | dog     | m    | 1979-08-31 | 1995-07-29 |
| Chirpy   | Gwen   | bird    | f    | 1998-09-11 | NULL       |
| Whistler | Gwen   | bird    | NULL | 1997-12-09 | NULL       |
| Slim     | Benny  | snake   | m    | 1996-04-29 | NULL       |
| Puffball | Diane  | hamster | f    | 1999-03-30 | NULL       |
+----------+--------+---------+------+------------+------------+

這種形式的SELECT使用*,它是“選擇所有列”的簡寫。如果您想要檢視整個表格,例如,在剛剛載入初始資料集後,這是很有用的。例如,您可能會覺得 Bowser 的出生日期似乎不太對。查閱您的原始血統檔案,您發現正確的出生年份應該是 1989 年,而不是 1979 年。

至少有兩種方法可以解決這個問題:

  • 編輯檔案pet.txt以更正錯誤,然後使用DELETELOAD DATA清空表格並重新載入:

    mysql> DELETE FROM pet;
    mysql> LOAD DATA LOCAL INFILE 'pet.txt' INTO TABLE pet;
    

    但是,如果這樣做,您還必須重新輸入 Puffball 的記錄。

  • 僅使用UPDATE語句修復錯誤記錄:

    mysql> UPDATE pet SET birth = '1989-08-31' WHERE name = 'Bowser';
    

    UPDATE僅更改相關記錄,無需重新載入表格。

有一個例外,即SELECT *選擇所有列的原則。如果表中包含不可見列,則*不包括它們。有關更多資訊,請參見第 15.1.20.10 節,“不可見列”。

原文:dev.mysql.com/doc/refman/8.0/en/selecting-rows.html

5.3.4.2 選擇特定行

如前一節所示,檢索整個表很容易。只需從SELECT語句中省略WHERE子句。但通常你不想看到整個表,特別是當它變得很大時。相反,你通常更感興趣的是回答一個特定的問題,這時你會對你想要的資訊指定一些約束條件。讓我們看一些關於回答有關寵物的問題的選擇查詢。

你可以僅選擇表中特定的行。例如,如果你想驗證對鮑澤的出生日期所做的更改,可以像這樣選擇鮑澤的記錄:

mysql> SELECT * FROM pet WHERE name = 'Bowser';
+--------+-------+---------+------+------------+------------+
| name   | owner | species | sex  | birth      | death      |
+--------+-------+---------+------+------------+------------+
| Bowser | Diane | dog     | m    | 1989-08-31 | 1995-07-29 |
+--------+-------+---------+------+------------+------------+

輸出確認年份正確記錄為 1989 年,而不是 1979 年。

字串比較通常是不區分大小寫的,因此你可以將名稱指定為'bowser''BOWSER'等。查詢結果是相同的。

你可以對任何列指定條件,不僅僅是name。例如,如果你想知道哪些動物是在 1998 年或之後出生的,請測試birth列:

mysql> SELECT * FROM pet WHERE birth >= '1998-1-1';
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Puffball | Diane | hamster | f    | 1999-03-30 | NULL  |
+----------+-------+---------+------+------------+-------+

你可以組合條件,例如,定位雌性狗:

mysql> SELECT * FROM pet WHERE species = 'dog' AND sex = 'f';
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

前面的查詢使用了AND邏輯運算子。還有一個OR運算子:

mysql> SELECT * FROM pet WHERE species = 'snake' OR species = 'bird';
+----------+-------+---------+------+------------+-------+
| name     | owner | species | sex  | birth      | death |
+----------+-------+---------+------+------------+-------+
| Chirpy   | Gwen  | bird    | f    | 1998-09-11 | NULL  |
| Whistler | Gwen  | bird    | NULL | 1997-12-09 | NULL  |
| Slim     | Benny | snake   | m    | 1996-04-29 | NULL  |
+----------+-------+---------+------+------------+-------+

ANDOR可以混合使用,儘管ANDOR具有更高的優先順序。如果同時使用這兩個運算子,最好使用括號明確指示條件應如何分組:

mysql> SELECT * FROM pet WHERE (species = 'cat' AND sex = 'm')
       OR (species = 'dog' AND sex = 'f');
+-------+--------+---------+------+------------+-------+
| name  | owner  | species | sex  | birth      | death |
+-------+--------+---------+------+------------+-------+
| Claws | Gwen   | cat     | m    | 1994-03-17 | NULL  |
| Buffy | Harold | dog     | f    | 1989-05-13 | NULL  |
+-------+--------+---------+------+------------+-------+

原文:dev.mysql.com/doc/refman/8.0/en/selecting-columns.html

5.3.4.3 選擇特定列

如果您不想看到表中的整行資料,只需按逗號分隔感興趣的列名即可。例如,如果您想知道動物的出生日期,選擇namebirth列:

mysql> SELECT name, birth FROM pet;
+----------+------------+
| name     | birth      |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+

要找出誰擁有寵物,請使用此查詢:

mysql> SELECT owner FROM pet;
+--------+
| owner  |
+--------+
| Harold |
| Gwen   |
| Harold |
| Benny  |
| Diane  |
| Gwen   |
| Gwen   |
| Benny  |
| Diane  |
+--------+

注意,查詢僅從每條記錄中檢索owner列,並且有些列會出現多次。為了最小化輸出,透過新增關鍵字DISTINCT僅檢索每個唯一的輸出記錄一次:

mysql> SELECT DISTINCT owner FROM pet;
+--------+
| owner  |
+--------+
| Benny  |
| Diane  |
| Gwen   |
| Harold |
+--------+

您可以使用WHERE子句將行選擇與列選擇結合起來。例如,要僅獲取狗和貓的出生日期,請使用以下查詢:

mysql> SELECT name, species, birth FROM pet
       WHERE species = 'dog' OR species = 'cat';
+--------+---------+------------+
| name   | species | birth      |
+--------+---------+------------+
| Fluffy | cat     | 1993-02-04 |
| Claws  | cat     | 1994-03-17 |
| Buffy  | dog     | 1989-05-13 |
| Fang   | dog     | 1990-08-27 |
| Bowser | dog     | 1989-08-31 |
+--------+---------+------------+

原文:dev.mysql.com/doc/refman/8.0/en/sorting-rows.html

5.3.4.4 排序行

您可能已經注意到在前面的示例中,結果行沒有按特定順序顯示。當行以某種有意義的方式排序時,檢查查詢輸出通常更容易。要對結果進行排序,請使用ORDER BY子句。

這裡是按日期排序的動物生日:

mysql> SELECT name, birth FROM pet ORDER BY birth;
+----------+------------+
| name     | birth      |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+

在字元型別列上,排序——就像所有其他比較操作一樣——通常以不區分大小寫的方式執行。這意味著對於除大小寫外完全相同的列,排序是未定義的。您可以透過使用BINARY來強制對列進行區分大小寫排序,如下所示:ORDER BY BINARY *col_name*

預設排序順序是升序,最小值優先。要以相反(降序)順序排序,請在要排序的列名後新增DESC關鍵字:

mysql> SELECT name, birth FROM pet ORDER BY birth DESC;
+----------+------------+
| name     | birth      |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+

您可以按多個列進行排序,並且可以按不同方向對不同列進行排序。例如,要按動物型別升序排序,然後按動物型別內的出生日期降序排序(最年輕的動物優先),請使用以下查詢:

mysql> SELECT name, species, birth FROM pet
       ORDER BY species, birth DESC;
+----------+---------+------------+
| name     | species | birth      |
+----------+---------+------------+
| Chirpy   | bird    | 1998-09-11 |
| Whistler | bird    | 1997-12-09 |
| Claws    | cat     | 1994-03-17 |
| Fluffy   | cat     | 1993-02-04 |
| Fang     | dog     | 1990-08-27 |
| Bowser   | dog     | 1989-08-31 |
| Buffy    | dog     | 1989-05-13 |
| Puffball | hamster | 1999-03-30 |
| Slim     | snake   | 1996-04-29 |
+----------+---------+------------+

DESC關鍵字僅適用於緊隨其後的列名(birth);它不會影響species列的排序順序。

原文:dev.mysql.com/doc/refman/8.0/en/date-calculations.html

5.3.4.5 日期計算

MySQL 提供了幾個函式,您可以使用這些函式對日期進行計算,例如計算年齡或提取日期的部分。

要確定每隻寵物的年齡,可以使用TIMESTAMPDIFF()函式。它的引數是您希望結果表達的單位,以及要計算差異的兩個日期。以下查詢顯示了每隻寵物的出生日期、當前日期和年齡。使用別名age)使最終輸出列標籤更有意義。

mysql> SELECT name, birth, CURDATE(),
       TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
       FROM pet;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
| Claws    | 1994-03-17 | 2003-08-19 |    9 |
| Buffy    | 1989-05-13 | 2003-08-19 |   14 |
| Fang     | 1990-08-27 | 2003-08-19 |   12 |
| Bowser   | 1989-08-31 | 2003-08-19 |   13 |
| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
| Whistler | 1997-12-09 | 2003-08-19 |    5 |
| Slim     | 1996-04-29 | 2003-08-19 |    7 |
| Puffball | 1999-03-30 | 2003-08-19 |    4 |
+----------+------------+------------+------+

查詢是有效的,但如果按某種順序呈現行,則結果可以更容易地掃描。這可以透過新增一個ORDER BY name子句來實現,以按名稱對輸出進行排序:

mysql> SELECT name, birth, CURDATE(),
       TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
       FROM pet ORDER BY name;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Bowser   | 1989-08-31 | 2003-08-19 |   13 |
| Buffy    | 1989-05-13 | 2003-08-19 |   14 |
| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
| Claws    | 1994-03-17 | 2003-08-19 |    9 |
| Fang     | 1990-08-27 | 2003-08-19 |   12 |
| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
| Puffball | 1999-03-30 | 2003-08-19 |    4 |
| Slim     | 1996-04-29 | 2003-08-19 |    7 |
| Whistler | 1997-12-09 | 2003-08-19 |    5 |
+----------+------------+------------+------+

要按age而不是name對輸出進行排序,只需使用不同的ORDER BY子句:

mysql> SELECT name, birth, CURDATE(),
       TIMESTAMPDIFF(YEAR,birth,CURDATE()) AS age
       FROM pet ORDER BY age;
+----------+------------+------------+------+
| name     | birth      | CURDATE()  | age  |
+----------+------------+------------+------+
| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |
| Puffball | 1999-03-30 | 2003-08-19 |    4 |
| Whistler | 1997-12-09 | 2003-08-19 |    5 |
| Slim     | 1996-04-29 | 2003-08-19 |    7 |
| Claws    | 1994-03-17 | 2003-08-19 |    9 |
| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |
| Fang     | 1990-08-27 | 2003-08-19 |   12 |
| Bowser   | 1989-08-31 | 2003-08-19 |   13 |
| Buffy    | 1989-05-13 | 2003-08-19 |   14 |
+----------+------------+------------+------+

可以使用類似的查詢來確定已經去世動物的死亡年齡。透過檢查death值是否為NULL來確定這些動物,然後對具有非NULL值的動物計算deathbirth值之間的差異:

mysql> SELECT name, birth, death,
       TIMESTAMPDIFF(YEAR,birth,death) AS age
       FROM pet WHERE death IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name   | birth      | death      | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 |    5 |
+--------+------------+------------+------+

查詢使用death IS NOT NULL而不是death <> NULL,因為NULL是一個特殊值,不能使用通常的比較運算子進行比較。這將在後面討論。請參閱第 5.3.4.6 節,“處理 NULL 值”。

如果您想知道哪些動物下個月過生日怎麼辦?對於這種型別的計算,年份和日期都不重要;您只需提取birth列的月份部分。MySQL 提供了幾個用於提取日期部分的函式,例如YEAR()MONTH()DAYOFMONTH()。在這裡,MONTH()是適當的函式。要檢視它的工作原理,請執行一個顯示birthMONTH(birth)值的簡單查詢:

mysql> SELECT name, birth, MONTH(birth) FROM pet;
+----------+------------+--------------+
| name     | birth      | MONTH(birth) |
+----------+------------+--------------+
| Fluffy   | 1993-02-04 |            2 |
| Claws    | 1994-03-17 |            3 |
| Buffy    | 1989-05-13 |            5 |
| Fang     | 1990-08-27 |            8 |
| Bowser   | 1989-08-31 |            8 |
| Chirpy   | 1998-09-11 |            9 |
| Whistler | 1997-12-09 |           12 |
| Slim     | 1996-04-29 |            4 |
| Puffball | 1999-03-30 |            3 |
+----------+------------+--------------+

查詢下個月過生日的動物也很簡單。假設當前月份是四月。那麼月份值為4,您可以這樣查詢出生在五月(月份5)的動物:

mysql> SELECT name, birth FROM pet WHERE MONTH(birth) = 5;
+-------+------------+
| name  | birth      |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+

如果當前月份是十二月,會有一個小複雜性。您不能簡單地將月份數字(12)加一,然後查詢出生在第13個月的動物,因為沒有這樣的月份。相反,您應該查詢出生在一月(月份1)的動物。

您可以編寫查詢,使其無論當前月份是什麼都能正常工作,這樣您就不必使用特定月份的數字。DATE_ADD()使您能夠向給定日期新增時間間隔。如果您將一個月新增到CURDATE()的值,然後用MONTH()提取月份部分,結果將產生要查詢生日的月份:

mysql> SELECT name, birth FROM pet
       WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));

透過在使用模運算(MOD)將月份值包裝為0後,將1新增到當前月份以獲得下一個月份的另一種方法:

mysql> SELECT name, birth FROM pet
       WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

MONTH()返回112之間的數字。而MOD(某物,12)返回011之間的數字。因此,加法操作必須在MOD()之後進行,否則我們會從十一月(11)跳到一月(1)。

如果計算使用無效日期,則計算將失敗併產生警告:

mysql> SELECT '2018-10-31' + INTERVAL 1 DAY;
+-------------------------------+
| '2018-10-31' + INTERVAL 1 DAY |
+-------------------------------+
| 2018-11-01                    |
+-------------------------------+
mysql> SELECT '2018-10-32' + INTERVAL 1 DAY;
+-------------------------------+
| '2018-10-32' + INTERVAL 1 DAY |
+-------------------------------+
| NULL                          |
+-------------------------------+
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Incorrect datetime value: '2018-10-32' |
+---------+------+----------------------------------------+

相關文章