烦恼一般都是想太多了。

0%

MySQL主从复制会出现的问题

公司本来业务量不大,但是为了备份,或者是因为很多视图上的查询有很多锁的问题,导致很多时候连登录都登录不上,就准备做一下读写分里,通过主从复制来实现。

行与语句

基于行的复制会复制变更的每一行,但是如果在类似与 update … set date=now() 这样的语句就会很坑爹。

基于语句的复制,会被执行更新操作的语句进行重放。但是有时候这个重放的顺序可能不一致,同样,,update … set date = now() 这样的情况下,有可能主从服务器时间不一致呢?

所以呢默认的情况下,MySQL 自己使用了一种 mixed 的方式来混合,一种出现问题的时候就使用另外一种来进行。

配置

配置 主从复制是非常简单的。原理就是,主机把变更事件写入二进制日志,从机获取日志,然后重放日志。

直接贴配置了。懒得讲了:

Master

[mysqld]
datadir=/data/mysql/data
socket=/data/mysql/mysql.sock
character_set_server=utf8mb4
lower_case_table_names = 1
max_connections=2000
group_concat_max_len = 5120

log-bin = mysql_bin_log
server-id = 1
innodb_flush_log_at_trx_commit=1 # 事务日志的同步设置。为0,每秒写入日志并同步到磁盘; 1 默认值,事务提交刷新到磁盘;为2时,事务提交就写到日志,但刷新到磁盘每秒一次。
sync_binlog=1 # 当事务提交时,由 MySQL刷新到 bin_log 设置为0,由 内核来执行。为 N(N>1)时,有 N个提交后进行刷新。


slow_query_log = 1
long_query_time = 3
slow_query_log_file=/data/mysql/log/slow_query.log
max_allowed_packet=20M
expire_logs_days=15
sql_mode = strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_auto_create_user,no_engine_substitution
event_scheduler = ON
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=utf8mb4
socket=/data/mysql/mysql.sock
[mysql]
default-character-set=utf8mb4
socket=/data/mysql/mysql.sock

Slave

多加几句就行:

server-id = 2 # 此参数一定不能和主配置文件中的相同
skip-slave-start=true # 手动启动同步线程
read_only=ON #开启的只读模式
relay-log=relay-bin #中继日志命名
relay-log-index=relay-bin.index 中继日志索引文件

# 我们不只同步我们关注的业务库。
replicate_wild_ignore_table =sys.%
replicate_wild_ignore_table =mysql.%
replicate_wild_ignore_table =performance_schema.%
replicate_wild_ignore_table =information_schema.%