<强>前言强>
数据库实时备份的需求很常见,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数据库的实时备份知识点详解