本文目录 [隐藏]
I. MySQL配置主从复制
II. 环境说明
主机名 | IP | 说明 |
---|---|---|
node01 | 172.16.10.10 | MySQL主服务器 |
node02 | 172.16.10.11 | MySQL从服务器 |
III. 主从同步的详细过程
- 主服务器验证连接。
- 主服务器为从服务器开启一个线程。
- 从服务器将主服务器日志的偏移位告诉主服务器。
- 主服务器检查该值是否小于当前二进制日志偏移位。
- 如果小于,则通知从服务器来取数据。
- 从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠。
- 当主服务器有更新时,主服务器线程被激活,并将二进制日志推送给从服务器,并通知从服务器线程进入工作状态。
- 从服务器SQL线程执行二进制日志,随后进入睡眠状态。
IV. 实战配置MySQL主从复制
主从服务器分别作以下操作
- 版本一致
- 初始化表,并在后台启动mysql
- 修改root的密码
修改主服务器master
[root@node01 ~]# egrep "log-bin|server-id" /etc/my.cnf
server-id = 4 #服务器唯一ID,默认是1,一般取IP最后一段
log-bin=/application/mysql/data/mysql-bin #启用二进制日志
重启MySQL
[root@node01 ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
V. 修改从服务器slave
[root@node02 ~]# egrep "log-bin|server-id" /etc/my.cnf
server-id = 11 #服务器唯一ID,默认是1,一般取IP最后一段
log-bin=/application/mysql/data/mysql-bin #启用二进制日志
重启MySQL
[root@node02 ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!
VI. 在主服务器上建立帐户并授权slave
[root@node01 ~]# mysql -uroot -pansheng.me
mysql> grant replication slave on *.* to 'rep'@'172.16.10.%' identified by '123456';
mysql> flush privileges;
一般不用root帐号,"%"表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
VII. 在主服务器上进行数据的全备
为了保持数据的一致性,先把主服务锁定,然后进行全备,最后恢复到从服务器上
mysql> flush table with read lock; #锁定写入操作
[root@node01 ~]# mysqldump -uroot -pansheng.me --events -B -A --master-data=2 | gzip >/opt/rep_bak.sql.gz #主服务器上的所有数据进行全备操作
[root@node01 ~]# scp /opt/rep_bak.sql.gz root@172.16.10.11:/tmp/ #把备份的数据传输到从服务器上面
[root@node01 ~]# mysql -uroot -pansheng.me
mysql> show master status; #查看位置
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 333 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> unlock tables; #解锁
Query OK, 0 rows affected (0.00 sec)
VIII. 在从服务器上面恢复主的全备
[root@node02 ~]# gzip -d /tmp/rep_bak.sql.gz
[root@node02 ~]# mysql -uroot -pansheng.me < /tmp/rep_bak.sql
IX. 配置从服务器
[root@node02 ~]# mysql -uroot -pansheng.me
mysql> change master to master_host='172.16.10.10',master_user='rep',master_password='123456',master_port=3306;
#设置服服务器的用户信息
mysql> change master to master_log_file='mysql-bin.000002',master_log_pos=333;
#设置binlog信息
X. 查看信息
mysql> start slave;
#启动slave进程
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.16.10.10
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 333
Relay_Log_File: node02-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000002
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: 333
Relay_Log_Space: 410
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: 4
1 row in set (0.00 sec)
现在可以在我们的主服务器做一些更新的操作,然后在从服务器查看是否已经更新