实现MySQL数据库的实时备份html
使用MySQL Replicationmysql
吴剑 2018-08-03sql
原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jian数据库
吴剑 http://www.cnblogs.com/wu-jian安全
前言微信
数据库实时备份的需求很常见,MySQL自己提供了 Replication 机制,摘译官方介绍以下:负载均衡
MySQL Replication 能够将一个主数据库中的数据同步到一个或多个从数据库中。而且这个同步过程默认以异步方式工做,不须要保持主从数据库的实时链接(即容许链接中断)。同时容许自定义配置需同步的数据库及数据表。异步
MySQL Replication 的优势及应用场景以下:ide
一、经过 MySQL Replication 实现负载均衡与读写分离(主数据库仅更新,从数据库仅读取),提高数据库性能。函数
二、经过 MySQL Replication 实现数据的实时备份,保证数据安全。
三、经过 MySQL Replication 实现数据的离线分析(主数据库生成数据,从数据库分析计算不影响主数据库性能)。
四、数据分发。
MySQL Replication完整的官方文档请参阅:https://dev.mysql.com/doc/refman/5.7/en/replication.html
剑 http://www.cnblogs.com/wu-jian
工做原理
一、Master中的全部数据库变动事件写入Binary Log文件
二、当在Slave中执行“SLAVE START”命令时,开启Slave I/O Thread,并链接Master
三、Master侦测到Slave I/O Thread的链接,开启Log Jump Thread进行响应
四、Master Binary Log经Master Log Jump Thread和Slave I/O Thread传输至Slave Relay Log
五、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