MySQL8-中文参考-三-

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。)然后按下几次回车键。如果你没有收到类似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' |
+---------+------+----------------------------------------+
posted @ 2024-06-23 00:40  绝不原创的飞龙  阅读(16)  评论(0编辑  收藏  举报