了解几种安装方式:
dnf/apt:傻瓜式,安装后文件分散
rpm/deb包:掌握,安装后文件分散
通用二进制文件:二进制GLIBC。掌握,无需编译,推荐
源码编译:了解
安装前 关闭防火墙 1 2 3 4 5 6 7 8 9 10 # centos firewall-cmd --state systemctl stop firewalld systemctl disable firewalld # ubuntu ufw status ufw disable # 临时关闭 systemctl stop ufw systemctl disable ufw
CentOS禁用SELinux 编辑 vim /etc/selinux/config
1 2 3 4 5 SELINUX =disabled # 禁用 setenforce Permissive
禁用swap分区 请禁用交换分区
1 free -m -s 5 # -m 以MB为单位显示内存使用情况;-s<间隔秒数> 持续观察内存使用状况。
使用RPM包安装 官方doc: https://dev.mysql.com/doc/refman/8.4/en/linux-installation.html
安装文件布局请参阅: https://dev.mysql.com/doc/refman/8.4/en/linux-installation-rpm.html
RPM Bundle :mysql-8.4.6-1.el8.x86_64.rpm-bundle.tar,包含MySQL所有组件。
使用通用二进制文件安装(使用中 ) 官方doc: https://dev.mysql.com/doc/refman/8.4/en/binary-installation.html
下载 官网下载 MySQL Community Server :https://dev.mysql.com/downloads/
Compressed TAR Archive :mysql-8.4.6-linux-glibc2.28-x86_64.tar.xz,常规二进制发行版。本文使用
Compressed TAR Archive, Minimal Install :mysql-8.4.6-linux-glibc2.28-x86_64-minimal.tar.xz ,最小安装,不包括调试二进制文件,并去掉了调试符号。
TAR :mysql-8.4.6-linux-glibc2.28-x86_64.tar。
查看操作系统 glibc 版本
1 2 3 4 5 # Linux发行版通用 ldd --version # centos rpm -qa | grep glibc
卸载旧版本 如果您之前曾通过操作系统自带的包管理工具(如dnf或apt)安装过MySQL,那么在使用原生二进制文件进行安装时可能会遇到问题。请确保之前安装的 MySQL 已被完全卸载(使用包管理系统),并且任何额外的文件(如旧版本的数据文件)也已删除。您还应检查配置文件(如 /etc/my.cnf 或 /etc/mysql 目录)并将其删除。
centos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # rpm -qa,列出系统中所有已安装的 RPM 包。-q → query(查询);-a → all(所有包); rpm -qa | grep -iE 'mysql|mariadb' # grep -iE,-i 忽略大小写;-E 启用扩展正则表达式 dnf list installed | grep mysql # 列出已安装的安装包 # rpm -e xxx xxx xxx dnf remove \ mysql-community-server-8.4.6-1.el8.x86_64 \ mysql-community-client-8.4.6-1.el8.x86_64 \ mysql-community-libs-8.4.6-1.el8.x86_64 \ mysql-community-common-8.4.6-1.el8.x86_64 \ mysql-community-client-plugins-8.4.6-1.el8.x86_64 \ mysql-community-icu-data-files-8.4.6-1.el8.x86_64 \ mariadb-connector-c-3.1.11-2.el8_3.x86_64 \ mariadb-connector-c-config-3.1.11-2.el8_3.noarch # 卸载数据库安装程序 # 查找残余文件 find / -name mysql # 按文件名查找 find / | grep .*mysql.* find / -name my.cnf # 查找mysql配置文件
ubuntu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 查询已安装的 MySQL 相关包 dpkg -l | grep -iE 'mysql|mariadb' # grep -iE,-i 忽略大小写;-E 启用扩展正则表达式 apt list --installed | grep mysql # 列出已安装的安装包 apt remove --purge \ mysql-community-server \ mysql-community-client \ mysql-community-libs \ mysql-community-common \ mysql-community-client-plugins \ mysql-community-icu-data-files # 卸载数据库安装程序 # 查找残余文件 find / -name mysql # 按文件名查找 find / | grep .*mysql.* find / -name my.cnf # 查找mysql配置文件
安装依赖 MySQL 依赖于 libaio 库。如果该库未在本地安装,数据目录初始化和后续服务器启动步骤将失败。如有必要,请使用适当的包管理器进行安装。
ubuntu
1 2 3 4 5 6 7 8 9 dpkg -l | grep -iE 'libaio1t64' apt list --installed | grep -iE 'libaio1t64' apt-get update apt-cache search 'libaio1t64' apt-get install libaio1t64 # Ubuntu 24.04 软件包名为 libaio1t64,而 MySQL 依赖 libaio.so.1 (未更新),创建符号链接如下 ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
centos
1 2 3 4 5 6 rpm -q libaio dnf list installed | grep -iE 'libaio' dnf makecache # 生成或更新本地的 仓库缓存 / 元数据 dnf search libaio # 从系统的 YUM 仓库(Repository) 中搜索包含关键词的软件包信息。 dnf install libaio
Oracle Linux 8 / Red Hat 8 (EL8): 这些平台默认不会安装文件 /lib64/libtinfo.so.5,而该文件是 MySQL 客户端 bin/mysql 运行 mysql-VERSION-el7-x86_64.tar.gz 和 mysql-VERSION-linux-glibc2.28-x86_64.tar.xz 包时所需的。为解决此问题,请安装 ncurses-compat-libs 包。
1 2 3 4 5 6 7 8 9 # ubuntu dpkg -l | grep libncurses apt-cache search libncurses apt-get install ... # centos rpm -q ncurses dnf search ncurses dnf install ...
解压二进制包 表 2.3 通用 Unix/Linux 二进制包的 MySQL 安装布局
https://dev.mysql.com/doc/refman/8.4/en/binary-installation.html#binary-installation-layout
目录
目录内容
bin
MySQL 服务器(mysqld)、客户端和实用程序程序
docs
MySQL 手册(Info 格式)
man
Unix 手册页
include
Include (header) files
lib
Libraries
share
错误信息、词典和数据库安装的SQL语句
support-files
其他支持文件
解压
1 2 3 4 5 6 mkdir -p /data/local && cd /data/local/ tar -xvf mysql-8.4.6-linux-glibc2.28-x86_64.tar.xz mv ./mysql-8.4.6-linux-glibc2.28-x86_64 ./mysql # 创建指向安装目录的符号链接(软链接),这样可以轻松地将其引用为 /data/local/mysql # ln -s mysql-8.4.6-linux-glibc2.28-x86_64 mysql
为了让mysqld命令可以在任何位置执行,需配置环境变量 ,参考:**环境变量持久化 **
1 2 3 4 5 6 7 grep -qxF 'export PATH=/data/local/mysql/bin:$PATH' /etc/profile || \ echo 'export PATH=/data/local/mysql/bin:$PATH' >> /etc/profile # vim /etc/profile # export PATH=$PATH :/data/local/mysql/bin# 使环境变量生效 source /etc/profile
创建数据目录 1 2 3 4 5 6 7 8 cd /data/local/mysql # 创建各实例数据存放目录 mkdir -p /data/local/mysql/3306/{data,log,mysql-files} mkdir -p /data/local/mysql/8306/{data,log,mysql-files} # 创建各实例error日志,可省略,会自动创建 # touch /data/local/mysql/3306/log/error.log# touch /data/local/mysql/8306/log/error.logtree -d /data/local/mysql # 以树状图列出目录的内容。-d 显示目录名称而非内容。
创建用户并赋予权限 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 groupadd mysql # -r 创建一个 系统用户(UID < 1000,一般不用于登录); # -g mysql 指定用户所属的主组为 mysql(该组必须已存在) # -s /bin/false 指定用户的 shell 为 /bin/false,禁止该用户登录系统 useradd -r -g mysql -s /bin/false mysql # 创建一个用于运行 MySQL 服务的系统用户,该用户属于 mysql 用户组,且禁止用户登录。 # 将指定文件的拥有者改为指定的用户或组。chown [-cfhvR] [--help ] [--version] user[:group] file... chown -R mysql:mysql /data/local/mysql # 将文件的拥有者改为指定的用户或组。-R 处理指定目录以及其子目录下的所有文件。 # chmod 750 /data/local/mysql # 查看所有用户组 cat /etc/group # 查看所有用户(系统 + 登录用户) cat /etc/passwd # 查看某个用户所属的所有组 groups mysql # 查看指定用户详细信息(包括主组) id mysql # userdel -r mysql # groupdel mysql
创建配置文件 新建配置文件 vim /data/local/mysql/my.cnf ,修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 [server] [mysqld] user = mysql # 以指定用户运行 mysqld 服务器(此处的 "用户 "是指操作系统用户,而不是授权表中列出的MySQL数据库的账号)。 basedir = /data/local/mysql # MySQL安装的根目录。若在启动时未显式指定,MySQL 会尝试根据 mysqld 程序所在的当前路径推断默认的 basedir。 local_infile = ON # 此变量控制服务器端对LOAD DATA语句的LOCAL权限。根据local_infile设置,服务器将拒绝或允许客户端在启用LOCAL权限时进行本地数据加载。 lc_messages_dir = /data/local/mysql/share # 错误消息所在的目录。 lc_messages = en_US # 默认en_US。用于错误消息的区域设置。服务器将该参数转换为语言名称,并与 --lc-messages-dir 的值组合,生成错误消息文件位置 /data/local/mysql/share/english。 default-time-zone = '+08:00' # 设置默认服务器时区。此选项用于设置全局 time_zone 系统变量。若未指定此选项,则默认时区与系统时区相同(由 system_time_zone 系统变量的值决定)。 mysqlx = OFF # 默认ON。此选项控制服务器在启动时加载X插件的方式。在MySQL 8.4中,X插件默认处于启用状态,但可通过此选项控制其激活状态。 secure_file_priv = NULL # 默认值因系统和安装方式而异。此变量用于限制数据导入和导出操作的影响,例如由LOAD DATA和SELECT ... INTO OUTFILE语句以及LOAD_FILE()函数执行的操作。这些操作仅允许具有FILE权限的用户执行。如果设置为 NULL,服务器将禁用导入和导出操作。 max_connections = 100 # 默认151,最大100000。允许的最大并发客户端连接数。实际生效值取 open_files_limit - 810 的有效值与 max_connections 实际设置值中的较小者。如果服务器因达到 max_connections 限制而拒绝连接,则会递增 Connection_errors_max_connections 状态变量。 max_connect_errors = 10000 # 默认100。当来自某个主机的连续连接请求在 max_connect_errors 次尝试后均未成功建立连接时,服务器将阻止该主机进行进一步连接。如果在前一次连接中断后,该主机在少于 max_connect_errors 次尝试内成功建立了连接,则该主机的错误计数将清零。 back_log = 50 # 默认-1。MySQL可处理的未完成连接请求数量。当主MySQL线程在极短时间内收到大量连接请求时,该参数便会生效。此时主线程需要花费一定时间(尽管非常短暂)来检查连接并启动新线程。back_log值决定了在此短暂时间内可堆叠的请求数量上限,超过该值后MySQL将暂时停止响应新请求。仅当预期短时间内出现大量连接时才需增加此值。 换言之,该值即为传入TCP/IP连接的监听队列大小。操作系统对此队列大小设有自身限制。Unix系统调用listen()的手册页应包含更多细节。请查阅操作系统文档以获取该变量的最大值。back_log的设置值不得超过操作系统设定的上限。 默认值为 max_connections 的值,这使得允许的连接队列能够根据最大允许连接数进行调整。 wait_timeout = 3600 # 默认28800。服务器在关闭 非交互式连接 之前等待该连接活动的秒数。在线程启动时,会话 wait_timeout 值从全局 wait_timeout 值或全局 interactive_timeout 值初始化,取决于客户端的类型(由 mysql_real_connect() 的 CLIENT_INTERACTIVE 连接选项定义)。 interactive_timeout = 3600 # 默认28800。服务器在关闭 交互式连接 之前等待该连接活动的秒数。交互式客户端定义为使用 mysql_real_connect() 的 CLIENT_INTERACTIVE 选项的客户端。另请参阅 wait_timeout。 max_allowed_packet = 512M # 默认67108864(64MB)。定义 MySQL 服务器与客户端(包括其他副本服务器)之间单个消息或数据包的大小上限。影响 INSERT、UPDATE 大字段(如 BLOB 或 TEXT)以及执行超长查询语句时的处理。 replica_max_allowed_packet = 1G # 默认1073741824(1GB)。专门用于从库(Replica),设置从库接收来自主库(Source)数据包的最大限制。它会覆盖从库上的 max_allowed_packet 设置。 max_prepared_stmt_count = 4194304 # 默认16382,最大4194304。此变量限制了服务器中预编译语句的总数(即所有客户端连接所创建的预编译语句的总和,关闭连接会销毁创建的预处理语句)。在可能发生基于通过预编译大量语句导致服务器内存耗尽的拒绝服务攻击的环境中,可以使用此变量。将该值设置为 0 将禁用预编译语句。 thread_cache_size = 0 # 默认-1。服务器应缓存多少个线程以供复用。当客户端断开连接时,若缓存中的线程数少于 thread_cache_size,则将客户端的线程放入缓存。线程请求将优先通过复用缓存中的线程来满足,仅当缓存为空时才会创建新线程。若存在大量新连接,可增加此变量值以提升性能。通常情况下,若线程实现良好,此设置不会带来显著性能提升。但若服务器每秒处理数百个连接,应将 thread_cache_size 设置得足够高,确保多数新连接能使用缓存线程。通过比较 Connections 和 Threads_created 状态变量差异,可评估线程缓存效率。默认值基于以下公式计算,默认值的上限为100: 8 + (max_connections / 100) skip_name_resolve = ON # 默认值OFF。控制服务器在处理客户端连接时是否进行DNS反向解析(使用PTR记录)。若设为ON,则仅使用IP地址,但MySQL用户授权表(mysql.user)中的 Host 列值必须为 IP 地址或网段(如 'root'@'192.168.1.%'),不能使用主机名(如 'root'@'db-server'),否则会导致连接失败。 跳过 DNS 查询过程能提升连接速度。 thread_stack = 1M # 默认1048576(1MB),最小131072(128KB)。每个线程的堆栈大小。默认值足以满足正常运行需求。若线程堆栈过小,将限制服务器可处理的SQL语句复杂度、存储过程的递归深度及其他耗费内存的操作。 sort_buffer_size = 2M # 默认262144(256KB)。每个需要执行排序的会话都会分配一个该大小的缓冲区。该参数不特定于任何存储引擎,而是以通用方式应用于优化。排序缓冲区大小至少需满足容纳十五个元组的要求(元组指的是排序过程中的一行记录,如果单行数据非常大,而buffer设置得极小,可能会导致查询直接报错或无法执行排序优化)。此外,当增加 max_sort_length 的值时,可能需要相应提升 sort_buffer_size 的值。 如果您在 SHOW GLOBAL STATUS 输出中看到每秒有许多 Sort_merge_passes,则可以考虑增加 sort_buffer_size 值以加快无法通过查询优化或改进索引来改进的 ORDER BY 或 GROUP BY 操作。 join_buffer_size = 8M # 默认262144(256KB)。用于普通索引扫描、范围索引扫描和不使用索引从而执行全表扫描的表连接操作所使用的缓冲区的大小。 read_buffer_size = 2M # 默认131072(128KB)。对MyISAM表进行顺序扫描的每个线程都会为其扫描的每个表分配一个此大小(以字节为单位)的缓冲区。如果执行多次顺序扫描,您可能需要增加该值。 read_rnd_buffer_size = 8M # 默认262144(256KB)。此变量用于从MyISAM表读取数据,并适用于任何存储引擎的多范围读取优化。 当从MyISAM表按键排序操作后的排序顺序读取行时,数据通过此缓冲区读取以避免磁盘寻道。 将该变量设为较大值可显著提升 ORDER BY 性能。 binlog_cache_size = 4M # 默认32768(32KB)。在事务期间用于存储二进制日志变更的内存缓冲区大小。 当服务器启用二进制日志功能时,若服务器支持任何事务型存储引擎,则会为每个客户端分配二进制日志缓存。若事务数据超出内存缓冲区容量,则多余数据将存储于临时文件中。当服务器启用二进制日志加密时,内存缓冲区本身不加密,但用于存储二进制日志缓存的临时文件将被加密。每次事务提交后,系统会通过清空内存缓冲区并截断临时文件(若存在)来重置二进制日志缓存。 若频繁处理大型事务,可通过增大此缓存大小来减少或消除临时文件写入需求,从而提升性能。状态变量 Binlog_cache_use 和 Binlog_cache_disk_use 可用于调整此缓存大小。 binlog_cache_size 仅设置事务缓存大小;语句缓存的大小由系统变量 binlog_stmt_cache_size 控制。 tmp_table_size = 512M # 默认16777216(16MB)。定义由MEMORY和TempTable存储引擎创建的内部内存临时表的最大尺寸。若内部内存临时表超过此尺寸,将自动转换为磁盘上的内部临时表。 用户手动创建的TempTable表不受支持。 当使用MEMORY存储引擎处理内存中临时表时,实际大小限制取决于 tmp_table_size 与 max_heap_table_size 的较小值。 若需执行大量复杂的GROUP BY查询且内存充足,请增加tmp_table_size的值。 可通过比较Created_tmp_disk_tables与Created_tmp_tables的数值,对比创建的内部磁盘临时表数量与内部临时表总数。 max_heap_table_size = 512M # 默认16777216(16MB)。 transaction_isolation = REPEATABLE-READ # 设置默认事务隔离级别。READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ(默认)、SERIALIZABLE。 disabled_storage_engines = "Myisam,Memory" # 默认空字符串。指示哪些存储引擎不可用于创建表或表空间。 bulk_insert_buffer_size = 64M # 默认8388608(8MB)。专门用于优化 MyISAM 存储引擎批量插入性能的线程级缓存参数。优化场景:LOAD DATA INFILE、INSERT INTO... SELECT。通过在内存中缓存索引数据以减少磁盘 I/O 次数,从而显著提升数据导入速度。 innodb_doublewrite = ON innodb_buffer_pool_size = 1G # 默认134217728(128MB)。核心缓冲池的大小(以字节为单位),该内存区域的缓存包括:数据页(Data Pages)、索引页(Index Pages)、自适应哈希索引(Adaptive Hash Index)、Undo log(Undo Pages)等。如果是专用 DB 服务器,推荐设置为内存的 70% – 80%。可根据缓存命中率调整大小。 innodb_buffer_pool_instances = 1 # InnoDB缓冲池划分的区域数量。对于缓冲池规模达几GB的系统,将缓冲池划分为多个实例,可减少不同线程读写缓存页时的竞争,从而提升并发性。存储于缓冲池或从缓冲池读取的每个页面,都会通过哈希函数随机分配至某个缓冲池实例。每个实例独立管理其空闲列表、刷新列表、最近最少使用列表(LRU) 及其他数据结构,并由自己的缓冲池互斥锁进行保护。 总缓冲池大小在所有缓冲池之间分配。为获得最佳效率,请将 innodb_buffer_pool_instances 与 innodb_buffer_pool_size 组合设置,确保每个缓冲池实例至少为 1GB。 innodb_buffer_pool_dump_pct = 25 # 默认值25,范围是1到100。指定每个缓冲池中读出并转储的最近使用页的百分比。例如,若存在4个缓冲池,每个缓冲池包含100个页,且 innodb_buffer_pool_dump_pct 设置为25,则每个缓冲池中最近使用的25个页将被转储。人话:MySQL正常关闭时把buffer中页信息转储到磁盘,启动后再从磁盘加载到buffer,实现服务器快速预热。 innodb_log_buffer_size = 256M # 默认67108864(64MB)。redo log(重做日志)缓冲区。较大的日志缓冲区使得大型事务能够运行,而无需在事务提交之前将日志写入磁盘。因此,若存在需更新、插入或删除大量行的事务,增大日志缓冲区可节省磁盘I/O操作。 innodb_redo_log_capacity = 2G # 默认104857600(100MB)。redo log(重做日志)文件占用的磁盘空间大小。 高并发场景下,建议将该值调大,以容纳更多短时间内的写入操作。过小的 Redo Log 会频繁触发 Checkpoint 落盘,导致大量的磁盘 I/O 抖动,影响写入性能。 log_timestamps = SYSTEM # 默认UTC。此变量控制写入错误日志的消息中时间戳的时区,以及写入文件的通用查询日志和慢查询日志消息的时区。该设置不影响写入表(mysql.general_log、mysql.slow_log)的常规查询日志和慢查询日志消息的时区。从这些表中检索的行可通过CONVERT_TZ()函数或设置会话time_zone系统变量,将本地系统时区转换为任意目标时区。 log_timestamps 允许取值为 UTC(默认值)和 SYSTEM(本地系统时区)。 log_error_verbosity = 1 # 默认2。控制错误日志记录详细程度的参数。 general_log = ON # 默认OFF。是否启用通用查询日志。该值可设为0(或OFF)以禁用日志,或设为1(或ON)以启用日志。日志输出目标由log_output系统变量控制;若该值为NONE,即使启用日志也不会写入任何日志条目。 general_log_file = general.log # 默认值 host_name.log。通用查询日志文件的名称。 slow_query_log = ON # 默认OFF。是否启用慢查询日志。日志输出目标由log_output系统变量控制;若该值为NONE,即使启用日志也不会写入任何日志条目。“慢速”的判定依据 long_query_time 变量的值。 slow_query_log_file = slow.log # 默认值 host_name-slow.log。慢查询日志文件的名称。 long_query_time = 1 # 默认值10秒,最小值0秒,最大值为31536000秒(即365天)。若查询耗时超过此秒数阈值,服务器将递增Slow_queries状态变量。若慢查询日志启用,该查询将被记录至慢查询日志文件。此值以实际耗时而非CPU时间衡量,因此在低负载系统中低于阈值的查询,在高负载系统中可能超出阈值。 log_queries_not_using_indexes = ON # 默认OFF。如果在启用慢查询日志的情况下启用此变量,则预期检索所有行的查询将被记录。此选项并不一定意味着未使用索引。例如,使用全索引扫描的查询虽然使用了索引,但仍会被记录,因为该索引无法限制行数。 log-bin = binlog # 指定二进制日志文件的基础名称。启用二进制日志记录后,服务器会将所有修改数据的语句记录到二进制日志中,该日志用于备份和复制。 二进制日志是一系列具有基础名称和数字扩展名的文件。--log-bin 选项的值即为日志序列的基础名称。服务器通过在基础名称后添加数字后缀来按顺序创建二进制日志文件。 二进制日志文件的默认存储位置为数据目录,可通过在基础名称前添加绝对路径来指定替代存储位置。 binlog-do-db = basedb # 将特定数据库的更改写入二进制日志。主从架构中需要同步的数据库(白名单)。指定多个库需重复书写多行(不能用逗号隔开)。 binlog-do-db = archedb relay_log = relay-log # 中继日志文件的基础名称。对于默认复制通道,中继日志的默认基础名称为 host_name-relay-bin。对于非默认复制通道,中继日志的默认基础名称为 host_name-relay-bin-channel,其中 channel 是记录在此中继日志中的复制通道名称。 relay_log_recovery = ON # 默认OFF。当该参数设置为 ON 时,如果从库发生意外宕机,在重启后:1、抛弃损坏的 Relay Log:它会忽略所有现有的 Relay Log 文件(防止其中的损坏数据导致同步报错)。2、重置同步位点:它会根据 SQL 线程 已经成功执行到的位点,重新从主库(Source)拉取所需的 Binary Log 并写入新的 Relay Log。3、自动化恢复:IO 线程会自动对齐到 SQL 线程的位置,无需人工干预即可恢复同步。 replica_skip_errors = 1007,1008,1050 # 默认OFF。用于在复制过程中遇到特定错误时自动跳过,避免同步中断。 replica_net_timeout = 600 # 默认值为60秒。指定在副本认为连接中断、中止读取并尝试重新连接之前,等待源端发送更多数据或心跳信号的秒数。设置此变量不会立即生效。该变量的状态将应用于所有后续的 START REPLICA 命令。 open_files_limit = 8161 # 操作系统提供给 mysqld 的文件描述符数量。 计算公式:a、10 + max_connections + (table_open_cache * 2);b、max_connections * 5;c、操作系统限制。服务器尝试使用这些值中的最大值来获取文件描述符的数量。 在 Unix 系统上,该值不能设置为大于 ulimit -n 命令显示的数值。 table_open_cache = 4000 # 所有线程打开的表的数量。增加此值会增加 mysqld 所需的文件描述符的数量。默认 4000 = MAX((open_files_limit - 10 - max_connections) / 2, 400),最大524288。 table_definition_cache = 2000 # 范围 400 ~ 524288。默认值-1(表示自动调整大小;不要分配该文字值)。可存储在表定义缓存中的表定义数量。如果使用的表数量较多,可以创建一个较大的表定义缓存,以加快表的打开速度。与正常的表缓存不同,表定义缓存占用空间较小,且不使用文件描述符。最小值为 400。默认值基于以下公式,上限为 2000:MIN(400 + table_open_cache / 2, 2000) performance_schema_events_statements_history_long_size = 10000 # 默认-1(表示自动调整大小;请勿直接赋值此字面量)。 performance_schema_events_stages_history_long_size = 10000 performance_schema_events_waits_history_long_size = 10000 performance_schema_events_transactions_history_long_size = 10000 [mysqld3306] server_id = 3306 # 主从复制时有用 port = 3306 socket = /tmp/mysql_3306.sock basedir = /data/local/mysql datadir = /data/local/mysql/3306/data # MySQL服务器数据目录的路径 log_error = /data/local/mysql/3306/log/error.log # 将默认错误日志目标设置为指定的文件。默认错误日志目标是数据目录中名为 host_name.err 的文件。 pid_file = /data/local/mysql/3306/mysql.pid # 5.7建议两层目录,否则启动时可能会卡住 [mysqld8306] server_id = 8306 port = 8306 socket = /tmp/mysql_8306.sock basedir = /data/local/mysql datadir = /data/local/mysql/8306/data log_error = /data/local/mysql/8306/log/error.log pid_file = /data/local/mysql/8306/mysql.pid [mysqld_multi] user = root # 调用 mysqladmin 时使用的 MySQL 数据库的账号 pass = 123456789 # 调用 mysqladmin 时使用的 MySQL 数据库的密码 mysqld = /data/local/mysql/bin/mysqld_safe # 要使用的mysqld二进制文件。mysqld_safe是启动Unix上的 mysqld服务器的推荐方法。mysqld_safe添加了一些安全功能,例如在发生错误时重新启动服务器以及将运行时信息记录到错误日志中。 mysqladmin = /data/local/mysql/bin/mysqladmin # 用于停止服务器的mysqladmin二进制文件 log = /data/local/mysql/mysqld_multi.log [client] default-character-set = utf8mb4 [client_3306] socket = /tmp/mysql_3306.sock [client_8306] socket = /tmp/mysql_8306.sock [mysql] ssl-mode = DISABLED # 此选项用于指定与服务器连接时所需的安全状态。 [mysqladmin] user = root # 连接 MySQL 服务器时使用的 MySQL 用户名 password = 123456789
初始化数据目录 https://dev.mysql.com/doc/refman/8.4/en/data-directory-initialization.html
--defaults-group-suffix :不仅读取常规的选项组,还读取具有常规名称并带有 str 后缀的组。例如,MySQL 客户端通常读取 [client] 和 [mysql] 组。如果将此选项设置为 –defaults-group-suffix=_other,MySQL 还会读取 [client_other] 和 [mysql_other] 组。
--defaults-file :仅读取指定的选项文件,默认读取 /etc/my.cnf 或 ~/.my.cnf 。例外情况:即使使用了 –defaults-file 选项,mysqld 仍会读取 mysqld-auto.cnf 文件,而客户端程序会读取 .mylogin.cnf 文件。
初始化数据目录,请使用 --initialize 或 --initialize-insecure 选项调用 mysqld,具体取决于您是否希望服务器为 ‘root‘@’localhost’ 账户生成一个随机的初始密码,还是创建该账户时不设置密码:
--user :在 Unix 和类 Unix 系统上,确保数据库目录和文件属于哪个 Linux 系统用户是非常重要的 ,以便日后运行 mysqld 时,服务进程能正常读写这些文件。 为了实现这一点,你应该用 Linux 系统的 root 用户启动 mysqld(初始化命令),并加上 --user=mysql 参数,以确保最终生成的文件归属 Linux 操作系统的 mysql 用户。见选项文件的 [mysqld] 组。
1 2 3 4 5 6 7 8 # 不会生成 root 密码 mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=3306 --initialize-insecure --user=mysql mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=8306 --initialize-insecure --user=mysql # 生成随机初始 root 密码,密码会被标记为过期 # mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=8306 --initialize --user=mysql # cat /var/log/mysqld.log # grep 'temporary password' /var/log/mysqld.log
启动 单实例 mysqld --user :以哪个 Linux 系统用户运行 mysqld 服务器。见选项文件的 [mysqld] 组。
mysqladmin --user :连接 MySQL 服务器时使用的 MySQL 用户名。见选项文件的 [mysqladmin] 组。
1 2 3 4 5 6 7 8 9 10 # 打印程序名称及其从选项文件获取的所有选项。密码值将被屏蔽。若使用此选项,它必须是命令行中的第一个选项,但允许紧接在 --defaults-file 或 --defaults-extra-file 之后使用。 mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=3306 --print-defaults mysqladmin --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=_3306 --print-defaults # 启动 mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=3306 & mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=8306 & # 关闭 mysqladmin --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=_3306 shutdown # 也可进入数据库,执行 shutdown; 语句。 mysqladmin --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=_8306 shutdown
多实例 mysqld_multi 用于管理(启动、停止、查看状态)多个 MySQL 实例 。仅搜索名为 [mysqldN] 的选项组。
mysqld_multi --user :调用 mysqladmin 时使用的 MySQL 数据库的账号。见选项文件的 [mysqld_multi] 组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # mysqld_multi [options] {start|stop|reload|report} [GNR[,GNR] ...] 多实例启动 mysqld_multi --defaults-file=/data/local/mysql/my.cnf report # 查看mysql服务 mysqld_multi --defaults-file=/data/local/mysql/my.cnf start # 启动所有组 mysqld_multi --defaults-file=/data/local/mysql/my.cnf start 3306,8306 mysqld_multi --defaults-file=/data/local/mysql/my.cnf stop # 关闭所有组 mysqld_multi --defaults-file=/data/local/mysql/my.cnf stop 3306,8306 # 若启动失败,请查看 mysqld_multi.log 或 各实例的错误日志 cat -n /data/local/mysql/mysqld_multi.log | tail -n 20 # 显示文件的最后 10 行。 cat -n /data/local/mysql/3306/log/error.log | tail -n 20 cat -n /data/local/mysql/3307/log/error.log | tail -n 20 # 清空日志文件 > /data/local/mysql/mysqld_multi.log > /data/local/mysql/3306/log/error.log > /data/local/mysql/3307/log/error.log
首次登录/远程访问/密码设置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 使用 --initialize-insecure 初始化的数据目录,通过 Unix Socket 登录能自动通过认证。 mysql -u root --skip-password -S /tmp/mysql_3306.sock # 使用 --initialize 初始化的数据目录,可通过用户名密码登录。 # mysql -u root -p -S /tmp/mysql_3306.sock # 设置root远程访问 use mysql; select host, user, plugin from mysql.user; update mysql.user set host='%' where user='root'; flush privileges; # 修改密码/设置密码 alter user 'root'@'%' identified by '123456789'; # 修改身份验证插件,并永久修改密码。8.0之后默认的身份验证插件是 caching_sha2_password alter user 'root'@'%' identified with caching_sha2_password by '123456789' password expire never; # alter user 'root' @'%' identified with mysql_native_password by '123456789' password expire never; quit/exit # 退出当前会话
重置Root密码 https://dev.mysql.com/doc/refman/8.4/en/resetting-permissions.html
--skip-grant-tables
自动启停(多实例) https://dev.mysql.com/doc/refman/8.4/en/automatic-start.html
Linux 服务管理有两种方式 service 和 systemd 。
systemd 使用 systemd 配置多个 MySQL 实例: https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
由于 systemd 具备在已安装 systemd 支持的平台上管理多个 MySQL 实例的能力,因此 mysqld_multi 和 mysqld_multi.server 变得不再必要,且不会被安装。
@ 是 systemd 支持的唯一分隔符(模板单元标识符)。启动时 mysqld@实例名.service,systemd 会把 实例名 作为参数传递给模板单元文件,模板文件中可以通过 %i、%I 等变量引用这个实例名。
创建 systemd 服务配置文件 vim /etc/systemd/system/mysqld@.service:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [Unit] Description=MySQL server Documentation=https://zh.wikipedia.org/wiki/Systemd After=syslog.target network.target network-online.target Wants=network-online.target [Service] Type=simple # mysqld 前台运行,需配置 Type=simple # mysqld_safe 后台运行,需配置 Type=forking,同时指定 PIDFile。测试 mysqld_safe 启动失败,可能需要配置选项组!!! # PIDFile=/data/local/mysql/mysql-%I.pid User=mysql Group=mysql ExecStart=/data/local/mysql/bin/mysqld --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=%I ExecStop=/data/local/mysql/bin/mysqladmin --defaults-file=/data/local/mysql/my.cnf --defaults-group-suffix=_%I shutdown Restart=on-failure RestartSec=10s # 文件描述符的数量 LimitNOFILE=65535 [Install] WantedBy=multi-user.target
systemd 服务管理工具 systemctl:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 重新加载systemd服务配置文件 systemctl daemon-reload systemctl status mysqld@3306 systemctl status mysqld@8306 systemctl start mysqld@3306 systemctl start mysqld@8306 systemctl stop mysqld@3306 systemctl stop mysqld@8306 systemctl restart mysqld@3306 systemctl restart mysqld@8306 # 开机自启 systemctl enable mysqld@3306 systemctl enable mysqld@8306 # 关闭自启 systemctl disable mysqld@3306 systemctl disable mysqld@8306 # 查看systemd journal日志 journalctl -u mysqld@3306 journalctl -u mysqld@8306
service 新增启动文件 vim /etc/init.d/mysqld_multi ,或从mysql目录中复制并修改 cp /data/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 # !/bin/sh # # This script assumes that my.cnf file exists either in /etc/my.cnf or # /root/.my.cnf and has groups [mysqld_multi] and [mysqldN]. See the # mysqld_multi documentation for detailed instructions. # # # chkconfig: 2345 64 36 # description: A very fast and reliable SQL database engine. # # basedir=/data/local/mysql bindir=/data/local/mysql/bin export PATH=$bindir:$PATH if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi from dir $basedir"; exit; fi case "$1" in 'start' ) "$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf start $2 ;; 'stop' ) "$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf stop $2 ;; 'report' ) "$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf report $2 ;; 'restart' ) "$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf stop $2 "$mysqld_multi" --defaults-file=/data/local/mysql/my.cnf start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac
启动
1 2 3 4 5 6 7 chmod 750 /etc/init.d/mysqld_multi service mysqld_multi report service mysqld_multi start service mysqld_multi start 3306,3307 service mysqld_multi stop service mysqld_multi stop 3306,3307
设置开机启动
1 2 3 # 设置 mysqld_multi 服务在运行级别为2、3、4、5时启动。--level 指定读系统服务要在哪一个Linux运行级别中开启或关闭。 chkconfig --level 2345 mysqld_multi on chkconfig --level 2345 mysqld_multi off
两种自启动区别 systemd 使用 mysqld 启动服务器。
service 使用 mysqld_multi 管理服务器,启动程序由 [mysqld_multi] 组的 mysqld 选项指定,默认是 mysqld,本文指定为 mysqld_safe。