Home  >  Article  >  Database  >  mysql数据库主从配置详解

mysql数据库主从配置详解

WBOY
WBOYOriginal
2016-06-07 17:51:291681browse

我记得一年前我就做过一篇关于mysql主从配置的教程,今天看到一个网站可以把数据库相互主从这个觉得不错,正好我有两台机器想这样操作,下面看看过程。


我们先来回顾一下我以前的做法


服务器的主从配置,本来是一件很简单的事情,无奈不是从零开始,总是在别人已经安装好的mysql服务器之上 ,这就会牵扯到,mysql的版本,启动文件,等一些问题。

不过没关系,先问清楚两点

1、mysql配置文件my.cnf的位置

2、如何启动、停止mysql,找好启动文件

假设有两台机器,已经安装好了mysql(尽量同版本,且两台机器同一网络,可以ping通)

有朋友说:“从服务器,不能低于主服务器的版本”,不过我是低于的,没有出现问题。

主机A: 192.168.1.100

从机B:192.168.1.101

可以有多台从机

1、先登录主机 A

 代码如下 复制代码

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘backup’@’192.168.1.101‘ IDENTIFIED BY ‘123456’;

赋予从机权限,有多台丛机,就执行多次

2、 打开主机A的my.cnf,输入

 代码如下 复制代码

server-id               = 1    #主机标示,整数
log_bin                 = /var/log/mysql/mysql-bin.log   #确保此文件可写
read-only       =0  #主机,读写都可以
binlog-do-db    =test   #需要备份数据,多个写多行
binlog-ignore-db=mysql #不需要备份的,多个写多行

3、打开从机B的my.cnf,输入

 代码如下 复制代码

server-id               = 2
log_bin                 = /var/log/mysql/mysql-bin.log
master-host     =192.168.1.100
master-user     =backup
master-pass     =123456
master-port     =3306
master-connect-retry=60 #如果从服务器发现主服务器断掉,重新连接的时间差(秒)
replicate-do-db =test #只复制某个库
replicate-ignore-db=mysql #不复制某个库

4、同步数据库

有多种方法,我说最笨的一种,先mysqldump导出主机A的数据test为 test.sql

然后在,从机B上建立数据库test,mysql导入 test.sql到test库中

5、先重启主机A的mysql,再重启从机B的mysql

6、验证

 代码如下 复制代码

在主机A中,mysql>show master statusG;

在从机B中,mysql>show slave statusG;

能看到大致这些内容

 代码如下 复制代码

File: mysql-bin.000001
Position: 1374
Binlog_Do_DB: test
Binlog_Ignore_DB: mysql

可以在主机A中,做一些INSERT, UPDATE, DELETE 操作,看看主机B中,是否已经被修改


好了,如果上面没有问题大家可以看看mysql数据相互主从配置小记:

共有四台机器:A(10.1.10.28),B(10.1.10.29),C(10.1.10.30),D(10.1.10.31)。
配置后结果:A-C互为主从,B为A的slave,D为C的slave。


0)准备工作

在四台机器上面安装好mysql后,创建用于同步的账号。

添加账户:

 代码如下 复制代码
INSERT INTO user (Host,User, Password,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES('%','test',password('test'),'Y','Y','Y','Y','Y','Y');

 
刷新数据库:

 代码如下 复制代码

FLUSH PRIVILEGES;

1)配置A-C互为主从

修改A配置文件为:

 代码如下 复制代码

server-id   = 1
replicate-do-db=test
replicate-do-db=test_admin
log-bin=mysql-bin
log-slave-updates
replicate-wild-do-table=test.%
replicate-wild-do-table=test_admin.%
binlog-ignore-db=mysql
slave-skip-errors=all

修改C配置文件为:

 代码如下 复制代码

server-id   = 3
binlog-do-db=test
binlog-do-db=test_admin
log-bin=mysql-bin
log-slave-updates
replicate-wild-do-table=test.%
replicate-wild-do-table=test_admin.%
binlog-ignore-db=mysql
slave-skip-errors=all

重启mysql是配置生效

将A设置为主:
停止同步:

 代码如下 复制代码
