MySQL 性能优化与运维实战

MySQL 性能优化与运维实战

概述

MySQL 作为互联网行业使用最广泛的开源关系型数据库,其性能优化与日常运维是 DBA 和运维工程师的核心技能之一。本文从实际生产环境出发,系统性地梳理了 MySQL 在参数优化、锁分析、慢查询诊断、密码策略、权限管理、数据迁移、监控部署、版本升级以及编译安装等方面的关键知识和实践技巧,旨在为读者提供一份可随时查阅的运维参考手册。


一、MySQL 核心优化参数

合理的参数配置是 MySQL 高性能运行的基石。以下参数直接影响数据库的连接能力、缓存效率、日志行为以及 InnoDB 存储引擎的表现。

1.1 基础配置

[mysqld]
user=mysql
datadir=/data/mysql/data
basedir=/opt/mysql
expire_logs_days=7
event_scheduler=ON
max_connections=60000
skip-name-resolve
slow_query_log=1
slow_query_log_file=slowquery.log
long_query_time=3

关键参数说明:

  • skip-name-resolve:跳过 DNS 反向解析,可显著加快客户端连接速度,尤其在连接数较大的场景下,避免 DNS 查询带来的延迟和失败风险。
  • max_connections:最大连接数。生产环境中建议根据业务并发量合理设置,过大会导致系统资源耗尽,过小则无法满足业务需求。
  • slow_query_loglong_query_time:开启慢查询日志并设置阈值为 3 秒,是定位性能瓶颈的第一步。
  • event_scheduler:启用事件调度器,用于定时执行维护任务(如定期清理过期数据)。

1.2 InnoDB 专项配置

innodb_file_per_table=1
innodb_open_files=1000
innodb_buffer_pool_size=4096M
  • innodb_file_per_table=1:启用独立表空间,每个表拥有独立的 .ibd 文件,便于管理和空间回收。
  • innodb_buffer_pool_size:InnoDB 缓冲池大小,是 InnoDB 性能优化中最重要的参数。建议设置为物理内存的 50%-80%,用于缓存数据和索引。

1.3 内存与线程优化

key_buffer_size = 4096M
max_allowed_packet = 32M
table_open_cache = 2048
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 128M
thread_cache_size = 64
query_cache_size= 16M
thread_concurrency = 16
  • key_buffer_size:MyISAM 索引缓冲区大小,如果仍在使用 MyISAM 引擎,该参数非常关键。
  • table_open_cache:表缓存数量。当数据库表数量较多时,适当增大此值可减少频繁打开/关闭表的开销。
  • sort_buffer_sizeread_buffer_size:排序缓冲区和顺序读缓冲区,每个会话都会分配,值不宜过大以免内存过度消耗。
  • thread_cache_size:线程缓存,避免频繁创建/销毁线程带来的开销。
  • query_cache_size:查询缓存大小。在 MySQL 8.0 中查询缓存已被移除,5.7 及以下版本建议根据实际命中率评估是否启用。

二、表锁分析与故障排查

锁争用是 MySQL 性能问题的常见元凶。当业务出现大面积阻塞或超时时,快速定位锁源头是 DBA 的基本功。

2.1 查看表级锁状态

-- 查看正在被锁定的表
SHOW OPEN TABLES WHERE In_use > 0;

-- 查看锁状态概要
SHOW STATUS LIKE '%lock%';

-- 查看表锁相关统计
SHOW STATUS LIKE 'Table%';

2.2 InnoDB 行锁与阻塞分析

以下 SQL 可从 information_schema 中提取当前正在发生阻塞的事务信息,包括被阻塞的线程、SQL 语句、阻塞线程以及阻塞时长:

SELECT
    b.trx_mysql_thread_id AS '被阻塞线程',
    b.trx_query              AS '被阻塞SQL',
    c.trx_mysql_thread_id AS '阻塞线程',
    c.trx_query              AS '阻塞SQL',
    (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started)) AS '阻塞时间(秒)'
