环境说明:使用内网IP
主机A(主):192.168.1.1
主机B(从):192.168.1.2
主机A和B分别安装mysql,版本需一致(A、B均为5.6.35)
1、登陆主机A,在主服务器上,设置一个从库的账户
mysql>grant replication slave on *.* to test@"192.168.1.2" identified by 'test123';
或者
mysql>grant replication slave,super,reload on *.* to test@'%' identified by 'est123'; #根据需求权限进行相应赋权
mysql>flush privileges;
mysql>select user,host,password from mysql.user; #查看账户
赋予从机权限,有多台从机,就执行多次;一般不赋予*.*任意权限,只赋予需同步的库的权限
2、启用binlog日志并指定server_id(修改之后必须重启mysql服务)
vim /etc/my.cnf
[mysqld]
server_id=1 #指定服务器ID,主机标示,整数(必须修改)
log_bin=mysql-bin #启用binlog日志(可不修改)
binlog_format= mixed #指定日志格式(可不修改)
:wq
可以通过mysql>show variables like 'log_%'; 验证二进制日志是否已经启动。
3、现在可以停止主数据的的更新操作,并生成主数据库的备份,我们可以通过mysqldump导出数据到从数据库,当然了,你也可以直接用cp命令将数据文件复制到从数据库去,注意在导出数据之前先对主数据库进行READ LOCK,以保证数据的一致性
(1) mysql> flush tables with read lock;
(2) 然后mysqldump导出数据:
mysqldump -h127.0.0.1 -p3306 -uroot -p需同步数据库> /data/backup/DB.sql
(3)查询主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复。
mysql> show master status;
(4)主数据库备份完毕,恢复写操作
mysql> unlock tables;
(5)将刚才主数据备份的test.sql复制到从数据库(navicat、sqlyog、命令行都可以),进行导入,在B上操作
mysql -h127.0.0.1 -p3306 -uroot -p 数据库名 < /data/backup/DB.sql
mysql -uroot -p 数据库名 < /data/backup/DB.sql
mysql> source /home/db.sql; #直接进去数据库导入
4、修改从数据库的my.cnf,增加server-id参数(修改之后必须重启mysql服务),在B上操作
vim /etc/my.cnf
[mysqld]
server_id=2 #必须设置并与A中的不是同一数字
log_bin=pc2 #自定义,可以不启用
binlog_format="mixed"
replicate-do-db = test #只同步test数据库,在master端不指定binlog-do-db(需同步的数据库),在slave端用replication-do-db来过滤
replicate-ignore-db = mysql #忽略的库
replicate-do-table = home.mem_fan
replicate-ignore-table =
replicate_wild_do_table =
replicate_wild_ignore_table =
:wq
5、指定从数据库(在B上操作)
mysql -uroot -p
mysql> show slave status; #若之前有从库,可先还原从库,使用reset slave,使用reset slave之前必须使用stop slave 命令将复制进程停止。
mysql> change master to
master_host="192.168.1.1",
master_user="test",
master_password="test123",
master_port=3306,
master_log_file="mysql-bin.000034", #从A查看
master_log_pos=140428300; #偏移量,从A查看
或
change master to master_host="192.168.1.1",master_user="test",master_password="test123",master_port=3306,master_log_file="mysql-bin.000919",master_log_pos=1049322004;
6、在从服务器B上,启动slave进程,并验证
mysql>show slave statusG; #G:分行显示
mysql> start slave;
mysql>show slave statusG;
Slave_IO_Running: Yes #查看
Slave_SQL_Running: Yes #查看
验证主从是否正常同步:
在A中创建同步的数据库,然后在库中创建表;再在B中查看是否有创建的库和表
mysql>create database test1;
mysql>use test1;
mysql>CREATE TABLE student (id int,name varchar(20));
在B中查看是否有student这个表。
自此,MySQL主从同步配置完毕。
备注(重要):若数据库主从架构为 A-->B-->C,即A为从服务器B的主库,B为从服务器C的主库。为了能工作,B必须既为主库又为从库;必须用log-bin启动A和B以启用二进制日志,并且用log-slave-updates选项启动B,log-slave-updates参数默认是关闭的状态,如果不手动设置,那么bin-log只会记录直接在该库上执行的SQL语句,由replication机制的SQL线程读取relay-log而执行的SQL语句并不会记录到bin-log,那么就无法实现上述的三级级联同步。



