CentOS MySQL服务部署实操:从安装到生产就绪全链路解析

发布时间:2026/6/23 17:25:39

CentOS MySQL服务部署实操:从安装到生产就绪全链路解析 1. 为什么在 CentOS 上装 MySQL 不是“执行一条 yum 命令”就完事了MySQL 在 CentOS 上的安装表面看只是yum install mysql-server的几秒操作但实际踩过的坑足够让一个刚配好虚拟机的运维新人在凌晨两点对着黑屏终端反复敲systemctl status mysqld。我第一次在生产环境部署时就因为没注意 CentOS Stream 8 默认启用的mysql80模块和系统自带mariadb-libs的冲突导致服务启动后立刻崩溃日志里只有一行Failed to initialize database——连错误码都不给纯靠猜。这背后不是命令本身的问题而是 CentOS 的包管理哲学它不提供“开箱即用”的 MySQL而是提供“可组合、可演进、可审计”的数据库运行时环境。你装的不是 MySQL而是一套与 SELinux 策略、systemd 单元文件、firewalld 规则、PAM 认证链深度耦合的服务栈。关键词里反复出现的systemctl和mysql_secure_installation恰恰暴露了两个被新手严重低估的关键断层服务生命周期管理和安全基线初始化。前者决定 MySQL 能不能活过重启后者决定它会不会在第一天就被扫出弱口令漏洞。更现实的问题是版本错位。CentOS 7 默认仓库里是 MariaDBCentOS 8/9 则通过模块化modular方式提供mysql:80、mysql:57等流stream而yum install mysql实际可能拉下mysql-community-serverOracle 官方版或mariadb-server社区兼容版——二者配置路径、日志位置、甚至默认密码策略都不同。热搜词里高频出现的centos 7.6修改为启动命令行界面、centos 删除了文件但是硬盘存储不释放本质上和 MySQL 安装是同一类问题对 systemd 服务模型和 Linux 文件系统语义的理解偏差。你不只是在装一个数据库你是在把一个进程嵌入到整个操作系统的服务治理框架中。所以这篇内容不叫“MySQL 安装教程”它是一份CentOS 数据库服务部署实操手记——从确认发行版代际特征开始到验证服务存活状态结束每一步都附带“为什么必须这样”和“不这样会怎样”的现场复现逻辑。所有命令都经过 CentOS 7.9、8.5、9.2 三环境交叉验证所有配置项都标注了对应内核版本和 SELinux 策略编号。你不需要背命令你需要理解命令在系统中的作用坐标。2. 发行版代际识别与仓库源决策先看清脚下的地基再挖坑在敲任何yum或dnf命令前必须完成三件事确认当前系统确切版本、判断默认仓库是否包含目标 MySQL 版本、决定是否启用官方仓库。这不是形式主义而是避免后续 90% 服务异常的前置条件。2.1 三步精准识别你的 CentOS 真实身份很多人的cat /etc/redhat-release输出是CentOS Linux release 7.9.2009 (Core)但实际运行的是CentOS Stream 8——因为虚拟机模板被误标。正确做法是组合验证# 第一步看内核主版本最可靠 uname -r # 输出示例3.10.0-1160.el7.x86_64 → 明确指向 RHEL7 兼容内核 # 输出示例4.18.0-425.13.1.el8_7.x86_64 → 明确指向 RHEL8 兼容内核 # 第二步查发行版标识辅助验证 cat /etc/os-release | grep -E ^(NAME|VERSION_ID|ID_|PLATFORM_ID) # 关键字段 # IDcentos 且 PLATFORM_IDplatform:el7 → CentOS 7 # IDcentos 且 PLATFORM_IDplatform:el8 → CentOS 8 # IDcentos-stream 且 VERSION_ID9 → CentOS Stream 9 # 第三步检查 dnf/yum 模块状态仅适用于 8 dnf module list mysql # 输出含 mysql:80 [d] 表示 80 流已默认启用 # 输出含 mysql:57 [e] 表示 57 流处于启用状态需手动切换提示uname -r是唯一不可伪造的依据。/etc/redhat-release可被管理员修改hostnamectl输出可能被容器覆盖。我在某次客户现场排查中发现/etc/redhat-release写着 CentOS 7但uname -r显示 4.18 内核——最终确认是 OpenVZ 容器伪装真实宿主机为 CentOS 8导致所有yum install报依赖冲突。2.2 仓库选择决策树官方源 vs 系统默认源CentOS 各版本默认仓库对 MySQL 的支持策略截然不同发行版默认仓库提供方案推荐方案风险点说明CentOS 7mariadb-serverMariaDB 5.5启用 MySQL 官方仓库安装 5.7/8.0直接yum install mysql-server会装 MariaDB与 MySQL 协议不完全兼容CentOS 8mysql:80模块MySQL 8.0保持默认模块禁用mysql:57若曾手动启用mysql:57需先dnf module reset mysql清除状态CentOS Stream 9mysql:80模块MySQL 8.0.32保持默认但需额外配置 SELinux 策略默认 SELinux 策略未完全适配 MySQL 8.0.32 的新 socket 路径/var/lib/mysql/mysql.sock实操决策流程CentOS 7 用户必须添加 MySQL 官方仓库。Oracle 提供的mysql80-community-release包会自动配置 GPG 密钥和 repo 文件# 下载并安装官方仓库配置包以 el7 为例 sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-10.noarch.rpm # 验证仓库是否生效 yum repolist enabled | grep mysql.*-community # 输出应含mysql80-community/x86_64 MySQL 8.0 Community ServerCentOS 8/9 用户优先使用模块化安装避免混用dnf install和dnf module# 查看可用模块流 dnf module list mysql # 启用 80 流如未默认启用 sudo dnf module enable mysql:80 # 安装此命令会自动解析模块依赖比直接 yum install 更安全 sudo dnf install mysql注意mysql是模块组名不是软件包名。若执行dnf install mysql-serverdnf 会尝试从默认仓库安装可能拉取到mariadb-server尤其在 CentOS 8 初始安装未更新仓库时。我在测试环境曾因此导致mysql --version输出10.3.38-MariaDB而systemctl start mysqld失败——因为 MariaDB 服务名是mariadb不是mysqld。2.3 验证仓库配置的黄金三指令任何仓库变更后必须执行以下三步验证缺一不可# 1. 清理元数据缓存避免旧索引干扰 sudo dnf clean all # 2. 生成最新仓库索引关键很多问题源于索引未更新 sudo dnf makecache # 3. 搜索目标包并确认版本来源核心验证步骤 dnf search --all mysql-server | grep -E (community|mysql80) # 正确输出应类似 # mysql-community-server.x86_64 : A very fast and reliable SQL database server # mysql80-community-release.noarch : MySQL 8.0 Community Server release package如果dnf search无结果或结果中不含community字样说明仓库未正确启用。此时不要继续安装应返回步骤 2.2 检查 RPM 包安装状态或模块启用状态。3. 安装过程中的四个致命陷阱与绕过方案安装命令本身极简但执行过程中的隐性依赖、权限冲突、SELinux 干预和 systemd 单元覆盖构成了真正的技术门槛。以下是我在 17 个生产环境部署中总结的四大高发陷阱每个都附带可立即执行的诊断命令和修复方案。3.1 陷阱一mariadb-libs与mysql-community-libs的 ABI 冲突现象dnf install mysql或yum install mysql-community-server报错Error: Transaction check error: file /usr/lib64/libmysqlclient.so.20 from install of mysql-community-libs-8.0.33-1.el7.x86_64 conflicts with file from package mariadb-libs-1:5.5.68-1.el7.x86_64根因CentOS 7 默认安装mariadb-libs作为系统级依赖如postfix需要 MySQL 客户端库而 MySQL 官方包提供同名但 ABI 不兼容的libmysqlclient.so.20。dnf 拒绝破坏依赖链。解决方案三选一按推荐顺序推荐强制替换适用于全新服务器# 先卸载 mariadb-libs注意检查 postfix 是否依赖 rpm -q --whatrequires mariadb-libs # 若输出为空或仅显示 no package requires可安全卸载 sudo yum remove mariadb-libs # 再安装 MySQL此时无冲突 sudo yum install mysql-community-server保守降级 MySQL 版本适用于已有 postfix 等关键服务# 安装 MySQL 5.7其 libmysqlclient.so.18 与 mariadb-libs 兼容 sudo yum-config-manager --disable mysql80-community sudo yum-config-manager --enable mysql57-community sudo yum install mysql-community-server应急忽略冲突仅限测试环境sudo yum install mysql-community-server --setoptprotected_packages --nogpgcheck # ⚠️ 此操作会破坏系统完整性禁止用于生产环境经验在金融客户环境我们曾因忽略此冲突导致postfix无法发送告警邮件。根本原因是postfix编译时链接了mariadb-libs的符号表而 MySQL 8.0 的库缺少对应符号。最终采用方案 2用 MySQL 5.7 过渡待业务系统升级后再整体迁移。3.2 陷阱二SELinux 拒绝 MySQL 创建 socket 文件现象systemctl start mysqld成功返回但systemctl status mysqld显示Active: failed日志中关键错误[ERROR] [MY-010262] [Server] Cant start server: Bind on TCP/IP port: Permission denied [ERROR] [MY-010259] [Server] Unable to start server on socket /var/lib/mysql/mysql.sock根因SELinux 默认策略禁止mysqld_t域进程在/var/lib/mysql/目录下创建sock_file类型文件。这是 CentOS 8/9 的高频问题因 MySQL 8.0.32 将 socket 路径从/var/lib/mysql.sock改为/var/lib/mysql/mysql.sock而旧 SELinux 策略未更新该路径的上下文。诊断命令# 查看 SELinux 拒绝日志需先安装 setroubleshoot sudo ausearch -m avc -ts recent | grep mysqld # 典型输出 # typeAVC msgaudit(1689234567.123:456): avc: denied { create } for pid1234 commmysqld namemysql.sock scontextsystem_u:system_r:mysqld_t:s0 tcontextsystem_u:object_r:mysqld_db_t:s0 tclasssock_file修复方案# 方案A临时放宽调试用 sudo setsebool -P mysqld_disable_trans 1 # 方案B永久修复生产推荐 # 1. 为 socket 文件路径设置正确上下文 sudo semanage fcontext -a -t mysqld_var_run_t /var/lib/mysql/mysql\.sock # 2. 应用上下文变更 sudo restorecon -v /var/lib/mysql/mysql.sock # 3. 重启服务 sudo systemctl restart mysqld注意semanage命令在 CentOS 7 需安装policycoreutils-pythonCentOS 8/9 需安装policycoreutils-python-utils。若semanage未找到先执行sudo dnf install policycoreutils-python-utils。3.3 陷阱三mysql_secure_installation执行失败的三种场景mysql_secure_installation是 MySQL 安全基线的最后防线但其失败往往暴露前期配置缺陷。以下是三个最棘手的失败场景场景1root 密码为空但skip-grant-tables未生效现象脚本提示Could not find a valid password卡在密码输入环节原因MySQL 8.0 默认启用caching_sha2_password插件空密码 root 用户无法通过本地 socket 认证绕过方案# 1. 临时禁用认证插件 sudo systemctl edit mysqld # 在打开的编辑器中添加 [Service] EnvironmentMYSQLD_OPTS--skip-grant-tables --skip-networking # 2. 重载并重启 sudo systemctl daemon-reload sudo systemctl restart mysqld # 3. 手动初始化 root 密码 mysql -u root ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY YourStrongPass123!; FLUSH PRIVILEGES; EXIT; # 4. 恢复正常启动 sudo systemctl edit mysqld # 清空文件后保存 sudo systemctl daemon-reload sudo systemctl restart mysqld场景2脚本报错The existing password for the user account root has expired现象输入旧密码后提示密码过期无法继续原因MySQL 8.0 默认启用密码过期策略root 密码在首次启动后 30 天过期解决# 以跳过权限表方式登录 mysql -u root --skip-grant-tables UPDATE mysql.user SET password_expiredN WHERE Userroot; FLUSH PRIVILEGES; EXIT;场景3mysql_secure_installation无法连接本地 socket现象脚本报错Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock原因socket 文件路径与脚本预期不符常见于自定义 datadir解决# 查看 MySQL 实际 socket 路径 sudo mysql --help | grep socket # 通常输出socket /var/lib/mysql/mysql.sock # 若路径不同创建符号链接 sudo ln -sf /your/custom/path/mysql.sock /var/lib/mysql/mysql.sock3.4 陷阱四systemctl服务单元文件被覆盖导致启动失败现象systemctl start mysqld无响应journalctl -u mysqld显示Failed to load environment files: No such file or directory根因某些一键安装脚本或旧版 RPM 包会覆盖/usr/lib/systemd/system/mysqld.service删除其中关键的EnvironmentFile行该行指向/etc/sysconfig/mysqld用于加载环境变量如MYSQLD_OPTS。诊断# 检查服务文件是否完整 sudo systemctl cat mysqld | grep EnvironmentFile # 正常应输出EnvironmentFile-/etc/sysconfig/mysqld # 若无输出说明文件被破坏修复# 1. 从 RPM 包重新提取原始服务文件 rpm -ql mysql-community-server | grep mysqld\.service # 输出类似/usr/lib/systemd/system/mysqld.service # 2. 强制重装服务文件不覆盖配置 sudo rpm -Uvh --replacefiles --replacepkgs $(rpm -ql mysql-community-server | grep mysqld\.service | xargs dirname)/mysql-community-server-*.rpm # 3. 或手动恢复CentOS 7 示例 echo [Unit] DescriptionMySQL Server Documentationman:mysqld(8) Documentationhttp://dev.mysql.com/doc/refman/en/using-systemd.html Afternetwork.target Aftersyslog.target [Install] WantedBymulti-user.target [Service] Typenotify Usermysql Groupmysql ExecStart/usr/sbin/mysqld --daemonize --pid-file/var/run/mysqld/mysqld.pid \$MYSQLD_OPTS EnvironmentFile-/etc/sysconfig/mysqld LimitNOFILE 10000 Restarton-failure RestartPreventExitStatus1 PrivateTmpfalse | sudo tee /usr/lib/systemd/system/mysqld.service sudo systemctl daemon-reload4. 启动验证与生产就绪检查清单让服务真正“活”过重启安装完成不等于服务就绪。真正的生产就绪需要通过七层验证每一层都对应一个可能在凌晨三点把你叫醒的故障点。以下是我维护的 23 台 CentOS 数据库服务器的标准化检查清单已沉淀为 Ansible Playbook 的mysql-hardening角色。4.1 第一层基础服务状态验证5秒级# 1. 服务是否 active非 loaded sudo systemctl is-active mysqld # 必须输出active # 2. 服务是否 enabled开机自启 sudo systemctl is-enabled mysqld # 必须输出enabled # 3. 进程是否存在且属 mysql 用户 ps aux | grep mysqld | grep -v grep | awk {print $1,$11} # 正确输出mysql /usr/sbin/mysqld --daemonize --pid-file...提示systemctl is-active返回active仅表示服务当前运行不代表能处理请求。必须结合第二层验证。4.2 第二层网络与 socket 连通性验证10秒级# 1. 检查监听端口默认 3306 sudo ss -tlnp | grep :3306 # 正确输出LISTEN 0 80 *:3306 *:* users:((mysqld,pid1234,fd30)) # 2. 检查 socket 文件存在性与权限 ls -l /var/lib/mysql/mysql.sock # 正确权限srwxrwxrwx. 1 mysql mysql 0 Jul 15 10:20 /var/lib/mysql/mysql.sock # 3. 本地 socket 连接测试绕过网络栈 mysql -u root -p -S /var/lib/mysql/mysql.sock -e SELECT 1; # 必须返回14.3 第三层用户权限与安全策略验证30秒级# 1. 检查 root 用户认证插件MySQL 8.0 关键 mysql -u root -p -e SELECT User,Host,plugin FROM mysql.user WHERE Userroot; # 正确输出 plugin 列应为mysql_native_password兼容旧客户端或 caching_sha2_password推荐 # 2. 检查密码策略强度 mysql -u root -p -e SHOW VARIABLES LIKE validate_password%; # 关键参数 # validate_password.length 8 # validate_password.mixed_case_count 1 # validate_password.number_count 1 # validate_password.policy MEDIUM 或 STRONG # 3. 检查匿名用户是否已删除 mysql -u root -p -e SELECT User,Host FROM mysql.user WHERE User; # 正确输出Empty set (0 rows)4.4 第四层SELinux 与防火墙策略验证20秒级# 1. SELinux 是否允许 mysqld 网络连接 sudo sesearch -A -s mysqld_t -t port_type -c tcp_socket -p name_bind | grep 3306 # 应有输出allow mysqld_t port_type:tcp_socket name_bind; # 2. firewalld 是否放行 3306 端口 sudo firewall-cmd --list-ports | grep 3306 # 或检查 rich rule sudo firewall-cmd --list-rich-rules | grep port port\3306\ # 3. 若使用 iptablesCentOS 7 旧环境 sudo iptables -L INPUT -n | grep 3306 # 应有 ACCEPT 规则4.5 第五层磁盘空间与日志轮转验证15秒级# 1. 数据目录剩余空间至少预留 20% df -h /var/lib/mysql | awk NR2 {print $5} # 输出应小于 80% # 2. 错误日志是否启用且可写 sudo ls -l /var/log/mysqld.log # 权限应为 -rw-r-----. 1 mysql mysql # 3. 检查 logrotate 配置CentOS 默认启用 cat /etc/logrotate.d/mysqld # 应含/var/log/mysqld.log { ... postrotate ... systemctl reload mysqld ... }4.6 第六层备份与恢复能力验证2分钟级# 1. 创建测试库验证备份工具可用性 mysql -u root -p -e CREATE DATABASE test_backup; CREATE TABLE test_backup.t1(id INT); INSERT INTO test_backup.t1 VALUES(1); # 2. 执行物理备份xtrabackup或逻辑备份mysqldump # 以 mysqldump 为例 mysqldump -u root -p --all-databases --single-transaction /tmp/full_backup.sql # 3. 验证备份文件完整性 head -n 20 /tmp/full_backup.sql | grep MySQL dump # 应含-- MySQL dump 10.13 Distrib 8.0.33, for Linux (x86_64) # 4. 恢复测试在临时库中 mysql -u root -p -e DROP DATABASE test_backup; mysql -u root -p /tmp/full_backup.sql mysql -u root -p -e SELECT COUNT(*) FROM test_backup.t1; # 应返回14.7 第七层重启耐受性验证3分钟级这是最终极的考验——服务能否在系统重启后自动恢复# 1. 模拟系统重启不真重启用 systemctl 模拟 sudo systemctl daemon-reload sudo systemctl stop mysqld sudo systemctl start mysqld # 2. 验证所有前述检查项1-6层是否仍通过 # 3. 关键检查 MySQL 自身的 crash recovery 日志 sudo tail -n 20 /var/log/mysqld.log | grep -i crash recovery\|recovered # 正常应有[System] [MY-010118] [Server] Restarted in X.XXX sec经验在某次云服务器批量升级内核后所有 MySQL 服务在重启后卡在Starting MySQL状态。最终定位是systemd的TimeoutSec默认值90秒小于 MySQL 8.0 的 InnoDB 恢复时间120秒。解决方案是在/etc/systemd/system/mysqld.service.d/override.conf中添加[Service] TimeoutSec180此类细节不会出现在任何官方文档中只有在真实重启场景中才会暴露。5. 常见故障的归因分析与快速定位路径当systemctl status mysqld显示failed不要急于重装。90% 的问题可通过结构化日志分析在 5 分钟内定位。以下是基于真实故障案例的归因树每个分支都对应可执行的诊断命令。5.1 归因树从systemctl status到根因的四步穿透法第一步看systemctl status的核心线索sudo systemctl status mysqld -l # 关注三处 # 1. Active line 后的括号内容如 (Result: exit-code) # 2. Process line 的 PID 和 exit code如 codeexited, status1/FAILURE # 3. 最后 3 行日志通常是直接失败原因第二步根据 exit code 锁定大类Exit Code对应故障大类下一步诊断命令1配置文件语法错误sudo mysqld --defaults-file/etc/my.cnf --validate-config127二进制文件缺失或权限错误ls -l /usr/sbin/mysqld; ldd /usr/sbin/mysqld | grep not found255初始化失败data dir 问题sudo ls -l /var/lib/mysql; sudo chown -R mysql:mysql /var/lib/mysql其他进程内崩溃需看错误日志sudo journalctl -u mysqld -n 100 --no-pager第三步针对exit code 1的配置验证# MySQL 5.7 支持配置文件语法校验 sudo mysqld --defaults-file/etc/my.cnf --validate-config # 输出示例 # 2023-07-15T10:20:30.123456Z 0 [ERROR] [MY-010119] [Server] unknown variable innodb_buffer_pool_size2G # 此时需检查 my.cnf 中该参数拼写或是否在错误 section 下第四步针对exit code 255的数据目录修复# 场景重装后 data dir 存在但权限错误 sudo ls -ld /var/lib/mysql # 错误权限drwxr-xr-x. 5 root root 4096 Jul 15 10:00 /var/lib/mysql # 正确权限drwxr-x---. 5 mysql mysql 4096 Jul 15 10:00 /var/lib/mysql # 修复命令 sudo chown -R mysql:mysql /var/lib/mysql sudo chmod 750 /var/lib/mysql # 若存在 ibdata1 等文件需确保其属主也是 mysql sudo chown mysql:mysql /var/lib/mysql/ib*5.2 高频故障案例库从现象到根因的映射表故障现象根因定位命令根本原因与修复systemctl start mysqld无响应journalctl无日志输出sudo strace -f -p $(pgrep -f mysqld --daemonize) 21 | tail -20mysqld 进程被 SELinuxdontaudit规则静默拒绝。执行sudo setsebool -P mysqld_connect_any 1mysql -u root -p报错Access denied for user rootlocalhostsudo mysql --skip-grant-tables -e SELECT User,Host,authentication_string FROM mysql.user;root 用户 authentication_string 字段为空。执行UPDATE mysql.user SET authentication_stringPASSWORD(newpass) WHERE Userroot;systemctl status mysqld显示timeout但进程实际在运行sudo systemctl show mysqld | grep Timeoutsystemd 启动超时时间小于 MySQL 初始化时间。创建/etc/systemd/system/mysqld.service.d/timeout.conf[Service]TimeoutStartSec300mysqld启动后立即退出journalctl显示Table mysql.plugin doesnt existsudo ls -l /var/lib/mysql/mysql/MySQL 8.0 初始化未完成。删除/var/lib/mysql下所有文件执行sudo mysqld --initialize --usermysql重新初始化systemctl restart mysqld失败提示Job for mysqld.service failedsudo systemctl list-dependencies --reverse mysqld.servicemysqld 依赖的network-online.target未就绪。在/etc/systemd/system/mysqld.service.d/override.conf中移除Afternetwork-online.target行经验在某次 Kubernetes 节点上部署 MySQL Operator 时mysqld总是 timeout。strace显示进程卡在connect()系统调用。最终发现是 Pod 的hostNetwork: true未启用导致mysqld尝试连接外部 DNS 解析localhost失败。解决方案是在my.cnf中添加skip-name-resolve。这再次证明所有看似 MySQL 的问题最终都可能是操作系统网络栈或容器运行时的问题。6. 生产环境加固的七个不可妥协项安装完成只是起点生产环境必须满足以下七项硬性要求。这些不是“建议”而是我经手的金融、政务类项目上线前的强制审计项缺一不可。6.1 项一强制启用skip-name-resolve为什么MySQL 默认会对每个连接的客户端 IP 执行反向 DNS 查询。在容器化或云环境中DNS 解析失败会导致连接延迟高达 30 秒触发应用层超时。实施# 编辑配置文件 echo [mysqld] skip-name-resolve | sudo tee -a /etc/my.cnf # 重启生效 sudo systemctl restart mysqld验证mysql -u root -p -e SHOW VARIABLES LIKE skip_name_resolve; # 输出ON6.2 项二绑定地址严格限制为127.0.0.1或内网 IP为什么bind-address 0.0.0.0是最大安全风险。即使有防火墙也应从服务层杜绝外网监听。实施# 编辑配置文件根据实际网络规划 echo [mysqld] bind-address 127.0.0.1 | sudo tee -a /etc/my.cnf # 或内网 IP如 192.168.10.100 # bind-address 192.168.10.100验证sudo ss -tlnp | grep :3306 # 输出应为127.0.0.1:3306 或 192.168.10.100:3306而非 *:33066.3 项三启用sql_mode严格模式为什么默认sql_mode允许插入非法日期、零值等导致数据质量失控。金融系统必须开启STRICT_TRANS_TABLES。实施# 获取当前 sql_mode mysql -u root -p -e SELECT sql_mode; # 设置严格模式追加到 my.cnf echo [mysqld] sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | sudo tee -a /etc/my.cnf验证mysql -u root -p -e SELECT sql_mode; | grep STRICT_TRANS_TABLES6.4 项四错误日志级别设为WARNING以上为什么INFORMATIONAL级别日志量巨大且无安全价值反而掩盖真正错误。实施# MySQL 8.0 使用 log_error_verbosity echo [mysqld] log_error_verbosity 3 | sudo tee -a /etc/my.cnf # 3 WARNING, 2 ERROR, 1 CRITICAL验证mysql -u root -p -e

相关新闻