FROM
    information_schema.INNODB_LOCK_WAITS a
    JOIN information_schema.INNODB_TRX b ON a.requesting_trx_id = b.trx_id
    JOIN information_schema.INNODB_TRX c ON a.blocking_trx_id = c.trx_id
WHERE
    (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started)) > 60;

当确定阻塞源头后,可通过 KILL 命令终止阻塞线程:

-- 查看所有正在执行的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

-- 终止指定线程(trx_mysql_thread_id)
KILL <线程ID>;

2.3 死锁信息收集

-- 查看当前事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

-- 查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

-- 查看当前等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
运维建议:建议在监控系统中配置锁等待告警,当阻塞时间超过阈值(如 60 秒)时自动触发通知,以便及时介入处理。

三、DDL 操作与在线变更

3.1 SQL 语句分类

SQL 语句主要划分为以下三类:

类别全称说明常用关键字
DDLData Definition Languages数据定义语言,定义数据库对象结构CREATEDROPALTER
DMLData Manipulation Language数据操纵语言,对表记录进行增删改查INSERTDELETEUPDATESELECT
DCLData Control Language数据控制语言,控制访问权限和安全级别GRANTREVOKE

DDL 与 DML 的最大区别在于:DML 仅操作表内部数据,不涉及表结构修改;而 DDL 会改变表定义,通常伴随元数据锁(MDL)的获取。

3.2 DDL 常用操作清单

  1. 创建数据库:CREATE DATABASE
  2. 删除数据库:DROP DATABASE
  3. 创建表:CREATE TABLE
  4. 删除表:DROP TABLE
  5. 修改表:

    • 修改表类型/引擎
    • 增加表字段
    • 删除表字段
    • 字段改名
    • 修改字段排列顺序
    • 表改名
注意事项:对生产环境大表执行 DDL 操作时,务必使用支持在线变更的工具(如 pt-online-schema-changegh-ost),避免长时间锁表影响业务。

四、InnoDB 行格式:COMPACT 与 DYNAMIC

InnoDB 存储引擎引入两种文件格式:

文件格式行格式特点
Antelope(早期)COMPACTRedundant基础行格式,不支持页外存储
Barracuda(新版)DYNAMICCompressed支持可变长度列的页外存储,适合大字段
  • DYNAMICCOMPACT 的主要区别在于:DYNAMIC 对长字段(如 TEXTBLOB)的处理更高效,当行数据过长时会自动将溢出列存储到独立的溢出页,主索引页仅保留 20 字节指针;而 COMPACT 最多在页内存储 768 字节前缀。
  • Compressed 格式在 DYNAMIC 基础上增加了表空间级别的压缩支持。

修改行格式示例:

ALTER TABLE 表名 ROW_FORMAT=DYNAMIC;
适用场景:如果表中包含较多 VARCHARTEXTBLOB 类型字段,且单行数据较长,建议使用 DYNAMIC 行格式以提升空间利用率和查询性能。

五、密码策略与安全配置

MySQL 5.6.6 版本之后引入了密码强度验证插件 validate_password,用于强制实施密码复杂度策略。此插件影响的语句包括:CREATE USERGRANTSET PASSWORDPASSWORD() 等。

5.1 查看当前密码策略

SHOW VARIABLES LIKE 'validate_password%';

输出示例:

+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+

5.2 参数详解

参数说明
validate_password_dictionary_file密码强度验证字典文件路径
validate_password_length密码最小长度,默认 8。最小值为:number_count + special_char_count + (2 * mixed_case_count)
validate_password_mixed_case_count至少包含的大小写字母个数
validate_password_number_count至少包含的数字个数
validate_password_policy密码强度检查等级(0/LOW、1/MEDIUM、2/STRONG)
validate_password_special_char_count至少包含的特殊字符个数

三种策略等级:

  • 0 / LOW:仅校验长度。
  • 1 / MEDIUM(默认):校验长度 + 数字 + 大小写字母 + 特殊字符。
  • 2 / STRONG:在 MEDIUM 基础上增加字典文件校验。

5.3 调整密码策略

