zoukankan      html  css  js  c++  java
  • 实现MySQL数据库的实时备份

    实现MySQL数据库的实时备份

    使用MySQL Replication

    吴剑 2018-08-03

    原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian

    吴剑 http://www.cnblogs.com/wu-jian

    前言

    数据库实时备份的需求很常见,MySQL本身提供了 Replication 机制,摘译官方介绍如下:

    MySQL Replication 可以将一个主数据库中的数据同步到一个或多个从数据库中。并且这个同步过程默认以异步方式工作,不需要保持主从数据库的实时连接(即允许连接中断)。同时允许自定义配置需同步的数据库及数据表。

    MySQL Replication 的优点及应用场景如下:

    1、通过 MySQL Replication 实现负载均衡与读写分离(主数据库仅更新,从数据库仅读取),提升数据库性能。

    2、通过 MySQL Replication 实现数据的实时备份,保证数据安全。

    3、通过 MySQL Replication 实现数据的离线分析(主数据库生成数据,从数据库分析计算不影响主数据库性能)。

    4、数据分发。

    MySQL Replication完整的官方文档请参阅:https://dev.mysql.com/doc/refman/5.7/en/replication.html

    剑 http://www.cnblogs.com/wu-jian

    工作原理

    MySQL Replication 工作原理

    1、Master中的所有数据库变更事件写入Binary Log文件

    2、当在Slave中执行“SLAVE START”命令时,开启Slave I/O Thread,并连接Master

    3、Master侦测到Slave I/O Thread的连接,开启Log Jump Thread进行响应

    4、Master Binary Log经Master Log Jump Thread和Slave I/O Thread传输至Slave Relay Log 

    5、Slave SQL Thread将Relay Log还原至数据,同步完成

    注:可使用“SHOW PROCESSLIST”命令在Master和Slave中查看对应线程的运行情况

    吴剑 http://www.cnblogs.com/wu-jian

    配置Master

    开启Binary Log并设置ServerID,ServerID必须唯一,取值范围1至232-1

    [mysqld]
    # 开启Binary Log log-bin=mysql-bin
    # 设置全局ID server-id=1

    # 指定需同步的数据库(因为数据库名称可能包含逗号,因此多个数据库必须重复配置多次而不能以逗号分隔)
    binlog-do-db=database_name
    # 指定禁止同步的数据库
    binlog-ignore-db=database_name
    # 指定Binary Log格式
    binlog_format=MIXED

    创建同步帐号

    因为每个Slave均需要使用帐号密码连接至主数据库,所以在主数据库上必须提供帐号。建议使用一个独立帐号,仅授权数据同步权限。

    CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';

    获取Binary Log信息

    Slave启动I/O Thread时需要传入Binary Log部分信息,因此需要获取一下Binary Log信息:

    SHOW MASTER STATUS;

    使用“SHOW MASTER STATUS”命令获取Binary Log信息,并记录File和Position字段值。

    同步前保证Master与Slave的数据一致

    在Slave启动I/O Thread前,需确保Master与Slave的数据一致,因此先对Master进行锁定(防止数据变更),手动同步并确保数据一致后再解锁。

    FLUSH TABLES WITH READ LOCK;

    手动数据同步相关操作略...

    UNLOCK TABLES;

    配置Slave

    设置ServerID,可不必开启BinLog:

    [mysqld]
    # 设置全局ID server-id=2

    # 指定同步的数据库
    replicate-do-db=database_name
    # 指定禁止同步的数据库
    replicate_ignore_db=database_name

    设置Master信息,执行如下命令:

    mysql> CHANGE MASTER TO
        ->     MASTER_HOST='master_host_name',
    -> MASTER_PORT=master_host_port, -> MASTER_USER='replication_user_name', -> MASTER_PASSWORD='replication_password', -> MASTER_LOG_FILE='recorded_log_file_name', -> MASTER_LOG_POS=recorded_log_position;

    启动I/O Thread

    START SLAVE;

    查看同步状态:

    SHOW SLAVE STATUS;

    吴剑 http://www.cnblogs.com/wu-jian

    Master的binlog_format 参数

    binlog_format用于配置Binary Log的格式,支持如下三种类型:

    Row

    按数据行的变化进行记录,该模式与SQL语句、存储过程、函数、触发器等无关,它只关心每一行的数据是否发生变化,如变化则记录,因此Row模式是准确度最高的。但它的缺点是某些情况下会产生大量内容而导致效率下降,比如表结构发生变更时。

    Statement

    按SQL语句进行记录,很明显这个解决了Row模式的短板,但问题是准确度不够高,因为SQL语句可以非常复杂并且容易出现意外情况。

    Mixed

    Row与Statement混合模式,由MySQL自动决定什么时候使用Row,什么时候使用Statement,这也是默认模式。

    吴剑 http://www.cnblogs.com/wu-jian

    replicate-do-db注意事项

    当在Slave中使用replicate-do-db和replicate-ignore-db配置项时,需特别注意,跨数据库的SQL语句将不会被同步,如:

    replicate-do-db=a
    use b;
    update a.some_table set some_field = 'some value';

    解决方案是使用replicate_wild_do_table和replicate_wild_ignore_table,如:

    replicate_wild_do_table=database_name.%
    replicate_wild_ignore_table=database_name.%

    吴剑 http://www.cnblogs.com/wu-jian

    <全文完>

    吴剑 http://www.cnblogs.com/wu-jian

    微信打赏
    如果您觉得本文对您有所帮助,可扫描两侧的二维码向作者打赏。您的支持是原创的源动力!
    作者:吴剑
    出处:http://www.cnblogs.com/wu-jian/
    本文版权归作者所有,欢迎转载,但必需注明出处,并且在转载页面明显位置给出原文连接,否则保留追究法律责任的权利。
    支付宝打赏
  • 相关阅读:
    本周面试总结
    本周面试总结
    本周面试题总结
    网络请求AJAX
    es6数组、对象的解构赋值
    es6箭头函数
    es6总结
    js限定输入为数字包括负数正则
    js限定输入为非负数,浮点数正则
    js数值千分隔(正则)
  • 原文地址:https://www.cnblogs.com/wu-jian/p/9396739.html
Copyright © 2011-2022 走看看