mysql主从配置(清晰的思路 主win7--从Linux)
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;版本不一致,可能出现的问题就是同步的不稳定(兼容性的老问题),因为会在某些函数处理、日志读取、日志的解析重演等上发生异常,导致同步报错而需手工处理。
· 注意检查防火墙