在某些内部测试环境或历史遗留系统中,可能需要放宽密码策略:

SET GLOBAL validate_password_policy=0;
SET GLOBAL validate_password_mixed_case_count=0;
SET GLOBAL validate_password_number_count=3;
SET GLOBAL validate_password_special_char_count=0;
SET GLOBAL validate_password_length=3;

执行后再次查看确认:

SHOW VARIABLES LIKE 'validate_password%';

5.4 创建符合简化策略的用户

GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'127.0.0.1' IDENTIFIED BY '123';
安全提醒:生产环境严禁使用弱密码策略。以上简化配置仅适用于开发/测试环境,生产环境建议密码策略至少保持在 MEDIUM 级别。

六、用户权限与权限分配

精确的权限控制是数据库安全的基础。以下汇总了生产环境中常见的 GRANT 授权模式。

6.1 常规业务账号授权

为业务账号分配常见的增删改查及 DDL 权限:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, INDEX,
      RELOAD, LOCK TABLES, CREATE ROUTINE, ALTER ROUTINE, EXECUTE,
      REPLICATION CLIENT, CREATE TEMPORARY TABLES
ON *.* TO 'user'@'%' IDENTIFIED BY 'user@2015.use' WITH GRANT OPTION;

6.2 最小权限原则示例

只为特定库的特定表分配最小必要权限:

-- 仅赋予 upload_logs 库的只读权限
GRANT SELECT ON upload_logs.* TO 'log'@'localhost' IDENTIFIED BY 'log_pass' WITH GRANT OPTION;

-- 仅赋予单个库的只读权限
GRANT SELECT ON drip_hardware_service.* TO 'trans'@'%' IDENTIFIED BY 'Trans!2018';

6.3 权限管理最佳实践

  1. 遵循最小权限原则:仅授予业务需要的最小权限集合,避免直接使用 ALL PRIVILEGES
  2. 限制访问来源:优先使用精确的 IP 地址或主机名(如 'user'@'10.0.1.100'),避免使用 '%' 通配符。
  3. 定期审计:定期使用 SHOW GRANTS FOR 'user'@'host' 审查权限配置。
  4. 区分账号角色:将 DDL 账号(结构变更)与 DML 账号(数据操作)分开管理,降低误操作风险。

七、数据迁移方案

MySQL 数据迁移主要使用 Percona XtraBackup 工具进行物理热备份与恢复,支持单表迁移和全库迁移两种场景。

7.1 单表迁移(5.6 至 5.7)

步骤一:备份单表

innobackupex --user=root --password=test1234 --databases="monitor.os_net" /data01/backup

步骤二:恢复准备(--export)

在备份的 prepare 阶段使用 --export 选项生成导入所需的元数据文件:

innobackupex \
    --defaults-file=/etc/my.cnf \
    --apply-log \
    --use-memory=1G \
    --export \
    /data01/backup/2015-12-17_17-23-18

执行后会在表目录下生成以下关键文件:

  • 表名.cfg:表空间导入所需的元数据文件
  • 表名.ibd:表空间数据文件
  • 表名.exp:导出信息文件

步骤三:导入目标库

-- 在目标库创建结构完全一致的表,必须指定 ROW_FORMAT=COMPACT
CREATE TABLE 表名 (
    ID INT(11),
    Name CHAR(35)
) ROW_FORMAT=COMPACT;

-- 卸载现有表空间
ALTER TABLE 表名 DISCARD TABLESPACE;

在操作系统层面拷贝文件:

cp 表名.cfg 表名.ibd /目标数据库目录/
chown -R mysql:mysql /目标数据库目录/表名.cfg 表名.ibd

在目标库导入表空间:

ALTER TABLE 表名 IMPORT TABLESPACE;

7.2 全库迁移

步骤一:全量备份

innobackupex \
    --defaults-file=/etc/my.cnf \
    --user=root \
    --password= \
    --socket=/var/lib/mysql/mysql.sock \
    /data/Xtrabackup

步骤二:应用 redo log(前滚)

