mysql-主从复制

三步骤:

1、master将改变记录到二进制日志。这些记录过程叫做二进制日志事件,binary log events

2、slave将master的binary log events拷贝到它的中继日志(relay log)

3、slave重做中继日志中的事件,将改变应用到自己的数据库中。mysql复制是异步的且串行化的

master和slave的mysql版本最好一致

原理:主服务器建立二进制日志,每产生语句或磁盘变化,写进日志;授权复制账号

从服务器建立中继日志;利用复制账号来监听主服务器的日志

实操步骤:

配置binlog日志文件和中继日志文件

主机

1、主服务器ID必须唯一:server_id = 1

2、必须启用二进制日志文件:

    log-bin=mysql-bin

    # 指定日志格式

    binlog-format=mixed # statement(语句)、 row(行)、 mixed(语句和行的混合)

3、启用错误日志

    log-error=/var/mysql/mysql-error.log

4、根目录

    basedir=指mysql的安装位置

    tmpdir= # 临时目录

    datadir= # 数据存储目录

read-only=0

binlog-format=mixed/row/

binlog-ignore-db=mysql

从机:

从服务器唯一ID:server-id=2

启用二进制日志:relay-log=mysql-relay # 开启中继日志


建立账户并授权slave

主机:

#grant replication slave on *.* to 'zhansan'@'zhuji' identified by 'new-password';

grant replication client,replication slave on *.* to 'repl'@'192.169.%.%' identified by 'new-password';

flush privileges;

start master;

show master status; # 取得File:mysqlbin.00001文件和Postion:331位置的值

从机:

change master to 

master_host='ip-address'

master_user='zhansan'

master_password='new-password'

master_log_file='mysqlbin.00001',master_log_pos=331;

start slave;

show status slave; # 查看slave_io_running和slave_sql_running是否开启,如果开启成功就是yes

reset slave; # 重置slave的状态

stop slave; # 停止slave

注意show slave status查看file和position位置的重要性

# 主主复制会出现主键冲突,该如何解决

set session auto_increment=2; # 每步增长2

set session auto_increment=1; # 从1开始增长

set global auto_increment_increment=2;

set global auto_increment_increment=1;


## log-bin二进制日志

日志配置:

开启:log-bin=mysql-bin

设置binlog的格式:binlog-format=mixed # statement,row,mixed

设置log能存储的最大值:max_binlog_size=104857200 # 10M

设置值保留几天的binlog日志:expire_logs_days=7

设置日志只记录指定库的更新:binlog-do-db=db_name

设置日志不记录指定库的更新:binlog-ignore-db=db_name

设置写缓冲多少次,刷一次磁盘,默认为0:sync_binlog=0

查看日志状态和事件:

查看日志是否开启:show variables like '%log_bin%'

查看binlog列表:show binary logs

查看最新的binlog:show master status

查看binlog执行的事件:show binlog events in 'mysql-bin.000001'

查看binlog日志的格式:show global variables like '%binlog-format%';

查看binlog的二进制文件:mysqlbinlog mysql-bin.000001 | more

### 通过mysqlbinlog命令手动恢复数据:

    1、show binary logs;

    2、show binlog events in 'mysql-bin.0000001'; # 找到pos的开始和结束位置

    3、mysqlbinlog --no-defaults --database=dblog--base64-output=decode-rows -vv --start-position=1359 --stop-position=5484  mysql-bin.000001 > backup.sql # 将1359 - 5484位点的数据恢复成自定义的sql文件

    -v:自动生成带注释的SQL语句

    -v -v|-vv:生成列的描述信息,会生成字段的类型、长度、是否为null等

    --base64-output=decode-rows:日志为rows类型时的解码操作

binlog-format的类型时row的情况下遇到的问题:

(1)、binlog出现读不懂的编码,可用--base64-output=decode-rows来解决

(2)、解码后的sql非原生sql,那么如何解决尼?

    show variables like 'binlog_rows_query_log_events';

    set binlog_rows_query_log_events=1;

    flush logs;

    参考链接:https://www.cnblogs.com/kerrycode/p/9315949.html

(3)、解码后发现insert、update、delete等操作被注释掉了?

    暂未找到解决方法,

    但是网上有用binlog2sql来解析二进制日志文件

    参考连接:https://www.cnblogs.com/rickiyang/p/13841811.html

你可能感兴趣的:(mysql-主从复制)