slave stop;

清空服务器master日志:

 代码如下 复制代码

reset master;

授权同步账号:

 代码如下 复制代码

GRANT REPLICATION SLAVE ON *.* TO 'test'@'%' IDENTIFIED BY 'test';

刷新授权:

 代码如下 复制代码
flush privileges;

 
锁定数据库:

 代码如下 复制代码
flush tables with read lock;

 
将C设置为从:
停止同步:

 代码如下 复制代码
slave stop;

 
配置同步信息:

 代码如下 复制代码
CHANGE MASTER TO MASTER_HOST='10.1.10.28', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

 
将C设置为主:
停止同步:

 代码如下 复制代码

slave stop;

清空服务器master日志:

 代码如下 复制代码
reset master;

 
授权同步账号:

 代码如下 复制代码
GRANT REPLICATION SLAVE ON *.* TO 'test'@'%' IDENTIFIED BY 'test';

 
刷新授权:

 代码如下 复制代码

flush privileges;

锁定数据库:

 代码如下 复制代码
flush tables with read lock;

 
将A设置为从:
停止同步:

 代码如下 复制代码
slave stop;

 
配置同步信息:

 代码如下 复制代码
CHANGE MASTER TO MASTER_HOST='10.1.10.30', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

 
2)将B设置为A的从

 代码如下 复制代码
server-id   = 2
replicate-do-db=test
replicate-do-db=test_admin
log-bin=mysql-bin
log-slave-updates
replicate-wild-do-table=test.%
replicate-wild-do-table=test_admin.%
binlog-ignore-db=mysql
slave-skip-errors=all

 

重启mysql服务

停止同步:

 代码如下 复制代码
slave stop;

 
配置同步信息:

 代码如下 复制代码
CHANGE MASTER TO MASTER_HOST='10.1.10.28', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

 
启动同步:

 代码如下 复制代码
slave start;

 
3)将D设置为C的从

 代码如下 复制代码
server-id   = 4
replicate-do-db=test
replicate-do-db=test_admin
log-bin=mysql-bin
log-slave-updates
replicate-wild-do-table=test.%
replicate-wild-do-table=test_admin.%
binlog-ignore-db=mysql
slave-skip-errors=all
 


重启mysql服务

停止同步:

slave stop;
 
配置同步信息:

 代码如下 复制代码
CHANGE MASTER TO MASTER_HOST='10.1.10.30', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

 
启动同步:

 代码如下 复制代码

slave start;


完成之后可以创建添加数据测试一下是否可以。

下面是常见错误处理:

1)
change master导致的:
             

 代码如下 复制代码
Last_IO_Error: error connecting to master 'repl1@IP:3306' - retry-time: 60  retries

2)   
在没有解锁的情况下停止slave进程:

 代码如下 复制代码
     mysql> stop slave;
ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction

3)
change master语法错误,落下逗号

 代码如下 复制代码

mysql> change master to
    -> master_host='IP'
    -> master_user='USER',
    -> master_password='PASSWD',
    -> master_log_file='mysql-bin.000002',
    -> master_log_pos=106;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'master_user='USER',
master_password='PASSWD',
master_log_file='mysql-bin.000002' at line 3

 


4)
在没有停止slave进程的情况下change master

 代码如下 复制代码
mysql> change master to master_host=‘IP', master_user='USER', master_password='PASSWD', master_log_file='mysql-bin.000001',master_log_pos=106;
ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first


5)
A B的server-id相同:

 代码如下 复制代码
Last_IO_Error: Fatal error: The slave I/O thread sto because master and slave have equal MySQL server ids;
these ids must be different for replication to work (or the --replicate-same-server-id option must be used on
slave but this does not always make sense; please check the manual before using it).

查看server-id

 代码如下 复制代码
mysql> show variables like 'server_id';

手动修改server-id

 代码如下 复制代码
mysql> set global server_id=2; #此处的数值和my.cnf里设置的一样就行
mysql> slave start;

6)change master之后,查看slave的状态,发现slave_IO_running 为NO

好了,这篇文章总共计到了mysql主从配置与数据相互主从配置配置教程。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn