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

所属分类: 数据库 / Mysql 阅读数: 1889
收藏 0 赞 0 分享

前言

数据库实时备份的需求很常见,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

工作原理

1111

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中查看对应线程的运行情况

配置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;

Master的binlog_format 参数

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

Row

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

Statement

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

Mixed

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

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.%

更多精彩内容其他人还在看

MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)

很多人都将 数据库设计范式 作为数据库表结构设计“圣经”,认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求
收藏 0 赞 0 分享

MySQL的表分区详解

这篇文章主要介绍了MySQL的表分区,例如什么是表分区、为什么要对表进行分区、表分区的4种类型详解等,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL基本命令、常用命令总结

这篇文章主要介绍了MySQL基本命令、常用命令总结,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql 强大的trim() 函数

这篇文章主要介绍了mysql 强大的trim() 函数使用方法,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL函数大全及用法示例分享

这篇文章主要介绍了MySQL的一些函数及用法示例,需要的朋友可以参考下
收藏 0 赞 0 分享

MySQL不支持INTERSECT和MINUS及其替代方法

这篇文章主要介绍了MySQL不支持INTERSECT和MINUS情况下的替代方法,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql修改数据库编码(数据库字符集)和表的字符编码的方法

Mysql数据库是一个开源的数据库,应用非常广泛。以下是修改mysql数据库的字符编码的操作过程和将表的字符编码转换成utf-8的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

mysql远程登录出错的解决方法

mysql远程登录出错的情况,先比很多朋友都有遇到过吧,下面有个不错的解决方法,大家可以参考下
收藏 0 赞 0 分享

mysql通过查看跟踪日志跟踪执行的sql语句

在SQL SERVER下跟踪sql采用事件探查器,而在mysql下如何跟踪sql呢,下面有个不错的方法,大家可以参考下
收藏 0 赞 0 分享

MySQL错误代码大全

本章列出了当你用任何主机语言调用MySQL时可能出现的错误。首先列出了服务器错误消息。其次列出了客户端程序消息
收藏 0 赞 0 分享
查看更多