MySQL的 Binary Log (Binlog)是MySQL数据库运行过程中的一种重要日志文件,记录了所有对MySQL数据库执行的数据修改语句(如INSERT,UPDATE,DELETE)和数据库的结构变更语句(如CREATE,ALTER,DROP)。同时,每条记录内容都包含了该语句执行的精确时间(可以理解为事件的发生时间)。
Binlog主要用于以下三个目的:
-
复制: Binlog用于实现MySQL的主从复制,即从服务器可以读取主服务器的Binlog来保持与主服务器的同步。主服务器上的所有数据改变(比如增,删,改)都写入二进制日志,然后从服务器获取这些日志,然后在它的本地数据据进行重放这些日志,从而达到数据的一致性。从而实现负载均衡和故障转移。
-
数据恢复: 当数据库出现故障时,可以使用Binlog进行点时间恢复。通过回放Binlog日志记录,可以将数据库状态恢复到某一特定时间点的状态,从而可以恢复数据并最小化数据丢失。
-
审计: Binlog也被用于审计目的。通过审查日志,您可以看到何时对数据进行了更改,以及更改是如何进行的。
Binlog的优势:
- 数据安全性: Binlog可以提供一种数据恢复手段,在硬件故障或者人为误操作的情况下,可以通过点时间恢复(PITR)来恢复数据。
- 高可用性: 利用Binlog进行主从复制,可以提升数据的高可用性,实现负载均衡和故障转移。
- 事务一致性: 所有的事务提交都会在Binlog中依次有所记录,可以保证ACID中的一致性和持久性。
- 实时性: 使用BinlogJournal存储方式,可以在事务提交的同时写Binlog,降低了同步延迟。
下面是基于binlog实现MySQL主备库配置的主要步骤:
-
在主服务器上启动二进制日志
在MySQL的配置文件mysqld.cnf中(通常在/etc/mysql/mysql.conf.d/mysqld.cnf),添加如下配置项:
[mysqld] log-bin=mysql-bin # 启用binlog binlog-format=ROW # 设置binlog格式 server-id=1 # 设置服务器ID,唯一即可
-
在主服务器上创建用于复制的用户并授权
启动MySQL服务并登陆MySQL,创建一个用户mysql_repl,并授予其replication权限:
CREATE USER 'mysql_repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'mysql_repl'@'%';
-
获取主服务器的状态信息
在主服务器上执行SHOW MASTER STATUS;来获取当前的二进制日志文件名和位置:
SHOW MASTER STATUS;
记住这里的File和Position信息,后面在备机上需要用到。
-
在备服务器上设置服务器ID
进入备服务器的MySQL配置文件,在mysqld.cnf中设置server-id:
[mysqld] server-id=2 # 设置服务器ID,唯一即可
-
在备服务器上配置复制
在备服务器上,配置复制,告诉从服务器去连接主服务器的哪个位置开始复制数据:
CHANGE MASTER TO MASTER_HOST='master_host_name', # 主服务器的IP或者域名 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\G;查看复制状态,如果看到 "Slave_IO_Running: Yes" 和 "Slave_SQL_Running: Yes",则意味着主从复制配置成功。