Linux 版安装详细步骤。
安装方式:
YUM:傻瓜式,安装后文件分散
RPM包:掌握,安装后文件分散
通用二进制文件:二进制GLIBC。掌握,无需编译,推荐
源码编译:了解
安装前 关闭防火墙 1 2 3 4 5 firewall-cmd --state systemctl start firewalld systemctl stop firewalld systemctl enable firewalld systemctl disable firewalld
禁用 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
。
1 rpm -qa | grep glibc # 需根据操作系统glibc版本选择
检查&卸载 如果您之前曾通过操作系统自带的包管理工具(如Yum或APT)安装过MySQL,那么在使用原生二进制文件进行安装时可能会遇到问题。请确保之前安装的 MySQL 已被完全卸载(使用包管理系统),并且任何额外的文件(如旧版本的数据文件)也已删除。您还应检查配置文件(如 /etc/my.cnf 或 /etc/mysql 目录)并将其删除。
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 rpm -qa | grep -i mysql # 列出系统中所有已安装的 RPM 包。a 查询所有套件;-q 使用询问模式。 yum list installed | grep mysql # 列出已安装的安装包 yum remove \ mysql-community-server-8.4.6-1.el8.x86_64 \ mysql-community-libs-8.4.6-1.el8.x86_64 \ mysql-community-client-8.4.6-1.el8.x86_64 \ mysql-community-common-8.4.6-1.el8.x86_64 \ mysql-community-icu-data-files-8.4.6-1.el8.x86_64 \ mysql-community-client-plugins-8.4.6-1.el8.x86_64 # 卸载上述命令查询出的已安装程序 find / -name mysql # 按文件名查找 rm -rf \ /var/lib/mysql \ /var/lib/mysql/mysql \ /var/lib/selinux/targeted/active/modules/100/mysql \ /usr/lib64/mysql \ /usr/share/bash-completion/completions/mysql \ /usr/share/selinux/targeted/default/active/modules/100/mysql # 删除上述命令查找出的相关文件 find / | grep .*mysql.* rpm -qa | grep -i mariadb # 检查是否安装mariadb。Redhat默认安装 # rpm -e xxx xxx xxx yum remove \ mariadb-connector-c-3.1.11-2.el8_3.x86_64 \ mariadb-connector-c-config-3.1.11-2.el8_3.noarch # 推荐使用 find / -name my.cnf # 删除所有查询出的配置文件
MySQL 依赖于 libaio 库。如果该库未在本地安装,数据目录初始化和后续服务器启动步骤将失败。如有必要,请使用适当的包管理器进行安装。例如,在基于 Yum 的系统上:
1 2 3 4 5 6 7 8 9 # 方式一:rpm -qa,列出系统中所有已安装的 RPM 包。a 查询所有套件;-q 使用询问模式。 rpm -qa | grep -iE 'libaio|net-tools' # grep -iE,-i 忽略大小写;-E 启用扩展正则表达式 # 方式二:rpm -q <包名>,查询是否安装某个包 rpm -q libaio net-tools # yum search <关键词>,从系统的 YUM 仓库(Repository) 中搜索包含关键词的软件包信息。 yum search libaio yum 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 yum search ncurses-compat-libs yum install ncurses-compat-libs
其他
1 2 3 4 # yum 是基于 RPM 的包管理工具 # deplist 是 yum 的一个子命令,用来列出某个包的依赖列表 yum deplist perl yum install perl
安装 MySQL 安装布局(适用于通用 Unix/Linux 二进制包)
目录
目录内容
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 /opt/local && cd /opt/local/ tar -xf mysql-8.4.6-linux-glibc2.28-x86_64.tar.xz mv ./mysql-8.4.6-linux-glibc2.28-x86_64 ./mysql # 目录重命名 # 创建指向安装目录的符号链接(软链接),这样可以轻松地将其引用为 /opt/local/mysql # ln -s mysql-8.4.6-linux-glibc2.28-x86_64 mysql
为了让mysqld命令可以在任何位置执行,需配置环境变量 ,参考:**环境变量持久化 **
1 2 3 4 5 6 # 在/etc/profile文件末尾添加 echo "export PATH=/opt/local/mysql/bin:$PATH" >> /etc/profile # vim /etc/profile # export PATH=$PATH :/opt/local/mysql/bin# 使环境变量生效 source /etc/profile
修改配置 新建配置文件 vim /opt/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 [mysqld] mysql-native-password = ON # 8.4中默认禁用,9.0.0开始被删除 plugin-load-add = auth_socket.so user = mysql # 以 mysql 用户运行 mysqld 服务器(此处的 "用户 "是指操作系统用户,而不是授权表中列出的 MySQL 数据库的账号)。 bind_address = * # 当绑定多个值时,不允许通配符。不支持正则。IP地址必须存在。 basedir = /opt/local/mysql # MySQL基本安装目录。服务器可执行文件在启动时确定自己的完整路径名,并使用其所在目录的父目录作为默认basedir值。 local_infile = OFF # 此变量控制服务器端对 LOAD DATA 语句的 LOCAL 功能。根据 local_infile 设置,服务器会拒绝或允许客户端在客户端启用 LOCAL 功能时进行本地数据加载。 mysqlx = OFF # lc_messages_dir = /opt/local/mysql/share # lc_messages = en_US # 在这种情况下,mysqld将区域设置en_US映射到语言english,并在/opt/local/mysql/share/english目录中查找错误文件 default_password_lifetime = 180 # 全局密码自动过期策略,每N天修改一次 max_connections = 10 # 允许同时连接的最大客户端数量,默认151,最小1,最大100000。最大有效值为 (open_files_limit 的有效值 - 810) 与 max_connections 实际设置的值中的较小者。状态变量 connection_errors_max_connections:由于达到服务器 max_connections 限制,因此拒绝的连接数。 back_log = 1 # MySQL 可拥有的未处理连接请求数。当 MySQL 主线程在很短的时间内收到很多连接请求时,这一点就会发挥作用。这时,主线程需要一些时间(虽然很少)来检查连接并启动一个新线程。back_log 值表示在 MySQL 暂时停止应答新请求之前,在这短时间内可以堆叠多少个请求。只有在预计短时间内会有大量连接的情况下,才需要增加该值。换句话说,该值是用于接收 TCP/IP 连接的监听队列的大小。操作系统对该队列的大小有自己的限制。Unix listen() 系统调用的手册页面应该有更多详细信息。请查阅操作系统文档,了解该变量的最大值。默认值为 max_connections(最大连接数)的值,该值可使允许积压的连接数调整到最大允许连接数。 max_connect_errors = 100 # 当主机的 max_connect_errors 次连续连接请求被中断且未成功连接时,服务器将阻止该主机继续连接。 character_set_server = utf8mb4 # 服务默认字符集 lower_case_table_names = 1 # 此选项适用于数据库名称和表名称。0:存储区分大小写,比较区分大小写; 1:存储小写,比较不区分大小写; 2:存储区分大小写,比较小写 default-time-zone = '+08:00' # 设置服务器默认时区,若未指定则与系统时区相同 skip-grant-tables = OFF # 需重启。该配置使所有用户登录当前数据库都免密,修改密码后立即去掉。 activate_all_roles_on_login = OFF # default_storage_engine = InnoDB # 为永久表设置存储引擎 default_tmp_storage_engine = InnoDB # 临时表的默认存储引擎 log_timestamps = SYSTEM transaction_isolation = REPEATABLE-READ # 设置默认事务隔离级别 max_allowed_packet = 67108864 # 默认67108864(64MB),最小1024。 tmp_table_size = 16777216 # 默认16777216(16MB),最小1024, max_heap_table_size = 16777216 # 默认16777216(16MB),最小16384(16KB) secure_file_priv = NULL # 默认值因系统和安装方式而异。此变量用于限制数据导入和导出操作的影响,例如由LOAD DATA和SELECT ... INTO OUTFILE语句以及LOAD_FILE()函数执行的操作。这些操作仅允许具有FILE权限的用户执行。如果设置为 NULL,服务器将禁用导入和导出操作。 require_secure_transport = OFF # 客户端连接到服务器时是否需要使用某种形式的加密传输。当此变量启用时,服务器仅允许使用TLS/SSL加密的TCP/IP连接,或使用套接字文件(在Unix系统上)或共享内存(在Windows系统上)的连接。服务器将拒绝不安全的连接尝试,这些尝试将以ER_SECURE_TRANSPORT_REQUIRED错误失败。简言之,OFF 表示服务器不强制客户端必须使用加密连接,可以使用 mysql --ssl-mode=disable。 thread_cache_size = 0 # 服务器应缓存多少线程以供重用。当客户端断开连接时,如果缓存中的线程少于线程_缓存_大小,客户端的线程就会被放入缓存。如果可能,会通过重用缓存中的线程来满足对线程的请求,只有当缓存为空时,才会创建新的线程。如果有大量新连接,可以增加这个变量来提高性能。通常情况下,如果你的线程实现得很好,这并不会显著提高性能。不过,如果服务器每秒有数百个连接,通常应将 thread_cache_size 设置得足够高,以便大多数新连接都使用缓存线程。通过查看 Connections 和 Threads_created 状态变量之间的差异,可以了解线程缓存的效率如何。详情请参阅第 7.1.10 节 "服务器状态变量"。默认值基于以下公式,上限为 100:8 + (max_connections / 100) thread_stack = 1048576 # 每个线程的堆栈大小。默认值对于正常操作来说足够大。如果线程堆栈大小太小,则会限制服务器可以处理的SQL语句的复杂性、存储过程的递归深度以及其他消耗内存的操作。默认1048576(1MB),最小131072(128KB)。 wait_timeout = 28800 # 默认28800。服务器在关闭 非交互式连接 之前等待该连接活动的秒数。在线程启动时,会话 wait_timeout 值从全局 wait_timeout 值或全局 interactive_timeout 值初始化,取决于客户端的类型(由 mysql_real_connect() 的 CLIENT_INTERACTIVE 连接选项定义)。 interactive_timeout = 28800 # 默认28800。服务器在关闭 交互式连接 之前等待该连接活动的秒数。交互式客户端定义为使用 mysql_real_connect() 的 CLIENT_INTERACTIVE 选项的客户端。另请参阅 wait_timeout。 sort_buffer_size = 262144 # 每个必须执行排序的会话都会分配一个该大小的缓冲区。不特定于任何存储引擎,并且以通用方式应用以进行优化。值必须足够大,以便在排序缓冲区中容纳十五个元组。增加 max_sort_length 的值可能需要增加 sort_buffer_size 的值。如果您在 SHOW GLOBAL STATUS 输出中看到每秒有许多 Sort_merge_passes,则可以考虑增加 sort_buffer_size 值以加快无法通过查询优化或改进索引来改进的 ORDER BY 或 GROUP BY 操作。默认262144(256KB),最小32768(32KB)。 join_buffer_size = 262144 # 用于普通索引扫描、范围索引扫描和不使用索引从而执行全表扫描的连接所使用的缓冲区的大小。默认262144(256KB),最小128。 read_buffer_size = 131072 # 对MyISAM表进行顺序扫描的每个线程都会为其扫描的每个表分配一个此大小(以字节为单位)的缓冲区。如果执行多次顺序扫描,您可能需要增加该值,默认131072(128KB),最小8192(8KB)。 binlog_cache_size = 32768 # 当服务器上启用二进制日志记录时,如果服务器支持任何事务存储引擎,则为每个客户端分配一个二进制日志缓存。如果事务的数据超出了内存缓冲区的空间,则超出的数据将存储在临时文件中。默认32768(32KB),最小4096。 max_binlog_cache_size = 18446744073709547520 # 如果事务需要超过这么多字节,服务器会生成多语句事务需要超过“max_binlog_cache_size”字节的存储错误。当gtid_mode不为ON时,最大推荐值为4GB,因为在这种情况下,MySQL无法使用大于4GB的二进制日志位置;该选项仅设置事务缓存的大小;语句缓存的上限由 max_binlog_stmt_cache_size 系统变量控制。最小4096。 key_buffer_size = 8388608 # MyISAM 表的索引块被缓冲并由所有线程共享。该选项是用于索引块的缓冲区的大小。密钥缓冲区也称为密钥缓存。默认8388608(8MB),最小0。 innodb_buffer_pool_size = 134217728 # 缓冲池的大小(以字节为单位),InnoDB 缓存表和索引数据的内存区域。默认134217728(128MB),最小5242880(5MB)。 innodb_buffer_pool_instances = 1 # InnoDB缓冲池划分的区域数。对于缓冲池大小在几GB范围内的系统,将缓冲池划分为单独的实例可以提高并发性,因为不同线程读取和写入缓存页面时会减少争用。使用哈希函数将存储在缓冲池中或从缓冲池读取的每个页面随机分配给其中一个缓冲池实例。每个缓冲池管理自己的空闲列表、刷新列表、LRU 以及连接到缓冲池的所有其他数据结构,并受自己的缓冲池互斥锁保护。\n 总缓冲池大小在所有缓冲池之间分配。为了获得最佳效率,请指定 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的组合,以便每个缓冲池实例至少为 1GB。 innodb_buffer_pool_dump_pct = 25 # 指定每个缓冲池要读出并转储的最近使用的页面的百分比。范围是 1 到 100。默认值为 25。例如,如果有 4 个缓冲池,每个缓冲池有 100 个页面,并且 innodb_buffer_pool_dump_pct 设置为 25,则会转储每个缓冲池中最近使用的 25 个页面。人话:MySQL正常关闭时把buffer中页信息保存到磁盘,启动后再从磁盘加载到buffer,实现服务器快速预热。 innodb_data_file_path = ibdata1:12M:autoextend # 定义InnoDB系统表空间数据文件的名称、大小和属性。file_name:file_size[:autoextend[:max:max_file_size]] innodb_file_per_table = ON # 当启用 innodb_file_per_table 时,表默认创建在按表分文件的表空间中。当禁用时,表默认创建在系统表空间中。 innodb_default_row_format = DYNAMIC # 该选项用于定义 InnoDB 表和用户创建的临时表的默认行格式。默认设置为 DYNAMIC。其他允许的值包括 COMPACT 和 REDUNDANT。COMPRESSED 行格式(不支持在系统表空间中使用)不能被定义为默认值。新创建的表在未显式指定 ROW_FORMAT 选项或使用 ROW_FORMAT=DEFAULT 时,将使用 innodb_default_row_format 定义的行格式。服务器为处理查询而创建的内部 InnoDB 临时表使用 DYNAMIC 行格式,无论 innodb_default_row_format 设置如何。 innodb_page_size = 16384 # 默认16384(16KB)。指定InnoDB表空间的页面大小。值可以以字节或千字节为单位指定。例如,16千字节的页面大小值可以指定为16384、16KB或16k。 innodb_redo_log_archive_dirs = NULL # 定义可创建重做日志存档文件的带标签目录。您可以在以分号分隔的列表中定义多个带标签目录。默认值为NULL,不允许激活重做日志归档。 innodb_redo_log_capacity = 104857600 # 默认104857600(100MB)。定义重做日志文件占用的磁盘空间量。已经取代 innodb_log_file_size 和 innodb_log_files_in_group。总共的redo日志文件大小其实就是: innodb_log_file_size * innodb_log_files_in_group。 innodb_log_buffer_size = 67108864 # redo log bufer。默认67108864(64MB),最小1048576(1MB)。InnoDB用于写入磁盘日志文件的缓冲区大小。较大的日志缓冲区使得大型事务能够运行,而无需在事务提交之前将日志写入磁盘。因此,如果您有更新、插入或删除多行的事务,则增大日志缓冲区可以节省磁盘 I/O。尚硅谷:为了提高性能,也是先将信息写入 Innodb Log Buffer 中,当满足 innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。 innodb_flush_log_at_trx_commit = 1 # 从redo log bufer刷盘到redo log file的策略。为了在使用事务的复制设置中实现持久性和一致性InnoDB,始终设置 innodb_flush_log_at_trx_commit=1 (完全符合 ACID 要求,默认设置 1。每次提交事务时,日志都会写入并刷新到磁盘)。 innodb_undo_tablespaces = 2 # 定义InnoDB使用的undo表空间的数量。默认值和最小值为2,最大值127。 innodb_undo_log_truncate = ON # 启用后,超过 innodb_max_undo_log_size 定义的阈值的undo表空间将被标记为截断。只有undo表空间才能被截断。不支持截断驻留在系统表空间中的undo日志。要进行截断,必须至少有两个undo表空间。 innodb_max_undo_log_size = 1073741824 # 定义undo表空间的阈值大小。如果undo表空间超出阈值,则在启用 innodb_undo_log_truncate 时可以将其标记为截断。默认1073741824(1GB),最小10485760(10MB)。 innodb_print_all_deadlocks = OFF # 当启用此选项时,有关 InnoDB 用户事务中的所有死锁的信息都将记录在 mysqld 错误日志中。 innodb_flush_sync = ON # 默认启用,在检查点发生 I/O 活动突发期间,会忽略 innodb_io_capacity 和 innodb_io_capacity_max 配置。为了遵守 innodb_io_capacity 和 innodb_io_capacity_max 定义的 I/O 速率,请禁用 innodb_flush_sync。 innodb_io_capacity = 200 # 默认值10000。定义InnoDB后台任务可用的每秒 I/O 操作数 (IOPS),例如从缓冲池刷新页面和从更改缓冲区合并数据。人话:缓冲区刷新到磁盘时,每秒刷新的脏页数量; innodb_io_capacity_max = 400 # 默认 2 * innodb_io_capacity。 innodb_read_io_threads = 4 # 默认值为 CPUCore / 2。 InnoDB 中用于读取操作的 I/O 线程数。写入线程的对应项是 innodb_write_io_threads。 innodb_write_io_threads = 4 # 默认值为 4。 InnoDB 中用于写入操作的 I/O 线程数。读取线程的对应项是 innodb_read_io_threads。 innodb_lock_wait_timeout = 50 # InnoDB 事务在放弃之前等待行锁的时间长度(以秒为单位)。默认值为 50 秒。 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) open_files_limit = 8161 # 操作系统中 mysqld 可用的文件描述符数量。默认 8161 = 10 + max_connections + (table_open_cache * 2),该值是从三种计算方式中取的最大值,详见官网。 log_output = FILE # 默认值 FILE。通用查询日志和慢查询日志的输出目标。该值是一个由TABLE、FILE和NONE组成的一个或多个以逗号分隔的单词列表。TABLE选择将日志记录到mysql系统模式中的general_log和slow_log表中。FILE选择将日志记录到日志文件中。NONE禁用日志记录。如果值中包含NONE,则它将优先于其他任何存在的单词。TABLE 和 FILE 可以同时指定以选择两个日志输出目标。此变量用于选择日志输出目标,但不会启用日志输出。要启用日志输出,需启用 general_log 和 slow_query_log 系统变量。对于 FILE 日志记录,general_log_file 和 slow_query_log_file 系统变量确定日志文件的位置。有关更多信息,请参阅第 7.4.1 节“选择通用查询日志和慢查询日志输出目标”。 general_log = OFF # 是否启用通用查询日志。日志输出的目标由 log_output 系统变量控制;如果该值为 NONE,则即使启用了日志也不会写入任何日志条目。默认OFF。 general_log_file = localhost.log # 默认值 host_name.log。通用查询日志文件的名称。 long_query_time = 2 # 如果查询耗时超过指定秒数,服务器会将 Slow_queries 状态变量加一。如果启用了慢查询日志,该查询会被记录到慢查询日志文件中。默认值10秒,最小0秒。 slow_query_log = ON # 是否启用慢查询日志。日志输出的目的地由log_output系统变量控制;如果该值为 NONE,则即使启用了日志也不会写入任何日志条目。“慢”由 long_query_time 变量的值决定。默认OFF。 slow_query_log_file = localhost-slow.log # 默认值 host_name-slow.log。慢查询日志文件的名称。 log_queries_not_using_indexes = ON # 如果在启用慢查询日志的情况下启用此变量,则会记录预期检索所有行的查询。此选项并不一定意味着不使用索引。例如,使用完整索引扫描的查询使用索引,但会被记录,因为索引不会限制行数。默认OFF。 log_throttle_queries_not_using_indexes = 0 # 如果启用了 log_queries_not_using_indexes,则 log_throttle_queries_not_using_indexes 变量会限制每分钟可写入慢查询日志的此类查询的数量。默认值0,表示“无限制”。 min_examined_row_limit = 0 # 检查少于此行数的查询将不会记录到慢查询日志中。设置此系统变量的会话值是一项受限制的操作。会话用户必须具有足够的权限才能设置受限制的会话变量。默认值0。 log_slow_replica_statements = ON # 开启 从服务器 的慢查询日志。请查阅官网... performance_schema = ON # 默认值ON。用于指示性能模式是否启用。 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 log-bin = binlog # 二进制日志文件名称,也可以加上路径 /opt/local/mysql/3306/data/binlog。数据库文件最好不要与日志文件放在同一个磁盘上,当数据库文件所在的磁盘发生故障时,可以使用日志文件恢复数据。 binlog_expire_logs_seconds = 2592000 # 设置二进制日志的有效期(以秒为单位)。有效期结束后,二进制日志文件可以被自动删除。可能的删除发生在启动时以及二进制日志刷新时。可以通过将 binlog_expire_logs_auto_purge 系统变量设置为 OFF 来禁用二进制日志的自动清除。此设置优先于 binlog_expire_logs_seconds 的任何设置。要手动删除二进制日志文件,请使用 PURGE BINARY LOGS 语句。默认2592000秒(30天)。 binlog_expire_logs_auto_purge = ON # 启用或禁用二进制日志文件的自动清除。清除之前等待的间隔由 binlog_expire_logs_seconds 控制。即使 binlog_expire_logs_auto_purge 处于 ON 状态,将 binlog_expire_logs_seconds 设置为 0 也会停止自动清除。此变量对 PURGE BINARY LOGS 没有影响。默认值ON。 max_binlog_size = 200M # 每次重启会新建。事务以一个块的形式写入二进制日志,因此它永远不会被拆分到多个二进制日志中。因此,如果您有大型事务,您可能会看到二进制日志文件大于 max_binlog_size。如果 max_relay_log_size 为 0,则 max_binlog_size 的值也适用于中继日志。最大值和默认值为1073741824(1GB)。 log_bin_trust_function_creators = OFF # 此变量在启用二进制日志记录时适用。限制存储过程,因为二进制日志的一个重要功能是用于主从复制,而存储函数(now())有可能导致主从的数据不一致。所以当开启二进制日志后,需要限制存储函数的创建、修改、调用。 binlog_format = ROW # binlog_format 已被弃用,并将在未来的 MySQL 版本中删除。这意味着对基于行的记录格式以外的记录格式的支持也将在未来版本中删除。因此,任何新的 MySQL 复制设置都只能使用基于行的日志记录。 binlog_row_image = full # binlog-ignore-db = test # 不要复制的数据库 binlog-do-db = basedb # 需要复制的数据库 sync_binlog = 1 # 为了在使用事务的复制设置中实现持久性和一致性InnoDB,如果启用了二进制日志记录,请设置 sync_binlog=1。 relay_log = relaylog # 中继日志文件名称 max_execution_time = 0 # SELECT 语句的执行超时时间(会中断超时 SQL,返回错误),单位为毫秒。默认值0,表示不启用超时。对于存储程序中的 SELECT 语句,max_execution_time 将被忽略。 read_only = OFF [mysqld3306] server_id = 3306 # 用于主从复制 port = 3306 basedir = /opt/local/mysql # MySQL安装基目录的路径。 datadir = /opt/local/mysql/3306/data # MySQL服务器数据目录的路径。 log-error = /opt/local/mysql/3306/log/error.log # 将默认错误日志目标设置为指定的文件。这会影响以默认目标为基础输出目标的日志接收器。如果该选项没有指定文件,则 Unix 和类 Unix 系统上的默认错误日志目标是数据目录中名为 host_name.err 的文件。 pid-file = /opt/local/mysql/3306/mysql.pid # 5.7建议两层目录,否则启动时可能会卡住 socket = /tmp/mysql_3306.sock lower_case_table_names = 1 # 会在初始化数据目录和启动服务时,替换[mysqld]组的设置(存在多个选项组时,最后一个配置项生效) [mysqld3307] server_id = 3307 port = 3307 basedir = /opt/local/mysql datadir = /opt/local/mysql/3307/data log-error = /opt/local/mysql/3307/log/error.log pid-file = /opt/local/mysql/3307/mysql.pid socket = /tmp/mysql_3307.sock lower_case_table_names = 1 [mysqld_multi] user = root # 调用 mysqladmin 时使用的 MySQL 数据库的账号 pass = 123456789 # 调用 mysqladmin 时使用的 MySQL 数据库的密码 mysqld = /opt/local/mysql/bin/mysqld_safe # 要使用的mysqld二进制文件。mysqld_safe是启动Unix上的 mysqld服务器的推荐方法。mysqld_safe添加了一些安全功能,例如在发生错误时重新启动服务器以及将运行时信息记录到错误日志中。 mysqladmin = /opt/local/mysql/bin/mysqladmin # 用于停止服务器的mysqladmin二进制文件 log = /opt/local/mysql/mysqld_multi.log [client] default-character-set = utf8mb4 [client_3306] socket = /tmp/mysql_3306.sock [client_3307] socket = /tmp/mysql_3307.sock [mysql] ssl-mode = disable # 此选项用于指定与服务器连接时所需的安全状态。 [mysqladmin] user = root # 连接 MySQL 服务器时使用的 MySQL 用户名 password = 123456789
创建数据目录 1 2 3 4 5 6 7 8 cd /opt/local/mysql # 创建各实例数据存放目录 mkdir -p /opt/local/mysql/3306/{data,log,mysql-files} mkdir -p /opt/local/mysql/3307/{data,log,mysql-files} # 创建各实例error日志,可省略,会自动创建 # touch /opt/local/mysql/3306/log/error.log# touch /opt/local/mysql/3307/log/error.logtree -d /opt/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 /opt/local/mysql # -R 处理指定目录以及其子目录下的所有文件。 # chmod 750 /opt/local/mysql # 查看所有用户组 cat /etc/group # 查看所有用户(系统 + 登录用户) cat /etc/passwd # 查看某个用户所属的所有组 groups mysql # 查看指定用户详细信息(包括主组) id mysql # userdel -r mysql # groupdel mysql
初始化数据目录 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=/opt/local/mysql/my.cnf --defaults-group-suffix=3306 --initialize-insecure --user=mysql mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=3307 --initialize-insecure --user=mysql # 生成随机初始 root 密码,密码会被标记为过期 mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=3308 --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 # 启动 mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=3306 & mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=3307 & # 关闭 mysqladmin --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=_3306 shutdown mysqladmin --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=_3307 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=/opt/local/mysql/my.cnf report # 查看mysql服务 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf start # 启动所有组 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf start 3306,3307 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf stop # 关闭所有组 mysqld_multi --defaults-file=/opt/local/mysql/my.cnf stop 3306,3307 # 若启动失败,请查看 mysqld_multi.log 或 各实例的错误日志 cat -n /opt/local/mysql/mysqld_multi.log | tail -n 20 # 显示文件的最后 10 行。 cat -n /opt/local/mysql/3306/log/error.log | tail -n 20 cat -n /opt/local/mysql/3307/log/error.log | tail -n 20 # 清空日志文件 > /opt/local/mysql/mysqld_multi.log > /opt/local/mysql/3306/log/error.log > /opt/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 初始化后的登录方式 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 [Unit] Description= MySQL server Documentation= https://zh.wikipedia.org/wiki/Systemd After=syslog.target network.target network-online.target [Service] Type=simple User=mysql Group=mysql ExecStart=/opt/local/mysql/bin/mysqld --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=%I ExecStop=/opt/local/mysql/bin/mysqladmin --defaults-file=/opt/local/mysql/my.cnf --defaults-group-suffix=_%I shutdown Restart=on-failure # 文件描述符的数量 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 # 重新加载systemd服务配置文件 systemctl daemon-reload systemctl status mysqld@3306 systemctl status mysqld@3307 systemctl start mysqld@3306 systemctl start mysqld@3307 systemctl stop mysqld@3306 systemctl stop mysqld@3307 systemctl restart mysqld@3306 systemctl restart mysqld@3307 # 开机自启 systemctl enable mysqld@3306 systemctl enable mysqld@3307 # 关闭自启 systemctl disable mysqld@3306 systemctl disable mysqld@3307
service 新增启动文件 vim /etc/init.d/mysqld_multi
,或从mysql目录中复制并修改 cp /opt/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=/opt/local/mysql bindir=/opt/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=/opt/local/mysql/my.cnf start $2 ;; 'stop' ) "$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf stop $2 ;; 'report' ) "$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf report $2 ;; 'restart' ) "$mysqld_multi" --defaults-file=/opt/local/mysql/my.cnf stop $2 "$mysqld_multi" --defaults-file=/opt/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。