数据库的主从复制原理:
Master,记录数据更改操作:1、启用binlog日志;2、设置binlog日志格式;3、设置server_id;
Slave运行2个线程:Slave_IO:复制master主机binlog日志文件里的SQL语句到本机的relay-log文件里;Slave_SQL:执行本机relay-log文件里的SQL语句,重现Master数据操作。
部署MySQL主从同步基本思路:
1.确保数据相同,从库必须要有主库上的数据;
2.配置主服务器,启用binlog日志及设定格式,设置server_id,授权用户;
3.配置从服务器,设置server_id,配置为从数据库服务器;
4.测试同步效果,客户端连接主库,写入的数据,在访问从库的时候也能够看到;
搭建步骤:
确保数据相同(源码搭建数据库可以访问https://blog.csdn.net/weixin_44316575/article/details/87184137 进行安装)
为了模拟真实环境,可以在练习的时候为主库写入一些数据。
[root@DB1 ~]# mysql -uroot -p
Enter password:
mysql> create database test1;
Query OK, 1 row affected (0.00 sec)
mysql> use test1;
Database changed
mysql> create table test(id int);
Query OK, 0 rows affected (0.06 sec)
mysql> quit
Bye
导数据前先进行锁表操作
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
备份所有的数据
[root@DB1 ~]# mysqldump -uroot -p -A > all.sql
Enter password:
将备份的数据拷贝到从服务器
[root@DB1 ~]# scp all.sql [email protected]:/root/
从服务器导入主服务器的数据
[root@DB2 ~]# mysql -uroot -p < all.sql
Enter password:
进入从数据库查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| test1 |
+--------------------+
5 rows in set (0.00 sec)
......
配置主服务器,调整运行参数,启动binlog及允许同步。
[root@DB1 ~]# vim /etc/my.cnf
# 启用binlog日志
log_bin = /data/mysql/binlog/dbmaster-bin
log_bin_index = /data/mysql/binlog/mysql-bin.index
# 指定服务器ID号
server_id = 132
# 指定日志格式
binlog_format = mixed
# 允许日志同步
sync-binlog = 1
[root@DB1 ~]# mkdir /data/mysql/binlog
[root@DB1 ~]# setfacl -m u:mysql:rwx -R /data/mysql/binlog/
[root@DB1 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[root@DB1 ~]# ls /data/mysql/binlog/
dbmaster-bin.000001 mysql-bin.index
配置主服务器授权用户,需要的权限为REPLICATION SLAVE,允许其从Slave服务器访问。
mysql> grant replication slave on *.* to 'replicater'@'192.168.109.%' identified by 'replicater';
Query OK, 0 rows affected (0.01 sec)
检查Master服务器的同步状态,在已经初始化现有库的情况下,查看MASTER状态,记录下当前的日志文件名、偏移的位置(下面SLAVE发起复制时需要用到):
mysql> show master status\G
*************************** 1. row ***************************
File: dbmaster-bin.000001
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
配置MySQL slave 从服务器
修改MySQL主配置文件,启动MySQL服务程序,指定服务器ID号,允许日志同步;
[root@DB2 ~]# vim /etc/my.cnf
# 启用binlog日志
log_bin = /data/mysql/binlog/dbslave-bin
log_bin_index = /data/mysql/binlog/mysql-bin.index
# 指定服务器ID号
server_id = 133
# 允许日志同步
sync-binlog = 1
[root@DB2 ~]# mkdir /data/mysql/binlog
[root@DB2 ~]# setfacl -m u:mysql:rwx -R /data/mysql/
[root@DB2 ~]# /etc/init.d/mysqld start
在生产环境中,还可以根据需要设置更详细的同步选项。比如,指定当主、从网络中断时的重试超时时间(slave-net-timeout=60 )等,具体 可参考MySQL手册。
通过CHANGE MASTER语句指定MASTER服务器的IP地址、同步用户名/密码、起始日志文件、偏移位置(参考MASTER上的状态输出):
mysql> change master to master_host='192.168.109.132',
-> master_user='replicater',
-> master_password='replicater',
-> master_log_file='dbmaster-bin.000001',
-> master_log_pos=120;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
然后执行START SLAVE(较早版本中为SLAVE START)启动复制:
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
注意:一旦启用SLAVE复制,当需要修改MASTER信息时,应先执行STOP SLAVE停止复制,然后重新修改、启动复制。
通过上述连接操作,MASTER服务器的设置信息自动存为master.info文件,以后每次MySQL服务程序时会自动调用并更新,无需重复设置。查 看master.info文件的开头部分内容,可验证相关设置:
检查Slave服务器的同步状态 通过SHOW SLAVE STATUS语句可查看从服务器状态,确认其中的IO线程、SQL线程正常运行,才能成功同步:
mysql> show slave status\G
... ...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
... ...
若START SLAVE直接报错失败,请检查CHANGE MASTER相关设置是否有误,纠正后再重试;若IO线程或SQL线程有一个为“No”,则应检 查服务器的错误日志,分析并排除故障后重启主从复制。
测试主从同步效果
在Master上操作数据库、表、表记录
主库写入数据
mysql> insert into test values(111),(112);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test;
+------+
| id |
+------+
| 111 |
| 112 |
+------+
2 rows in set (0.00 sec)
从库查询数据
mysql> select * from test;
+------+
| id |
+------+
| 111 |
| 112 |
+------+
2 rows in set (0.00 sec)