innobackupex \
    --defaults-file=/etc/my.cnf \
    --user=root \
    --password= \
    --apply-log \
    --socket=/var/lib/mysql/mysql.sock \
    /data/Xtrabackup/2017-05-18_10-07-06

步骤三:恢复数据

方法一(单实例 --copy-back):

# MySQL 数据目录必须为空,MySQL 实例必须关闭
innobackupex --copy-back /data/temp/20180131/20180130

方法二(多实例直接移动):

systemctl stop mysqld@3306
mv 20180130 /data/mysql/3306/data
chown -R mysql: /data/mysql/3306/data
systemctl start mysqld@3306

步骤四:跨版本升级系统表

mysql_upgrade -uroot -p -S /var/lib/mysql/mysql3306.sock
systemctl restart mysqld@3306
注意:指定 --use-memory 可增大 xtrabackup 使用的内存(默认 100M),加速 --apply-log 阶段。

八、慢查询分析:pt-query-digest

pt-query-digest 是 Percona Toolkit 中的核心工具,用于分析 MySQL 慢查询日志,快速定位消耗资源最多的 SQL 语句。

8.1 安装依赖

yum install perl-Time-HiRes perl-devel perl-Digest-MD5 perl-DBD-MySQL

wget http://www.cpan.org/modules/by-module/Data/Data-Dumper-2.154.tar.gz
tar xzf Data-Dumper-2.154.tar.gz
cd Data-Dumper-2.154
perl Makefile.PL
make && make install

8.2 基本用法

# 分析慢查询日志
pt-query-digest /path/to/slowquery.log

# 输出到文件并生成报告
pt-query-digest /path/to/slowquery.log > slow_report.txt

# 分析指定时间范围内的慢查询
pt-query-digest --since '2024-01-01 00:00:00' --until '2024-01-02 00:00:00' /path/to/slowquery.log

工具会输出按查询耗时排名的 SQL 摘要,包括执行次数、平均响应时间、锁等待时间等指标,帮助 DBA 快速锁定需要优化的 SQL。


九、PMM 监控部署

Percona Monitoring and Management(PMM)是 Percona 推出的开源数据库监控平台,支持 MySQL、MongoDB、PostgreSQL 等多种数据库的统一监控。

9.1 注册 PMM Client

pmm-admin config \
    --server-insecure-tls \
    --server-url=https://admin:<password>@<PMM-Server-IP>:3004

9.2 添加 MySQL 实例监控

通过 pmm-admin add mysql 命令将 MySQL 实例注册到 PMM Server。使用 --query-source=slowlog 表示从慢查询日志中获取查询分析数据:

pmm-admin add mysql \
    --query-source=slowlog \
    --username=mtop \
    --password=<monitor_password> \
    <实例别名> <IP>:<端口>

示例 — 批量注册多个 MySQL 实例:

pmm-admin add mysql --query-source=slowlog --username=mtop --password=mtop@M2017 zabbix-proxy 10.4.11.103:3306
pmm-admin add mysql --query-source=slowlog --username=mtop --password=mtop@M2017 历史库2 10.180.147.242:3306
pmm-admin add mysql --query-source=slowlog --username=mtop --password=mtop@M2017 业务库A 10.143.68.51:3307

9.3 添加 MongoDB 实例监控

pmm-admin add mongodb <实例别名> <IP>:<端口>

示例:

pmm-admin add mongodb 对象存储 10.148.38.75:27017
pmm-admin add mongodb 光明网日报 10.148.38.75:37017
pmm-admin add mongodb 输入法账号 10.148.38.75:27018
监控建议:建议为每个数据库实例设置清晰的别名(如业务名+用途),便于在 PMM Dashboard 中快速定位。监控账号建议使用最小权限(只需 SELECTPROCESSSUPERREPLICATION CLIENT 权限)。

十、MySQL 版本升级

生产环境的 MySQL 版本升级通常有两种方式:就地升级(In-Place Upgrade)和逻辑升级(Logical Upgrade)。

10.1 就地升级流程

