模拟环境:
主(master)服务器IP:192.168.1.10
从(slave)服务器1IP:192.168.1.11
从(slave)服务器2IP:192.168.1.12
同步的数据库:dbName
一、配置主(master)服务器
1、打开mysql配置文件
PS:一般是/etc/my.cnf,如果忘记当时编译时填的地址或者不知道的话,可以使用以下命令找出当前mysql命令用的配置文件
[root@master ~]# which mysql
[root@master ~]# /usr/bin/mysql --verbose --help | grep -A 1 'Default options'
结果类似如下:
[root@master ~]# vim /etc/my.cnf
2、在[mysqld](没有这个就手动加入进去)下面加入以下代码:
server-id = 1 #数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值;
read-only = 0 #主机,读写都可以
binlog-do-db = dbName #需要同步的数据库库名,多个写多行
binlog-ignore-db = mysql #不需要同步的库,mysql这个库不用同步
binlog_format=mixed #设置主从复制模式
log-bin=mysql-bin #设定生成的log文件名
PS:以上binlog-do-db和binlog-ignore-db两个选项有一定的缺陷,原因及处理办法在上一篇日志有详细说明
保存退出
3、建立从(slave)服务器用于同步的帐号
[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql>GRANT REPLICATION SLAVE ON *.* TO slaveUserName1@192.168.1.11 IDENTIFIED BY 'slavePasswd1';
mysql>GRANT REPLICATION SLAVE ON *.* TO slaveUserName2@192.168.1.12 IDENTIFIED BY 'slavePasswd2';
PS:如果想要在Slave上有权限执行 "LOAD TABLE FROM MASTER" 或 "LOAD DATA FROM MASTER" 语句的话,必须授予全局的 FILE 和 SELECT 权限,语句更改如下:
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO slaveUserName1@192.168.1.11 IDENTIFIED BY 'slavePasswd1';
mysql>GRANT FILE,SELECT,REPLICATION SLAVE ON *.* TO slaveUserName2@192.168.1.12 IDENTIFIED BY 'slavePasswd2';
4、重启主服务器Mysql
[root@master ~]# service mysqld restart
重启Mysql有各种手段,不多举例了。。
5、查看主服务器状态,是否设置成功
[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql> show master status\G
显示结果如下:
*************************** 1. row ***************************
File: mysql-bin.000013
Position: 1090
Binlog_Do_DB: dbName
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
到此主服务器已经配置完成了!!
二、配置从(slave)服务器
1、检查主服务器新建的同步帐号是否可用
[root@slave1 ~]# mysql -h 192.168.1.10 -uslaveUserName1 -pslavePasswd1
如果能够登陆成功,则说明设置是成功的;如果不成功,则到主服务器重新设置。然后查看用户是否具有相应权限
mysql>SHOW GRANTS;
2、打开mysql配置文件
方法同主服务器配置方法
3、在[mysqld](没有这个就手动入进去)下面加入以下代码:
server-id=2 #如果以后要再加Slave号接着往后数就OK了
log-bin=mysql-bin #设定2进制log文件名
master-host=192.168.1.10 #主服务器IP
master-user=slaveUserName1#用于同步的用户名
master-password=slavePasswd1 #用于同步的用户名的密码
master-port=3306 #同服务器mysql端口
master-connect-retry=60 #如果发现主服务器断线,重新连接的时间差
replicate-do-db=dbName #需要同步的数据库库名
replicate-ignore-db=mysql #不同步的数据库库名
log-slave-update
slave-skip-errors
保存退出
4、重启从服务器Mysql
[root@slave1 ~]# service mysqld restart
从服务器配置完成!!
三、将主服务器要同步的数据库传到各个从服务器
1、打开主服务器
切换到mysql数据文件存放目录,我写的这个目录是mysql默认数据存放目录,根据自己情况改写
[root@master ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql>FLUSH TABLES WITH READ LOCK;
PS:不要退出这个终端,否则这个锁就不生效了。以下代码另开终端执行:
[root@master ~]#cd /var/lib/mysql
[root@master ~]# tar zcvf dbName.tar.gz dbName
2、打开从服务器
[root@slave1 ~]# cd /var/lib/mysql/
[root@slave1 ~]# scp root@192.168.1.10:/var/lib/mysql/dbName.tar.gz dbName.tar.gz
传文件有各种手段,不多举例
[root@slave1 ~]# tar zxvf dbName.tar.gz
[root@slave1 ~]# rm -f dbName.tar.gz
四、启动slave及查看主/从服务器状态
1、从服务器启动slave并查看状态
[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql> slave start;
mysql> show slave status\G
类似结果如下:
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.10
Master_User: slaveUserName1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000013
Read_Master_Log_Pos: 1090
Relay_Log_File: x1-relay-bin.000017
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: masterTest
Replicate_Ignore_DB: mysql
*****省略N行*******
我们要看其中的Master_Host、Master_User、Master_Port、Master_Log_File是否符合主服务器相关情况,Master_Log_File应该和主服务器show master status\G结果中的File一致。
情况一:Slave_IO_Running显示connecting..
这个是正常的,因为主库服务器还是锁表状态,解锁之后执行以下两部恢复正常:
mysql> slave stop;
mysql> slave start;
情况二:上述变量值某项不符合不符合主服务器情况。处理办法如下:
[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql> slave stop;
PS:修改配置之前都要将slave停掉
mysql>change master to master_host='192.168.1.10', master_user='slaveUserName1', master_password='slavePasswd1', master_port=3306;
mysql>flush privileges;
mysql>slave start;
情况三:Slave_IO_Running和Slave_SQL_Running其中一项为No,处理办法如下:
[root@slave1 ~]# mysql -h127.0.0.1 -udbUser -pdbPwd
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
2、一切正常之后,解锁主服务器的表
打开刚刚作锁表操作没有关闭的主服务器终端,执行如下命令:
mysql>UNLOCK TABLES;
如果Slave_IO_Running和Slave_SQL_Running不全为Yes,那么执行以下语句:
mysql> slave stop;
mysql> slave start;
如果在使用过过程中,发现突然不同步了,下面是解决办法:
情况一、从服务器上show slave status\G中Last_IO_Error报错;Got fatal error 1236 from masterwhen reading data from binary log
1、 在从服务器上登陆mysql
mysql>stop slave;
2、 在主服务器上登陆mysql
mysql>flushlogs;
mysql>showmaster status;
记录下“File”和“Position”两项的值,此处以$fileName和$position代称
3、 在从服务器上登陆mysql
mysql>CHANGEMASTER TO MASTER_LOG_FILE=’log-bin.00000X’, MASTER_LOG_POS=106;
log-bin.00000X为$fileName,106为$position。
mysql>start slave;