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

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

MySQL复制的基本过程

1. Slave上面的IO线程连接上Master,并请求从指定日志文件的指定位置(或者从
最开始的日志)之后的日志内容;

2. Master接收到来自SlaveIO线程的请求后,通过负责复制的IO线程根据请
求信息读取指定日志指定位置之后的日志信息,返回给Slave端的IO线程。返回信
息中除了日志所包含的信息之外,还包括本次返回的信息在Master端的Binary Log
文件的名称以及在Binary Log中的位置;

3. SlaveIO线程接收到信息后,将接收到的日志内容依次写入到Slave端的
Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的binlog的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的
告诉Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我

4. SlaveSQL线程检测到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的数据库里有bcd表,那从数据库里的就应该有一个模子刻出来的a的数据库和bcd

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_runningslave_sql_running都为yes,那么表明可以成功同步了     

 

6、测试同步数据。

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

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

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

 

 

踩过的坑

· 

MySQL无法关闭或重启:
Warning: World-writable config file '/etc/my.cnf' is ignored 

· 

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

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

· 

start slave出错:
[Err] 1872 - Slave failed to initialize relay log info structure from the repository

· 

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

解决方法:

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 

· 

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

解决办法:添加配置
[mysqld] 
server-id = 1

· 无法同步,[SQL]SHOW SLAVE STATUS;
Last_ErrorError 'Unknown database 'userdb'' on query. Default database: 'userdb'... 
或者
Last_ErrorError 'Table 'userdb.table' doesn't exist' on query. Default database: 'userdb'... 

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

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

· 无法同步,[SQL]SHOW SLAVE STATUS;
Last_ErrorGot fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file' 

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

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

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

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

· 注意检查防火墙


 

没有更多推荐了,返回首页