以 MySQL 5.7 升级为例,主要步骤如下:

  1. 备份数据库(必须做全量备份)。
  2. 停止 MySQL 服务
  3. 替换二进制文件(升级 MySQL 安装包)。
  4. 以新版本启动 MySQL
  5. 运行 mysql_upgrade 升级系统表。

10.2 执行 mysql_upgrade

mysql_upgrade -uroot -p -S /var/lib/mysql/mysql.sock

执行完成后需要重启数据库使所有变更生效:

systemctl restart mysqld@3306

mysql_upgrade 会检查并升级以下内容:

  • mysql 系统库中的系统表(user、db、tables_priv、columns_priv 等)
  • sys schema
  • 检查所有数据库的兼容性

典型输出如下:

Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.user                                         OK
...
Upgrading the sys schema.
Checking databases.
sys.sys_config                                     OK
Upgrade process completed successfully.
Checking if update is needed.
重要提醒:升级前务必在测试环境充分验证,并且确保备份可恢复。跨主版本升级(如 5.6 至 5.7,或 5.7 至 8.0)建议使用逻辑备份方式(mysqldump + 导入),而非就地升级。

十一、Percona Server 编译安装

Percona Server for MySQL 是 Percona 发行的 MySQL 增强版本,提供了更好的性能和额外的诊断功能。以下是编译安装的关键步骤。

11.1 Percona Server 5.6.32 编译

安装 Boost 库:

wget https://nchc.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
tar xzf boost_1_59_0.tar.gz
cd boost_1_59_0
./bootstrap.sh
./b2 install

安装编译依赖:

yum install ncurses-devel ncurses openssl-devel tcp_wrappers-devel \
            bison-devel bison gcc-c++ cmake

cmake 编译配置:

cmake \
    -DCMAKE_INSTALL_PREFIX=/usr/server/percona-server5.7.18 \
    -DSYSCONFDIR=/usr/server/percona-server5.7.18 \
    -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
    -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
    -DWITH_FEDERATED_STORAGE_ENGINE=1 \
    -DWITH_PARTITION_STORAGE_ENGINE=1 \
    -DENABLED_LOCAL_INFILE=1 \
    -DEXTRA_CHARSETS=all \
    -DDEFAULT_CHARSET=utf8mb4 \
    -DDEFAULT_COLLATION=utf8mb4_general_ci \
    -DWITH_EDITLINE=bundled \
    -DWITH_SSL:STRING=bundled \
    -DWITH_ZLIB:STRING=bundled \
    -DENABLE_DOWNLOADS=1 \
    -DZLIB_INCLUDE_DIR=/usr/include \
    -DZLIB_LIBRARY=/usr/lib \
    -DMYSQL_USER=mysql

11.2 MySQL 5.5.62 编译参数参考

cmake ./ \
    -DCMAKE_INSTALL_PREFIX=/usr/server/mysql-5.5.62 \
    -DMYSQL_DATADIR=/data/mysql/3310 \
    -DSYSCONFIG=/usr/server/mysql-5.5.62 \
    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
    -DMYSQL_USER=mysql \
    -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql3310.sock \
    -DDEFAULT_CHARSET=utf8mb4 \
    -DDEFAULT_COLLATION=utf8mb4_general_ci \
    -DWITH_EXTRA_CHARSETS=all \
    -DWITH_MYISAM_STORAGE_ENGINE=1 \
    -DWITH_INNOBASE_STORAGE_ENGINE=1 \
    -DWITH_PARTITION_STORAGE_ENGINE=1 \
    -DWITH_READLINE=1 \
    -DWITH_DEBUG=OFF \
    -DENABLE_DEBUG_SYNC=OFF \
    -DINSTALL_LAYOUT=STANDALONE \
    -DWITH_EMBEDDED_SERVER=ON \
    -DWITH_SSL=system \
    -DWITH_ZLIB=system \
    -DZLIB_INCLUDE_DIR=/usr/include \
    -DZLIB_LIBRARY=/usr/lib \
    -DENABLED_LOCAL_INFILE=1 \
    -LH
