MySQL主从数据库复制是基于binlog实现的。熟悉Oracle的朋友都知道,MySQL不是有redo log日志吗?为什么不使用redo log来实现复制呢?原因是MySQL数据库的redo log是存储引擎层的日志,如果不使用innodb作为MySQL数据库的存储引擎是无法实现复制的。 MySQL的redo log日志是innodb存储引擎所独有的,MySQL作为一个支持可插拔存储引擎的数据库,MySQL不仅支持innodb存储引擎,还有MyISAM,Memory等其他存储引擎,对于这些存储引擎的操作需要持久化到binlog日志中,是不会存储到redo log中的。 说白了,就是redo log 是innodb存储引擎层实现的,而binlog是在server服务层实现的。
主从复制涉及到如下3个线程:1. 主库binlog dump 线程, Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中.2.从库I/O线程,从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log;3.从库SQL线程,Slave重做中继日志中的事件,将改变数据更新同步到从库中;复制的流程如下:1. 从库执行完start slave启动命令后,会创建两个线程,I/O线程和SQL线程。2. I/O线程会建立一个到主库的连接,主库会创建一个binlog dump线程来响应这个连接的请求,此时,对主库来说,从库的I/O线程就是一个普通的客户端。3. I/O线程首先告诉主库应该从哪里开发发送二进制日志事件。4. 主库的binlog dump线程开始从指定位置点读取二进制日志事件,并发送给I/O线程。5. I/O线程接受到二进制日志事件后,将写入到relay log日志中。6. SQL线程读取relay log 日志中的日志事件,然后进行SQL重放。这样就实现了从库和主库数据一致的目的。
主从复制案例
前期准备
|
|
|
|---|---|
|
|
|
|
|
|
主库配置
1)修改主库的MySQL核心配置文件/etc/my.conf,并添加如下配置信息:
[mysqld] # 开启二进制日志(必须) log-bin = mysql-bin # MySQL服务ID,保证整个集群环境中唯一,默认为1(必须) server-id = 1 # 二进制日志格式,默认ROW(可选)最好的row格式 binlog_format = ROW # 忽略的数据,不需要同步的数据库 # binlog-ignore-db = mysql # 指定同步的数据库 # binlog-do-db = db01
systemctl restart mysql
3)登录MySQL数据库,创建远程连接的账号,并授予主从复制权限。
# 创建repl用户,并设置密码,该用户可在任意主机连接该MySQL服务 MySQL [(none)]> create user 'repl'@'%' identified by 'repl123456'; # 为'repl'@'%'用户分配主从复制权限 MySQL [(none)]> grant replication slave on *.* to 'repl'@'%';
为了验证创建的复制用户是否有效以及主从库之间的网络是否畅通,可以在从库上进行登陆测试
MySQL [(none)]>mysql -h10.10.23.37 -urepl -prepl123456
4)备份主库为了方便,我这里使用mysqldump进行备份,备份通过scp命令在拷贝到从库上。
mysqldump -uroot -p -h10.10.23.37 --single-transaction --triggers --master-data=2 -E -R -A > /oradata/backupfile`date +"%Y%m%d%H%M%S"`.sqlscp backupfile20241223161344.sql mysql@10.10.23.38:/oradata
mysqldump 备份时,我们使用了参数--master-data=2,目的是在备份时,在备份文件中记录binlog位置点信息。
从库配置
1)修改从库的MySQL核心配置文件/etc/my.conf,并添加如下配置信息:
[mysqld] # 开启二进制日志(必须) log-bin = mysql-bin # MySQL服务ID,保证整个集群环境中唯一,默认为1(必须) server-id = 2 # 二进制日志格式,默认ROW(可选)最好的row格式 binlog_format = ROW # 是否只读,1代表只读,0代表读写 read-only = 1
systemctl restart mysql
MySQL [(none)]> source /backup/backupfile20241223161344.sql
MySQL [(none)]> change master to master_host='10.10.23.37', master_port=3306, master_user='repl', master_password='repl123456', master_log_file='mysql-bin00000057', master_log_pos=896;
master_host:主库的主机信息,可以指定为主机名或者ip
master_port:主库的端口,若不指定,则默认为3306
master_user: 复制的用户
master_password:复制用户的密码
master_log_file和master_log_pos:从库I/O线程启动时,应该从主库的哪个binlog的哪个位置开始读取二进制日志事件。
master_log_pos=896信息可以到备份文件中查询。
[root@test oradata]# grep -m 1 "CHANGE MASTER TO" backupfile20241223161344.sql-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin00000057', MASTER_LOG_POS=896;或者使用[root@test oradata]# head -n30 backupfile20241223161344.sql5)开启主从复制
MySQL [(none)]> start slave;
6)查看主从复制的状态
MySQL [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.10.23.37 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin00000057 Read_Master_Log_Pos: 896 Relay_Log_File: mysql-relay-bin.000011 Relay_Log_Pos: 423 Relay_Master_Log_File: mysql-bin00000057 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 896 Relay_Log_Space: 61 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 0 Master_UUID: d056e231-616f-11ec-89e7-fa163e153c3c Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
从状态信息中,主要看 Slave_IO_Running和 Slave_SQL_Running的状态,两个均为Yes代表主从复制搭建成功。今天我们就说这么多。请大家继续关注我。酋长彭谈数据库。谢谢。
