MySQL数据库的实时备份知识点详解

  

<强>前言

  

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

  

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

  

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

  

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

  

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

  

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

  

4,数据分发。

  

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

  

<>强工作原理

  1111年

  

1,主中的所有数据库变更事件写入二进制日志文件

  

2,当在奴隶中执行“奴隶开始”命令时,开启奴隶I/O的线程,并连接主人

  

3,主侦测到奴隶I/O的线程的连接,开启日志跳线进行响应

  

4,主二进制日志经主日志跳线和从I/O的线程传输至奴隶中继日志

  

5,奴隶SQL线程将中继日志还原至数据,同步完成

  

注:可使用“显示PROCESSLIST”命令在主人和奴隶中查看对应线程的运行情况

  

<>强配置主

  

开启二进制日志并设置ServerID, ServerID必须唯一,取值范围1至232 - 1

        (mysqld)   #开启二进制日志   log-bin=mysql-bin   #设置全局ID   服务器id=1      #指定需同步的数据库(因为数据库名称可能包含逗号,因此多个数据库必须重复配置多次而不能以逗号分隔)   binlog-do-db=database_name   #指定禁止同步的数据库   binlog-ignore-db=database_name   #指定二进制日志格式   binlog_format=和之前      

<>强创建同步帐号

  

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

        创建用户“repl”@“% .example.com”被“密码”;   格兰特复制奴隶>   显示主状态;      

使用“显示主状态”命令获取二进制日志信息,并记录文件和位置字段值。

  

同步前保证主与从的数据一致

  

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

        刷新表读锁;      

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

        打开表;      

<>强配置奴隶

  

设置ServerID,可不必开启BinLog:

        (mysqld)   #设置全局ID   服务器id=2      #指定同步的数据库   replicate-do-db=database_name   #指定禁止同步的数据库   replicate_ignore_db=database_name      

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

        mysql>改变主   →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的线程

  
  

开始的奴隶;      

查看同步状态:

  
  

显示奴隶状态;

     

主的binlog_format参数

  

binlog_format用于配置二进制日志的格式,支持如下三种类型:

  

<强>行

  

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

  

<强>声明

  

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

  

<强>

  

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

MySQL数据库的实时备份知识点详解