注意:编译时字符集推荐使用 utf8mb4,排序规则使用 utf8mb4_general_ci,以获得完整的 Unicode 支持(包括 emoji 表情等 4 字节字符)。

十二、MySQLi PHP 扩展编译

当 PHP 应用需要连接 MySQL 数据库时,需要编译安装 mysqli 扩展。

# 进入 PHP 扩展源码目录
/opt/php/bin/phpize

# 配置编译选项
./configure \
    --with-php-config=/opt/php/bin/php-config \
    --with-mysqli=/opt/mysql/bin/mysql_config

# 编译安装
make
make install

关键注意事项:在编译前需要修改 mysqli_api.c 源文件,删除 #include "mysqli_priv.h" 下面直接跟随的那一行代码(通常是多余的宏定义或头文件引用),否则编译将失败。修改后重新执行 make && make install 即可。

编译完成后,在 php.ini 中添加 extension=mysqli.so 并重启 PHP-FPM 服务即可生效。


十三、MySQL 复制原理与 Binlog 格式

13.1 主从复制工作流程

  1. Slave 执行 START SLAVE 命令后,其 IO 线程通过 Master 上授权的复制用户请求连接。
  2. Master 的二进制转储 IO 线程根据 Slave 请求的指定位置(由 CHANGE MASTER 指定),分批读取 binlog 日志内容并返回给 Slave。
  3. Slave IO 线程将接收到的 binlog 内容依次写入本地 Relay Log 文件(mysql-relay-bin.xxx)的末尾,并将新的 binlog 文件名和位置记录到 master-info 文件中。
  4. Slave SQL 线程实时检测 Relay Log 中新增的日志内容,解析为 SQL 语句后在本地按顺序执行,并在 relay-log.info 中记录当前已应用的位置。

13.2 Binlog 三种日志格式

格式特点优点缺点
STATEMENT记录执行的 SQL 语句日志量小,IO 开销低部分函数(如 UUID()USER()SYSDATE())无法正确复制
ROW(推荐)记录每一行数据的修改细节复制精确,不会出现函数/触发器复制问题日志量大,尤其 ALTER TABLE 等批量操作
MIXEDSTATEMENT + ROW 混合平衡日志量与精确性部分场景下的格式选择可能不如预期

推荐使用 ROW 格式:虽然日志量较大,但 ROW 格式提供了最可靠的复制一致性,避免了 STATEMENT 格式下因上下文差异导致的主从数据不一致问题。新版本 MySQL 中对 ROW 格式已做了优化,并非所有修改都以行级记录。

STATEMENT 格式下无法被正确复制的函数:

  • LOAD_FILE()
  • UUID()
  • USER()
  • FOUND_ROWS()
  • SYSDATE()(除非启用 --sysdate-is-now 选项)

总结

本文系统性地覆盖了 MySQL 运维中常见的性能优化与日常操作场景,从核心参数配置、锁故障排查、慢查询分析,到密码策略、权限管理、数据迁移、监控部署、版本升级以及编译安装,形成了一套可落地的实操参考。建议读者将本文作为运维手册,根据实际生产环境的需求选择性参考和细化。

关键要点回顾:

  1. 参数调优innodb_buffer_pool_size 是性能优化的核心,建议设置为物理内存的 50%-80%。
  2. 锁排查:善用 INNODB_LOCK_WAITS 以及 INNODB_TRX 表快速定位阻塞源。
  3. 慢查询pt-query-digest 是必备的慢查询分析工具,需提前安装 Perl 依赖。
  4. 数据迁移:XtraBackup 的 --export--apply-log 是单表/全库迁移的核心步骤。
  5. 监控:PMM 可实现 MySQL 和 MongoDB 的统一监控视图。
  6. 安全:生产环境务必保持密码策略至少为 MEDIUM 级别,权限遵循最小权限原则。
  7. 复制:生产环境推荐使用 ROW 格式的 binlog,以保障主从数据一致性。

暂无评论