美文网首页
mysql-主从复制

mysql-主从复制

作者: bug_ling | 来源:发表于2020-11-24 09:32 被阅读0次

    三步骤:

    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-主从复制

          本文链接:https://www.haomeiwen.com/subject/dcediktx.html