您的位置:首页 > 运维架构 > Linux

mysql主从配置(清晰的思路 主win7--从Linux)

2017-06-08 11:38 260 查看

mysql主从配置(清晰的思路) 

MySQL复制的基本过程

1. Slave上面的IO线程连接上Master,并请求从指定日志文件的指定位置(或者从

最开始的日志)之后的日志内容;

2. Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请

求信息读取指定日志指定位置之后的日志信息,返回给Slave端的IO线程。返回信

息中除了日志所包含的信息之外,还包括本次返回的信息在Master端的Binary Log

文件的名称以及在Binary Log中的位置;

3. Slave的IO线程接收到信息后,将接收到的日志内容依次写入到Slave端的

Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的binlog的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的

告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”

4. Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log文

件中的内容成为在Master端真实执行时候的那些可执行的Query语句,并在自身执

行这些Query。这样,实际上就是在Master端和Slave端执行了同样的Query,所

以两端的数据是完全一样的。

 






mysql主从配置。鄙人是在如下环境测试的:

  主数据库所在的操作系统:win7

  主数据库的版本:5.0

  主数据库的ip地址:192.168.1.111

  从数据库所在的操作系统:linux

  从数据的版本:5.0

  从数据库的ip地址:192.168.1.112

介绍完了环境,就聊聊配置步骤:

1、确保主数据库与从数据库一模一样。

例如:主数据库里的a的数据库里有b,c,d表,那从数据库里的就应该有一个模子刻出来的a的数据库和b,c,d表

2、在主数据库上创建同步账号。

GRANT REPLICATION SLAVE,FILE ON *.* TO 'mstest'@'192.168.1.112' IDENTIFIED BY '123456';

192.168.1.112:是运行使用该用户的ip地址

mstest:是新创建的用户名

123456:是新创建的用户名的密码

    以上命令的详细解释,最好百度一下,写太多反到更加更不清思路。

3、配置主数据库的my.ini(因为是在window下,所以是my.ini不是my.cnf)。

   [mysqld]

server-id=1

log-bin=log

binlog-do-db=mstest      //要同步的mstest数据库,要同步多个数据库,就多加几个replicate-db-db=数据库名

binlog-ignore-db=mysql  //要忽略的数据库

4、配置从数据库的my.cnf。

[mysqld]

server-id=2

master-host=192.168.1.111

master-user=mstest      //第一步创建账号的用户名

master-password=123456   //第一步创建账号的密码

master-port=3306

master-connect-retry=60

replicate-do-db=mstest        //要同步的mstest数据库,要同步多个数据库,就多加几个replicate-db-db=数据库名

replicate-ignore-db=mysql//要忽略的数据库 

5、验证是否成功


进入mysql,后输入命令:show slave status\G。将显示下图。如果slave_io_running和slave_sql_running都为yes,那么表明可以成功同步了     

 

6、测试同步数据。

    进入主数据库输入命令:insert into one(name) values('beijing');

    然后进入从数据库输入命令:select * from one;

    如果此时从数据库有获取到数据,说明同步成功了,主从也就实现了

 

 

踩过的坑

· 

MySQL无法关闭或重启:

Warning: World-writable config file '/etc/my.cnf' is ignored 

· 

o 原因是my.cnf配置文件权限全局可写。mysql担心这种文件被其他用户恶意修改,所以忽略掉这个配置文件。这样mysql无法关闭。

o 解决办法:修改my.cnf权限
chmod 644 /etc/my.cnf

· 

start slave出错:

[Err] 1872 - Slave failed to initialize relay log info structure from the repository

· 

o 可能原因:my.cnf配置文件没指定relay_log或者指定路径错误,注意空格。

o 解决方法:

1. 停止slave

mysql>STOP SLAVE;

2. 在my.cnf中添加

relay_log=/var/log/mysql/relay_log 

relay_log_index=/var/log/mysql/relay_log.index 

3. 重置slave日志并连接master

mysql>RESET SLAVE;

mysql>CHANGE MASTER TO

Master_Host='192.168.0.151',

Master_Port=3306,

Master_User='slave',

Master_Password='123456',

Master_Log_File='mysql-bin.000009',

Master_Log_Pos=159;

4. 启动slave

mysql>START SLAVE;

· 

无法同步,error.log:

[ERROR] Error reading packet from server: Misconfigured master - server_id was not set ( server_errno=1236)

[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Misconfigured master - server_id was not set', Error_code: 1236 

· 

o 原因很明显,master没有设置server-id,这里要注意,server-id一定要写在[mysqld]下面,如果装的是wamp集成环境的话这个server-id默认在[wampmysqld]下面了,这是不行的。

o 解决办法:添加配置

[mysqld] 

server-id = 1

· 无法同步,[SQL]SHOW SLAVE STATUS;

Last_Error:Error 'Unknown database 'userdb'' on query. Default database: 'userdb'... 
或者

Last_Error:Error 'Table 'userdb.table' doesn't exist' on query. Default database: 'userdb'... 

o 可能原因:master库中有userdb数据库和table表而slave中没有,而且同步之前没有把master库中已有的数据传到slave中。忘了哪里看到的好像数据库引擎不一样也可能会出现这个问题…

o 解决办法:手动将userdb数据库传到slave中并重新设置同步。

· 无法同步,[SQL]SHOW SLAVE STATUS;

Last_Error:Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file' 

o 原因:master_log_file文件名指定错误。

o 解决办法:在master上使用mysql> show master status\G 查看File并在slave上重新连接master。

· 配置项下划线和中杠要分清,比如:log-bin和log_bin

· slave跟master的MySQL版本一致,是官方推荐的方式;至少版本前两个号相同,可高于master;版本不一致,可能出现的问题就是同步的不稳定(兼容性的老问题),因为会在某些函数处理、日志读取、日志的解析重演等上发生异常,导致同步报错而需手工处理。

· 注意检查防火墙

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息