前言

数据库实时备份的需求很常见,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 Loglog-bin=mysql-bin# 设置全局IDserver-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';

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

SHOW MASTER STATUS;

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

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

FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;

设置ServerID,可不必开启BinLog:

[mysqld]# 设置全局IDserver-id=2# 指定同步的数据库replicate-do-db=database_name# 指定禁止同步的数据库replicate_ignore_db=database_name
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;

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=ause b;update a.some_table set some_field = 'some value';
replicate_wild_do_table=database_name.%replicate_wild_ignore_table=database_name.%

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Android(安卓)- Manifest 文件 详解
  3. Android的Handler机制详解3_Looper.looper()不会卡死主线程
  4. Selector、shape详解(一)
  5. android2.2资源文件详解4--menu文件夹下的菜单定义
  6. Android开发小知识点集锦
  7. Android发送短信方法实例详解
  8. Android(安卓)读取资源文件实例详解
  9. 详解Android中的屏幕方向

随机推荐

  1. 最新eclipse中android插件安装下载地址
  2. Android带返回值的窗口跳转
  3. android edittext 去边框 去下划线
  4. Android全透明Activity示例
  5. appium測試中验证toast的正确性
  6. Android压缩
  7. 代码中如何设置TextView为不可见
  8. Android判断当前线程是否是主线程的方法
  9. Android(安卓)OpenGL ES(八)----纹理编程
  10. android-passwordsafe - Android Passwor