面试题答案
一键面试优化思路
- 调整binlog格式:不同的binlog格式在数据记录方式和性能上有所差异。
ROW
格式记录每行数据的变化,能精确记录数据修改,但日志量较大;STATEMENT
格式记录执行的SQL语句,日志量小,但在某些复杂场景可能出现数据一致性问题;MIXED
格式是前两者的结合。在数据迁移场景下,考虑到数据准确性和日志量,ROW
格式通常更合适,能确保复杂事务中数据修改被准确记录,利于在目标端重放日志进行数据同步。 - 优化binlog写入频率:频繁的binlog写入会产生I/O开销,影响数据库性能。可以适当增大
innodb_flush_log_at_trx_commit
参数值。该参数有0、1、2三个取值。取值为1时,每次事务提交都将日志写入磁盘,能保证数据不丢失,但I/O开销大;取值为0时,每秒将日志写入磁盘一次,性能好但可能丢失一秒内的数据;取值为2时,每次事务提交将日志写入系统缓存,每秒写入磁盘一次,在性能和数据安全性上有一定平衡。在数据迁移场景下,可根据业务对数据丢失的容忍度,在确保数据可靠性前提下适当调整该参数,如设置为2,以减少I/O操作提高迁移效率。 - 控制binlog文件大小:binlog文件过大可能导致恢复时间长和管理不便。通过设置
max_binlog_size
参数,控制单个binlog文件的大小。合适的文件大小能便于管理和恢复,同时避免因文件过大导致单个事务跨越多个文件,影响数据迁移时日志重放的效率。 - 利用binlog并行复制:MariaDB支持基于库、基于组提交等并行复制方式。在数据迁移到目标端时,开启并行复制功能,可利用多个线程同时重放binlog日志,加快数据同步速度。例如,基于库的并行复制可针对不同数据库的binlog日志并行处理,提高整体迁移效率。
具体操作方法
- 修改binlog格式:编辑MariaDB配置文件(通常是
my.cnf
或my.ini
),在[mysqld]
部分添加或修改binlog_format = ROW
,然后重启MariaDB服务使设置生效。 - 调整binlog写入频率:同样在配置文件
[mysqld]
部分,修改innodb_flush_log_at_trx_commit
参数值,如设置为2 ,即添加或修改innodb_flush_log_at_trx_commit = 2
,重启服务。 - 控制binlog文件大小:在配置文件
[mysqld]
部分,设置max_binlog_size
参数,例如max_binlog_size = 100M
(可根据实际需求调整大小),重启服务后新的binlog文件将按此大小限制生成。 - 开启binlog并行复制:编辑配置文件,在
[mysqld]
部分添加或修改以下参数:- 基于库的并行复制:
slave_parallel_type = DATABASE
,slave_parallel_workers = [N]
(N
为并行工作线程数,根据服务器硬件资源合理设置,如8)。 - 基于组提交的并行复制:
slave_parallel_type = LOGICAL_CLOCK
,slave_parallel_workers = [N]
,并确保主库开启了组提交功能(binlog_group_commit_sync_delay
和binlog_group_commit_sync_no_delay_count
等参数合理设置)。修改完成后,重启MariaDB服务,在目标端(从库)执行START SLAVE
命令启动复制,即可利用并行复制加速数据迁移。
- 基于库的并行复制: