有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。
要点: 负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限。
一、MySQL数据安装
安装过程省略
服务器 Master :192.168.8.131
Mysql 安装目录: /usr/share/mysql
服务器 Slave :192.168.8.132
Mysql 安装目录 :/usr/share/mysql
二、拷贝数据
关停Master服务器,将Master中的数据拷贝到B服务器中,使得Master和slave中的数据同步,并且确保在全部设置操作结束前,禁止在Master和slave服务器中进行写操作,使得两数据库中的数据一定要相同!(完全新安装mysql主从服务器,这个一步就不需要,因为新安装的master和slave有相同的数据)
备份数据库 :
mysqldump test > test.bak
导入数据库 :
mysql -uroot -p test< test.bak
三、Master 配置
修改mysql配置文件my.cnf
在[mysqld]标签下添加以下几行:
log-bin #开启二进制日志
server-id=id #主服务器id号
binlog-do-db=db_nameA #指定对db_nameA记录二进制日志
binlog-ignore-db=db_namB #指定不对db_namB记录二进制日志
注意:
log-bin,server-id是配置文件中必须添加的内容。此时主服务器默认对所有数据库进行备份。如果需要特殊指明只对某个数据库进行备份或不备份,则可以加入binlog-do-db和binlog-ignore-db选项。
关于log_bin日志,my.conf 文件中的[mysqld]标签下的log_bin指定日志文件,如果不提供文件名,mysql将自己产生缺省文件名。mysql会在文件名后面自动添加数字引,每次启动服务时,都会重新生成一个新的二进制文件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定记录的数据库;使用binlog-ignore-db可以指定不记录的数据库。注意的是:binlog-do-db和binlog-ignore-db一次只指定一个数据库,指定多个数据库需要多个语句。而且,MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,否则不会起作用。以后对数据库每做的一次操作,都会在binlog中有所记录。
在测试主机上,我们实际添加入如下内容:
log-bin
server-id=1
binlog-do-db=test
为从服务器添加mysql账户并配置权限,在主服务器上,必须为从服务器创建一个用来连接主服务器的用户,并设置replication slave权限。所用具体命令如下:
grant replication slave
on *.*
to '帐号' @ '从服务器IP' identified by '密码';
在测试机上,我们实际执行:
grant replication slave
on *.*
to 'repl'@'%' identified by '123456';
这时在mysql库的user表中使用
select * from user where user = 'repl' \G;
可以看到Repl_slave_priv项对就的值为Y。
记录File 及Position 项的值
重启mysql,使用show master status\G;查看主服务器状态,记录File 及Position 项的值,以便之后对从服务器进行配置。
在测试机上,我们实际执行时看到的结果如下:
*************************** 1. row ***************************
File: mysqld-bin.000001
Position: 106
Binlog_Do_DB: test
Binlog_Ignore_DB:
1 row in set (0.00 sec)
其中File为mysqld-bin.000001;Position为106。
至此主服务器配置完毕
四、Slave配置
修改mysql配置文件my.cnf,在[mysqld]标签下添加以下面一行:
server-id=id #从机id
实际中,我们添加:
server-id=2
数据库并设置相关参数
change master to
master_host = '192.168.8.131',
master_user = 'repl',
master_password = '123456',
master_log_file = 'simba-bin.000008',
master_log_pos = 0;
MASTER_LOG_POS的值为0,因为它是日志的开始位置
重启mysql,执行命令:
slave start;
使用show slave status \G;查看相关参数是否正确。
在实际执行时,我们在从机上看到的结果如下(只摘取了部分输出):
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.8.131
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 576
Relay_Log_File: mysqld-relay-bin.000007
Relay_Log_Pos: 452
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
……
对部分参数的解释:
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
以上参数说听slave正常运行,正等待主服务器发来的消息。此时若用netstate命令可以看到从机与主机间已经建立了一条边接。
特别需要注意的两个参数是:Master_Log_File和Read_Master_Log_Pos。Master_Log_File代表主机上用于主备同步的日志文件名,Read_Master_Log_Pos代表上一次成功同步到的日志文件中的位置。如果这两项与先前在主服务器上看到的File及Position的值不相符,则无法正确进行同步。
五、测试
在 Master 中创建一张表,插入一条数据, 然后在 Slave 中查询,可以验证。
创建表:
create table simple(
id int(4) not null primary key,
name char(20) not null,
sex int(4) not null default '0');
插入数据:
insert into simple values(1,'yy',1);
commit;
查询语句:
select * from simple;
你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:
show processlist\G;